Перейти к основному контенту
Tech Path Finder
КурсыИнтервьюКод-ревьюБлог
Tech Path Finder

Персонализированный путеводитель в IT. Квизы, мок-интервью, код ревью и аналитика прогресса.

@potapov_me

Платформа

  • Курсы
  • Прогресс
  • Мок-интервью
  • Код ревью
  • Живое ревью с ИИ
  • Тренажёр переговоров
  • Закладки

Контент

  • Блог
  • Главная
  • Обратная связь

Компания

  • О проекте
  • Тарифы
  • Условия использования
  • Конфиденциальность
  • Согласие на обработку данных
  • Cookie
  • Реквизиты

Аккаунт

  • Войти
  • Зарегистрироваться
  • Профиль

© 2026 Tech Path Finder. Все права защищены.

·ИП Потапов К.С.·Политика конфиденциальности·
Сделано с ❤️ в России
  1. Оценка качества RAG
evaluation

Оценка качества RAG

Метрики оценки: relevance, faithfulness, answer relevancy, RAGAS фреймворк

Оценка качества RAG

Без оценки качества RAG-система — чёрный ящик. Вы не знаете, становится ли она лучше или хуже.

#Зачем оценивать качество

Вы изменили chunking-стратегию, заменили embedding-модель, переписали промпт. Стала ли система лучше? Без метрик вы гадаете. С метриками — знаете точно.

Оценка качества RAG отвечает на вопросы:

  • Насколько релевантные документы находит retrieval?
  • Соответствует ли ответ контексту (нет ли галлюцинаций)?
  • Насколько ответ релевантен вопросу пользователя?
  • Какая конфигурация (chunking, модель, промпт) работает лучше?

#Компоненты для оценки

RAG-систему оценивают по трём аспектам:

АспектЧто оцениваемМетрика
RetrievalНасколько найденные чанки релевантны вопросуContext Precision, Context Recall
Generation (faithfulness)Соответствует ли ответ найденному контекстуFaithfulness
Generation (answer relevancy)Насколько ответ релевантен вопросуAnswer Relevancy

#RAGAS: фреймворк оценки

RAGAS (Retrieval Augmented Generation Assessment) — стандартный фреймворк для оценки RAG-систем.

#Установка

pip install ragas

#Подготовка данных

Для оценки нужен тестовый набор: вопрос, правильный ответ, найденный контекст, сгенерированный ответ.

from datasets import Dataset test_data = { "question": [ "Как оформить отпуск?", "Куда нести больничный лист?", "Сколько дней удалёнки разрешено?" ], "answer": [ "Заявление на отпуск подаётся через HR-портал за 2 недели.", "Больничный лист нужно отнести в бухгалтерию в течение 3 дней.", "Удалённая работа разрешена до 3 дней в неделю по согласованию.", ], "contexts": [ ["Отпуск оформляется через HR-портал. Заявление подаётся за 2 недели до начала."], ["Больничный лист нужно отправить в бухгалтерию в течение 3 дней."], ["Удалённая работа разрешена до 3 дней в неделю по согласованию с руководителем."] ], "ground_truth": [ "Через HR-портал, заявление за 2 недели.", "В бухгалтерию, в течение 3 дней.", "До 3 дней в неделю." ] } dataset = Dataset.from_dict(test_data)

Поля:

  • question — вопрос пользователя
  • answer — ответ, сгенерированный RAG-системой
  • contexts — список чанков, найденных retrieval (список списков, так как чанков может быть несколько)
  • ground_truth — эталонный правильный ответ (для сравнения)

#Запуск оценки

from ragas import evaluate from ragas.metrics import ( faithfulness, answer_relevancy, context_precision, context_recall, ) result = evaluate( dataset=dataset, metrics=[ faithfulness, answer_relevancy, context_precision, context_recall, ], ) print(result)

RAGAS использует LLM (обычно GPT-4) для оценки каждого аспекта. Результат —_score от 0 до 1 для каждой метрики.

#Интерпретация результатов

{'faithfulness': 0.85, 'answer_relevancy': 0.90, 'context_precision': 0.80, 'context_recall': 0.75}
МетрикаЗначениеЧто означает
faithfulness0.8585% утверждений в ответе подтверждаются контекстом — мало галлюцинаций
answer_relevancy0.90Ответ хорошо соответствует вопросу — не отклоняется от темы
context_precision0.8080% найденных чанков релевантны вопросу — retrieval работает хорошо
context_recall0.75Retrieval нашёл 75% всей нужной информации — часть упущена

Хорошие значения: все метрики выше 0.7. Отличные: выше 0.85.

#Faithfulness: проверка на галлюцинации

Faithfulness измеряет, насколько ответ привязан к контексту. Если модель добавляет информацию от себя — faithfulness снижается.

from ragas.metrics import faithfulness # Пример: ответ содержит информацию не из контекста test_case = { "question": ["Как оформить отпуск?"], "answer": ["Заявление подаётся через HR-портал за 2 недели. Также нужно приложить копию паспорта."], "contexts": [["Отпуск оформляется через HR-портал. Заявление подаётся за 2 недели до начала."]] } # «Копия паспорта» не упоминается в контексте — faithfulness будет ниже 1.0

Здесь RAGAS обнаружит, что утверждение «нужна копия паспорта» не подтверждается контекстом, и снизит score.

#Answer Relevancy: релевантность ответа

Answer Relevancy оценивает, насколько ответ отвечает на вопрос — даже если контекст был релевантен, модель могла ответить не на то.

from ragas.metrics import answer_relevancy # Ответ не релевантен вопросу test_case = { "question": ["Как оформить отпуск?"], "answer": ["В компании есть HR-портал для различных процедур."], "contexts": [["Отпуск оформляется через HR-портал. Заявление за 2 недели."]] }

Ответ «В компании есть HR-портал» техничесчески верен (правильный контекст), но не отвечает на конкретный вопрос «как оформить». Answer relevancy будет низким.

#Context Precision и Recall

#Context Precision

Доля релевантных чанков среди всех найденных. Если retrieval нашёл 5 чанков, но только 3 релевантны — precision = 0.6.

# Retrieval нашёл 5 чанков, но 2 нерелевантны test_case = { "question": ["Как оформить отпуск?"], "answer": ["Через HR-портал за 2 недели."], "contexts": [ [ "Отпуск через HR-портал, заявление за 2 недели.", # релевантный "В офисе есть кофе-машина.", # нерелевантный "Для отпуска нужно согласие руководителя.", # релевантный "Парковка во дворе бесплатная.", # нерелевантный "Международный отпуск — до 4 недель.", # релевантный ] ], "ground_truth": ["Через HR-портал."] } # context_precision = 3/5 = 0.6

Низкий precision = retrieval приносит много шума. Решение: улучшить embedding-модель, добавить reranking, настроить threshold.

#Context Recall

Доля нужной информации, которую retrieval нашёл. Если для ответа нужно 4 факта, а retrieval нашёл только 3 — recall = 0.75.

# Для полного ответа нужен факт про 4 недели, но retrieval его не нашёл test_case = { "question": ["Какие сроки оформления отпуска?"], "answer": ["Заявление за 2 недели."], "contexts": [ ["Отпуск оформляется через HR-портал. Заявление за 2 недели."] ], "ground_truth": ["Заявление за 2 недели, международный отпуск — до 4 недель."] } # context_recall будет низким — не найден факт про 4 недели

Низкий recall = retrieval пропускает важную информацию. Решение: увеличить k, улучшить chunking, использовать query expansion.

#Генерация тестового набора

Откуда взять ground_truth ответы? Есть несколько подходов:

#Вручную

Эксперт по предметой области пишет вопросы и правильные ответы. Точнее всего, но дорого по времени.

# Эксперт создал 20 вопросов с ответами для тестирования manual_test_data = { "question": ["Как оформить отпуск?", "Куда нести больничный?"], "answer": [...], # ответы вашей RAG-системы "contexts": [...], "ground_truth": ["Через HR-портал за 2 недели.", "В бухгалтерию за 3 дня."] }

#LLM-генерация

Использовать LLM для генерации вопросов и ответов на основе документов:

# Генерируем тестовые данные из документов doc_contexts = [ "Отпуск оформляется через HR-портал. Заявление за 2 недели.", "Больничный лист нужно отнести в бухгалтерию." ] # Для каждого документа генерируем вопрос-ответ test_questions = [] test_answers = [] for ctx in doc_contexts: # Здесь был бы вызов LLM с промптом: # «Сгенерируй вопрос и ответ на основе этого текста» pass

#A/B тестирование конфигураций

Оценка качества позволяет сравнивать разные конфигурации RAG:

# Конфигурация A: chunking по 200 слов, gpt-4o-mini results_a = evaluate(dataset_a, metrics=[faithfulness, answer_relevancy]) # Конфигурация B: chunking по 500 слов, claude-3-haiku results_b = evaluate(dataset_b, metrics=[faithfulness, answer_relevancy]) print(f"Конфиг A: faithfulness={results_a['faithfulness']:.2f}") print(f"Конфиг B: faithfulness={results_b['faithfulness']:.2f}")

Так вы объективно определяете, какая конфигурация лучше, а не полагаетесь на субъективные ощущения.

#Практический пайплайн оценки

from ragas import evaluate from ragas.metrics import faithfulness, answer_relevancy, context_precision, context_recall from datasets import Dataset def evaluate_rag_system(test_cases, rag_pipeline): """ Оценивает RAG-систему на тестовом наборе. test_cases: список {"question": str, "ground_truth": str} rag_pipeline: функция, которая принимает question и возвращает {"answer": str, "contexts": list} """ questions = [] answers = [] contexts = [] ground_truths = [] for test_case in test_cases: question = test_case["question"] gt = test_case["ground_truth"] # Запускаем RAG-систему result = rag_pipeline(question) questions.append(question) answers.append(result["answer"]) contexts.append(result["contexts"]) ground_truths.append(gt) dataset = Dataset.from_dict({ "question": questions, "answer": answers, "contexts": contexts, "ground_truth": ground_truths }) result = evaluate( dataset=dataset, metrics=[faithfulness, answer_relevancy, context_precision, context_recall] ) return result # Использование def my_rag(question): # Ваша RAG-система return {"answer": "...", "contexts": ["..."]} test_cases = [ {"question": "Как оформить отпуск?", "ground_truth": "Через HR-портал за 2 недели."} ] results = evaluate_rag_system(test_cases, my_rag) print(results)

Далее: RAG в продакшене