Экзамен: Самокорректирующийся агент: README.md
This commit is contained in:
@@ -1,3 +1,98 @@
|
|||||||
# task-6a1864fa-ekzamen-samokorrektiruyus
|
# Самокорректирующийся агент (LangGraph)
|
||||||
|
|
||||||
Решения домашних заданий
|
## Описание
|
||||||
|
Проект демонстрирует реализацию **самокорректирующегося агента** на базе `LangGraph`.
|
||||||
|
Агент получает задачу, выполняет её через ненадёжный инструмент (`unreliable_tool`), затем LLM‑as‑judge проверяет результат. Если проверка не прошла и количество попыток меньше `max_attempts`, агент повторяет выполнение. Цикл продолжается до получения статуса `success` или исчерпания лимита попыток.
|
||||||
|
|
||||||
|
### Состояние графа (`AgentState`)
|
||||||
|
```python
|
||||||
|
class AgentState(TypedDict):
|
||||||
|
task: str # исходная задача
|
||||||
|
result: str # результат выполнения инструмента
|
||||||
|
attempts: int # текущая попытка (начинается с 0)
|
||||||
|
status: str # pending | success | failed | max_attempts
|
||||||
|
error: Optional[str] # текст ошибки, если возникла
|
||||||
|
max_attempts: int # лимит попыток
|
||||||
|
```
|
||||||
|
|
||||||
|
### Узлы графа
|
||||||
|
| Узел | Роль |
|
||||||
|
|-----------------|----------------------------------------------------------------------|
|
||||||
|
| `execute_task` | Вызывает `unreliable_tool` (с ~30% вероятностью бросает `ValueError`). |
|
||||||
|
| `verify_result` | LLM‑as‑judge оценивает результат и возвращает строго `"success"` или `"failed"`. |
|
||||||
|
| `handle_error` | Увеличивает `attempts`, сохраняет ошибку и готовит к повторному выполнению. |
|
||||||
|
|
||||||
|
### Граф
|
||||||
|
```
|
||||||
|
START → execute_task → verify_result
|
||||||
|
↓ success → END
|
||||||
|
↓ failed & attempts < max → handle_error → execute_task
|
||||||
|
↓ max_attempts → END
|
||||||
|
```
|
||||||
|
|
||||||
|
## Установка зависимостей
|
||||||
|
```bash
|
||||||
|
# Рекомендуется использовать виртуальное окружение
|
||||||
|
python -m venv venv
|
||||||
|
source venv/bin/activate # Windows: venv\Scripts\activate
|
||||||
|
|
||||||
|
# Установить необходимые пакеты
|
||||||
|
pip install langgraph langchain-openai langchain-ollama
|
||||||
|
```
|
||||||
|
|
||||||
|
> **Важно:** Для работы с OpenAI необходимо задать переменную окружения `OPENAI_API_KEY`.
|
||||||
|
> Если вы предпочитаете Ollama, установите локальную модель и используйте `ChatOllama` вместо `ChatOpenAI` (см. комментарии в коде).
|
||||||
|
|
||||||
|
## Запуск
|
||||||
|
В проекте единственный исполняемый файл — `main.py`.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
python main.py
|
||||||
|
```
|
||||||
|
|
||||||
|
При запуске скрипт выводит:
|
||||||
|
- номер текущей попытки,
|
||||||
|
- результат выполнения инструмента,
|
||||||
|
- вердикт LLM‑as‑judge,
|
||||||
|
- финальный статус (`success`, `failed` или `max_attempts`).
|
||||||
|
|
||||||
|
### Пример вывода
|
||||||
|
```
|
||||||
|
Attempt 0: Result = 42, Judge = failed
|
||||||
|
Attempt 1: Result = 42, Judge = success
|
||||||
|
Final status: success
|
||||||
|
```
|
||||||
|
|
||||||
|
Если все попытки исчерпаны:
|
||||||
|
```
|
||||||
|
Attempt 0: Result = Error: ..., Judge = failed
|
||||||
|
Attempt 1: Result = Error: ..., Judge = failed
|
||||||
|
Attempt 2: Result = Error: ..., Judge = failed
|
||||||
|
Final status: max_attempts
|
||||||
|
```
|
||||||
|
|
||||||
|
## Как работает пример
|
||||||
|
1. **`unreliable_tool`** – простая функция, которая с вероятностью ~30% бросает `ValueError`, иначе возвращает фиксированный результат (например, `"42"`).
|
||||||
|
2. **LLM‑as‑judge** – запрос к модели (OpenAI GPT‑3.5‑turbo или локальная Ollama) с промптом, требующим ответить **только** словом `success` или `failed` в зависимости от того, совпадает ли результат с ожидаемым значением.
|
||||||
|
3. Граф построен через `StateGraph` и скомпилирован в исполняемый объект, который запускается в цикле до достижения терминального узла.
|
||||||
|
|
||||||
|
## Настройка
|
||||||
|
- Изменить `task` и ожидаемый результат в функции `unreliable_tool` внутри `main.py`.
|
||||||
|
- Подстроить `max_attempts` в начальном состоянии (по умолчанию `3`).
|
||||||
|
- Переключиться между OpenAI и Ollama, заменив импорт и инициализацию LLM:
|
||||||
|
```python
|
||||||
|
# Для OpenAI
|
||||||
|
llm = ChatOpenAI(model="gpt-3.5-turbo", temperature=0)
|
||||||
|
|
||||||
|
# Для Ollama (убедитесь, что модель запущена: ollama run <model>)
|
||||||
|
# from langchain_ollama import ChatOllama
|
||||||
|
# llm = ChatOllama(model="llama3", temperature=0)
|
||||||
|
```
|
||||||
|
|
||||||
|
## Требования
|
||||||
|
- Python 3.10+
|
||||||
|
- Доступ к интернету (для OpenAI) **или** запущенный локальный Ollama сервер.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
*Это README охватывает только основной файл проекта `main.py`. При добавлении новых файлов достаточно дополнить разделы «Запуск» и «Пример использования» соответствующими инструкциями.*
|
||||||
Reference in New Issue
Block a user