122 lines
4.4 KiB
Markdown
122 lines
4.4 KiB
Markdown
# Практическое задание №3
|
||
## Память и подтверждение действий
|
||
|
||
> **Цель** – доработать агента из предыдущих заданий: добавить память разговора и механизм подтверждения каждого вызова инструмента пользователем.
|
||
|
||
---
|
||
|
||
## Описание проекта
|
||
|
||
В этом репозитории реализован простой чат‑бот на базе LangChain, который умеет:
|
||
|
||
- хранить историю диалога (память) при помощи `MemorySaver`;
|
||
- запрашивать у пользователя подтверждение перед выполнением любого внешнего инструмента;
|
||
- выводить сообщения в красивом формате с помощью библиотеки `rich`.
|
||
|
||
Бот использует Ollama‑LLM (`llama3`) и два вспомогательных файла:
|
||
|
||
| Файл | Описание |
|
||
|------|----------|
|
||
| `agent.py` | Определяет агента, инструменты и логику подтверждения. |
|
||
| `client.py` | Точка входа: запускает интерактивный чат с пользователем. |
|
||
|
||
---
|
||
|
||
## Предварительные требования
|
||
|
||
- Python **3.11+** (рекомендуется 3.12)
|
||
- Ollama установлен и запущен локально:
|
||
```bash
|
||
ollama pull llama3
|
||
```
|
||
- Установлен пакет `rich` для красивого вывода в консоль.
|
||
|
||
---
|
||
|
||
## Установка
|
||
|
||
```bash
|
||
# Клонируйте репозиторий
|
||
git clone https://github.com/yourusername/langchain-memory-confirmation.git
|
||
cd langchain-memory-confirmation
|
||
|
||
# Создайте виртуальное окружение (опционально)
|
||
python -m venv .venv
|
||
source .venv/bin/activate # Windows: .venv\Scripts\activate
|
||
|
||
# Установите зависимости
|
||
pip install -r requirements.txt
|
||
```
|
||
|
||
`requirements.txt` содержит:
|
||
|
||
```text
|
||
langchain==0.2.*
|
||
langgraph==0.1.*
|
||
langchain-ollama==0.0.*
|
||
rich>=13.0
|
||
```
|
||
|
||
---
|
||
|
||
## Запуск
|
||
|
||
```bash
|
||
python client.py
|
||
```
|
||
|
||
После запуска бот будет ждать вашего ввода в консоли. При каждом запросе к инструменту он попросит подтвердить действие, например:
|
||
|
||
```
|
||
> Какова цена товара "X"?
|
||
[Bot] Пожалуйста, подтвердите вызов инструмента get_price для аргументов: {'product': 'X'} (y/n):
|
||
```
|
||
|
||
Введите `y` – инструмент выполнится; `n` – запрос будет отменён.
|
||
|
||
---
|
||
|
||
## Пример работы
|
||
|
||
```text
|
||
> Какова цена товара "Кофе"?
|
||
[Bot] Пожалуйста, подтвердите вызов инструмента get_price для аргументов: {'product': 'Кофе'} (y/n): y
|
||
[Bot] Цена продукта Кофе: 5.00 USD
|
||
|
||
> Сколько стоит товар "Чай"?
|
||
[Bot] Пожалуйста, подтвердите вызов инструмента get_price для аргументов: {'product': 'Чай'} (y/n): n
|
||
[Bot] Операция отменена.
|
||
```
|
||
|
||
Память сохраняет все предыдущие сообщения, поэтому бот может использовать их в дальнейшем диалоге.
|
||
|
||
---
|
||
|
||
## Как это работает
|
||
|
||
1. **MemorySaver** хранит историю сообщений в памяти процесса.
|
||
2. В `agent.py` каждый инструмент помечен декоратором `@tool`.
|
||
3. При вызове инструмента агент выводит запрос на подтверждение через `rich.console.Console()`.
|
||
Если пользователь отвечает `y`, инструмент выполняется; иначе – операция отменяется.
|
||
|
||
---
|
||
|
||
## Тесты
|
||
|
||
Для запуска тестов (если есть) используйте:
|
||
|
||
```bash
|
||
pytest tests/
|
||
```
|
||
|
||
---
|
||
|
||
## Вклад
|
||
|
||
Если хотите улучшить проект, откройте issue или pull request. Убедитесь, что все изменения проходят линтер (`ruff`) и тесты.
|
||
|
||
---
|
||
|
||
## Лицензия
|
||
|
||
MIT © 2026 |