96 lines
4.3 KiB
Markdown
96 lines
4.3 KiB
Markdown
# Human‑in‑the‑Loop via Middleware
|
||
|
||
## 📖 Описание
|
||
В этом проекте реализован агент на базе LangChain, который при каждом вызове инструмента останавливается и запрашивает подтверждение пользователя.
|
||
* **HumanInTheLoopMiddleware** автоматически формирует запрос к пользователю (в терминале) с описанием того, что планирует сделать агент.
|
||
* Пользователь вводит одно из решений: `approve`, `reject` или `edit`. После этого выполнение возобновляется через команду `Command(resume={"decisions": [...]})`.
|
||
|
||
Таким образом, пользователь всегда контролирует действия агента и может корректировать их в реальном времени.
|
||
|
||
## 📦 Установка зависимостей
|
||
```bash
|
||
# Создайте виртуальное окружение (рекомендовано)
|
||
python -m venv .venv
|
||
source .venv/bin/activate # Windows: .venv\Scripts\activate
|
||
|
||
# Установите зависимости из requirements.txt
|
||
pip install -r requirements.txt
|
||
```
|
||
|
||
`requirements.txt`
|
||
```txt
|
||
langchain==0.2.*
|
||
langgraph==0.1.*
|
||
openai==1.*
|
||
python-dotenv==1.*
|
||
```
|
||
|
||
> **Важно**:
|
||
> * `checkpointer=MemorySaver()` нужен для сохранения состояния паузы, иначе агент не сможет возобновиться после подтверждения.
|
||
> * Убедитесь, что переменная окружения `OPENAI_API_KEY` установлена (или используйте `.env` файл).
|
||
|
||
## 🚀 Запуск файлов
|
||
|
||
| Файл | Что делает | Как запустить |
|
||
|------|------------|---------------|
|
||
| `agent.py` | Создаёт агента с middleware и инструментом `get_weather`. | `python agent.py` |
|
||
| `run_agent.py` | Демонстрирует взаимодействие: задаётся вопрос, агент вызывает инструмент, пользователь подтверждает. | `python run_agent.py` |
|
||
|
||
### Пример запуска
|
||
```bash
|
||
# 1️⃣ Запустите агента
|
||
python agent.py
|
||
|
||
# 2️⃣ В другом терминале запустите сценарий взаимодействия
|
||
python run_agent.py
|
||
```
|
||
|
||
## 🧪 Пример использования
|
||
|
||
```python
|
||
from langchain.agents import create_agent
|
||
from langgraph.checkpoint.memory import MemorySaver
|
||
from langchain.agents.middleware import HumanInTheLoopMiddleware
|
||
|
||
# Инициализация памяти для сохранения состояния паузы
|
||
memory = MemorySaver()
|
||
|
||
agent = create_agent(
|
||
model=llm,
|
||
tools=[get_weather],
|
||
system_prompt="Ты полезный ассистент",
|
||
middleware=[
|
||
HumanInTheLoopMiddleware(
|
||
interrupt_on={
|
||
"get_weather": True, # разрешаем все решения: approve, edit, reject
|
||
},
|
||
description_prefix="Подтвердите вызов инструмента",
|
||
),
|
||
],
|
||
checkpointer=memory,
|
||
)
|
||
|
||
# Запрос к агенту
|
||
response = agent.run("Какая погода в Москве?")
|
||
print(response)
|
||
```
|
||
|
||
При выполнении агента вы увидите в терминале запрос вида:
|
||
|
||
```
|
||
[HumanInTheLoop] Подтвердите вызов инструмента:
|
||
Agent wants to call tool 'get_weather' with arguments: {"location": "Moscow"}
|
||
Enter decision (approve/reject/edit):
|
||
```
|
||
|
||
Введите `approve`, и агент продолжит работу, возвращая результат.
|
||
Если ввести `reject` – запрос будет отменён, а если `edit` – можно изменить аргументы перед повторным вызовом.
|
||
|
||
---
|
||
|
||
## 📚 Дополнительные ресурсы
|
||
|
||
* [Документация Human‑in‑the‑Loop — LangChain](https://docs.langchain.com/oss/python/langchain/human-in-the-loop)
|
||
* [LangGraph Checkpointing](https://langgraph.org/docs/checkpoints)
|
||
|
||
--- |