AI Prompt Engineering · Урок

Оценка результатов LLM с помощью LLM

Почему судьи на основе LLM работают и в чём они уступают оценке людьми.

Урок 1 из 413 шагов

«Оценка результатов LLM с помощью LLM» — бесплатный урок AI Prompt Engineering на CoddyKit. Это урок 1 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения AI Prompt Engineering, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс AI Prompt Engineering содержит 4 уроков всего.

Зачем использовать LLM в роли судьи

Традиционные метрики оценки — BLEU, ROUGE, точное совпадение — подходят для структурированных результатов, но не справляются с тонкими характеристиками вроде полезности, точности, тона и творческого подхода.

Оценка людьми передаёт нюансы, но требует много времени и стоит дорого. Оценка с помощью LLM предлагает промежуточный вариант: автоматическую оценку, которая понимает смысл, контекст и субъективное качество, — в больших объёмах и при низкой стоимости.

Почему судьи на основе LLM работают

Судьи на основе LLM успешно работают, потому что обладают тем же пониманием языка, что и оцениваемая модель. Они могут определить:

  • является ли ответ фактически точным, а не просто лексически похожим на эталон
  • является ли ответ полезным для заявленной цели
  • соответствует ли тон требованиям
  • передаёт ли краткое изложение ключевые points

Это характеристики, которые простые метрики сопоставления строк измерить не могут.

Простой судья на основе LLM

Самый простой судья на основе LLM: попросите модель оценить ответ по числовой шкале и кратко обосновать оценку. На этом строятся все более продвинутые схемы работы судьи.

import anthropic
import json

client = anthropic.Anthropic(api_key='sk-ant-...')

def simple_llm_judge(question, response, criterion):
    judge_prompt = (
        f'Rate the following response on {criterion} from 1 to 5.\n\n'
        f'Question: {question}\n'
        f'Response: {response}\n\n'
        f'Return JSON: {{"score": <1-5>, "reason": "<one sentence>"}}'
    )
    r = client.messages.create(
        model='claude-opus-4-5',
        max_tokens=100,
        messages=[{'role': 'user', 'content': judge_prompt}]
    )
    try:
        result = json.loads(r.content[0].text)
        return result['score'], result['reason']
    except Exception:
        return None, r.content[0].text

score, reason = simple_llm_judge(
    question='What is recursion in programming?',
    response='Recursion is when a function calls itself.',
    criterion='clarity and completeness'
)
print(f'Score: {score}/5 — {reason}')

Где судьи на основе LLM ошибаются: смещение из-за позиции

Смещение из-за позиции: если судье на основе LLM представить два ответа (A и B), он предпочитает тот, который показан первым, независимо от качества. Исследования показывают, что при использовании наивной инструкции судье это влияет на 60–70% попарных сравнений.

Это означает, что порядок представления вариантов меняет вердикт судьи.

import anthropic

client = anthropic.Anthropic(api_key='sk-ant-...')

def demonstrate_position_bias(question, response_a, response_b):
    def ask_judge(first, second, order):
        prompt = (
            f'Question: {question}\n\n'
            f'Response 1: {first}\n\n'
            f'Response 2: {second}\n\n'
            f'Which response is better? Reply with 1 or 2.'
        )
        r = client.messages.create(
            model='claude-opus-4-5',
            max_tokens=10,
            messages=[{'role': 'user', 'content': prompt}]
        )
        choice = r.content[0].text.strip()
        # Map back to original labels
        if order == 'AB':
            return 'A' if choice == '1' else 'B'
        else:  # BA
            return 'B' if choice == '1' else 'A'

    result_ab = ask_judge(response_a, response_b, 'AB')
    result_ba = ask_judge(response_b, response_a, 'BA')

    print(f'Order A-B: Judge picked {result_ab}')
    print(f'Order B-A: Judge picked {result_ba}')
    if result_ab != result_ba:
        print('Position bias detected: different results!')

    return result_ab, result_ba

Где судьи на основе LLM ошибаются: смещение в пользу многословия

Смещение в пользу многословия: судьи на основе LLM обычно выше оценивают более длинные и подробные ответы, даже когда краткий ответ объективно лучше. Ответ, в котором 400 слов говорят то, для чего достаточно 50 слов, часто получает более высокую оценку, чем краткая версия.

Чтобы уменьшить это смещение, явно укажите судье снижать оценку за unnecessary длину.

import anthropic

client = anthropic.Anthropic(api_key='sk-ant-...')

def length_aware_judge(question, response):
    judge_prompt = (
        f'Evaluate this response for quality. Be aware of verbosity bias: '
        f'do NOT score longer responses higher just because they are longer.\n\n'
        f'Question: {question}\n'
        f'Response: {response}\n\n'
        f'Evaluate on:\n'
        f'1. Accuracy (does it correctly answer the question?)\n'
        f'2. Conciseness (does it avoid unnecessary filler?)\n'
        f'3. Helpfulness (does it serve the user well?)\n\n'
        f'Penalize responses that add filler, repetition, or irrelevant information.\n'
        f'Score each 1-5 and provide an overall score. Return JSON.'
    )
    r = client.messages.create(
        model='claude-opus-4-5',
        max_tokens=200,
        messages=[{'role': 'user', 'content': judge_prompt}]
    )
    print(r.content[0].text)

Где судьи на основе LLM ошибаются: предпочтение собственных ответов

Смещение в пользу собственных ответов: когда Клод оценивает два ответа, он обычно предпочитает ответы в стиле Клода. Когда оценивает GPT-4, он предпочитает ответы в стиле GPT-4. Это систематическое смещение, которое затрагивает всех судей на основе LLM.

Способ уменьшить смещение: используйте несколько разных моделей в качестве судей и объединяйте их оценки. Расхождение указывает на пограничный случай, требующий проверки человеком.

import anthropic
import openai

anthropic_client = anthropic.Anthropic(api_key='sk-ant-...')
openai_client = openai.OpenAI(api_key='sk-...')

def multi_model_judge(question, response):
    judge_prompt = (
        f'Rate this response 1-10 for overall quality.\n'
        f'Q: {question}\nA: {response}\n'
        f'Reply with only a number.'
    )

    # Judge 1: Claude
    r_claude = anthropic_client.messages.create(
        model='claude-opus-4-5',
        max_tokens=10,
        messages=[{'role': 'user', 'content': judge_prompt}]
    )
    score_claude = float(r_claude.content[0].text.strip())

    # Judge 2: GPT-4o
    r_gpt = openai_client.chat.completions.create(
        model='gpt-4o',
        max_tokens=10,
        messages=[{'role': 'user', 'content': judge_prompt}]
    )
    score_gpt = float(r_gpt.choices[0].message.content.strip())

    avg = (score_claude + score_gpt) / 2
    print(f'Claude judge: {score_claude}, GPT judge: {score_gpt}, Average: {avg}')
    if abs(score_claude - score_gpt) > 2:
        print('WARNING: High disagreement — consider human review')
    return avg

Завышение оценок

Завышение оценок: судьи на основе LLM обычно выставляют большинству ответов высокие оценки (4–5 из 5), сужая распределение и затрудняя различение хороших и превосходных ответов. Ответы, которым люди поставили бы 3/5, часто получают 4–4,5/5.

Решение: используйте критерии оценки, которые обеспечивают калибровку, или относительную (попарную), а не абсолютную оценку.

# Anti-inflation judge prompt with explicit score anchors
CALIBRATED_JUDGE_PROMPT = (
    'Rate this response 1-5 using these STRICT score definitions:\n'
    '1 = Completely wrong, harmful, or completely off-topic\n'
    '2 = Partially relevant but contains significant errors or omissions\n'
    '3 = Correct and addresses the question but lacks depth or precision\n'
    '4 = Correct, reasonably complete, and clearly expressed\n'
    '5 = Exceptional: correct, complete, insightful, and concise\n\n'
    'Only give 5 if the response is genuinely outstanding.\n'
    'Give 3 for any adequate-but-not-impressive response.\n\n'
    'Question: {question}\n'
    'Response: {response}\n\n'
    'Score (1-5) and one-sentence reason:'
)

# Compare to non-anchored prompt which tends to cluster at 4-5
print('Anchored rubrics force the judge to use the full scale')

Когда судьи на основе LLM работают лучше всего

Судьи на основе LLM наиболее надёжны, когда:

  • критерии ясны и чётко определены
  • разница в качестве ответов велика (очевидно хороший ответ и очевидно плохой)
  • предметная область входит в круг знаний модели-судьи
  • Вы оцениваете субъективные характеристики (тон, полезность), по которым люди-оценщики также расходятся во мнениях

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

Когда необходима оценка людьми

Подключайте людей к оценке в следующих случаях:

  • оценка ответов в специализированных областях (медицине, праве, безопасности)
  • установление калибровки судьи на основе LLM по эталонным данным
  • решения с высокими ставками, в которых ошибки судьи на основе LLM имеют реальные последствия
  • новые задачи, по которым модель-судья получила мало обучающих сигналов
  • обнаружение тонких фактических ошибок, требующих специальных знаний
def triage_for_human_review(question, response, llm_score, confidence_threshold=0.7):
    """
    Route low-confidence or high-stakes evaluations to human review.
    """
    # Route to human if judge is uncertain
    if llm_score is None:
        return 'human_review', 'LLM judge failed to produce a score'

    # Route to human for borderline scores (near decision boundaries)
    if 2.5 <= llm_score <= 3.5:
        return 'human_review', f'Borderline score {llm_score} — needs human judgment'

    # Route to human for domain-specific high-risk content
    HIGH_RISK_KEYWORDS = ['medication', 'legal advice', 'financial advice', 'security']
    if any(kw in question.lower() for kw in HIGH_RISK_KEYWORDS):
        return 'human_review', 'High-risk domain — human verification required'

    # Else: LLM score is sufficient
    return 'auto_accept', f'Score {llm_score} — LLM judgment sufficient'

routing, reason = triage_for_human_review('What medication should I take?', 'Take aspirin.', 4.5)
print(f'{routing}: {reason}')

Построение конвейера оценки

Практический конвейер оценки с помощью LLM: сгенерировать ответы → запустить судью на основе LLM → направить пограничные случаи людям для проверки → объединить оценки → сообщить метрики качества. Журналируйте всё для создания аудиторского следа.

import anthropic
import json

client = anthropic.Anthropic(api_key='sk-ant-...')

def evaluate_batch(examples, product_under_test, criteria):
    results = []
    for ex in examples:
        response = product_under_test(ex['question'])
        score, reason = simple_llm_judge(ex['question'], response, criteria)

        results.append({
            'question': ex['question'],
            'response': response,
            'score': score,
            'reason': reason,
            'needs_review': score is None or 2.5 <= (score or 0) <= 3.5
        })

    # Summarize
    valid_scores = [r['score'] for r in results if r['score'] is not None]
    avg_score = sum(valid_scores) / len(valid_scores) if valid_scores else 0
    review_count = sum(1 for r in results if r['needs_review'])

    print(f'Average score: {avg_score:.2f}/5')
    print(f'Cases needing review: {review_count}/{len(results)}')
    return results, avg_score

# results, avg = evaluate_batch(test_cases, my_product, 'helpfulness')

Оценка без эталона и по эталону

Судьи на основе LLM могут работать в двух режимах:

  • По эталону: судья сравнивает ответ с заведомо правильным ответом. Высокая точность, но требуются размеченные данные.
  • Без эталона: судья оценивает ответ по его собственным достоинствам (согласован ли он? полезен ли? хорошо ли написан?). Такой подход гибче, но менее точен при оценке фактической правильности.

Используйте оценку по эталону, если у Вас есть эталонные ответы высокого качества. Используйте оценку без эталона для открытых задач, таких как создание кратких изложений, оценка тона или качества творческого письма.

Проверка знаний: позиционное смещение

Что такое позиционное смещение при оценивании с помощью LLM в роли судьи и к чему оно приводит?

Повторение: оценивание с помощью LLM

Судьи на основе LLM понимают нюансы, семантическую точность и субъективное качество — то, чего традиционные метрики измерить не могут. Они ошибаются в следующих случаях: позиционное смещение (предпочтение первого варианта), смещение в пользу многословия (предпочтение более длинных ответов), предпочтение собственного стиля и завышение оценок (скопление оценок на уровнях 4–5 из 5). Снижайте эти эффекты с помощью случайного изменения порядка ответов, явных инструкций не придавать значения многословию, систем критериев с опорными описаниями каждого уровня оценки и использования нескольких разных моделей в роли судей. Передавайте пограничные оценки и оценивание в областях высокого риска людям-оценщикам. Используйте судей на основе LLM для масштабирования, а людей — для калибровки и принятия решений с высокими последствиями.

Можно начать бесплатно

Изучай AI Prompt Engineering с ИИ-репетитором — бесплатно

Пиши и запускай код прямо в браузере, получай мгновенную помощь от ИИ-репетитора 24/7 и продолжи учиться на сайте или в приложении.

Курсы
53
Уроки
199

Часто задаваемые вопросы

Урок «Оценка результатов LLM с помощью LLM» бесплатный?

Да — полный текст урока «Оценка результатов LLM с помощью LLM» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс AI Prompt Engineering, подпишись на CoddyKit PRO. Курс AI Prompt Engineering содержит 4 уроков всего.

Чему я научусь в уроке «Оценка результатов LLM с помощью LLM»?

Почему судьи на основе LLM работают и в чём они уступают оценке людьми. Ты практикуешь AI Prompt Engineering с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать AI Prompt Engineering?

Предыдущий опыт не требуется. AI Prompt Engineering на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 1 из 4.

Сколько времени занимает урок «Оценка результатов LLM с помощью LLM»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке AI Prompt Engineering?

Да. Каждый урок AI Prompt Engineering включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Оценка результатов LLM с помощью LLM
  2. Запросы для оценки по критериям
  3. Сравнительная оценка: A и B
  4. Калибровка и предвзятость судей на основе LLM
← Назад к AI Prompt Engineering