awesome-everything EN
↑ Обратно к восхождению

AI / LLM

LLM-evals: чтение кода и харнесса

Суть Читаем реальный код eval-харнесса, judge-промпт и его скоринг, diff golden set и CI regression gate — затем выбираем поведение или самый рычажный фикс, который senior-инженер сделает первым.
Высота — путь к senior
НольJuniorMiddleSenior
Ты на senior-высоте — в орбите
◷ 14 min

Evals живут в коде: харнесс, который скорит кейсы, judge-промпт, возвращающий вердикт, diff против прошлого релиза и CI-гейт, блокирующий merge. Прочитай каждый и выбери, что senior-инженер фиксит первым.

Цель

Отработай цикл, который запускаешь при сборке eval-набора: прочитать харнесс, заметить, где оценка лжёт или judge неверно запромпчен, и взять структурный фикс до подкрутки порогов.

Сниппет 1 — eval-харнесс

def run_eval(cases, model):
    passed = 0
    for c in cases:
        out = model(c["input"])
        if out.strip() == c["expected"].strip():   # exact-match scorer
            passed += 1
    return passed / len(cases)                      # single accuracy number
Викторина

Этот харнесс оценивает фичу свободного Q&A через exact string match и выдаёт одно число accuracy. Какой фикс самый рычажный?

Сниппет 2 — judge-промпт и скоринг

JUDGE = """Rate the assistant answer from 1-10 for overall quality.
Question: {q}
Answer: {a}
Score:"""

def judge_score(q, a, judge_model):
    text = judge_model(JUDGE.format(q=q, a=a))   # e.g. "I'd say about an 8/10 because..."
    return int(text.strip()[0])                  # take the first char as the score
Викторина

Две вещи делают этот judge ненадёжным как CI-гейт. Какая пара верна?

Сниппет 3 — diff golden set

  eval run: candidate vs main (golden set, 180 cases)
  overall:        main 0.91  ->  candidate 0.90   (-0.01)   PASS (threshold -0.02)
+ category json_format:   main 0.98 -> candidate 0.99  (+0.01)
- category refusals:      main 0.88 -> candidate 0.61  (-0.27)
- category long_context:  main 0.84 -> candidate 0.71  (-0.13)
Викторина

Агрегат сдвинулся на -0.01 и ПРОШЁЛ гейт, но per-category diff рассказывает другое. Как читать правильно?

Сниппет 4 — CI regression gate

# .github/workflows/eval.yml
on: [pull_request]
jobs:
  eval:
    steps:
      - run: python run_eval.py --set golden --out score.json
      - run: |
          SCORE=$(jq .overall score.json)
          echo "eval score: $SCORE"   # logs the number, job always exits 0
Викторина

Этот «гейт» прогоняет eval на каждом PR и логирует оценку. Почему он на деле не гейт и как починить?

Итог

Eval-набор читается в коде: скорер должен соответствовать типу вывода (exact match молча валит свободный текст); judge нужен парсимый вердикт, явная рубрика и референс плюс валидация против человеческих меток до доверия; diff golden set читается per-category, потому что агрегаты отмывают регрессии; а CI-гейт — гейт лишь когда сравнивает с baseline и выходит с ненулевым кодом, блокируя merge. Строй харнесс так, чтобы число не могло лгать, затем гейти по худшей категории, а не по среднему.

Продолжить восхождение ↑LLM-evals: собери eval-набор и CI-гейт
хоткеи развернуть
поиск
K
пред. пьеса
k
след. пьеса
j
тиры
t
это меню
?
sources2
expand
  1. 01
  2. 02

Trademarks belong to their respective owners. Editorial reference only.