Как вы калибруете retrieval confidence для threshold-based filtering?

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

Retrieval confidence — это rating|числовая оценка (score), которую поисковая система присваивает каждому найденному документу, показывая, насколько он релевантен запросу. Threshold-based filtering отсекает документы с confidence ниже заданного порога. Проблема в том, что сырые scores (например, cosine similarity) не являются вероятностями и плохо калиброваны: score 0.7 не означает «70% вероятность релевантности». Калибровка через Platt scaling или isotonic regression преобразует scores в калиброванные вероятности, что позволяет выбирать осмысленный порог (например, 0.5) и улучшает downstream-качество RAG.


1. Термины: retrieval confidence, threshold-based filtering, калибровка

Retrieval confidence — это score, который retrieval-модель (например, на основе косинусного расстояния между эмбеддингами запроса и документа) возвращает для каждого кандидата. Чем выше score, тем «увереннее» модель в релевантности.

Threshold-based filtering — простейший способ отбора документов: оставить только те, чей confidence превышает фиксированный порог (например, 0.6). Это дешевле, чем реранжирование, но критично зависит от качества scores.

Калибровка (calibration) — процесс преобразования сырых scores в вероятности, которые можно интерпретировать как P(relevant | score). Хорошо калиброванная модель: если она говорит «вероятность 0.8», то в 80% случаев документ действительно релевантен.

Platt scaling — метод калибровки, при котором на scores обучается логистическая регрессия (сигмоида). Подходит, когда распределение scores имеет монотонную связь с логарифмом шансов.

Isotonic regression — непараметрический метод, который строит монотонно возрастающую кусочно-линейную функцию. Не требует предположения о форме связи, но склонен к переобучению на малых данных.


2. Почему сырые scores не подходят для пороговой фильтрации

Большинство retrieval-моделей (cosine similarity, dot product, L2 distance) выдают scores, которые:

  • не нормированы на [0,1];
  • зависят от конкретной модели и датасета;
  • не отражают истинную вероятность релевантности.

Пример: cosine similarity = 0.75 для одной модели может соответствовать 90% релевантных документов, а для другой — только 40%. Если установить порог 0.7, в первом случае отсечётся слишком мало, во втором — слишком много.

Последствия для RAG:


3. Методы калибровки: Platt scaling и isotonic regression

3.1 Platt scaling

Идея: обучить логистическую регрессию на парах (score, label), где label = 1, если документ релевантен, и 0 иначе. Полученная сигмоида преобразует score в калиброванную вероятность:

[ P(y=1 | s) = \frac{1}{1 + \exp(A \cdot s + B)} ]

Параметры A и B находятся минимизацией log-loss на validation set.

Когда использовать:

  • Scores имеют примерно монотонную связь с логарифмом шансов.
  • Мало данных (Platt scaling устойчивее к переобучению).
  • Scores распределены нормально или близко к нормальному.

Пример кода (scikit-learn):

from sklearn.linear_model import LogisticRegression
from sklearn.calibration import CalibratedClassifierCV

# Допустим, у нас есть scores и бинарные метки релевантности
scores_train = ...  # (n_samples, 1) или (n_samples,)
labels_train = ...  # 0/1

# Обучаем Platt scaling (логистическая регрессия на одном признаке)
calibrator = LogisticRegression(C=1e10, solver='lbfgs')  # C большое = почти без регуляризации
calibrator.fit(scores_train.reshape(-1, 1), labels_train)

# Применяем к новым scores
calibrated_probs = calibrator.predict_proba(scores_test.reshape(-1, 1))[:, 1]

3.2 Isotonic regression

Идея: построить монотонно возрастающую кусочно-линейную функцию, которая минимизирует среднеквадратичную ошибку между предсказаниями и метками.

Когда использовать:

  • Много данных (isotonic regression легко переобучается при <1000 точек).
  • Связь между score и вероятностью немонотонна (редко, но бывает).
  • Нет уверенности в форме зависимости.

Пример кода:

from sklearn.isotonic import IsotonicRegression

iso_reg = IsotonicRegression(out_of_bounds='clip')
iso_reg.fit(scores_train, labels_train)
calibrated_probs = iso_reg.transform(scores_test)

3.3 Сравнение методов

ХарактеристикаPlatt scalingIsotonic regression
ПараметрическийДа (2 параметра)Нет (кусочно-линейная)
Устойчивость к переобучениюВысокаяНизкая
Требования к даннымМало данныхМного данных (>1000)
ПредположенияМонотонная логит-линейная связьТолько монотонность
ИнтерпретируемостьПростая формулаСложнее

4. Оценка качества калибровки

4.1 Reliability diagram (калибровочная кривая)

По оси X — предсказанные вероятности (разбиты на бины), по оси Y — доля истинно релевантных документов в бине. Идеальная калибровка — диагональ y=x.

4.2 Expected Calibration Error (ECE)

Средневзвешенное отклонение от диагонали:

[ ECE = \sum_{m=1}^{M} \frac{|B_m|}{n} \left| [text](/wiki/text){accuracy}(B_m) - [text](/wiki/text){confidence}(B_m) \right| ]

где (B_m) — m-й бин, (|B_m|) — число примеров в бине, n — всего примеров.

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

  • ECE < 0.05 — отличная калибровка.
  • ECE 0.05–0.10 — приемлемо.
  • ECE > 0.10 — нужна калибровка.

4.3 Log-loss (кросс-энтропия)

Чем ниже log-loss, тем лучше калибровка (при фиксированной дискриминационной способности).


5. Процесс калибровки для threshold-based filtering

  1. Сбор validation set:

    • Берём запросы из тестового/валидационного набора.
    • Для каждого запроса ранжируем документы с помощью retrieval.
    • Размечаем релевантность (бинарно: 1 — релевантен, 0 — нет). Можно использовать LLM-as-judge или человеческую разметку.
  2. Обучение калибратора:

    • Используем scores и метки релевантности.
    • Выбираем метод (Platt или isotonic) в зависимости от объёма данных.
    • Обучаем на validation set (не на train, чтобы избежать утечки).
  3. Выбор порога:

    • После калибровки scores становятся вероятностями.
    • Строим precision-recall curve или ROC curve на validation set.
    • Выбираем порог, максимизирующий F1-score или минимизирующий false positive rate при заданном recall.
    • Пример: порог 0.5 означает, что оставляем документы, которые с вероятностью >50% релевантны.
  4. Валидация на тестовом наборе:

    • Проверяем, что порог даёт приемлемое качество на отложенных данных.
    • Измеряем downstream-метрики RAG (faithfulness, answer relevance).

6. Особенности для Agentic RAG

В Agentic RAG агент может динамически решать, какие документы использовать. Калиброванный confidence помогает:

  • Filtering: отсеивать шумные документы до передачи в контекст.
  • Adaptive retrieval: если confidence всех документов низок, агент может решить переформулировать запрос или выполнить дополнительный поиск.
  • Multi-step reasoning: агент может ранжировать шаги по уверенности.

Пример: агент получает 5 документов с калиброванными вероятностями [0.9, 0.7, 0.4, 0.3, 0.1]. При пороге 0.5 он оставляет первые два. Если ни один не превышает 0.5, агент инициирует новый поиск.


7. Альтернативы и дополнения

  • LLM-as-judge для реранжирования: вместо калибровки можно использовать LLM для оценки релевантности каждого документа (дорого, но точнее).
  • Обучение отдельного классификатора релевантности: на эмбеддингах запроса и документа (cross-encoder). Это даёт сразу калиброванные вероятности, если использовать log-loss.
  • Temperature scaling: простой вариант Platt scaling с одним параметром (A=1/T, B=0). Менее гибкий, но стабильный.

8. Практические советы

  • Не калибруйте на train set — будет переоценка качества.
  • Используйте стратификацию при разбиении validation set, чтобы сохранить распределение релевантных/нерелевантных.
  • Для малых данных (сотни примеров) предпочитайте Platt scaling с сильной регуляризацией (C=1).
  • Для больших данных (тысячи+) isotonic regression может дать лучшую калибровку.
  • Проверяйте калибровку отдельно для разных типов запросов (фактологические vs. генеративные) — распределение scores может отличаться.
  • После калибровки порог можно выбирать не по вероятности, а по процентилю (например, оставлять top-20% по калиброванному score) — это устойчивее к дрейфу данных.

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

Задача: Реализовать систему калибровки retrieval confidence для небольшого RAG-приложения (например, Q&A по документации библиотеки).

Инструменты: Python, sentence-transformers, FAISS, scikit-learn, matplotlib.

Шаги:

  1. Соберите датасет: 200–500 запросов, для каждого вручную отметьте релевантные чанки (можно попросить коллег или использовать LLM для разметки).
  2. Запустите retrieval (например, all-MiniLM-L6-v2), получите scores для top-10 чанков на запрос.
  3. Разделите данные на train/validation (80/20).
  4. Обучите Platt scaling и isotonic regression на train.
  5. Постройте reliability diagrams для сырых scores и для каждого метода калибровки на validation.
  6. Выберите порог по F1-score на validation.
  7. Интегрируйте калиброванный фильтр в RAG-пайплайн и сравните ответы LLM (например, GPT-4o-mini) с/без фильтрации.

Ожидаемый результат: Вы увидите, что после калибровки порог 0.5 даёт осмысленное отсечение, а ECE снижается с 0.15 до <0.05. Ответы LLM станут более точными (меньше галлюцинаций из-за нерелевантных документов).


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

ВопросТема
5Метрики retrieval (HR, MRR, Recall) — калибровка улучшает эти метрики при пороговой фильтрации
7Threshold-based filtering снижает latency за счёт отбрасывания лишних документов; калибровка делает фильтр эффективнее
9При обновлении документов распределение scores может меняться, требуется перекалибровка
10Self-RAG использует confidence для принятия решений о необходимости поиска; калибровка критична
1В архитектуре нужно предусмотреть модуль калибровки и выбора порога
3Размер чанков влияет на scores и их калибровку (мелкие чанки дают более шумные scores)

Навигация