Практическое задание №3: Память и подтверждение действий
Описание проекта
В этом задании вы доработаете агента из предыдущих практических работ, добавив:
- Память разговора – агент будет помнить все сообщения в рамках одного диалога.
- Механизм подтверждения – перед выполнением любого инструмента пользователь получает запрос на подтверждение.
Для красивого вывода в консоли используется библиотека rich.
Структура проекта
project/
├── agent.py # Основной скрипт с реализацией агента
├── tools.py # Пользовательские инструменты
└── README.md # Это файл
Установка зависимостей
# Создайте виртуальное окружение (необязательно, но рекомендуется)
python -m venv .venv
source .venv/bin/activate # Windows: .\.venv\Scripts\activate
# Установите все необходимые пакеты
pip install langgraph rich openai # добавьте другие зависимости при необходимости
Важно –
richнужен только для вывода, но без него скрипт будет работать.
Как запустить каждый файл
1. tools.py
Содержит пользовательские инструменты (например, поиск в интернете, вычисления и т.д.).
Запуск не требуется отдельно – он импортируется в agent.py.
2. agent.py
Главный скрипт, который запускает агента.
python agent.py
При запуске вы увидите интерактивную сессию:
- Введите сообщение.
- Агент сформулирует запрос к инструменту и попросит подтвердить действие.
- После подтверждения (
yes/no) агент выполнит инструмент или отменит его.
3. Пример запуска в режиме потоковой печати
python agent.py --stream
Параметр --stream заставляет выводить ответы построчно, как это делает rich.
Пример использования
# Внутри agent.py (или в интерактивной сессии)
from langgraph.checkpoint.memory import MemorySaver
from rich.console import Console
import os
console = Console()
# Инициализация памяти и агента
memory = MemorySaver()
agent = create_agent(
model=llm,
tools=[my_tool],
system_prompt="You are a helpful assistant.",
checkpointer=memory,
interrupt_before=['tools'] # пауза перед каждым инструментом
)
# Конфигурация диалога (thread_id)
config = {"configurable": {"thread_id": "conversation-1"}}
# Запуск агента с потоковым выводом
for chunk in agent.stream({"messages": [{"role":"user","content":"Расскажи о Python"}]}, config=config):
console.print(chunk, end="")
# После завершения можно продолжить диалог в том же thread_id
Что происходит при запуске
- Память:
MemorySaverсохраняет все сообщения и состояния агента для конкретногоthread_id. При повторном вызове с тем же ID агент «видит» историю. - Подтверждение: Когда агент планирует вызвать инструмент, он выводит запрос вида:
[Agent] Предлагаю использовать инструмент "search". Подтвердить? (yes/no) - Пауза (
interrupt_before=['tools']): Агент останавливается до подтверждения и ждёт ввода пользователя.
Как добавить новый инструмент
- Создайте функцию в
tools.py. - Зарегистрируйте её в списке
tools=[...]при создании агента. - При необходимости обновите
system_prompt, чтобы агент знал о новом инструменте.
Тестирование
Для проверки работы можно использовать простые тесты:
python -m unittest discover tests
Убедитесь, что у вас есть файл
tests/с соответствующими проверками.
FAQ
| Вопрос | Ответ |
|---|---|
Как изменить thread_id? |
Передайте новый ID в config = {"configurable": {"thread_id": "новый-id"}}. |
| Что делать, если инструмент не подтверждается? | Агент просто пропускает вызов и продолжает диалог. |
| Можно ли отключить память? | Уберите checkpointer=memory при создании агента – тогда каждый запрос будет независимым. |
Лицензия
MIT © 2026