Практическое задание №3: Память и подтверждение действий: README.md

This commit is contained in:
2026-05-27 09:40:33 +00:00
parent bf7b326d41
commit e1259d7e5b
@@ -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. Добавить строку [Agent] Предлагаю использовать инструмент "search". Подтвердить? (yes/no)
2. Показать все строки ```
3. Удалить строку 3. **Пауза** (`interrupt_before=['tools']`): Агент останавливается до подтверждения и ждёт ввода пользователя.
4. Выход
Выберите действие: 1
Введите строку для сохранения: Hello, world!
✅ Строка успешно добавлена.
=== Меню === ## Как добавить новый инструмент
...
```
#### Удаление 1. Создайте функцию в `tools.py`.
2. Зарегистрируйте её в списке `tools=[...]` при создании агента.
3. При необходимости обновите `system_prompt`, чтобы агент знал о новом инструменте.
```text ## Тестирование
> python main.py
... (выбираем пункт 3)
Введите номер строки для удаления: 2
Вы уверены, что хотите удалить строку "Пример"? [y/N]: y
✅ Строка удалена.
```
--- Для проверки работы можно использовать простые тесты:
## Как это работает
- **`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
---