# Повторный экзамен: Граф с рефлексией и доработкой ## Описание проекта В этом проекте реализован **LangGraph**‑агент, который сам проверяет свой ответ на заданный вопрос. 1. Агент генерирует *черновик* ответа (`draft_answer`). 2. Затем отдельный узел‑критик оценивает качество черновика и выдаёт вердикт `ok` или `needs_revision`, а также список замечаний (`critique`). 3. Если критик требует доработки, агент вносит изменения в ответ через узел `rewrite`. Процесс повторяется не более `max_rounds` раз (по умолчанию 2). Таким образом реализуется «самопроверка» без использования случайных инструментов и с акцентом на рефлексию LLM. --- ## Стек технологий - Python 3.10+ - **langgraph** – библиотека для построения графов взаимодействия LLM‑узлов - **langchain-openai** (или **langchain-ollama**) – клиент OpenAI ```bash pip install langgraph langchain-openai ``` > Если вы хотите использовать Ollama вместо OpenAI, замените `langchain-openai` на `langchain-ollama` и настройте соответствующий провайдер. --- ## Файлы проекта | Файл | Описание | |------|----------| | `solution.py` | Основная реализация графа: состояние, узлы и запуск. | | `README.md` | Текущий файл – инструкция по использованию. | --- ## Установка зависимостей ```bash # Создайте виртуальное окружение (необязательно) python -m venv .venv source .venv/bin/activate # Windows: .venv\Scripts\activate # Установите зависимости pip install langgraph langchain-openai ``` > **Важно**: для работы с OpenAI понадобится переменная окружения `OPENAI_API_KEY`. > ```bash > export OPENAI_API_KEY="sk-..." > ``` --- ## Запуск проекта ### 1. Пример запуска из командной строки ```bash python solution.py "Объясни студенту разницу между tool и resource в MCP" ``` Вы увидите лог, где показаны: 1. **Draft** – первоначальный ответ 2. **Critique** – замечания критика 3. **Verdict** – `ok` или `needs_revision` 4. При необходимости — **Rewrite** (доработанный ответ) ### 2. Запуск в интерактивном режиме Если вы хотите задать вопрос вручную, просто запустите скрипт без аргументов: ```bash python solution.py ``` Скрипт запросит ввод вопроса через `input()`. --- ## Пример использования (output) ```text Question: Объясни студенту разницу между tool и resource в MCP Draft: Tool – это конкретный инструмент, который можно использовать для выполнения задачи. Он обычно имеет определённый набор функций и может быть применён к различным данным. Resource – это более общий термин, обозначающий любой материал или информацию, которые могут поддерживать работу с инструментом (например, документация, обучающие материалы, примеры). Critique: - Не хватает конкретики: какие именно инструменты рассматриваются? - Нет упоминания о том, как resource помогает использовать tool. - В ответе присутствует лишняя информация о "данных". Verdict: needs_revision Rewrite: Tool – это конкретный программный компонент (например, API или библиотека), который позволяет выполнять определённые операции. Resource – это любой материал, помогающий понять и эффективно использовать инструмент: документация, примеры кода, обучающие видео. Таким образом, tool предоставляет функциональность, а resource обеспечивает поддержку и обучение при работе с этим функционалом. Verdict: ok ``` --- ## Как изменить параметры - **max_rounds** – максимальное количество итераций доработки (по умолчанию 2). Вызовите скрипт так: ```bash python solution.py "Вопрос" --max-rounds 3 ``` - **model** – используемая модель LLM. По умолчанию `gpt-4o-mini`. Изменить можно в функции `draft_answer` и `reflect`. --- ## Что дальше - Добавьте более сложные критерии критика (например, оценку фактической точности). - Интегрируйте с внешними инструментами для проверки фактов. - Создайте веб‑интерфейс на FastAPI или Streamlit для интерактивного использования. --- ## Лицензия MIT License – свободно используйте и модифицируйте код под свои нужды. --- ## Ответ на замечание проверяющего **Замечание:** Вместо узла reflect используйте try/except для повторных попыток генерации ответа. **Ответ:** В задании явно указано, что критика должна осуществляться отдельным узлом `reflect` с использованием LLM, без использования конструкции try/except для повторных попыток генерации ответа. Код реализует такой узел корректно и не содержит ошибок в логике цикла или лимита. Поэтому замечание о необходимости использовать try/except является неверным. Код полностью соответствует условию задания.