Как вы оцениваете faithfulness RAG-ответа в production автоматически?

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

Faithfulness (фактологическая точность) RAG-ответа — это доля утверждений в ответе, которые можно подтвердить из переданного контекста (retrieved chunks). В production автоматическая оценка строится на разбивке ответа на атомарные утверждения и проверке каждого через NLI-модель или LLM-судью. Основной инструмент — RAGAS в batch-режиме (раз в час/день), который вычисляет метрику faithfulness без участия человека.


1. Термин: Faithfulness (фактологическая точность)

Faithfulness — метрика, измеряющая, насколько ответ LLM соответствует фактам из предоставленного контекста. В RAG контекст — это чанки, извлечённые retrieval-модулем. Если LLM «галлюцинирует» (добавляет факты, которых нет в контексте), faithfulness падает.

Почему это критично в production

  • Пользователь ожидает точного ответа на основе документов компании.
  • Низкий faithfulness → потеря доверия, юридические риски (медицина, финансы).
  • Отличие от answer relevance (релевантность ответа запросу) — faithfulness проверяет только факты, а не полезность.

Термин «галлюцинация» (hallucination) — генерация LLM информации, не подтверждённой контекстом или противоречащей ему.


2. Проблема оценки faithfulness в production

Ручная оценка (human evaluation) точна, но:

  • Дорогая (нужны аннотаторы-эксперты).
  • Медленная (не подходит для real-time мониторинга).
  • Не масштабируется на тысячи запросов в день.

Автоматическая оценка должна:

  • Работать без человека (или с минимальным участием).
  • Быть интерпретируемой (понятно, какие утверждения неверны).
  • Интегрироваться в CI/CD и мониторинг.

Production-требования

  • Batch-обработка (раз в час/день) — не блокирует ответ пользователю.
  • Логирование метрик по времени, модели, типу запроса.
  • Пороги тревог (alert) при падении faithfulness ниже 0.8.

3. Подход: разбивка ответа на утверждения (claim decomposition)

Первый шаг — разбить ответ LLM на атомарные утверждения. Каждое утверждение — это одно фактологическое высказывание.

Пример: Ответ: «Компания X основана в 2010 году в Берлине, а её CEO — Анна Иванова.» Утверждения:

  1. «Компания X основана в 2010 году.»
  2. «Компания X основана в Берлине.»
  3. «CEO компании X — Анна Иванова.»

Методы разбивки

  • LLM-based: промпт «Разбей следующий текст на отдельные факты. Каждый факт — одно предложение, содержащее одно утверждение.»
  • Rule-based: разделение по союзам (и, а, но), запятым, точкам с запятой — менее точный.
  • NLI-модели: некоторые модели (например, DeBERTa) могут напрямую оценивать entailment без явной декомпозиции, но разбивка даёт интерпретируемость.

Термин «NLI» (Natural Language Inference) — задача определения логической связи между двумя текстами: entailment (следует), contradiction (противоречие), neutral (нейтрально).


4. Метрика Faithfulness в RAGAS

RAGAS (Retrieval Augmented Generation Assessment) — open-source библиотека для автоматической оценки RAG. Метрика faithfulness вычисляется так:

  1. Декомпозиция ответа на утверждения (с помощью LLM, например GPT-4 или локальной модели).
  2. Проверка каждого утверждения против контекста (retrieved chunks):
    • Для каждого утверждения модель NLI (или LLM) определяет, поддерживается ли оно контекстом (entailment) или нет (contradiction/neutral).
  3. Итоговый score = (количество утверждений, подтверждённых контекстом) / (общее количество утверждений).

Формула

faithfulness = (число поддерживаемых утверждений) / (общее число утверждений)

Пример:

  • Ответ содержит 5 утверждений.
  • 4 из них подтверждаются контекстом.
  • Faithfulness = 4/5 = 0.8.

Код на Python (RAGAS):

from ragas import evaluate
from ragas.metrics import faithfulness
from datasets import Dataset

# Подготовка данных
data = {
    "question": ["Какой год основания компании X?"],
    "answer": ["Компания X основана в 2010 году в Берлине."],
    "contexts": [["Компания X была основана в 2010 году в Берлине."]]
}
dataset = Dataset.from_dict(data)

# Оценка
result = evaluate(dataset, metrics=[faithfulness])
print(result['faithfulness'])  # 1.0

Термин «entailment» — логическое следование: если контекст утверждает то же самое, что и утверждение, то entailment = True.


5. Инструменты для автоматической оценки

ИнструментОписаниеПлюсыМинусы
RAGASOpen-source, метрики faithfulness, answer relevancy, context precisionПростота интеграции, много метрикЗависит от LLM для декомпозиции
DeepEvalФреймворк для оценки LLM, включает faithfulnessИнтеграция с CI/CD, кастомные метрикиМеньше сообщество
TruLensМониторинг RAG, feedback functionsВизуализация, трекинг сессийТребует настройки
Собственный пайплайнLLM + NLI-модель (например, BART)Полный контроль, дешевлеБольше разработки

Выбор для production

  • Если бюджет позволяет — RAGAS с GPT-4 для декомпозиции (высокая точность).
  • Если нужна дешевизна — локальная NLI-модель (например, MoritzLaurer/DeBERTa-v3-base-mnli).

6. Batch-режим в production

Архитектура

  1. Логирование — каждый RAG-ответ сохраняется в БД (PostgreSQL, ClickHouse) вместе с контекстом и метаданными.
  2. Планировщик — Airflow, Prefect или cron запускает batch-оценку раз в час/день.
  3. Вычисление faithfulnessRAGAS обрабатывает пачку логов, записывает результат в отдельную таблицу.
  4. МониторингGrafana дашборд с графиком faithfulness по времени, алерты при падении ниже порога.

Пример конфигурации Airflow DAG

from airflow import DAG
from airflow.operators.python import PythonOperator
from datetime import datetime, timedelta

def evaluate_faithfulness():
    import pandas as pd
    from ragas import evaluate
    from datasets import Dataset

    logs = pd.read_sql("SELECT * FROM rag_logs WHERE evaluated_at IS NULL", conn)
    dataset = Dataset.from_pandas(logs)
    result = evaluate(dataset, metrics=[faithfulness])
    # запись результата
    logs['faithfulness'] = result['faithfulness']
    logs.to_sql('faithfulness_scores', conn, if_exists='append')

default_args = {'start_date': datetime(2024,1,1), 'retries': 1}
dag = DAG('faithfulness_eval', schedule_interval='0 */2 * * *', default_args=default_args)
task = PythonOperator(task_id='eval', python_callable=evaluate_faithfulness, dag=dag)

Термин «batch-режим» — обработка данных группами, а не в реальном времени, для снижения нагрузки.


7. Пороги и интерпретация

Значение faithfulnessИнтерпретацияДействие
0.95–1.0ОтличноНичего не делать
0.85–0.95ХорошоМониторить, возможны единичные галлюцинации
0.7–0.85УдовлетворительноПроверить retrieval (возможно, плохой контекст)
<0.7ПлохоСрочно: проверить модель, контекст, промпт

Важно пороги зависят от домена. В медицине порог 0.95, в чат-ботах — 0.8.


8. Ограничения автоматической оценки faithfulness

  • Зависимость от качества контекста: если retrieval вернул нерелевантные чанки, faithfulness может быть низким даже при правильном ответе (LLM вынужден галлюцинировать).
  • Сложность для творческих ответов: если ответ содержит обобщения или перефразирования, NLI может не распознать entailment.
  • Ложные срабатывания: модель может посчитать утверждение подтверждённым, если контекст содержит похожие, но не идентичные факты.
  • Стоимость: использование GPT-4 для декомпозиции дорого при большом объёме.
  • Языковая поддержка: NLI-модели хуже работают для редких языков.

Решение комбинировать с другими метриками (answer relevancy, context recall) и проводить периодическую ручную валидацию.


9. Альтернативы RAGAS

LLM-as-a-Judge — использование той же LLM (например, GPT-4) для оценки faithfulness через промпт:

Оцени, насколько следующий ответ соответствует контексту. 
Ответ: {answer}
Контекст: {context}
Оценка от 0 до 1.
  • Плюс: гибкость, можно задать критерии.
  • Минус: дорого, возможна предвзятость (LLM оценивает себя).

NLI-модели без декомпозиции — например, ynie/roberta-large-snli_mnli_fever_anli_R1_R2_R3-nli:

  • Подаётся пара (контекст, ответ) целиком.
  • Модель выдаёт вероятность entailment.
  • Быстрее, но менее интерпретируемо.

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

МетодТочностьСтоимостьИнтерпретируемостьСкорость
RAGAS (GPT-4)ВысокаяВысокаяВысокаяСредняя
LLM-as-a-JudgeВысокаяВысокаяСредняяСредняя
NLI-модель (локальная)СредняяНизкаяНизкаяВысокая

10. Практические советы для production

  1. Выбор модели-судьи: для декомпозиции используйте более сильную модель (GPT-4, Claude), для NLI — более лёгкую (DeBERTa).
  2. Калибровка: протестируйте на 100–200 вручную размеченных примерах, подберите порог.
  3. A/B тестирование: сравнивайте faithfulness при разных стратегиях retrieval или промптах.
  4. Мониторинг дрейфа: отслеживайте изменение faithfulness во времени — падение может указывать на деградацию данных или модели.
  5. Логирование утверждений: сохраняйте не только score, но и список неподтверждённых утверждений для анализа.

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

Задача Создать скрипт, который логирует RAG-ответы, оценивает faithfulness через RAGAS и выводит дашборд.

Инструменты Python, RAGAS, Streamlit, SQLite.

Шаги:

  1. Реализуйте простой RAG-пайплайн (FAISS + OpenAI).
  2. В ответе сохраняйте question, answer, contexts, timestamp.
  3. Напишите batch-функцию, которая раз в минуту читает новые записи, вычисляет faithfulness, сохраняет результат.
  4. Streamlit-дашборд: график faithfulness за последние 24 часа, таблица с низкими scores, кнопка для просмотра неподтверждённых утверждений.

Ожидаемый результат Работающий прототип мониторинга faithfulness с визуализацией и алертами при падении ниже 0.8.


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

ВопросТема
5Оценка качества retrieval
7Уменьшение latency RAG
10Self-RAG
130LLM-as-a-Judge общий подход
131Метрики эвалюации RAG
133Оценка answer relevance

Навигация