# Практическое задание №3: Память и подтверждение действий ## Описание проекта В этом задании вы доработаете агента из предыдущих практических работ, добавив: - **Память разговора** – агент будет помнить все сообщения в рамках одного диалога. - **Механизм подтверждения** перед вызовом любого инструмента – пользователь сможет согласовать действие. Для более приятного вывода используется библиотека `rich`. ## Структура проекта ``` project/ ├── solution.py # Основной скрипт с реализацией агента └── README.md # Это файл ``` --- ## Установка зависимостей ```bash # Создайте виртуальное окружение (рекомендуется) python -m venv .venv source .venv/bin/activate # Windows: .venv\Scripts\activate # Установите все необходимые пакеты pip install rich langgraph langchain-openai langchain-core ``` > **Важно** > `langgraph` и `langchain-openai` автоматически подтянут нужные версии OpenAI SDK. > Если у вас нет ключа API, создайте переменную окружения `OPENAI_API_KEY`. ```bash export OPENAI_API_KEY="sk-..." ``` --- ## Запуск скрипта ### 1️⃣ Запустите файл напрямую ```bash python solution.py ``` Скрипт откроет интерактивный чат, где вы можете задавать вопросы. При каждом вызове инструмента агент сначала спросит подтверждение. > **Пример** > ``` > Пользователь: Привет! > Агент: Здравствуйте! Чем могу помочь? > Пользователь: Напиши мне список покупок. > Агент: Вы хотите вызвать инструмент `echo_tool` с аргументом `text="список покупок"`? (y/n) > y > Эхо: список покупок > ``` ### 2️⃣ Запуск в режиме потоковой передачи Если вы хотите видеть ответы по частям, можно запустить скрипт так: ```bash python solution.py --stream ``` Внутри `solution.py` реализован флаг `--stream`, который переключает режим вывода. --- ## Пример использования кода ```python from rich.console import Console from langgraph.checkpoint.memory import MemorySaver from langgraph.prebuilt import create_chat_agent from langchain_openai import ChatOpenAI # 1. Консоль для красивого вывода console = Console() # 2. Создаём LLM llm = ChatOpenAI(model="gpt-3.5-turbo", temperature=0) # 3. Определяем инструмент def echo_tool(args: dict) -> str: return f"Эхо: {args.get('text', '')}" # 4. Память и агент с паузой перед инструментом memory = MemorySaver() agent = create_chat_agent( llm=llm, tools=[echo_tool], system_prompt="Ты — полезный ассистент, который сначала спрашивает подтверждение перед вызовом инструмента.", checkpointer=memory, interrupt_before=['tools'], # остановка перед каждым инструментом ) # 5. Запускаем диалог config = {"configurable": {"thread_id": "разговор-1"}} for chunk in agent.stream({"messages": [HumanMessage(content="Напиши мне список покупок")]}, config=config): console.print(chunk) ``` --- ## Что дальше? - Добавьте собственные инструменты (например, поиск в интернете, работа с файлами и т.д.). - Изучите другие параметры `create_chat_agent`, такие как `interrupt_after` или `max_output_tokens`. - Попробуйте использовать разные модели (`gpt-4o-mini`, `claude-3.5-sonnet` и др.) – просто поменяйте аргумент `model`. --- ## Полезные ссылки | Тема | Ссылка | |------|--------| | LangGraph Docs | https://langgraph.org/docs/ | | LangChain OpenAI | https://python.langchain.com/docs/integrations/providers/openai | | Rich Library | https://rich.readthedocs.io/en/latest/introduction.html | ---