Generator Evaluator

Паттерн «генератор + внешний оценщик»: качество обеспечивает не самооценка модели, а отдельный верификатор. Опирается на асимметрию: проверить решение легче и дешевле, чем создать. Для длинных задач разворачивается в трио Planner / Generator / Evaluator (harness-дизайн Anthropic).

Суть

Генератор выдаёт варианты, верификатор отбирает/судит. Самооценке агента доверять нельзя: «агенты уверенно хвалят свою работу, даже посредственную» — особенно на субъективных задачах (дизайн), где нет бинарного теста. Поэтому оценщик выносится наружу.

Зачем это нужно

Одиночная модель в долгой автономной сессии «сходит с рельсов» и переоценивает себя. Внешний оценщик с явными критериями ловит брак, который модель приняла бы «на слово». Важно: если верификатор слабее генератора — система деградирует («слепой ведёт слепого»), поэтому верификатор должен быть сильным, а генератор может быть дешёвым.

Как работает

  • Best-of-N / Search against Verifier — генерируем N вариантов (повышая temperature), строгая модель-судья выбирает лучший. Так внутри работают Claude Code и топовые код-агенты.
  • Trust Gate / Executable Spec Layer — где есть объективная проверка, оценщик = автотесты (Pytest), которые агент не может изменить; при провале агент получает лог ошибки и переписывает решение (см. DoD в Agent Evals).
  • Planner / Generator / Evaluator (harness Anthropic) — трёхагентная архитектура для многочасовых сессий: планировщик декомпозирует, генератор пишет, оценщик критикует по критериям. Цикл генератор↔оценщик соответствует review/QA в обычной разработке.
  • Context resets — против «context anxiety» оценщик/оркестратор сбрасывает контекст и передаёт следующему агенту структурированный handoff-артефакт (отличие от compaction — см. Context Window).

Пример

Best-of-N: генератор выдаёт N вариантов (повышенная температура → разнообразие), отдельный верификатор оценивает каждый (проверить легче, чем сгенерировать), возвращается лучший.

def best_of_n(query, n=3):
    candidates = [think_then_answer(query, temperature=0.7).answer for _ in range(n)]  # N вариантов
    scored = [{"answer": c, **verifier_score(query, c)} for c in candidates]           # внешний судья
    scored.sort(key=lambda x: x["score"], reverse=True)
    return scored[0]                                                                   # лучший по оценке

Связано с

  • Agent Architecture — где этот слой встраивается в master loop
  • Agent Evals — Trust Gate / executable spec как форма оценки
  • Plan and Execute — Planner здесь = планировщик из plan-and-execute
  • Reasoning Effort — почему внешняя оценка надёжнее самокоррекции (нюанс риска self-reflection)

Открытые вопросы

  • сколько вариантов N окупается в Best-of-N
  • как строить evaluator для субъективных задач без бинарного теста (rubric-критерии)