Фактологичность (Faithfulness)¶
Метрика Faithfulness оценивает фактическую согласованность между ответом AI-системы и контекстом поиска. Она обнаруживает галлюцинации -- случаи, когда ответ содержит информацию, не подкреплённую предоставленным контекстом.
Галлюцинации -- одна из главных проблем RAG-систем. Даже при наличии корректного контекста языковая модель может добавлять в ответ факты из своих "знаний", которые могут быть неточными или устаревшими. Метрика Faithfulness выявляет именно такие случаи, проверяя каждое утверждение в ответе на наличие поддержки в контексте.
Как это работает¶
graph TD
A[Actual Output] --> B[1. Extract Factual Statements]
B --> C[2. Check Each Statement Against Context]
D[Retrieval Context] --> C
C --> E[3. Generate Verdicts]
E --> F[4. Aggregate via Softmax]
F --> G[Final Score 0.0-1.0] Алгоритм работает в четыре этапа:
- Извлечение утверждений (Statement Extraction) -- разбивает ответ на отдельные фактические утверждения. Каждое утверждение -- это один проверяемый факт.
- Проверка фактологичности (Faithfulness Check) -- оценивает каждое утверждение на предмет поддержки контекстом поиска. Вопрос для каждого утверждения: "Можно ли вывести это утверждение из предоставленного контекста?"
- Генерация вердиктов (Verdict Generation) -- присваивает каждому утверждению вердикт по 5-уровневой шкале от
fully(полностью подтверждено) доnone(совершенно не подтверждено). - Агрегация (Score Aggregation) -- объединяет вердикты с помощью temperature-controlled softmax в итоговый балл.
Параметры¶
| Параметр | Тип | По умолчанию | Описание |
|---|---|---|---|
model | str | обязательный | Любая модель: "gpt-4o", "anthropic:claude-3-5-sonnet-latest", "google:gemini-2.0-flash", "ollama:llama3" или CustomLLMClient |
threshold | float | 0.7 | Минимальный балл для прохождения теста |
temperature | float | 0.5 | Строгость агрегации |
Обязательные поля¶
| Поле | Обязательно |
|---|---|
input | Да |
actual_output | Да |
retrieval_context | Да |
Требуется контекст поиска
Faithfulness проверяет, основан ли ответ на контексте, поэтому retrieval_context обязательно должен быть предоставлен.
Использование¶
from eval_lib import FaithfulnessMetric, EvalTestCase, evaluate
import asyncio
test_case = EvalTestCase(
input="When was Python created?",
actual_output="Python was created by Guido van Rossum and first released in 1991. It is one of the most popular programming languages today.",
retrieval_context=[
"Python was conceived in the late 1980s by Guido van Rossum at CWI in the Netherlands. The first version (0.9.0) was released in February 1991.",
"Python has consistently ranked among the top programming languages since the 2010s."
]
)
metric = FaithfulnessMetric(
model="gpt-4o",
threshold=0.7,
temperature=0.5
)
results = asyncio.run(evaluate([test_case], [metric]))
В этом примере оба утверждения в ответе поддерживаются контекстом:
- "Python was created by Guido van Rossum and first released in 1991" -- подтверждается первым фрагментом контекста.
- "It is one of the most popular programming languages today" -- подтверждается вторым фрагментом контекста.
Обнаружение галлюцинаций¶
Фактологичный ответ (высокий балл)¶
# Context says: "The Earth orbits the Sun at about 150 million km"
# Answer: "The Earth is approximately 150 million kilometers from the Sun."
# Score: ~0.95 (statement directly supported by context)
Здесь утверждение в ответе напрямую следует из контекста. Оно может быть перефразировано, но суть полностью подтверждена.
Галлюцинированный ответ (низкий балл)¶
# Context says: "The Earth orbits the Sun at about 150 million km"
# Answer: "The Earth is 150 million km from the Sun and has 2 moons."
# Score: ~0.50 (second claim not in context — hallucination)
Второе утверждение ("имеет 2 луны") не подтверждается контекстом -- это классический пример галлюцинации. Модель добавила информацию из собственных "знаний", причём эта информация ещё и ошибочна (у Земли одна луна).
Типичные виды галлюцинаций¶
Метрика Faithfulness обнаруживает несколько типов галлюцинаций:
- Добавление фактов -- ответ содержит информацию, отсутствующую в контексте.
- Искажение фактов -- ответ перевирает информацию из контекста (например, неправильные числа или даты).
- Чрезмерное обобщение -- ответ делает слишком широкие выводы на основании ограниченного контекста.
- Ложные причинно-следственные связи -- ответ устанавливает связи между фактами, которых нет в контексте.
Стоимость¶
3 вызова LLM API на одну оценку:
- Извлечение фактических утверждений из ответа
- Генерация вердиктов фактологичности
- Генерация пояснения
Рекомендации¶
- Высокий порог (0.8-0.9) для медицинских, юридических или финансовых приложений, где галлюцинации опасны. В таких областях даже одно неподтверждённое утверждение может иметь серьёзные последствия.
- Низкий порог (0.5-0.6) для творческих или разговорных приложений, где некоторая степень интерпретации допустима.
- Используйте
temperature=0.1для строгого режима, в котором любое неподтверждённое утверждение существенно снижает балл. - Обращайте внимание на пояснения. Метрика генерирует текстовое объяснение, в котором указывает, какие именно утверждения не подтверждены контекстом. Это помогает понять, где именно система галлюцинирует.
- Качество контекста критически важно. Если контекст неполный или неточный, даже корректный ответ может получить низкий балл. В таком случае проблема не в генераторе, а в ретривере -- используйте метрики контекста для диагностики.