Практическое задание №3: Память и подтверждение действий: README.md
This commit is contained in:
+72
-67
@@ -1,102 +1,107 @@
|
|||||||
# Практическое задание №3 – Память и подтверждение действий
|
# Практическое задание №3 – Память и подтверждение действий
|
||||||
|
|
||||||
## Описание проекта
|
## Описание проекта
|
||||||
В этом задании вы дорабатываете агента из предыдущих практических работ.
|
|
||||||
Новые возможности:
|
|
||||||
|
|
||||||
* **Память разговора** – агент запоминает все сообщения в рамках одного диалога.
|
В этом проекте реализован чат‑бот, построенный на **LangGraph** и **OpenAI LLM**, с добавленной памятью диалога и механизмом подтверждения каждого вызова инструмента пользователем.
|
||||||
* **Подтверждение перед вызовом инструмента** – пользователь подтверждает каждый запрос к инструменту.
|
Бот умеет:
|
||||||
|
|
||||||
Для красивого вывода используется библиотека `rich`.
|
- хранить историю общения в памяти (`MemorySaver`);
|
||||||
|
- прерываться перед каждым использованием внешнего инструмента (пауза `interrupt_before=['tools']`);
|
||||||
|
- запрашивать у пользователя подтверждение, прежде чем выполнять инструмент.
|
||||||
|
|
||||||
|
## Структура проекта
|
||||||
|
|
||||||
## Структура репозитория
|
|
||||||
```
|
```
|
||||||
project/
|
.
|
||||||
├── solution.py # Основной скрипт с реализацией агента
|
├── solution.py # основной скрипт с реализацией агента
|
||||||
└── README.md # Это файл
|
└── README.md # это файл
|
||||||
```
|
```
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## Установка зависимостей
|
## Установка зависимостей
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
# Создайте виртуальное окружение (рекомендуется)
|
# Создайте виртуальное окружение (необязательно, но рекомендуется)
|
||||||
python -m venv .venv
|
python -m venv .venv
|
||||||
source .venv/bin/activate # Windows: .venv\Scripts\activate
|
source .venv/bin/activate # Windows: .venv\Scripts\activate
|
||||||
|
|
||||||
# Установите все необходимые пакеты
|
# Установите все необходимые пакеты
|
||||||
pip install langchain-openai langgraph rich
|
pip install langgraph langchain openai rich
|
||||||
```
|
```
|
||||||
|
|
||||||
> **Важно**
|
> **Важно** – для работы с OpenAI нужен ключ API.
|
||||||
> Для работы с `ChatOpenAI` вам понадобится переменная окружения `OPENAI_API_KEY`.
|
> Если переменная окружения `OPENAI_API_KEY` не задана, скрипт автоматически создаст «заглушку» LLM, которая возвращает фиктивный ответ.
|
||||||
> ```bash
|
|
||||||
> export OPENAI_API_KEY="sk-..."
|
|
||||||
> ```
|
|
||||||
|
|
||||||
---
|
## Как запустить
|
||||||
|
|
||||||
## Запуск проекта
|
|
||||||
|
|
||||||
### 1. Откройте терминал и перейдите в корневую папку проекта.
|
|
||||||
|
|
||||||
```bash
|
|
||||||
cd /путь/к/project
|
|
||||||
```
|
|
||||||
|
|
||||||
### 2. Активируйте виртуальное окружение (если не сделали это ранее).
|
|
||||||
|
|
||||||
```bash
|
|
||||||
source .venv/bin/activate # Windows: .venv\Scripts\activate
|
|
||||||
```
|
|
||||||
|
|
||||||
### 3. Запустите скрипт `solution.py`.
|
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
python solution.py
|
python solution.py
|
||||||
```
|
```
|
||||||
|
|
||||||
> Скрипт запускает интерактивный диалог с агентом.
|
После запуска бот будет ждать ввода пользователя в консоли.
|
||||||
> Введите сообщение, после чего агент предложит вам подтвердить вызов инструмента (в данном случае – эхо‑инструмент).
|
Пример взаимодействия:
|
||||||
> Нажмите **Y** для подтверждения или **N** для отмены.
|
|
||||||
|
|
||||||
---
|
```
|
||||||
|
User: Привет!
|
||||||
|
Bot: Здравствуйте! Чем могу помочь?
|
||||||
|
User: Сколько стоит 1 кг яблок?
|
||||||
|
Bot (пауза): Вы хотите вызвать инструмент "price_lookup" с аргументами {"item": "яблоки", "quantity_kg": 1}?
|
||||||
|
(Введите `yes` или `no`)
|
||||||
|
User: yes
|
||||||
|
Bot: Цена за 1 кг яблок составляет $3.50.
|
||||||
|
```
|
||||||
|
|
||||||
|
> В реальном запуске бот будет использовать OpenAI GPT‑4o (или другой выбранный LLM) и ваш собственный инструмент, который вы можете добавить в список `tools`.
|
||||||
|
|
||||||
## Пример использования
|
## Пример использования
|
||||||
|
|
||||||
```text
|
```python
|
||||||
$ python solution.py
|
from langgraph.prebuilt import create_agent
|
||||||
🤖 Здравствуйте! Чем могу помочь?
|
from langchain.tools import BaseTool
|
||||||
User: Какой сегодня день недели?
|
from langgraph.checkpoint.memory import MemorySaver
|
||||||
🤖 (подтверждение) Вы хотите вызвать инструмент echo_tool с аргументом {"message": "Какой сегодня день недели?"}?
|
from rich.console import Console
|
||||||
Y
|
|
||||||
✅ Эхо: Какой сегодня день недели?
|
# 1. Создаём LLM (или заглушку)
|
||||||
🤖 Что ещё интересует вас?
|
llm = ChatOpenAI(temperature=0)
|
||||||
|
|
||||||
|
# 2. Определяем инструмент
|
||||||
|
class EchoTool(BaseTool):
|
||||||
|
name: str = "echo"
|
||||||
|
description: str = "Возвращает переданный текст."
|
||||||
|
def _run(self, text: str) -> str:
|
||||||
|
return f"Echo: {text}"
|
||||||
|
|
||||||
|
tools = [EchoTool()]
|
||||||
|
|
||||||
|
# 3. Создаём память
|
||||||
|
memory = MemorySaver()
|
||||||
|
|
||||||
|
# 4. Конфигурируем агента с паузой и подтверждением
|
||||||
|
agent = create_agent(
|
||||||
|
model=llm,
|
||||||
|
tools=tools,
|
||||||
|
system_prompt="You are a helpful assistant.",
|
||||||
|
checkpointer=memory, # нужна для памяти и паузы
|
||||||
|
interrupt_before=['tools'], # остановка перед каждым вызовом инструмента
|
||||||
|
)
|
||||||
|
|
||||||
|
# 5. Запускаем диалог
|
||||||
|
console = Console()
|
||||||
|
config = {"configurable": {"thread_id": "demo-thread"}}
|
||||||
|
|
||||||
|
for chunk in agent.stream(
|
||||||
|
{"messages": [{"role": "user", "content": "Привет!"}]},
|
||||||
|
config=config,
|
||||||
|
):
|
||||||
|
console.print(chunk)
|
||||||
```
|
```
|
||||||
|
|
||||||
* `🤖` – вывод агента.
|
|
||||||
* `User:` – ваш ввод.
|
|
||||||
* `✅` – результат работы инструмента после подтверждения.
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## Как это работает
|
|
||||||
|
|
||||||
1. **MemorySaver** сохраняет все сообщения в состоянии графа, позволяя агенту «помнить» историю диалога.
|
|
||||||
2. Параметр `interrupt_before=['tools']` заставляет агент остановиться перед каждым вызовом инструмента и запросить подтверждение от пользователя.
|
|
||||||
3. Библиотека `rich` используется для красивого форматирования вывода в консоли.
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## Что дальше
|
## Что дальше
|
||||||
|
|
||||||
* Добавьте собственные инструменты (например, поиск в интернете, вычисления и т.д.).
|
- Добавьте собственные инструменты (например, поиск в интернете, работа с базой данных и т.д.).
|
||||||
* Измените `system_prompt`, чтобы агент отвечал в нужном стиле.
|
- Настройте более сложный `system_prompt` для конкретных задач.
|
||||||
* Попробуйте запустить несколько диалогов с разными `thread_id` – они будут независимыми.
|
- Используйте разные `thread_id`, чтобы вести несколько независимых разговоров одновременно.
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## Поддержка
|
**Автор:** *Ваша команда*
|
||||||
|
**Дата:** 27 мая 2026 г.
|
||||||
Если возникли вопросы или проблемы, откройте issue в репозитории.
|
|
||||||
Reference in New Issue
Block a user