文章目录
- [3. RAG 指标详解](#3. RAG 指标详解)
-
- [3.1. Answer Relevancy(答案相关性)](#3.1. Answer Relevancy(答案相关性))
-
- [3.1.1. 指标定义与评分逻辑](#3.1.1. 指标定义与评分逻辑)
- [3.1.2. 适用场景](#3.1.2. 适用场景)
- [3.1.3. 参数说明](#3.1.3. 参数说明)
- [3.1.4. 完整可运行示例](#3.1.4. 完整可运行示例)
- [3.1.5. 运行结果与分数解读](#3.1.5. 运行结果与分数解读)
- [3.1.6. 常见问题与调优](#3.1.6. 常见问题与调优)
- [3.2. Faithfulness(忠实度)](#3.2. Faithfulness(忠实度))
-
- [3.2.1. 指标定义与评分逻辑](#3.2.1. 指标定义与评分逻辑)
- [3.2.2. 与 Hallucination 指标的区别](#3.2.2. 与 Hallucination 指标的区别)
- [3.2.3. 参数说明](#3.2.3. 参数说明)
- [3.2.4. 完整可运行示例](#3.2.4. 完整可运行示例)
- [3.2.5. 运行结果与分数解读](#3.2.5. 运行结果与分数解读)
- [3.3. Contextual Relevancy(上下文相关性)](#3.3. Contextual Relevancy(上下文相关性))
-
- [3.3.1. 指标定义与评分逻辑](#3.3.1. 指标定义与评分逻辑)
- [3.3.2. 完整可运行示例](#3.3.2. 完整可运行示例)
- [3.3.3. 分数解读](#3.3.3. 分数解读)
- [3.4. Contextual Recall(上下文召回率)](#3.4. Contextual Recall(上下文召回率))
-
- [3.4.1. 指标定义与评分逻辑](#3.4.1. 指标定义与评分逻辑)
- [3.4.2. 完整可运行示例](#3.4.2. 完整可运行示例)
- [3.5. Contextual Precision(上下文精确度)](#3.5. Contextual Precision(上下文精确度))
-
- [3.5.1. 指标定义与评分逻辑](#3.5.1. 指标定义与评分逻辑)
- [3.5.2. 完整可运行示例](#3.5.2. 完整可运行示例)
- [3.6. 五指标联合使用](#3.6. 五指标联合使用)
-
- [3.6.1. 推荐组合策略](#3.6.1. 推荐组合策略)
- [3.6.2. 完整联合评估代码](#3.6.2. 完整联合评估代码)
- [3.7. 小结](#3.7. 小结)
3. RAG 指标详解
文档基于 DeepEval v4.1.0 编写
| 指标 | 评估对象 | 评分公式 | 需要参数 | 参考基准 |
|---|---|---|---|---|
| Answer Relevancy | 生成器 | 相关语句数 / 总语句数 | input + actual_output | 无参考 |
| Faithfulness | 生成器 | 真实声明数 / 总声明数 | input + actual_output + retrieval_context | 无参考 |
| Contextual Relevancy | 检索器 | 相关语句数 / 总语句数 | input + actual_output + retrieval_context | 无参考 |
| Contextual Recall | 检索器 | 可归因语句数 / 总语句数 | input + actual_output + expected_output + retrieval_context | 有参考 |
| Contextual Precision | 检索器 | 加权累计精度 | input + actual_output + expected_output + retrieval_context | 有参考 |
3.1. Answer Relevancy(答案相关性)
3.1.1. 指标定义与评分逻辑
Answer Relevancy 衡量的是 LLM 生成的 actual_output 与用户 input 之间的相关程度。它的评分逻辑是:
- 用 LLM 从
actual_output中提取所有陈述语句 - 判断每条陈述是否与
input相关 - 分数 = 相关陈述数 / 总陈述数
注意:高分只说明答案切题,不保证事实正确。要检测幻觉,需要配合 Faithfulness 指标。
3.1.2. 适用场景
| 场景 | 是否适用 | 说明 |
|---|---|---|
| RAG 应用 | 推荐 | 评估生成器是否回答用户问题 |
| 聊天机器人 | 推荐 | 检测是否跑题 |
| 摘要生成 | 不适用 | 摘要场景用 SummarizationMetric |
| 安全检测 | 不适用 | 用 Bias/Toxicity 指标 |
3.1.3. 参数说明
| 参数名 | 类型 | 必填 | 默认值 | 说明 |
|---|---|---|---|---|
threshold |
float | 否 | 0.5 | 通过阈值,分数 >= threshold 才算通过 |
model |
str/DeepEvalBaseLLM | 否 | gpt-5.4 | 评估用 LLM |
include_reason |
bool | 否 | True | 是否输出评分原因 |
strict_mode |
bool | 否 | False | 严格模式:只有满分 1.0 才通过 |
async_mode |
bool | 否 | True | 是否异步执行 |
verbose_mode |
bool | 否 | False | 是否打印中间步骤 |
evaluation_template |
class | 否 | AnswerRelevancyTemplate | 自定义评估模板 |
3.1.4. 完整可运行示例
python
# 来源: https://deepeval.com/docs/metrics-answer-relevancy
# 导入评估模块
from deepeval import evaluate
from deepeval.metrics import AnswerRelevancyMetric
from deepeval.test_case import LLMTestCase
# 创建评估指标
metric = AnswerRelevancyMetric(
threshold=0.7, # 通过阈值
model="gpt-4.1", # 评估用 LLM
include_reason=True, # 输出评分原因
verbose_mode=False # 是否打印中间步骤
)
# 创建测试用例
test_case = LLMTestCase(
input="如果鞋子不合脚怎么办?", # 用户问题
actual_output="我们提供 30 天全额退款,无需额外费用。" # LLM 实际输出
)
# 运行评估
evaluate(test_cases=[test_case], metrics=[metric])
3.1.5. 运行结果与分数解读
text
# 运行上面代码后,输出类似:
Test Case 1:
Metric: Answer Relevancy
Score: 0.92
Threshold: 0.7
Success: True
Reason: The actual output is highly relevant to the input about shoe returns.
All statements directly address the return policy question.
| 分数区间 | 含义 | 建议 |
|---|---|---|
| 0.9 ~ 1.0 | 高度相关,答案精准切题 | 优秀 |
| 0.7 ~ 0.9 | 基本相关,可能有少量冗余 | 良好 |
| 0.5 ~ 0.7 | 部分相关,存在较多无关内容 | 需优化 prompt |
| 0.0 ~ 0.5 | 严重偏离主题 | 检查生成逻辑 |
3.1.6. 常见问题与调优
常见错误:Answer Relevancy 高不代表答案正确。一个回答可以完全切题但内容全是编造的。必须配合 Faithfulness 指标使用。
python
# 来源: https://deepeval.com/docs/metrics-answer-relevancy#customize-your-template
# 自定义评估模板示例
from deepeval.metrics import AnswerRelevancyMetric
from deepeval.metrics.answer_relevancy import AnswerRelevancyTemplate
class CustomTemplate(AnswerRelevancyTemplate):
@staticmethod
def generate_statements(actual_output: str):
return f"""Given the text, breakdown and generate a list of statements presented.
Example:
Our new laptop model features a high-resolution Retina display for crystal-clear visuals.
{{
"statements": [
"The new laptop model has a high-resolution Retina display."
]
}}
===== END OF EXAMPLE ======
Text: {actual_output}
JSON:
"""
# 注入自定义模板
metric = AnswerRelevancyMetric(evaluation_template=CustomTemplate)
metric.measure(test_case)
print(f"自定义模板评分: {metric.score}")
3.2. Faithfulness(忠实度)
3.2.1. 指标定义与评分逻辑
Faithfulness 衡量 LLM 的 actual_output 是否与 retrieval_context(检索到的上下文)事实一致。它的评分逻辑是:
- 用 LLM 从
actual_output中提取所有声明 - 判断每条声明是否与
retrieval_context中的事实一致(不矛盾) - 分数 = 真实声明数 / 总声明数
注意:Faithfulness 关注的是输出是否与检索上下文一致,而不是与 ground truth 一致。如果检索上下文本身就有错误,忠实度分数可能很高但实际输出是错误的------这就是 garbage in, garbage out。
3.2.2. 与 Hallucination 指标的区别
| 特性 | Faithfulness | Hallucination |
|---|---|---|
| 参考源 | retrieval_context(检索到的上下文) |
context(标注的 ground truth) |
| 使用场景 | RAG 管线,运行时评估 | 有标注数据时使用 |
| 评估对象 | 生成器输出是否忠于检索结果 | 输出是否与标准答案一致 |
| 是否参考基准 | 否(无参考) | 是(有参考) |
3.2.3. 参数说明
| 参数名 | 类型 | 必填 | 默认值 | 说明 |
|---|---|---|---|---|
threshold |
float | 否 | 0.5 | 通过阈值 |
model |
str/DeepEvalBaseLLM | 否 | gpt-5.4 | 评估用 LLM |
include_reason |
bool | 否 | True | 是否输出评分原因 |
strict_mode |
bool | 否 | False | 严格模式 |
async_mode |
bool | 否 | True | 是否异步执行 |
verbose_mode |
bool | 否 | False | 是否打印中间步骤 |
truths_extraction_limit |
int | 否 | None | 限制提取的真相数量 |
penalize_ambiguous_claims |
bool | 否 | False | 是否惩罚模糊声明 |
3.2.4. 完整可运行示例
python
# 来源: https://deepeval.com/docs/metrics-faithfulness
# 导入评估模块
from deepeval import evaluate
from deepeval.test_case import LLMTestCase
from deepeval.metrics import FaithfulnessMetric
# 准备测试数据
actual_output = "我们提供 30 天全额退款,无需额外费用。"
retrieval_context = ["所有客户享有 30 天全额退款保障。"]
# 创建评估指标
metric = FaithfulnessMetric(
threshold=0.7,
model="gpt-4.1",
include_reason=True
)
# 创建测试用例
test_case = LLMTestCase(
input="如果鞋子不合脚怎么办?",
actual_output=actual_output,
retrieval_context=retrieval_context
)
# 运行评估
evaluate(test_cases=[test_case], metrics=[metric])
3.2.5. 运行结果与分数解读
text
# 运行上面代码后,输出类似:
Test Case 1:
Metric: Faithfulness
Score: 0.95
Threshold: 0.7
Success: True
Reason: The output is highly faithful to the retrieval context. All claims
can be verified against the provided context.
python
# 对比:检索上下文有误导但输出忠实的情况
test_case = LLMTestCase(
input="退货政策是什么?",
actual_output="我们提供 60 天全额退款。", # 注意:上下文说的是 30 天
retrieval_context=["所有客户享有 30 天全额退款保障。"]
)
faithfulness = FaithfulnessMetric(threshold=0.7)
faithfulness.measure(test_case)
print(f"Faithfulness 分数: {faithfulness.score}") # 低分,因为上下文只有 30 天
print(f"原因: {faithfulness.reason}")
text
# 运行上面代码后,输出类似:
Faithfulness 分数: 0.0
原因: The claim '60 天全额退款' contradicts the retrieval context which states '30 天全额退款保障'.
3.3. Contextual Relevancy(上下文相关性)
3.3.1. 指标定义与评分逻辑
Contextual Relevancy 衡量检索到的 retrieval_context 与用户 input 的整体相关性。它关注的是:检索到的文档中有多少是真正有用的,有多少是噪音。
评分逻辑:分数 = 相关语句数 / 总语句数。LLM 先从 retrieval_context 中提取所有语句,再判断每条是否与 input 相关。
3.3.2. 完整可运行示例
python
# 来源: https://deepeval.com/docs/metrics-contextual-relevancy
from deepeval import evaluate
from deepeval.test_case import LLMTestCase
from deepeval.metrics import ContextualRelevancyMetric
# 模拟:检索返回了 3 条文档,其中 1 条不相关
retrieval_context = [
"所有客户享有 30 天全额退款保障。", # 相关
"退款需在购买后 30 天内申请。", # 相关
"我们的仓库位于深圳,支持全国配送。", # 不相关(噪音)
]
metric = ContextualRelevancyMetric(
threshold=0.7,
model="gpt-4.1",
include_reason=True
)
test_case = LLMTestCase(
input="退货政策是什么?",
actual_output="我们提供 30 天全额退款。",
retrieval_context=retrieval_context
)
evaluate(test_cases=[test_case], metrics=[metric])
text
# 运行上面代码后,输出类似:
Test Case 1:
Metric: Contextual Relevancy
Score: 0.67
Threshold: 0.7
Success: False
Reason: 2 out of 3 statements in the retrieval context are relevant
to the input. The warehouse location statement is irrelevant.
3.3.3. 分数解读
| 分数 | 含义 | 调优方向 |
|---|---|---|
| 低分 | 检索结果中噪音过多 | 降低 top-K、缩小 chunk size、优化 embedding |
| 高分 | 检索结果精准 | 保持现有配置 |
3.4. Contextual Recall(上下文召回率)
3.4.1. 指标定义与评分逻辑
Contextual Recall 衡量的是:对于理想的 expected_output,retrieval_context 中包含了多少必要信息。它关注的是 "有没有漏掉关键信息"。
评分逻辑:先从 expected_output 中提取所有语句,再判断每条是否能在 retrieval_context 中找到支撑。
注意 :Recall 使用
expected_output(期望输出)而不是actual_output(实际输出),因为要衡量的是检索系统是否取回了生成理想答案所需的所有信息。
3.4.2. 完整可运行示例
python
# 来源: https://deepeval.com/docs/metrics-contextual-recall
from deepeval import evaluate
from deepeval.test_case import LLMTestCase
from deepeval.metrics import ContextualRecallMetric
# 模拟:检索上下文缺少了部分信息
retrieval_context = [
"所有客户享有 30 天全额退款保障。",
# 缺少了"退款需在 30 天内申请"这条信息
]
metric = ContextualRecallMetric(
threshold=0.7,
model="gpt-4.1",
include_reason=True
)
test_case = LLMTestCase(
input="退货政策是什么?",
actual_output="我们提供 30 天全额退款。",
expected_output="客户享有 30 天全额退款保障,退款需在购买后 30 天内申请。",
retrieval_context=retrieval_context
)
evaluate(test_cases=[test_case], metrics=[metric])
text
# 运行上面代码后,输出类似:
Test Case 1:
Metric: Contextual Recall
Score: 0.50
Threshold: 0.7
Success: False
Reason: 1 out of 2 statements in the expected output can be attributed
to the retrieval context. The '30 天内申请' detail is missing.
3.5. Contextual Precision(上下文精确度)
3.5.1. 指标定义与评分逻辑
Contextual Precision 衡量的是:在 retrieval_context 中,相关节点是否排在无关节点前面。它关注的是 "排序是否合理"。
评分逻辑:使用加权累计精度(Weighted Cumulative Precision),越靠前的节点权重越大。相关节点排在前面得分高,埋在噪音后面得分低。
3.5.2. 完整可运行示例
python
# 来源: https://deepeval.com/docs/metrics-contextual-precision
from deepeval import evaluate
from deepeval.test_case import LLMTestCase
from deepeval.metrics import ContextualPrecisionMetric
# 模拟:相关文档排在后面,无关文档排在前面
retrieval_context = [
"我们的仓库位于深圳,支持全国配送。", # 不相关(排在第一位)
"所有客户享有 30 天全额退款保障。", # 相关
"退款需在购买后 30 天内申请。", # 相关
]
metric = ContextualPrecisionMetric(
threshold=0.7,
model="gpt-4.1",
include_reason=True
)
test_case = LLMTestCase(
input="退货政策是什么?",
actual_output="我们提供 30 天全额退款。",
expected_output="客户享有 30 天全额退款保障,退款需在购买后 30 天内申请。",
retrieval_context=retrieval_context
)
evaluate(test_cases=[test_case], metrics=[metric])
text
# 运行上面代码后,输出类似:
Test Case 1:
Metric: Contextual Precision
Score: 0.55
Threshold: 0.7
Success: False
Reason: Relevant nodes are not ranked optimally. The first node is irrelevant,
lowering the weighted cumulative precision score.
3.6. 五指标联合使用
3.6.1. 推荐组合策略
| 场景 | 推荐指标组合 | 说明 |
|---|---|---|
| 快速验证 | Answer Relevancy + Faithfulness | 先测生成器质量 |
| 全面评估 | 全部 5 个指标 | 生成器 + 检索器全覆盖 |
| 检索器调试 | Contextual Relevancy + Recall + Precision | 聚焦检索质量 |
| 生产监控 | Faithfulness + Answer Relevancy | 无参考指标,无需标注数据 |
3.6.2. 完整联合评估代码
python
# 来源: https://deepeval.com/docs/metrics-introduction
# 五指标联合评估
from deepeval import evaluate
from deepeval.test_case import LLMTestCase
from deepeval.metrics import (
AnswerRelevancyMetric,
FaithfulnessMetric,
ContextualRelevancyMetric,
ContextualRecallMetric,
ContextualPrecisionMetric,
)
# 准备测试数据
test_case = LLMTestCase(
input="退货政策是什么?",
actual_output="我们提供 30 天全额退款,退款需在购买后 30 天内申请。",
expected_output="客户享有 30 天全额退款保障,退款需在购买后 30 天内申请。",
retrieval_context=[
"所有客户享有 30 天全额退款保障。",
"退款需在购买后 30 天内申请。",
]
)
# 全部 5 个 RAG 指标
metrics = [
AnswerRelevancyMetric(threshold=0.7),
FaithfulnessMetric(threshold=0.7),
ContextualRelevancyMetric(threshold=0.7),
ContextualRecallMetric(threshold=0.7),
ContextualPrecisionMetric(threshold=0.7),
]
# 运行联合评估
results = evaluate(test_cases=[test_case], metrics=metrics)
# 汇总结果
print("\n" + "=" * 50)
print("RAG 联合评估结果汇总")
print("=" * 50)
for result in results:
status = "通过" if result.success else "未通过"
print(f"{status} {result.metric_name}: {result.score:.2f}")
text
# 运行上面代码后,输出类似:
==================================================
RAG 联合评估结果汇总
==================================================
通过 Answer Relevancy: 0.92
通过 Faithfulness: 0.95
通过 Contextual Relevancy: 0.88
通过 Contextual Recall: 0.80
通过 Contextual Precision: 0.85
3.7. 小结
Answer Relevancy:衡量答案是否切题,分数 0~1,建议阈值 0.7。无参考指标,仅需 input + actual_output
Faithfulness:衡量答案是否忠于检索上下文,是检测幻觉的核心指标。无参考指标,需要 retrieval_context
Contextual Relevancy:衡量检索结果中噪音比例,低分说明检索精度不足 → 降低 top-K
Contextual Recall:衡量检索是否遗漏关键信息,低分说明检索不全 → 增大 top-K 或换 embedding 模型
Contextual Precision:衡量相关节点排序是否靠前,低分说明排序算法需要优化 → 调整 re-ranker
推荐组合:Faithfulness + Answer Relevancy(生成器)+ Contextual Relevancy(检索器)= 最小覆盖