Как вы измеряете uncertainty в ответах LLM (logit-based vs ensemble methods)?
Краткий тезис
Uncertainty (неопределённость) в ответах LLM — ключевой компонент для построения надёжных систем, особенно в RAG (Retrieval-Augmented Generation). Два основных подхода: logit-based (анализ вероятностей токенов на выходе) и ensemble methods (множественные выборки или ансамбли моделей). Logit-based методы быстры и дешёвы, но менее надёжны из-за плохой калибровки вероятностей. Ensemble дают более точную оценку epistemic uncertainty (неопределённости из-за незнания), но требуют больше вычислений. В RAG uncertainty складывается из уверенности в найденных документах и уверенности генерации, что позволяет реализовать отказ от ответа или эскалацию человеку при низкой уверенности.
1. Термин: Uncertainty в LLM
Uncertainty — мера того, насколько модель «не уверена» в своём ответе. Различают два типа:
- Aleatoric uncertainty (неустранимая) — шум в данных, например, неоднозначность запроса. Её нельзя уменьшить добавлением данных.
- Epistemic uncertainty (устранимая) — незнание модели из-за недостатка обучения на похожих примерах. Её можно снизить, дообучив модель или добавив релевантный контекст.
Для LLM важно измерять именно epistemic, чтобы понимать, когда модель «галлюцинирует» или отвечает наугад. В контексте RAG epistemic uncertainty может быть частично снята хорошим retrieval'ом.
2. Logit-based методы
Основаны на анализе logits (сырых выходов последнего слоя) и probabilities (после softmax). Основные метрики:
2.1 Maximum probability (max prob)
Берём вероятность самого вероятного токена. Если она низкая (например, < 0.5), модель не уверена.
import torch
from transformers import AutoModelForCausalLM, AutoTokenizer
model = AutoModelForCausalLM.from_pretrained("gpt2")
tokenizer = AutoTokenizer.from_pretrained("gpt2")
inputs = tokenizer("Столица Франции —", return_tensors="pt")
with torch.no_grad():
outputs = model(**inputs)
logits = outputs.logits[:, -1, :] # последний токен
probs = torch.softmax(logits, dim=-1)
max_prob = probs.max().item()
print(f"Max probability: {max_prob:.3f}")
Недостаток: модель может быть уверена в неверном ответе (плохая калибровка).
2.2 Entropy (энтропия)
Энтропия распределения вероятностей по словарю:
H = - Σ p_i * log(p_i)
Высокая энтропия → высокая неопределённость. Для последовательности из нескольких токенов можно усреднить или взять сумму.
entropy = -torch.sum(probs * torch.log(probs + 1e-10), dim=-1).item()
2.3 Semantic entropy
Генерируем несколько ответов (через temperature sampling), переводим их в эмбеддинги (например, Sentence-BERT), кластеризуем по смыслу, затем считаем энтропию по кластерам. Если ответы семантически разные → высокая uncertainty.
from sentence_transformers import SentenceTransformer
from sklearn.cluster import DBSCAN
import numpy as np
answers = ["Париж", "Лондон", "Париж", "Берлин"]
model_emb = SentenceTransformer('all-MiniLM-L6-v2')
embeddings = model_emb.encode(answers)
clustering = DBSCAN(eps=0.5, min_samples=1).fit(embeddings)
labels = clustering.labels_
# энтропия по распределению ответов по кластерам
unique, counts = np.unique(labels, return_counts=True)
probs_clusters = counts / counts.sum()
sem_entropy = -np.sum(probs_clusters * np.log(probs_clusters))
Плюс: учитывает семантику, а не только поверхностные токены. Минус: дороже, требует нескольких генераций.
3. Ensemble methods
Основаны на множественных выборках из одной модели (с разным temperature или top-p) или на ансамбле разных моделей. Позволяют оценить epistemic uncertainty через разброс ответов.
3.1 Temperature sampling
Генерируем N ответов с temperature > 0 (например, 0.7). Если ответы сильно различаются → высокая uncertainty.
Метрики disagreement:
- Lexical similarity: средняя попарная BLEU или ROUGE.
- Embedding similarity: средняя косинусная близость эмбеддингов ответов.
from nltk.translate.bleu_score import sentence_bleu
import itertools
def lexical_disagreement(answers):
scores = []
for a, b in itertools.combinations(answers, 2):
ref = a.split()
hyp = b.split()
scores.append(sentence_bleu([ref], hyp))
return 1 - np.mean(scores) # disagreement = 1 - средняя BLEU
3.2 Monte Carlo Dropout
Включаем dropout на этапе inference, делаем несколько проходов. Разброс предсказаний — мера uncertainty. Эффективно для моделей с dropout (например, BERT).
3.3 Deep Ensembles
Обучаем несколько моделей с разными инициализациями, усредняем предсказания. Разброс между моделями — epistemic uncertainty. Самый точный, но самый дорогой метод.
4. Сравнение logit-based vs ensemble
| Критерий | Logit-based | Ensemble (sampling) | Ensemble (deep) |
|---|---|---|---|
| Скорость | Очень быстро (один forward pass) | Медленнее (N forward passes) | Очень медленно (N моделей) |
| Точность оценки uncertainty | Низкая (плохая калибровка) | Средняя (зависит от N) | Высокая |
| Различение aleatoric/epistemic | Только aleatoric | Частично epistemic | Хорошо разделяет |
| Вычислительные затраты | Минимальные | Умеренные (N генераций) | Высокие (N моделей) |
| Простота реализации | Тривиально | Просто (один вызов generate) | Сложно (обучение нескольких моделей) |
Вывод: для production обычно используют комбинацию — быстрый logit-based фильтр, а при низкой уверенности запускают ensemble (sampling) для уточнения.
5. Uncertainty в RAG
В RAG uncertainty складывается из двух компонентов:
- Retrieval confidence: насколько система уверена, что найденные документы релевантны. Обычно это score от векторного поиска (косинусная близость) или вероятность реранкера.
- Generation confidence: uncertainty LLM при генерации ответа на основе этих документов.
Комбинированная метрика: если retrieval score низкий (< порога) И generation uncertainty высокая → отказ от ответа. Если retrieval score высокий, но generation uncertainty высокая → возможно, документы противоречивы или неполны.
Пример простого правила:
def should_refuse(retrieval_score, gen_uncertainty, thr_ret=0.7, thr_unc=0.5):
if retrieval_score < thr_ret and gen_uncertainty > thr_unc:
return True
return False
Более продвинутый подход — обучить классификатор на основе фичей (retrieval score, entropy, semantic entropy, disagreement).
6. Применение: отказ от ответа и эскалация
Когда uncertainty высока, система может:
- Отказаться отвечать (например, «Извините, я не уверен в ответе»).
- Эскалировать человеку (передать запрос оператору).
- Запросить уточнение (если aleatoric uncertainty высока из-за неоднозначности).
Пороги подбираются на валидационном наборе по метрикам precision/recall отказа. Важно не отказывать слишком часто (потеря полезных ответов) и не пропускать опасные галлюцинации.
7. Проблемы и ограничения
- Калибровка вероятностей: современные LLM часто overconfident (дают высокие вероятности даже для неверных ответов). Logit-based метрики могут быть ненадёжны.
- Вычислительная стоимость ensemble: для real-time систем N генераций может быть неприемлемо.
- Semantic entropy: требует хорошего эмбеддера и кластеризации, может быть чувствителен к гиперпараметрам.
- Отсутствие ground truth: сложно оценить качество uncertainty метрик без эталонных данных.
8. Инструменты и библиотеки
- Hugging Face Transformers: прямой доступ к logits,
generateс параметрами temperature. - LangChain: встроенные цепочки для оценки uncertainty (например,
LLMChainсverbose=True). - RAGAS: метрики faithfulness, answer relevancy косвенно связаны с uncertainty.
- Uncertainty Toolbox: библиотека для калибровки и оценки uncertainty (больше для классификации, но идеи применимы).
- PyTorch / TensorFlow Probability: для реализации Monte Carlo Dropout.
Пет-проект для закрепления
Задача: Реализовать детектор неуверенных ответов для RAG-бота на основе open-source LLM (например, Llama 3 8B) и векторной БД (FAISS).
Инструменты:
- Hugging Face Transformers + Llama 3
- FAISS для retrieval
- Sentence-Transformers для эмбеддингов
- LangChain для оркестрации
Шаги:
- Соберите датасет вопросов с известными правильными ответами (например, SQuAD или свой).
- Реализуйте RAG pipeline: retrieval → генерация.
- Для каждого ответа вычислите:
- Постройте классификатор (логистическая регрессия) на этих фичах, где target — «ответ правильный» (1) или «неправильный» (0).
- Оцените precision/recall отказа при разных порогах.
Ожидаемый результат: Модель, которая отказывается отвечать в ~20% случаев, при этом отсекает >80% неверных ответов (high recall of errors). Сравните logit-based и ensemble подходы по качеству.
Связь с другими вопросами
| Вопрос | Тема |
|---|---|
| 499 | Multi-hop reasoning в RAG |
| 501 | Обработка запросов без ответа в документах |
| 502 | Self-RAG и когда его использовать |
| 503 | Оценка faithfulness в RAG |
| 504 | Как уменьшить latency RAG-системы |
| 5 | Оценка качества retrieval |
Навигация
- Предыдущий: 499
- Следующий: 501
- Индекс: 00. Индекс разборов