Зачем судья-модель

Три способа оценки из прошлых уроков образуют треугольник компромиссов. LLM-as-judge занимает золотую середину — и именно поэтому стал рабочей лошадкой оценки LLM.

СпособМасштабПонимает смыслЦена
Код-метрики✅ огромный❌ только формальное✅ ~0
Человек❌ маленький✅ полностью❌ дорого/медленно
LLM-judge✅ большой🟡 неплохо🟡 дёшево (токены)

Судья закрывает разрыв: оценивает смысловое качество (полезность, релевантность, тон), которое коду не под силу, но делает это на объёме, недоступном человеку. Типичные применения: массовая оценка в offline-экспериментах, quality-метрика на проде (на сэмпле трафика), автоматический скоринг в CI, вычисление метрик вроде RAGAS-faithfulness.

⚠️ Судья — не оракул, а ещё одна LLM

Держи это в голове весь урок: судья наследует все проблемы LLM — галлюцинирует, чувствителен к формулировке промпта, подвержен искажениям, недетерминирован. «GPT сказал 8/10» — это не истина, а ещё один вероятностный вывод, который надо валидировать. Весь урок — про то, как сделать судью достаточно надёжным, чтобы ему можно было доверять на объёме.

Три вида судей

Прежде чем писать промпт, выбери формат оценки — от него зависит и надёжность, и применимость.

100%
колёсико — масштаб  ·  зажать и тянуть — перемещение
Три формата LLM-судьи ① Score (одиночная) оценка одного ответа вопрос + ответ → judge → 1–5 / pass-fail ✓ просто, дёшево ✓ на проде на сэмпле ✗ абсолютный балл нестабилен ✗ «дрейф» шкалы когда нет эталона, нужен быстрый скор ② Pairwise (A vs B) сравнение двух ответов вопрос + A + B → judge → A / B / tie ✓ надёжнее (проще судить) ✓ выбор версии промпта/модели ✗ position bias (порядок!) ✗ нет абсолютной шкалы A/B версий, арены, «что лучше» ③ Reference-based сверка с эталоном вопрос + ответ + эталон → совпадает по смыслу? ✓ надёжнее всего ✓ регрессии по golden ✗ нужен ground truth ✗ эталон надо готовить есть golden-ответы, CI-регрессии

Правило выбора перекликается с прошлым уроком про людей: сравнение надёжнее абсолютной оценки. Судье, как и человеку, проще стабильно сказать «A лучше B», чем «этот ответ на 7 из 10». Поэтому:

  • Есть эталон → reference-based (самый надёжный): «совпадает ли ответ по смыслу с golden?».
  • Сравниваешь версии → pairwise: «A или B лучше?» — идеально для выбора промпта/модели.
  • Нужен абсолютный скор без эталона → score, но осторожно: абсолютные баллы нестабильны, склонны «дрейфовать».

Дизайн промпта-судьи

Судья настолько хорош, насколько хорош его промпт. По сути ты пишешь ту же рубрику, что для человека в прошлом уроке, — только адресат теперь модель. Компоненты хорошего judge-промпта:

  • Роль и задача — «Ты строгий оценщик качества ответов. Оцени по критерию…».
  • Чёткий критерий — один за раз (правильность отдельно от тона), с определением.
  • Явная рубрика шкалы — что значит каждый балл: «5 = полностью верно и полно; 3 = частично; 1 = неверно».
  • Chain-of-thought — попросить сначала обосновать, потом поставить оценку. Рассуждение заметно повышает качество и даёт объяснимость.
  • Структурированный вывод — JSON {reasoning, score}, чтобы парсить надёжно.
Промпт-судья: критерий + рубрика + CoT + JSON
python
JUDGE_PROMPT = """Ты — строгий оценщик качества ответов поддержки.
Оцени ОДИН критерий: ФАКТИЧЕСКАЯ ВЕРНОСТЬ ответа относительно вопроса.

Рубрика (шкала 1–5):
5 — всё верно, нет ошибок и выдумок
3 — в основном верно, есть неточность
1 — есть фактическая ошибка или галлюцинация

Вопрос: {question}
Ответ: {answer}

Сначала кратко ОБОСНУЙ (2–3 предложения), потом поставь оценку.
Верни СТРОГО JSON: {{"reasoning": "...", "score": <1-5>}}"""

def judge(question: str, answer: str) -> dict:
    raw = llm(JUDGE_PROMPT.format(question=question, answer=answer),
              temperature=0)          # детерминизм важнее креатива!
    return json.loads(raw)            # {"reasoning": "...", "score": 4}
# score нормируем к 0..1 при агрегации; reasoning храним для аудита
✅ temperature=0 и один критерий за раз

Два практических правила. Низкая температура (0): судья должен быть максимально детерминированным — тебе нужна воспроизводимая оценка, а не разнообразие. Один критерий за вызов: не проси «оцени качество в целом» — раздели на верность, релевантность, тон отдельными судьями/вызовами. Смешанный «общий балл» размыт и невоспроизводим — та же ошибка, что «оцените, хороший ли ответ» у людей.

Искажения судьи

Помнишь искажения людей из прошлого урока? У LLM-судьи они те же — модель научилась им у людей. Игнорировать их — значит получать стабильно смещённые оценки. Ключевые и противоядия:

Искажение судьиПроявлениеПротивоядие
Position biasВ pairwise чаще выбирает первый (или второй) вариантПрогнать оба порядка (A,B и B,A), усреднить; tie при расхождении
Length biasДлинный/многословный ответ кажется лучшеВ рубрике: «краткость не хуже; длина ≠ качество»
Self-preferenceСудья предпочитает ответы своей же моделиСудья от другого вендора/семейства, чем оцениваемый
SycophancyСоглашается с уверенным тоном, «ведётся»Просить проверять факты, а не уверенность
Formatting haloКрасивое форматирование → завышает содержаниеКритерии раздельно, оценивать суть
🔒 Position bias — обязательно лечить в pairwise

Самое коварное искажение: в парном сравнении судья систематически предпочитает вариант на определённой позиции — даже если поменять ответы местами, «победит» тот же слот. Обязательный приём: прогнать сравнение в обоих порядках (A→B и B→A) и засчитывать победу, только если судья консистентен; если ответ меняется от перестановки — это tie/ненадёжно. Без этого pairwise-числа врут.

Калибровка судьи

Вот главный вопрос, который отделяет работающий LLM-judge от самообмана: «а судья вообще прав?». Ответ даёт калибровка — проверка судьи против человеческого эталона из прошлого урока. Логика прямая: судья хорош настолько, насколько его оценки согласуются с людьми.

1. Разметить людьми N примеров (golden) — по надёжной рубрике, высокая κ
2. Прогнать судью на тех же N примерах
3. Сравнить: agreement судья ↔ человек (Cohen's kappa / корреляция)
        │
        ├─ высокое согласие → судье можно доверять → масштабировать на объём
        └─ низкое           → чинить ПРОМПТ судьи (рубрика, критерий, CoT, модель)
                              → переоценить → снова сверить (петля)

Это замыкает пирамиду из прошлого урока: люди калибруют судью, судья масштабируется на весь трафик. Калибровка — не разовая: при смене модели-судьи, промпта или домена её надо повторять. И держи «мета-эталон» — небольшой набор с человеческими оценками, на котором регулярно перепроверяешь, что судья не «поехал».

Калибровка: согласие судьи с человеком
python
from sklearn.metrics import cohen_kappa_score

# человеческий эталон (golden, из урока human evaluation) и оценки судьи
human_scores = [5, 3, 1, 4, 5, 2, 4, 1]   # разметка людьми
judge_scores = [5, 4, 1, 4, 5, 2, 3, 1]   # тот же набор, оценил судья

kappa = cohen_kappa_score(human_scores, judge_scores)
print(f"Согласие судья↔человек: {kappa:.2f}")   # напр. 0.68

# высокое (≈0.6+) → судья калиброван, масштабируем на 10 000 примеров
# низкое          → чинить промпт/рубрику/модель судьи и повторить калибровку
# ⚠️ повторять при смене модели-судьи, промпта или домена

Типичные ошибки

❌ Ошибка 1: доверять судье без калибровки

«GPT поставил 8/10» — не истина, пока не проверено согласие с людьми. Некалиброванный судья может стабильно ошибаться, а ты будешь принимать решения по кривым числам.

❌ Ошибка 2: игнорировать position bias в pairwise

Один прогон A vs B без перестановки даёт смещённый результат. Всегда гоняй оба порядка и требуй консистентности, иначе «победитель» — артефакт позиции.

❌ Ошибка 3: судья = оцениваемая модель

Из-за self-preference модель завышает свои же ответы. Для сравнения версий одной модели или разных вендоров бери судью из другого семейства.

❌ Ошибка 4: «оцени качество в целом»

Смешанный общий балл размыт и невоспроизводим. Оценивай по одному критерию за вызов, с явной рубрикой шкалы и temperature=0.

Шпаргалка

LLM-as-judge — всё в одном месте
text
LLM-AS-JUDGE = модель оценивает выход системы по критериям
  золотая середина: масштаб (как код) + смысл (как человек), дёшево
  ⚠️ судья = ТОЖЕ LLM: галлюцинирует, искажения, недетерминизм → калибровать!

3 ВИДА:
  ① score (1–5/pass-fail) — просто, но абсолютный балл нестабилен, «дрейф»
  ② pairwise (A/B/tie)    — надёжнее (сравнивать легче) → выбор версий · но position bias
  ③ reference-based       — сверка с эталоном, самый надёжный · нужен ground truth
  правило: есть эталон→③ · сравниваешь версии→② · абсолют без эталона→① (осторожно)

ПРОМПТ-СУДЬЯ (= рубрика для модели):
  роль · ОДИН критерий с определением · явная рубрика шкалы (что=5, что=1)
  chain-of-thought (сначала обоснуй, потом балл) · JSON {reasoning, score}
  temperature=0 (детерминизм!) · один критерий за вызов

ИСКАЖЕНИЯ (те же, что у людей):
  position (первый) → оба порядка A,B и B,A + консистентность (ОБЯЗАТЕЛЬНО в pairwise)
  length (длинный) → «длина≠качество» · self-preference → судья ДРУГОГО вендора
  sycophancy (ведётся на уверенность) · formatting halo → критерии раздельно

КАЛИБРОВКА (главное!): сверить судью с ЧЕЛОВЕЧЕСКИМ эталоном
  люди размечают N → судья на тех же N → agreement (Cohen's kappa/корр.)
  высокое→масштабировать · низкое→чинить промпт/модель→повторить
  повторять при смене модели/промпта/домена · держать мета-эталон

ГРАБЛИ: верить без калибровки · position bias в pairwise · судья=оцениваемая модель ·
        «оцени в целом»

Практическое задание

Задание: собери и откалибруй судью

  1. Для агента из модулей 03–05 выбери формат судьи (score / pairwise / reference-based) под свою задачу и обоснуй выбор.
  2. Напиши judge-промпт: роль, один критерий с определением, рубрику шкалы, требование CoT и JSON-вывод. Поставь temperature=0.
  3. Прогони судью на 10 ответах. Проверь: парсится ли JSON стабильно? Разумны ли reasoning'и (не галлюцинирует ли судья)?
  4. Если делаешь pairwise — прогони каждую пару в обоих порядках (A,B и B,A). Насколько часто вердикт меняется от перестановки? Это твой position bias.
  5. Возьми человеческую разметку тех же 10 примеров (из прошлого урока) и посчитай Cohen's kappa судья↔человек. Судья калиброван?
  6. Если согласие низкое — почини промпт судьи (уточни рубрику/критерий, смени модель) и переоцени. Выросло ли согласие?
  7. Со звёздочкой: проверь self-preference — оцени ответы двух моделей судьёй из одного из этих семейств и судьёй-«третьей стороной». Завышает ли «родственный» судья свою модель?

Что дальше

Теперь у тебя есть масштабируемый калиброванный судья — можно оценивать тысячи ответов. Это открывает следующий шаг: A/B-тестирование промптов — как поставить эксперимент, набрать статистически значимую разницу между версиями и безопасно выкатить победителя.