Как спроектировать агента, который может самоисправляться (self-correction)?
Краткий тезис
Self-correction (самоисправление) — это способность AI-агента обнаруживать и исправлять ошибки в собственном ответе без вмешательства человека. Ключевая идея — ввести второго агента (критика), который проверяет выход первого и даёт обратную связь для итеративного улучшения. Проектирование такого агента требует продумать архитектуру «исполнитель-критик», механизм обратной связи, критерии остановки и баланс между качеством и вычислительными затратами.
1. Термин: Self-correction (самоисправление)
Self-correction — это процесс, в котором агент после генерации ответа анализирует его на наличие ошибок (фактических, логических, стилистических) и, при необходимости, перегенерирует с учётом найденных проблем. В контексте Agentic RAG это особенно важно, так как агент может опираться на неверно извлечённые документы или неправильно интерпретировать контекст.
Зачем нужно self-correction
- Снижение галлюцинаций (hallucinations)
- Повышение фактической точности (factual accuracy)
- Улучшение релевантности ответа запросу
- Возможность исправить ошибки, не перезапуская весь пайплайн
2. Базовая архитектура: агент-исполнитель + агент-критик
Самая распространённая архитектура — два компонента:
| Компонент | Роль | Пример реализации |
|---|---|---|
| Агент-исполнитель (Actor) | Генерирует первоначальный ответ на основе контекста (RAG, инструменты) | LLM с промптом для ответа |
| Агент-критик (Critic) | Проверяет ответ на ошибки, даёт структурированный фидбек | Отдельный LLM-вызов с промптом-критиком |
Взаимодействие
- Исполнитель получает запрос и контекст → генерирует ответ.
- Критик получает запрос, контекст и ответ → выдаёт оценку и список проблем.
- Если критика обнаружила ошибки → исполнитель перегенерирует ответ с учётом фидбека.
- Цикл повторяется до 1–3 раз или пока ответ не пройдёт проверку.
3. Механизм обратной связи: как критик передаёт feedback
Критик должен выдавать структурированный фидбек, который исполнитель может интерпретировать. Пример формата:
{
"is_correct": false,
"issues": [
{"type": "factual_error", "description": "Утверждение X не подтверждается документами", "suggestion": "Заменить на Y"},
{"type": "missing_info", "description": "Не упомянут важный аспект Z", "suggestion": "Добавить абзац про Z"}
],
"score": 0.6
}
Варианты передачи
- Текстовый фидбек — критик пишет естественным языком, что не так.
- Структурированный (JSON) — легче парсить, можно передавать в system prompt исполнителя.
- Дискретные метки — только «исправить»/«принять», без деталей (менее эффективно).
4. Итеративный процесс: количество итераций и условия остановки
Сколько итераций Обычно 1–3. Больше — растёт latency и стоимость, а улучшение насыщается.
Условия остановки
- Критик поставил оценку выше порога (например, score > 0.9)
- Критик не нашёл ошибок (
is_correct: true) - Достигнуто максимальное число итераций
- Ответ не изменился после предыдущей итерации (зацикливание)
Пример цикла на Python (псевдокод):
def self_correcting_agent(query, context, max_iterations=3):
answer = actor(query, context)
for i in range(max_iterations):
feedback = critic(query, context, answer)
if feedback["is_correct"]:
break
answer = actor(query, context, feedback=feedback)
return answer
5. Типы проверок, выполняемых критиком
Критик может проверять разные аспекты:
| Тип проверки | Что проверяет | Пример ошибки |
|---|---|---|
| Фактическая точность | Соответствие ответа извлечённым документам | «Температура кипения воды 120°C» (должно быть 100°C) |
| Релевантность | Ответ отвечает на вопрос пользователя | Вопрос про цены, ответ про сроки доставки |
| Полнота | Не упущены ли важные детали | В ответе нет упоминания исключений |
| Безопасность | Нет ли токсичного или вредного контента | Агент даёт медицинский совет без оговорок |
| Стиль и формат | Соответствие заданному шаблону | Ответ не в формате JSON, хотя требовалось |
6. Реализация критика: промпт-инжиниринг, fine-tuning, внешние инструменты
Промпт-инжиниринг — самый простой способ. Пример промпта критика:
Ты — критик. Проверь ответ на следующие критерии:
1. Все ли утверждения подтверждаются документами?
2. Полно ли ответ покрывает вопрос?
3. Нет ли противоречий?
Выдай JSON с полями "is_correct", "issues" (массив объектов с type, description, suggestion).
Fine-tuning — если нужно повысить точность критика под конкретную предметную область. Обучаем LLM на парах (ответ, размеченные ошибки).
Внешние инструменты — критик может вызывать поиск, калькулятор, базу знаний для верификации фактов. Например, если агент утверждает «население Москвы 12 млн», критик может сделать запрос к API и сверить.
7. Примеры фреймворков и подходов
| Название | Описание |
|---|---|
| Reflexion (Shinn et al., 2023) | Агент генерирует ответ, затем «размышляет» о своих ошибках, записывая их в память, и перегенерирует. |
| Self-RAG (Asai et al., 2023) | Модель генерирует несколько вариантов, затем сама оценивает их релевантность и фактичность, выбирая лучший. |
| CRAG (Corrective RAG) | Если retrieval дал низкое качество, агент запускает веб-поиск или переформулирует запрос. |
| LangGraph (LangChain) | Позволяет строить граф состояний с узлами-агентами и условными переходами для циклов коррекции. |
8. Ограничения и компромиссы
| Проблема | Описание | Как смягчить |
|---|---|---|
| Latency | Каждая итерация добавляет время ответа | Ограничить число итераций, использовать лёгкую модель для критика |
| Cost | Дополнительные токены для критика и перегенерации | Использовать дешёвую модель (например, GPT-4o-mini) для критика |
| Overcorrection | Критик может ошибочно забраковать правильный ответ | Настроить порог уверенности, добавить человеческую валидацию для редких случаев |
| Зацикливание | Агент бесконечно переделывает ответ | Ввести детектор неизменности (если ответ не изменился — остановить) |
| Качество критика | Если критик плох, коррекция может ухудшить ответ | Обучать критика на качественных данных, использовать ансамбль критиков |
9. Метрики оценки self-correction
Чтобы понять, работает ли self-correction, нужны метрики:
- Improvement rate — доля запросов, где после коррекции ответ стал лучше (по оценке человека или автоматической метрике).
- Correction accuracy — доля исправлений, которые действительно улучшили ответ.
- Average iterations — среднее число итераций на запрос.
- Cost per query — среднее количество токенов на один запрос.
- Latency p95 — 95-й перцентиль времени ответа.
10. Сравнение с другими подходами
| Подход | Описание | Self-correction vs |
|---|---|---|
| ReAct (Reason+Act) | Агент чередует рассуждение и действия (вызов инструментов) | Self-correction — дополнительный этап после генерации; ReAct исправляет ошибки в процессе, а не постфактум |
| Plan-and-Execute | Агент сначала составляет план, затем выполняет шаги | Self-correction может применяться после выполнения плана для проверки результата |
| Tool-use | Агент вызывает внешние API для получения данных | Self-correction может использовать те же инструменты для верификации |
| Multi-agent debate | Несколько агентов обсуждают ответ и приходят к консенсусу | Self-correction — частный случай с двумя агентами (исполнитель + критик) |
11. Практические рекомендации по проектированию
- Начинайте с простого — сначала реализуйте однопроходную генерацию, затем добавьте критика.
- Используйте лёгкую модель для критика — например, GPT-4o-mini или локальную Llama 3.1 8B.
- Дайте критику доступ к контексту — он должен видеть те же документы, что и исполнитель.
- Структурируйте фидбек — JSON с типом ошибки и предложением по исправлению.
- Ограничьте итерации — 2–3 обычно достаточно, больше — перерасход.
- Логируйте все итерации — для анализа и отладки.
- Тестируйте на бенчмарках — например, на наборе вопросов с известными правильными ответами.
Пет-проект для закрепления
Задача Создать агента-помощника, который отвечает на вопросы по технической документации (например, по Python) и самоисправляется.
Инструменты
- Python, OpenAI API (или другая LLM)
- LangChain / LangGraph для построения графа
- FAISS или Chroma для векторного поиска
Шаги:
- Загрузите документацию (например, несколько страниц из Python docs) и разбейте на чанки.
- Создайте векторное хранилище и реализуйте retrieval.
- Напишите два промпта:
actor_prompt(генерирует ответ на основе контекста) иcritic_prompt(проверяет ответ на фактические ошибки, сравнивая с контекстом). - Реализуйте цикл: actor → critic → (если ошибки) actor с фидбеком → до 3 итераций.
- Оцените improvement rate на 20 вопросах (сравните ответы до и после коррекции вручную).
Ожидаемый результат Вы увидите, что после self-correction ответы становятся точнее, хотя latency возрастает в 2–3 раза. Вы сможете настроить порог и число итераций.
Связь с другими вопросами
| Вопрос | Тема |
|---|---|
| 142 | Как спроектировать агента с планированием (planning)? |
| 145 | Как организовать мультиагентную систему? |
| 147 | Как обеспечить безопасность агента? |
| 148 | Как обеспечить наблюдаемость (observability) агента? |
| 150 | Как оценивать качество работы агента? |
Навигация
- Предыдущий: 148
- Следующий: 150
- Индекс: 00. Индекс разборов