Архитектура рефлексирующего ИИ-агента: медленное мышление в быстрых системах | AiManual
AiManual Logo Ai / Manual.
30 Апр 2026 Гайд

Архитектура рефлексирующего ИИ-агента: как встроить медленное мышление в быстрые системы (с кодом на Python)

Пошаговый гайд с кодом на Python: как встроить рефлексию в ИИ-агента, чтобы снизить галлюцинации и каскадные ошибки. Архитектура, компоненты, примеры.

Галлюцинации - это не баг, а фича? Скажите это тому, кто потерял два дня, отлаживая код, сгенерированный ИИ, который уверенно врал про 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  # возвращаем последний ответ, если превысили лимит
💡
Обрати внимание: рефлексия вызывает более дорогую модель (gpt-4o), а исполнение — дешёвую (gpt-4o-mini). Так мы экономим, не теряя в качестве. Такой же паттерн используется в архитектуре Claude Code.

Нюансы и грабли, на которые я наступал

Проблема 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 — современные маленькие модели неплохо справляются.

Может ли рефлексия быть асинхронной?

Да, можно запускать несколько рефлексий параллельно (разные аспекты) и потом агрегировать. Это ускоряет процесс.

Подписаться на канал