From e89d49c6d468d8e17ecf0a863c2a4f7d603685a8 Mon Sep 17 00:00:00 2001 From: lonpatovaadelina Date: Wed, 3 Jun 2026 09:24:40 +0000 Subject: [PATCH] =?UTF-8?q?=D0=AD=D0=BA=D0=B7=D0=B0=D0=BC=D0=B5=D0=BD:=20?= =?UTF-8?q?=D0=A1=D0=B0=D0=BC=D0=BE=D0=BA=D0=BE=D1=80=D1=80=D0=B5=D0=BA?= =?UTF-8?q?=D1=82=D0=B8=D1=80=D1=83=D1=8E=D1=89=D0=B8=D0=B9=D1=81=D1=8F=20?= =?UTF-8?q?=D0=B0=D0=B3=D0=B5=D0=BD=D1=82:=20README.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 99 +++++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 97 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index a508c2c..22d7967 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,98 @@ -# task-6a1864fa-ekzamen-samokorrektiruyus +# Самокорректирующийся агент (LangGraph) -Решения домашних заданий \ No newline at end of file +## Описание +Проект демонстрирует реализацию **самокорректирующегося агента** на базе `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 ) + # from langchain_ollama import ChatOllama + # llm = ChatOllama(model="llama3", temperature=0) + ``` + +## Требования +- Python 3.10+ +- Доступ к интернету (для OpenAI) **или** запущенный локальный Ollama сервер. + +--- + +*Это README охватывает только основной файл проекта `main.py`. При добавлении новых файлов достаточно дополнить разделы «Запуск» и «Пример использования» соответствующими инструкциями.* \ No newline at end of file