Как вы оцениваете качество retrieval'а в RAG-системе?
Краткий тезис
Оценка качества retrieval в RAG — это многомерная задача. Нельзя полагаться только на одну метрику. Нужно использовать оффлайн-метрики (hit rate, MRR, recall@k, NDCG) для оценки поиска без LLM, и онлайн-метрики (faithfulness, answer relevance, context relevance) для оценки влияния retrieval на финальный ответ. Инструменты вроде RAGAS автоматизируют этот процесс.
1. Термин: Retrieval (поиск)
Что это Этап RAG, когда система ищет в векторной БД документы (чанки), релевантные запросу пользователя.
Почему важно оценивать retrieval
- Если retrieval нашёл плохие документы → LLM не сможет дать хороший ответ (мусор на входе — мусор на выходе)
- Если retrieval работает плохо, никакой LLM не спасёт
- Оценка retrieval помогает понять, где узкое место: поиск или генерация
Термин «Gold standard» (золотой стандарт Вручную размеченный датасет, где для каждого запроса известны правильные (релевантные) документы. Нужен для оффлайн-метрик.
Часть 1: Оффлайн-метрики (без LLM)
Что это Метрики, которые считаются без вызова LLM, только на основе retrieval результатов и gold standard.
Зачем Быстро, дешево, позволяет итерироваться по retrieval без дорогих LLM-вызовов.
Термин «Оффлайн-метрики» (Offline metrics Считаются на статическом датасете, без реальных пользователей.
1.1 Hit Rate (HR@k)
Что это Доля запросов, для которых retrieval нашёл хотя бы один релевантный документ среди top-k результатов.
Формула
HR@k = (количество запросов с хотя бы одним релевантным документом в top-k) / (общее количество запросов)
Пример:
- 100 запросов
- Для 80 запросов в top-5 есть хотя бы один релевантный документ
- HR@5 = 80 / 100 = 0.8 (80%)
| Порог | Интерпретация |
|---|---|
| 0.9+ | Отлично (почти всегда есть релевантный документ) |
| 0.7-0.9 | Хорошо (можно улучшать) |
| <0.7 | Плохо (retrieval часто не находит ничего) |
Термин «Релевантный документ» Документ, который действительно отвечает на запрос пользователя (по мнению человека-аннотатора).
Когда использовать Первая метрика для проверки, что retrieval вообще что-то находит. Если HR низкий → проблемы с индексацией или эмбеддингами.
1.2 MRR (Mean Reciprocal Rank)
Что это Среднее арифметическое обратных рангов первого релевантного документа.
Формула
RR (Reciprocal Rank) для одного запроса = 1 / (позиция первого релевантного документа)
MRR = (сумма RR по всем запросам) / (количество запросов)
Пример:
| Запрос | Позиция первого релевантного | Reciprocal Rank |
|---|---|---|
| Запрос 1 | 1 место | 1/1 = 1.0 |
| Запрос 2 | 3 место | 1/3 ≈ 0.333 |
| Запрос 3 | не найден | 0 |
MRR = (1.0 + 0.333 + 0) / 3 ≈ 0.444
Термин «Обратный ранг» (Reciprocal Rank Если релевантный документ на первом месте → 1, на втором → 1/2 = 0.5, на третьем → 0.333, на десятом → 0.1.
| Значение | Интерпретация |
|---|---|
| 0.8+ | Отлично (релевантный документ почти всегда на 1-2 месте) |
| 0.5-0.8 | Хорошо |
| <0.5 | Плохо (релевантный документ глубоко в выдаче) |
Когда использовать Когда важно не просто наличие релевантного документа, а его позиция. Пользователь вряд ли долистает до 10-го результата.
1.3 Recall@k
Что это Доля всех релевантных документов, попавших в top-k результатов.
Формула
Recall@k = (количество релевантных документов в top-k) / (общее количество релевантных документов в БД)
Пример:
- На запрос в БД есть 5 релевантных документов
- В top-10 нашлось 3 из них
- Recall@10 = 3 / 5 = 0.6 (60%)
Важное отличие от Hit Rate
| Значение | Интерпретация |
|---|---|
| 0.9+ | Отлично (нашли почти все релевантные) |
| 0.7-0.9 | Хорошо |
| <0.7 | Много релевантных документов потеряно |
Термин «Множественные релевантные документы» На один запрос может быть несколько правильных ответов. Например, "какие документы мне нужны для визы?" → 5 разных документов.
Когда использовать Когда на один запрос может быть несколько правильных ответов. RAG с несколькими источниками (например, юридические документы, научные статьи).
1.4 NDCG (Normalized Discounted Cumulative Gain)
Что это Метрика, которая учитывает порядок релевантности. Релевантный документ на 1-м месте лучше, чем на 10-м. Релевантные документы бывают разной степени важности (можно 3, 2, 1).
Термин «Graded relevance» (градированная релевантность Не просто "релевантно/не релевантно", а степень: 3 — очень релевантно, 2 — средне, 1 — слабо, 0 — не релевантно.
Формула (упрощённо
DCG@k = Σ (relevance_i / log2(i+1))
i=1..k
NDCG@k = DCG@k / IDCG@k
где IDCG — идеальный DCG (если бы все релевантные документы стояли в правильном порядке).
Пример:
| Позиция | Релевантность | Вклад в DCG |
|---|---|---|
| 1 | 3 | 3 / log2(2)= 3 / 1 = 3.0 |
| 2 | 2 | 2 / log2(3)= 2 / 1.585 = 1.26 |
| 3 | 1 | 1 / log2(4)= 1 / 2 = 0.5 |
| 4 | 0 | 0 |
| 5 | 2 | 2 / log2(6)= 2 / 2.585 = 0.77 |
DCG@5 = 3.0 + 1.26 + 0.5 + 0 + 0.77 = 5.53
Термин «Дисконтирование» (Discounting Чем дальше позиция, тем меньше вклад. Делим на log2(i+1), чтобы уменьшить важность низких позиций.
| Значение NDCG | Интерпретация |
|---|---|
| 0.9+ | Отлично (порядок почти идеальный) |
| 0.7-0.9 | Хорошо |
| <0.7 | Проблемы с ранжированием |
Когда использовать Когда нужно оценить качество ранжирования (порядок документов). Для RAG: если кросс-энкодер ранжирует результаты — NDCG покажет, насколько хорошо.
Сравнение оффлайн-метрик
| Метрика | Что измеряет | Нужен ли gold standard | Учитывает порядок | Нужна graded relevance |
|---|---|---|---|---|
| Hit Rate@k | Нашёлся хоть один? | Да | Нет | Нет |
| MRR | Позиция первого релевантного | Да | Да (только первого) | Нет |
| Recall@k | Сколько всех релевантных нашлось | Да | Нет | Нет |
| NDCG@k | Качество порядка с учётом весов | Да | Да | Да |
Что использовать в production
- Быстрая проверка Hit Rate@5 (легко интерпретировать)
- Оценка ранжирования MRR@10
- Множественные ответы Recall@10
- Детальная оценка порядка NDCG@10
Часть 2: Онлайн-метрики (с LLM)
Что это Метрики, которые оценивают финальный ответ LLM, а не только retrieval. Нужен LLM (обычно GPT-4 или другая модель-судья) для оценки.
Зачем Можно иметь идеальный retrieval, но LLM может проигнорировать контекст или галлюцинировать.
Термин «LLM-as-a-judge» Использование одной LLM (например, GPT-4) для оценки ответов другой LLM.
2.1 Faithfulness (достоверность)
Что это Насколько ответ LLM соответствует информации из найденных документов. Ответ не должен содержать галлюцинаций (выдуманных фактов).
Как измеряется (RAGAS
- Разбить ответ LLM на отдельные утверждения (statements)
- Для каждого утверждения проверить, можно ли его подтвердить из retrieved context
- Доля подтверждённых утверждений = faithfulness
Пример:
Контекст (retrieved): "Компания была основана в 2010 году."
Ответ LLM: "Компания была основана в 2010 году. У неё 5000 сотрудников."
Утверждение 1: "Компания основана в 2010" → ✅ можно подтвердить
Утверждение 2: "У неё 5000 сотрудников" → ❌ не в контексте
Faithfulness = 1/2 = 0.5 (50%)
Термин «Галлюцинация» (Hallucination LLM выдумывает факты, которых нет в контексте.
| Значение | Интерпретация |
|---|---|
| 0.9+ | Отлично (почти нет галлюцинаций) |
| 0.7-0.9 | Хорошо |
| <0.7 | Много галлюцинаций |
Когда использовать Всегда для production RAG Это самая важная метрика для доверия к системе.
2.2 Answer Relevance (релевантность ответа)
Что это Насколько ответ отвечает на заданный вопрос (не уходит в сторону, не отвечает на другой вопрос).
Как измеряется (RAGAS
- Сгенерировать N гипотетических вопросов из ответа (через LLM)
- Посчитать, насколько эти вопросы похожи на исходный вопрос (косинусное расстояние эмбеддингов)
- Усреднить similarity
Пример:
Вопрос: "Когда была основана компания?"
Ответ: "Компания производит программное обеспечение."
Гипотетические вопросы из ответа:
- "Что производит компания?" (эмбеддинг далёк от исходного)
Answer relevance = 0.2 (низкая)
Термин «Гипотетические вопросы» LLM генерирует, на какие вопросы мог бы отвечать данный ответ.
| Значение | Интерпретация |
|---|---|
| 0.9+ | Отлично (ответ прямо по вопросу) |
| 0.7-0.9 | Хорошо |
| <0.7 | Ответ не по существу |
Когда использовать Для чат-ботов и поддержки. Важно, чтобы модель не уходила в сторону.
2.3 Context Relevance (релевантность контекста)
Что это Насколько найденные retrieval'ем документы релевантны запросу (без учёта ответа LLM).
Как измеряется (RAGAS
- Разбить каждый retrieved chunk на предложения
- Для каждого предложения проверить, нужно ли оно для ответа на вопрос
- Доля релевантных предложений во всех чанках = context relevance
Пример:
Вопрос: "Цена товара X?"
Retrieved chunk: "Товар X имеет красный цвет. Цена 1000 рублей. Доставка бесплатная."
Предложение 1: "Товар X красный" → ❌ не нужно для цены
Предложение 2: "Цена 1000 рублей" → ✅ нужно
Предложение 3: "Доставка бесплатная" → ❌ не нужно
Context relevance = 1/3 ≈ 0.33 (33%)
| Значение | Интерпретация |
|---|---|
| 0.8+ | Отлично (контекст чистый, без мусора) |
| 0.5-0.8 | Хорошо |
| <0.5 | Много шума в контексте |
Когда использовать Для диагностики retrieval. Низкая context relevance → проблема в retrieval, даже если LLM хорошо отвечает.
Сравнение онлайн-метрик
| Метрика | Что измеряет | Нужен ли LLM-судья | Когда падает |
|---|---|---|---|
| Faithfulness | Галлюцинации? | Да | Модель выдумывает |
| Answer Relevance | Ответ по делу? | Да | Модель отвечает на другой вопрос |
| Context Relevance | Контекст чист? | Да | Retrieval принёс мусор |
Часть 3: Инструменты для автоматической оценки
RAGAS (RAG Assessment)
Что это Open-source фреймворк для автоматической оценки RAG-систем. Использует LLM-as-a-judge.
Как использовать
from ragas import evaluate
from ragas.metrics import faithfulness, answer_relevancy, context_relevancy
result = evaluate(
dataset=dataset, # вопросы + ответы + контекст
metrics=[faithfulness, answer_relevancy, context_relevancy]
)
print(result)
Плюсы Бесплатно, open-source, поддерживает русский язык (через BGE-m3). Минусы Нужен свой LLM для оценки (или OpenAI API).
Термин «LLM-as-a-judge» Использование одной LLM для оценки другой. RAGAS использует этот подход.
TruLens
Что это Платформа для оценки и мониторинга LLM-приложений (от Truera).
Как использовать
from trulens_eval import TruChain, Feedback
from trulens_eval.feedback import Groundedness
grounded = Groundedness()
f_faithfulness = Feedback(grounded.groundedness_measure_with_cot_reasons)
tru = TruChain(rag_chain, feedbacks=[f_faithfulness])
tru.invoke("вопрос")
Плюсы Глубокий анализ галлюцинаций, интеграция с LangChain. Минусы Бесплатная версия ограничена, есть paid.
DeepEval
Что это Open-source фреймворк для оценки LLM (аналог Pytest для LLM).
Как использовать
from deepeval import evaluate
from deepeval.metrics import AnswerRelevancyMetric, FaithfulnessMetric
metric = AnswerRelevancyMetric(threshold=0.7)
test_cases = [...]
evaluate(test_cases, [metric])
Плюсы Похож на unit-тесты, CI/CD интеграция. Минусы Меньше RAG-специфичных метрик.
Сравнение инструментов
| Инструмент | Open-source | RAG-специфичный | Поддержка русского | CI/CD | Сложность |
|---|---|---|---|---|---|
| RAGAS | ✅ Да | ✅ Да | ✅ (BGE-m3) | ❌ | Низкая |
| TruLens | ❌ Частично | ✅ Да | ✅ | ✅ | Средняя |
| DeepEval | ✅ Да | ❌ (общий) | ✅ | ✅ | Низкая |
Рекомендация Начинать с RAGAS (бесплатно, просто, подходит для русского).
Полный пайплайн оценки RAG
# 1. Подготовка gold standard (вручную или синтетически)
gold_dataset = [
{
"question": "Когда основана компания?",
"ground_truth": ["2010 год"], # правильный ответ
"relevant_docs": ["doc1.pdf", "doc5.pdf"] # ID релевантных документов
}
]
# 2. Запуск RAG на тестовых вопросах
answers = []
retrieved_chunks = []
for q in gold_dataset:
chunks = vectorstore.similarity_search(q.question, k=5)
answer = llm.invoke(prompt.format(context=chunks, question=q.question))
answers.append(answer)
retrieved_chunks.append([chunk.metadata["id"] for chunk in chunks])
# 3. Оффлайн-метрики (нужны gold стандарт)
mrr = calculate_mrr(relevant_docs, retrieved_chunks)
recall = calculate_recall_at_k(relevant_docs, retrieved_chunks, k=5)
# 4. Онлайн-метрики (RAGAS)
from ragas import evaluate
dataset = Dataset.from_dict({
"question": [q["question"] for q in gold_dataset],
"answer": answers,
"contexts": retrieved_chunks # тексты, а не ID
})
scores = evaluate(dataset, metrics=[faithfulness, answer_relevancy])
print(f"MRR: {mrr:.3f}, Recall@5: {recall:.3f}")
print(f"Faithfulness: {scores['faithfulness']:.3f}")
Пет-проект для закрепления
Задача Создать оценочный пайплайн для RAG, собрать gold standard, посчитать метрики.
Инструменты Python, Qdrant (из вопроса 4), BGE-m3, Llama-3 (через Ollama), RAGAS
Шаги
- Собрать 50 вопросов по вашему домену (юриспруденция/медицина/технологии)
- Вручную разметить:
- Для каждого вопроса — какие документы релевантны (gold standard для retrieval)
- Какой правильный ответ (gold standard для генерации)
- Запустить RAG на этих 50 вопросах, собрать retrieved chunks и ответы
- Посчитать оффлайн-метрики (MRR, Recall@5)
- Посчитать онлайн-метрики через RAGAS (faithfulness, answer relevance)
- Написать отчёт: на каких вопросах система падает, почему
Ожидаемый результат Понимание слабых мест вашего RAG (retrieval не находит редкие документы? LLM галлюцинирует на сложные вопросы?)
Связь с другими вопросами
| Вопрос | Тема |
|---|---|
| 1 | RAG архитектура (retrieval этап) |
| 16 | Оценка качества генерации (faithfulness, answer relevance) |
| 34 | Fine-tuning оценка |
| 131-140 | LLM-as-a-judge подробно (bias, калибровка) |
| 166-180 | Agentic evaluation (для агентов) |
| 177 | Model drift (как метрики меняются со временем) |
5. Как вы оцениваете качество retrieval'а в RAG-системе|5. Как вы оцениваете качество retrieval'а в RAG-системе|5. Как вы оцениваете качество retrieval'а в RAG-системе|5 полностью разобран. Переходим к вопросу 6, когда будете готовы|Вопрос 5 полностью разобран. Переходим к вопросу 6, когда будете готовы]]
Навигация
- Предыдущий: 4
- Следующий: 6
- Индекс: 00. Индекс разборов