← Claude на русском
Перевод с разбором · для Сони
Адаптировал Claude Opus 4.7 (ИИ) на основе документации Anthropic. Полная версия — в docs/evals.html.

Оценка качества (evals)

Адаптация для Сони · 2026-04-23

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

Ты правишь system prompt и не понимаешь: стало лучше или хуже? «На глаз» работает плохо — вчера казался хорошим ответ, сегодня тот же самый ответ кажется сухим. Нужен стабильный способ измерять качество бота. Эта область называется evals (от evaluations).

Три условия хорошего eval

  1. Конкретно. Не «бот хорошо работает», а «на 80% тестовых диалогов ответ короче 50 слов».
  2. Измеримо. Число или чёткая шкала. «Тёплый ответ» измерить трудно, но можно спросить у судьи-модели: «оцени тёплость от 1 до 5». При честной рубрике это работает.
  3. Релевантно задаче. Для бота по СДВГ ключевые метрики — длина ответа, удержание роли, отказ от диагнозов, отсутствие советов без запроса.

Какие метрики подходят твоему боту

Код-оценка: самая дешёвая и быстрая

def check_length(response):
    return len(response.split()) <= 50

def check_single_question(response):
    return response.count("?") <= 1

def check_no_judgment(response):
    bad = ["правильно", "неправильно", "надо", "должен", "обязан"]
    return not any(w in response.lower() for w in bad)

# Прогоняем все тест-диалоги
test_dialogs = load("test-dialogs.json")
scores = []
for d in test_dialogs:
    r = get_bot_reply(d["user_message"], d["history"])
    scores.append({
        "length_ok": check_length(r),
        "single_q": check_single_question(r),
        "no_judgment": check_no_judgment(r),
    })
print(f"length ok: {sum(s['length_ok'] for s in scores) / len(scores):.0%}")

Что здесь происходит: ты подгружаешь файл с тест-диалогами (10-50 штук), прогоняешь каждый через бота, проверяешь простыми функциями. Три строчки кода — и ты видишь процентное качество. При изменении промпта сравниваешь «было 85%, стало 92%» — факты, не ощущения.

LLM-judge для субъективного

def judge_tone(user_msg, bot_reply):
    prompt = f"""Оцени тон ответа бота-помощника для людей с СДВГ по
шкале 1-5:
1 — холодный, осуждающий
5 — мягкий, принимающий

Сообщение пользователя: {user_msg}
Ответ бота: {bot_reply}

Ответь только числом."""
    # отдельный вызов OpenAI, желательно другая модель (не та, что генерирует)
    response = client.chat.completions.create(
        model="gpt-5.4-mini",
        messages=[{"role": "user", "content": prompt}]
    )
    return int(response.choices[0].message.content.strip())

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

Что это значит для твоего бота

Полная версия — в docs/evals.html.