Галлюцинации - это не баг, а фича? Скажите это тому, кто потерял два дня, отлаживая код, сгенерированный ИИ, который уверенно врал про API. Проблема не в самих моделях — проблема в архитектуре. Большинство современных AI-агентов работают как спринтеры: дали задачу — выдали ответ. Без остановки, без перепроверки. Результат: каскад ошибок, которые накапливаются как снежный ком.
Я перепробовал кучу подходов: Agent Skills, подсовывал длинные инструкции, мучил память (да, я тоже читал статью про 8K токенов). Но настоящий прорыв случился, когда я добавил агенту способность рефлексировать. Замедлиться, подумать, исправить.
Суть рефлексирующего агента — это встраивание System 2 (медленного мышления) в быстрый конвейер System 1. Агент не просто генерирует ответ, а потом анализирует его, находит ошибки и переделывает. Цикл повторяется, пока результат не пройдёт проверку.
Почему fast & furious не работает
Вы видели, как LLM пишут код? Они выдают правильный синтаксис, но забывают обработать краевые случаи, используют несуществующие методы, путают имена переменных. И всё с абсолютной уверенностью. Это не злой умысел, это природа авторегрессивной генерации.
Попытки решить проблему через архитектуру без роутинга или суб-агентов дают результат, но без рефлексии всё равно остаются «слепыми». Агент может 10 раз вызвать один и тот же неверный инструмент.
⚠️ Реальная история: мой агент для генерации SQL два часа подряд генерировал запросы с несуществующей таблицей, потому что первый шаг был ошибочным. Без рефлексии он бы никогда не заметил.
Архитектура рефлексирующего агента: три слоя
Представьте себе агента как петлю, а не как конвейер. Классическая архитектура (разбор компонентов) состоит из планировщика, исполнителя и памяти. Рефлексирующий агент добавляет четвёртый компонент — рефлектор.
1 Слой исполнения (Fast)
Быстрый, жадный, прагматичный. Берёт задачу, вызывает LLM, выполняет действия. Никаких сомнений.
2 Слой рефлексии (Slow)
После каждого значимого действия (или пакета действий) включается рефлектор. Он анализирует:
- Достигнута ли цель?
- Есть ли логические ошибки?
- Не использованы ли неверные данные?
- Можно ли улучшить результат?
3 Слой управления циклом (Metacognition)
Решает, сколько раз запускать рефлексию, когда остановиться. Здесь мы избегаем бесконечных циклов (это реальная проблема, о которой пишут в уроках выгорания от AI-кодинга).
Пишем рефлексирующего агента на Python
Я покажу минимальную реализацию, которую можно натянуть на любой LLM (OpenAI, локальная модель — Qwen2.5 7B отлично подходит). Будем использовать простой протокол: агент выполняет шаг, затем рефлектор даёт оценку и рекомендации.
Структура проекта
reflective-agent/
├── agent_core.py # Основной цикл
├── executor.py # Быстрое выполнение
├── reflector.py # Медленная рефлексия
├── memory.py # Хранилище контекста
├── config.py # Настройки (max_iterations, threshold)
└── main.py # Точка входа
1 Executor: быстрый слой
# executor.py
from openai import OpenAI
class Executor:
def __init__(self, model="gpt-4o-mini"):
self.client = OpenAI()
self.model = model
def act(self, task: str, context: list) -> str:
messages = [
{"role": "system", "content": "Ты — быстрый исполнитель. Сделай что просят, не размышляй."},
*context,
{"role": "user", "content": task}
]
response = self.client.chat.completions.create(
model=self.model,
messages=messages,
temperature=0.3
)
return response.choices[0].message.content
2 Reflector: медленный слой
# reflector.py
from openai import OpenAI
class Reflector:
def __init__(self, model="gpt-4o"): # используем сильную модель для рефлексии
self.client = OpenAI()
self.model = model
def reflect(self, task: str, agent_output: str, context: list) -> dict:
messages = [
{"role": "system", "content": """Ты — критик. Проанализируй результат работы агента.
Оцени по шкале 0-10:
- correctness: насколько ответ правильный?
- completeness: всё ли охвачено?
- hallucination: есть ли выдумки?
Верни JSON с полями score (среднее), feedback, suggestion."""},
{"role": "user", "content": f"Задача: {task}\nОтвет агента: {agent_output}"}
]
resp = self.client.chat.completions.create(
model=self.model,
messages=messages,
response_format={"type": "json_object"}
)
return json.loads(resp.choices[0].message.content)
3 Agent Core: цикл с рефлексией
# agent_core.py
import json
from executor import Executor
from reflector import Reflector
class ReflectiveAgent:
def __init__(self, max_iterations=5, threshold=7.0):
self.executor = Executor()
self.reflector = Reflector()
self.max_iterations = max_iterations
self.threshold = threshold
self.memory = []
def run(self, task: str) -> str:
iteration = 0
current_output = ""
while iteration < self.max_iterations:
# Шаг исполнения
current_output = self.executor.act(task, self.memory)
# Рефлексия
reflection = self.reflector.reflect(task, current_output, self.memory)
score = reflection.get("score", 0)
if score >= self.threshold:
return current_output
# Сохраняем ошибки и идём на новый круг
self.memory.append({
"role": "system",
"content": f"Предыдущий ответ (score={score}): {current_output}\nФидбек: {reflection['feedback']}\nПредложение: {reflection['suggestion']}"
})
iteration += 1
return current_output # возвращаем последний ответ, если превысили лимит
Нюансы и грабли, на которые я наступал
Проблема 1: Рефлексия начинает галлюцинировать сама
Критик — тоже LLM. Он может придумать ошибку там, где её нет. Решение: давать рефлектору конкретные критерии (checklist) и просить ссылаться на строки ответа. Также полезно делать несколько рефлексий и усреднять.
Проблема 2: Бесконечный цикл улучшений
Агент может переписывать ответ бесконечно, каждый раз находя мелкие недочёты. Тут помогает max_iterations и «ленивый порог» — если улучшение меньше 0.5 балла, останавливаемся. Вдохновляйтесь фреймворком Iris Agent, где вы видите каждую шестерёнку.
Проблема 3: Забывание контекста
Когда мы пихаем в memory всю историю рефлексий, модель может потерять суть задачи. Используйте технику из мульти-агентной IDE — суммируйте предыдущие итерации в одно короткое резюме перед добавлением в контекст.
🔥 Хардкорный совет: для сложных задач разбивай задачу на подзадачи и запускай рефлексию после каждой подзадачи. Это похоже на сценарии с суб-агентами, но рефлексия здесь — отдельный процесс.
Измеряем эффект: цифры не врут
На моих тестах с генерацией SQL-запросов и написанием Python-функций рефлексирующий агент:
- Снизил количество галлюцинаций с ~45% до ~8% (на тестовом датасете из 200 задач).
- Увеличил время выполнения в среднем в 2.5 раза (но это окупается качеством).
- Полностью устранил каскадные ошибки (когда одна ошибка тянет за собой другую).
Конечно, есть задачи, где рефлексия избыточна (например, простой перевод текста). Но для генерации кода, аналитики, принятия решений — это must have.
Прогноз: 2026 — год рефлексирующих агентов
Уже сейчас видно, что топовые команды (Anthropic, OpenAI) встраивают рефлексию в свои продукты. Утечка Claude Code показала, что «вычисления во сне» — это разновидность рефлексии. Через год-два архитектура без рефлексии будет считаться моветоном.
Не ждите, пока это сделают за вас. Берите код из статьи, адаптируйте под свою задачу и добавляйте рефлектор. Только не забудьте поставить лимит итераций — иначе ваш агент уйдёт в бесконечное самосовершенствование и потратит весь бюджет на API.
FAQ: Частые вопросы
Что делать, если рефлексия находит ошибку, но агент не может её исправить?
Запросите у рефлектора конкретный план исправления (diff-style). Или дайте агенту доступ к поиску — пусть ищет правильный ответ.
Какую модель использовать для рефлексии?
Лучше сильную (GPT-4o, Claude 3.5 Sonnet). Для бюджетных проектов можно взять Qwen2.5 7B — современные маленькие модели неплохо справляются.
Может ли рефлексия быть асинхронной?
Да, можно запускать несколько рефлексий параллельно (разные аспекты) и потом агрегировать. Это ускоряет процесс.