Практическое задание №3: Память и подтверждение действий: README.md
This commit is contained in:
+78
-84
@@ -1,129 +1,123 @@
|
|||||||
# Практическое задание №3
|
# Практическое задание №3: Память и подтверждение действий
|
||||||
**Память и подтверждение действий**
|
|
||||||
|
|
||||||
---
|
## Описание проекта
|
||||||
|
В этом задании вы доработаете агента из предыдущих практических работ, добавив:
|
||||||
|
- **Память разговора** – агент будет помнить все сообщения в рамках одного диалога.
|
||||||
|
- **Механизм подтверждения** – перед выполнением любого инструмента пользователь получает запрос на подтверждение.
|
||||||
|
|
||||||
## Описание
|
Для красивого вывода в консоли используется библиотека `rich`.
|
||||||
|
|
||||||
В этом проекте реализована простая консольная утилита, которая демонстрирует работу с памятью (сохранение данных в файл) и подтверждением пользовательских действий.
|
|
||||||
|
|
||||||
Основные возможности:
|
|
||||||
|
|
||||||
- **Сохранение** введённых пользователем строк в JSON‑файл.
|
|
||||||
- **Загрузка** ранее сохранённого списка строк при запуске программы.
|
|
||||||
- **Подтверждение** удаления элемента из памяти через диалог «Да/Нет».
|
|
||||||
- Красивый вывод сообщений и таблиц с помощью библиотеки `rich`.
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## Структура проекта
|
## Структура проекта
|
||||||
|
|
||||||
```
|
```
|
||||||
memory_confirm/
|
project/
|
||||||
├── data.json # Хранилище (создаётся при первом запуске)
|
├── agent.py # Основной скрипт с реализацией агента
|
||||||
├── main.py # Точка входа
|
├── tools.py # Пользовательские инструменты
|
||||||
└── utils.py # Вспомогательные функции
|
└── README.md # Это файл
|
||||||
```
|
```
|
||||||
|
|
||||||
- **`main.py`** – основной скрипт, который запускает CLI‑интерфейс.
|
|
||||||
- **`utils.py`** – содержит функции для чтения/записи JSON и подтверждения действий.
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## Установка зависимостей
|
## Установка зависимостей
|
||||||
|
|
||||||
```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
|
||||||
|
|
||||||
# Установите зависимости из requirements.txt
|
# Установите все необходимые пакеты
|
||||||
pip install -r requirements.txt
|
pip install langgraph rich openai # добавьте другие зависимости при необходимости
|
||||||
```
|
```
|
||||||
|
|
||||||
`requirements.txt` содержит:
|
> **Важно** – `rich` нужен только для вывода, но без него скрипт будет работать.
|
||||||
|
|
||||||
```text
|
## Как запустить каждый файл
|
||||||
rich>=13.0.0
|
|
||||||
```
|
|
||||||
|
|
||||||
Если файла `requirements.txt` нет, установите вручную:
|
### 1. `tools.py`
|
||||||
|
Содержит пользовательские инструменты (например, поиск в интернете, вычисления и т.д.).
|
||||||
|
Запуск не требуется отдельно – он импортируется в `agent.py`.
|
||||||
|
|
||||||
|
### 2. `agent.py`
|
||||||
|
Главный скрипт, который запускает агента.
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
pip install rich
|
python agent.py
|
||||||
```
|
```
|
||||||
|
|
||||||
---
|
При запуске вы увидите интерактивную сессию:
|
||||||
|
|
||||||
## Запуск программы
|
1. Введите сообщение.
|
||||||
|
2. Агент сформулирует запрос к инструменту и попросит подтвердить действие.
|
||||||
|
3. После подтверждения (`yes`/`no`) агент выполнит инструмент или отменит его.
|
||||||
|
|
||||||
### 1. Через команду
|
### 3. Пример запуска в режиме потоковой печати
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
python main.py
|
python agent.py --stream
|
||||||
```
|
```
|
||||||
|
|
||||||
После запуска вы увидите меню:
|
Параметр `--stream` заставляет выводить ответы построчно, как это делает `rich`.
|
||||||
|
|
||||||
```
|
## Пример использования
|
||||||
=== Меню ===
|
|
||||||
1. Добавить строку
|
```python
|
||||||
2. Показать все строки
|
# Внутри agent.py (или в интерактивной сессии)
|
||||||
3. Удалить строку
|
from langgraph.checkpoint.memory import MemorySaver
|
||||||
4. Выход
|
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
|
||||||
```
|
```
|
||||||
|
|
||||||
### 2. Пример использования
|
### Что происходит при запуске
|
||||||
|
|
||||||
```text
|
1. **Память**: `MemorySaver` сохраняет все сообщения и состояния агента для конкретного `thread_id`. При повторном вызове с тем же ID агент «видит» историю.
|
||||||
> python main.py
|
2. **Подтверждение**: Когда агент планирует вызвать инструмент, он выводит запрос вида:
|
||||||
=== Меню ===
|
|
||||||
1. Добавить строку
|
|
||||||
2. Показать все строки
|
|
||||||
3. Удалить строку
|
|
||||||
4. Выход
|
|
||||||
Выберите действие: 1
|
|
||||||
Введите строку для сохранения: Hello, world!
|
|
||||||
✅ Строка успешно добавлена.
|
|
||||||
|
|
||||||
=== Меню ===
|
|
||||||
...
|
|
||||||
```
|
```
|
||||||
|
[Agent] Предлагаю использовать инструмент "search". Подтвердить? (yes/no)
|
||||||
#### Удаление
|
|
||||||
|
|
||||||
```text
|
|
||||||
> python main.py
|
|
||||||
... (выбираем пункт 3)
|
|
||||||
Введите номер строки для удаления: 2
|
|
||||||
Вы уверены, что хотите удалить строку "Пример"? [y/N]: y
|
|
||||||
✅ Строка удалена.
|
|
||||||
```
|
```
|
||||||
|
3. **Пауза** (`interrupt_before=['tools']`): Агент останавливается до подтверждения и ждёт ввода пользователя.
|
||||||
|
|
||||||
---
|
## Как добавить новый инструмент
|
||||||
|
|
||||||
## Как это работает
|
1. Создайте функцию в `tools.py`.
|
||||||
|
2. Зарегистрируйте её в списке `tools=[...]` при создании агента.
|
||||||
|
3. При необходимости обновите `system_prompt`, чтобы агент знал о новом инструменте.
|
||||||
|
|
||||||
- **`utils.load_data()`** читает `data.json`. Если файл отсутствует – создаётся пустой список.
|
## Тестирование
|
||||||
- **`utils.save_data(data)`** сохраняет список в JSON‑файл с отступом 4 пробела.
|
|
||||||
- **`utils.confirm(prompt)`** выводит запрос через `rich.prompt.Prompt.ask`, ожидая ответа `y/n`.
|
|
||||||
|
|
||||||
---
|
Для проверки работы можно использовать простые тесты:
|
||||||
|
|
||||||
## Тесты
|
|
||||||
|
|
||||||
Для проверки корректности работы можно запустить:
|
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
python -m unittest discover tests
|
python -m unittest discover tests
|
||||||
```
|
```
|
||||||
|
|
||||||
(Если тестовые файлы находятся в каталоге `tests/`.)
|
> Убедитесь, что у вас есть файл `tests/` с соответствующими проверками.
|
||||||
|
|
||||||
---
|
## FAQ
|
||||||
|
|
||||||
|
| Вопрос | Ответ |
|
||||||
|
|--------|-------|
|
||||||
|
| Как изменить `thread_id`? | Передайте новый ID в `config = {"configurable": {"thread_id": "новый-id"}}`. |
|
||||||
|
| Что делать, если инструмент не подтверждается? | Агент просто пропускает вызов и продолжает диалог. |
|
||||||
|
| Можно ли отключить память? | Уберите `checkpointer=memory` при создании агента – тогда каждый запрос будет независимым. |
|
||||||
|
|
||||||
## Лицензия
|
## Лицензия
|
||||||
|
|
||||||
MIT © 2026.
|
MIT © 2026
|
||||||
---
|
|
||||||
Reference in New Issue
Block a user