Почему LLM-as-Judge может быть biased? Назовите 3 основных bias и как их детектировать.

Краткий тезис

LLM-as-Judge — это подход, при котором большая языковая модель (LLM) используется для оценки качества ответов другой модели или системы (например, RAG). Однако LLM-судьи подвержены систематическим ошибкам (bias), которые искажают оценки. Три основных bias: position bias (предпочтение первого ответа в паре), self-enhancement bias (предпочтение собственных ответов модели) и verbosity bias (предпочтение более длинных ответов). Детекция каждого bias требует специфических методов: swap-тестов, сравнения с human judgments и корреляционного анализа.


1. Термин: LLM-as-Judge

LLM-as-Judge — это метод автоматической оценки качества текстов, при котором LLM (например, GPT-4, Claude, Llama) выступает в роли судьи. Модели дают инструкцию (prompt) оценить ответ по заданным критериям: полезность, точность, релевантность, безопасность. Оценка может быть бинарной (хорошо/плохо), в виде балла (1–5) или ранжирования (A лучше B).

Зачем нужен LLM-as-Judge

  • Масштабирование: ручная оценка (human evaluation) дорога и медленна.
  • Автоматизация: можно оценивать тысячи ответов за минуты.
  • Гибкость: легко менять критерии оценки через промпт.

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


2. Position Bias (смещение позиции)

Position bias — это склонность LLM-судьи предпочитать первый ответ в паре (или в списке), независимо от его реального качества. Bias возникает из-за того, что модель «запоминает» первый элемент как референтный или из-за ограничений внимания (attention) — модель уделяет больше внимания началу контекста.

Детекция: Swap-тест

Метод: для каждой пары ответов (A, B) оценить два варианта:

  1. Оригинальный порядок: A → B.
  2. Перевёрнутый порядок: B → A.

Если LLM-судья меняет победителя при смене порядка (например, в оригинале выбрал A, а в перевёрнутом — снова A, но теперь на первой позиции), это указывает на position bias.

Код детекции на Python:

import random

def detect_position_bias(judge_model, prompt_template, pair_a, pair_b, n_trials=10):
    """
    Детектирует position bias через swap-тест.
    Возвращает долю случаев, когда победитель меняется при перестановке.
    """
    swap_inconsistencies = 0
    
    for _ in range(n_trials):
        # Оригинальный порядок
        prompt_original = prompt_template.format(first=pair_a, second=pair_b)
        winner_original = judge_model(prompt_original)  # возвращает 'A' или 'B'
        
        # Перевёрнутый порядок
        prompt_swapped = prompt_template.format(first=pair_b, second=pair_a)
        winner_swapped = judge_model(prompt_swapped)
        
        # Если победитель не изменился (с учётом перестановки), это bias
        # Если в оригинале победил A, а в перевёрнутом — B (который теперь на первой позиции), это нормально
        # Если в оригинале победил A, а в перевёрнутом — снова A (теперь на второй позиции) — bias
        if winner_original == 'A' and winner_swapped == 'A':
            swap_inconsistencies += 1
        elif winner_original == 'B' and winner_swapped == 'B':
            swap_inconsistencies += 1
    
    bias_rate = swap_inconsistencies / n_trials
    return bias_rate

Интерпретация:

  • bias_rate < 0.1: position bias минимален.
  • 0.1–0.3: умеренный bias.
  • 0.3: сильный position bias, требуется коррекция.

Пример из практики: В бенчмарке MT-Bench (использует GPT-4 как судью) обнаружили, что position bias составляет ~15% — модель предпочитала первый ответ в 57.5% случаев вместо ожидаемых 50%.


3. Self-Enhancement Bias (самовосхваление)

Self-enhancement bias — это склонность LLM-судьи оценивать собственные ответы (или ответы моделей из того же семейства) выше, чем ответы других моделей. Bias возникает из-за того, что модель «узнаёт» свой стиль, паттерны и считает их эталонными.

Детекция: Сравнение с human judgments

Метод:

  1. Собрать набор пар ответов (от разных моделей).
  2. Получить оценки от LLM-судьи и от группы людей-аннотаторов (human judges).
  3. Сравнить, как часто LLM-судья завышает оценку для ответов, сгенерированных той же моделью (или моделью того же разработчика).

Код детекции:

import numpy as np

def detect_self_enhancement(llm_scores, human_scores, model_ids):
    """
    llm_scores: dict {pair_id: {'A': score, 'B': score}}
    human_scores: dict {pair_id: {'A': score, 'B': score}}
    model_ids: dict {pair_id: {'A': model_name, 'B': model_name}}
    """
    bias_scores = []
    
    for pair_id in llm_scores:
        llm_a, llm_b = llm_scores[pair_id]['A'], llm_scores[pair_id]['B']
        human_a, human_b = human_scores[pair_id]['A'], human_scores[pair_id]['B']
        
        # Разница между LLM-оценкой и human-оценкой для каждой модели
        diff_a = llm_a - human_a
        diff_b = llm_b - human_b
        
        # Если LLM-судья — это модель A, то diff_a должно быть систематически выше
        if model_ids[pair_id]['A'] == 'llm_judge_model':
            bias_scores.append(diff_a - diff_b)  # положительное значение = bias
        elif model_ids[pair_id]['B'] == 'llm_judge_model':
            bias_scores.append(diff_b - diff_a)
    
    mean_bias = np.mean(bias_scores)
    return mean_bias

Альтернативный метод: Использовать другую LLM (из другого семейства) как второго судью. Если оценки двух судей систематически расходятся для ответов «своей» модели — это self-enhancement bias.

Пример: В исследовании Zheng et al. (2023) GPT-4 оценивал ответы GPT-4 на 0.3 балла выше, чем human judges, в то время как для Llama-2 разница была менее 0.1.


4. Verbosity Bias (смещение многословности)

Verbosity bias — это склонность LLM-судьи предпочитать более длинные ответы, даже если они менее точны или релевантны. Bias возникает из-за того, что длинные ответы кажутся «более полными» или «более старательными», и модель ассоциирует длину с качеством.

Детекция: Корреляционный анализ

Метод:

  1. Для набора ответов измерить длину (в токенах, словах или символах).
  2. Получить оценки LLM-судьи.
  3. Вычислить корреляцию (Пирсона или Спирмена) между длиной и оценкой.

Код детекции:

from scipy.stats import pearsonr, spearmanr

def detect_verbosity_bias(responses, scores):
    """
    responses: list of strings
    scores: list of float (оценки LLM-судьи)
    """
    lengths = [len(r.split()) for r in responses]  # длина в словах
    
    pearson_corr, p_value = pearsonr(lengths, scores)
    spearman_corr, _ = spearmanr(lengths, scores)
    
    return {
        'pearson': pearson_corr,
        'spearman': spearman_corr,
        'p_value': p_value
    }

Интерпретация:

  • Корреляция > 0.3: умеренный verbosity bias.
  • Корреляция > 0.5: сильный bias.
  • p_value < 0.05: статистически значимо.

Уточнение: Можно удалить стоп-слова или нормализовать длину (например, считать количество уникальных фактов), чтобы отделить «полезную длину» от «пустого многословия».

Пример: В экспериментах с AlpacaEval ответы длиной >200 токенов получали среднюю оценку 4.2/5, а ответы <50 токенов — 2.8/5, хотя human judges оценивали их одинаково (3.5/5).


5. Дополнительные bias (для контекста)

Хотя вопрос просит 3 основных, полезно упомянуть ещё 2 для полноты:

BiasОписаниеДетекция
Familiarity biasМодель предпочитает ответы, похожие на её обучающие данныеСравнение с out-of-distribution ответами
Format biasМодель предпочитает определённый формат (списки, таблицы, абзацы)Анализ корреляции формата и оценки
Order bias (частный случай position)Предпочтение не только первого, но и последнего элементаSwap-тест с множественными перестановками

6. Методы смягчения bias

6.1 Multiple Judges (множественные судьи)

Использовать несколько LLM разных семейств (GPT-4, Claude, Gemini) и усреднять оценки. Если bias случайны, они скомпенсируются.

Пример:

def ensemble_judge(responses, judges):
    scores = []
    for judge in judges:
        scores.append(judge.evaluate(responses))
    return np.mean(scores, axis=0)

6.2 Calibration на human labels

Собрать небольшой набор human-оценок (100–500 примеров) и обучить калибровочную модель (например, логистическую регрессию) корректировать оценки LLM-судьи.

Формула калибровки:

calibrated_score = alpha * llm_score + (1 - alpha) * human_baseline

где alpha подбирается по валидационной выборке.

6.3 Random swap (рандомизация порядка)

При pairwise сравнении случайным образом менять порядок ответов (A/B → B/A) и усреднять результат. Это напрямую борется с position bias.

6.4 Prompt engineering

Добавить в промпт явные инструкции против bias:

"Оценивайте ответы независимо от их длины, порядка и стиля. 
Не отдавайте предпочтение первому ответу. 
Будьте объективны, как если бы вы были человеком-экспертом."

7. Пет-проект для закрепления

Задача: Создать систему автоматической оценки ответов RAG-системы с детекцией и коррекцией bias.

Инструменты:

  • Python, LangChain, OpenAI API (или локальная LLM через Ollama)
  • Датасет: 100 пар ответов от разных RAG-конфигураций
  • Human-оценки: 50 пар размечены вручную

Шаги:

  1. Генерация данных: Собрать ответы от 3 RAG-систем (разные chunking, retrieval, LLM).
  2. Оценка LLM-as-Judge: Использовать GPT-4 для pairwise сравнения (A vs B).
  3. Детекция bias:
    • Position bias: swap-тест на 20 случайных парах.
    • Self-enhancement bias: сравнить оценки GPT-4 для ответов GPT-4 vs Llama.
    • Verbosity bias: корреляция длины и оценки.
  4. Коррекция: Применить ensemble из 3 моделей (GPT-4, Claude, Gemini) и калибровку на human-оценках.
  5. Валидация: Сравнить скорректированные оценки с human-оценками на отложенной выборке (метрика: accuracy, Cohen's kappa).

Ожидаемый результат:

  • До коррекции: accuracy 65–70% (согласие с human), kappa 0.4–0.5.
  • После коррекции: accuracy 80–85%, kappa 0.6–0.7.
  • Документация bias-профиля каждой модели-судьи.

8. Связь с другими вопросами

ВопросТема
485Какие метрики для оценки RAG вы знаете?
487Как оценивать faithfulness в RAG?
488Что такое RAGAS и как он работает?
490Как сравнивать разные LLM для RAG?
495Что такое Human-in-the-loop evaluation?
500Как деплоить RAG-систему с мониторингом?

Навигация