Как вы измеряете и исправляете bias в LLM-as-Judge (self-enhancement, position, verbosity)?
Краткий тезис
LLM-as-Judge — это подход, при котором большая языковая модель (LLM) используется для оценки ответов другой модели или собственных ответов (self-judge). Однако LLM-судьи подвержены систематическим ошибкам (bias): self-enhancement bias (склонность завышать оценки собственным ответам), position bias (предпочтение ответов, расположенных в определённой позиции) и verbosity bias (предпочтение более длинных ответов). Измерение bias требует сравнения с золотым стандартом (human judgments) и расчёта метрик калибровки. Исправление включает swap-тесты, промпт-инжиниринг, ансамбль судей и калибровку через постобработку.
1. Термин: LLM-as-Judge
LLM-as-Judge — это метод, при котором LLM (например, GPT-4, Claude) выступает в роли оценщика качества ответов. Используется в RAG, agentic системах и fine-tuning для автоматической оценки без участия человека.
Почему возникает bias
- LLM обучалась на данных, где есть неявные предпочтения (длинные ответы, определённый стиль).
- Модель может «помнить» свои собственные ответы (self-enhancement).
- Внимание модели неравномерно распределено по позициям в контексте (bias|position bias).
Термин «Bias» — систематическое отклонение оценок от истинных значений, не связанное со случайностью.
2. Self-enhancement bias
Self-enhancement bias — склонность LLM-судьи ставить более высокие оценки ответам, которые сгенерировала она сама (или модель из той же семьи), по сравнению с ответами других моделей.
Пример:
- GPT-4 оценивает ответы: свой ответ получает 9/10, ответ Claude — 7/10, хотя оба объективно равны.
Измерение
- Собрать датасет с парами ответов (свой vs чужой) и human judgments.
- Посчитать среднюю разницу между оценками LLM и human для своих ответов.
- Метрика: Self-enhancement score = средняя оценка LLM своих ответов минус средняя оценка human.
Исправление
- Использовать анонимизацию (скрыть источник ответа).
- Применять кросс-модельную оценку (модель A оценивает ответы модели B, и наоборот).
- Добавлять в промпт инструкцию «не учитывай, кто автор ответа».
3. Position bias
Position bias — предпочтение ответа, расположенного на определённой позиции (например, первого или последнего) в списке кандидатов.
Пример:
- При сравнении двух ответов LLM чаще выбирает первый, даже если второй объективно лучше.
Измерение
- Swap-тест: поменять местами два ответа и проверить, изменилась ли оценка. Если bias есть, оценка сместится.
- Метрика: Position bias rate = доля случаев, когда оценка изменилась после swap.
Исправление
- Swap and average: оценить обе перестановки и усреднить результат.
- Промпт-инжиниринг: явно указать «не обращай внимания на порядок».
- Multiple judges: использовать несколько LLM с разными порядками и агрегировать.
4. Verbosity bias
Verbosity bias — предпочтение более длинных, многословных ответов, даже если они менее информативны.
Пример:
- Ответ из 500 слов с повторениями получает 8/10, а лаконичный ответ из 100 слов — 6/10, хотя второй точнее.
Измерение
- Построить корреляцию между длиной ответа (в токенах) и оценкой LLM на датасете с human judgments.
- Если корреляция значимо выше, чем у human, — verbosity bias.
Исправление
- Нормализация длины: в промпте указать «оценивай информативность, а не длину».
- Post-hoc correction: вычесть из оценки компонент, зависящий от длины (линейная регрессия).
- Использовать рубрики (rubrics) с критериями, не связанными с длиной.
5. Измерение bias: калибровка с human judgments
Калибровка — процесс сравнения оценок LLM-судьи с оценками человека на золотом стандарте (gold standard).
Шаги:
- Собрать датасет из 200–500 примеров (запрос, ответ, human score).
- Получить оценку LLM для каждого примера.
- Построить калибровочную кривую (x — human score, y — LLM score).
- Рассчитать метрики:
- Mean Absolute Error (MAE) — среднее абсолютное отклонение.
- Spearman correlation — согласованность ранжирования.
- Bias per bin — средняя ошибка для разных диапазонов оценок.
Пример кода (Python):
import numpy as np
from sklearn.metrics import mean_absolute_error, spearmanr
human_scores = [1, 2, 3, 4, 5]
llm_scores = [2, 2, 4, 4, 5]
mae = mean_absolute_error(human_scores, llm_scores)
corr, _ = spearmanr(human_scores, llm_scores)
print(f"MAE: {mae:.2f}, Spearman: {corr:.2f}")
Интерпретация
- MAE < 0.5 — хорошо.
- Spearman > 0.8 — высокая согласованность.
- Если bias систематический (например, LLM завышает на 1 балл), можно применить калибровочную коррекцию: corrected_score = llm_score - bias.
6. Исправление bias: методы
6.1 Swap-тест и усреднение (position bias)
- Для каждой пары ответов оценить два порядка: (A, B) и (B, A).
- Итоговая оценка = среднее двух оценок.
6.2 Промпт-инжиниринг
- Добавить анти-bias инструкции: «Не отдавай предпочтение длинным ответам», «Не учитывай порядок».
- Использовать chain-of-thought (CoT) перед оценкой: «Сначала проанализируй каждый ответ по критериям, затем поставь оценку».
6.3 Ансамбль судей (multiple judges)
- Использовать несколько разных LLM (GPT-4, Claude, Llama) и усреднять их оценки.
- Это снижает variance и уменьшает специфичный для модели bias.
6.4 Калибровка через постобработку
- Обучить простую модель (линейную регрессию) на золотом стандарте, чтобы предсказывать human score по LLM score и дополнительным признакам (длина, позиция, автор).
- Применять коррекцию:
final_score = model.predict(features).
6.5 Rubric-based evaluation
- Заранее определить критерии (точность, полнота, стиль) и просить LLM оценивать по каждому отдельно, затем агрегировать.
- Это уменьшает влияние поверхностных bias.
7. Инструменты для измерения и исправления bias
| Инструмент | Назначение |
|---|---|
| LangSmith | Трекинг оценок, A/B тесты, визуализация bias |
| DeepEval | Встроенные метрики bias, swap-тесты |
| RAGAS | Оценка faithfulness, но можно адаптировать для judge bias |
| Custom scripts | Python + pandas + scikit-learn для калибровки |
Пример pipeline измерения bias
import pandas as pd
from sklearn.linear_model import LinearRegression
# Загружаем золотой стандарт
df = pd.read_csv('human_judgments.csv')
# Получаем LLM оценки
df['llm_score'] = get_llm_scores(df['query'], df['answer'])
# Вычисляем bias как разницу
df['bias'] = df['llm_score'] - df['human_score']
# Средний bias
mean_bias = df['bias'].mean()
print(f"Mean bias: {mean_bias:.2f}")
# Коррекция: обучаем регрессию
X = df[['llm_score', 'answer_length', 'position']]
y = df['human_score']
model = LinearRegression().fit(X, y)
df['corrected_score'] = model.predict(X)
8. Пет-проект для закрепления
Задача Разработать систему оценки ответов RAG-агента с детекцией и коррекцией position bias.
Инструменты Python, LangChain, OpenAI API, pandas, scikit-learn.
Шаги:
- Сгенерировать 100 запросов и по 2 ответа на каждый (от разных моделей).
- Получить human оценки (можно самому или через краудсорсинг).
- Реализовать LLM-as-Judge (GPT-4) с промптом без анти-bias инструкций.
- Провести swap-тест: для каждой пары оценить (A,B) и (B,A). Вычислить position bias rate.
- Применить коррекцию: усреднить оценки по двум порядкам.
- Сравнить MAE и Spearman до и после коррекции.
- Добавить второй judge (Claude) и ансамбль — улучшится ли калибровка?
Ожидаемый результат Отчёт с метриками bias, кодом коррекции и выводом о снижении MAE на 20–30%.
9. Связь с другими вопросами
| Вопрос | Тема |
|---|---|
| 340 | Что такое Agentic RAG и как он отличается от классического RAG? |
| 341 | Как спроектировать multi-agent систему для оценки ответов? |
| 342 | Как вы оцениваете качество работы AI-агента в целом? |
| 344 | Как деплоить LLM-as-Judge в production? |
| 345 | Как обеспечить согласованность оценок между разными судьями? |
| 5 | Как оценивать качество retrieval в RAG? |
10. Навигация
- Предыдущий: 342
- Следующий: 344
- Индекс: 00. Индекс разборов
Навигация
- Предыдущий: 342
- Следующий: 344
- Индекс: 00. Индекс разборов