大模型测评DeepEval快速入门-RAG指标详解

文章目录

  • [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 编写

来源:https://deepeval.com/docs/metrics-answer-relevancy

指标 评估对象 评分公式 需要参数 参考基准
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 之间的相关程度。它的评分逻辑是:

  1. 用 LLM 从 actual_output 中提取所有陈述语句
  2. 判断每条陈述是否与 input 相关
  3. 分数 = 相关陈述数 / 总陈述数

注意:高分只说明答案切题,不保证事实正确。要检测幻觉,需要配合 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(检索到的上下文)事实一致。它的评分逻辑是:

  1. 用 LLM 从 actual_output 中提取所有声明
  2. 判断每条声明是否与 retrieval_context 中的事实一致(不矛盾)
  3. 分数 = 真实声明数 / 总声明数

注意: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_outputretrieval_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(检索器)= 最小覆盖

相关推荐
小码哥哥1 小时前
如何从架构层面评价国内六大企业AI知识库的技术差异?
人工智能·架构
库拉大叔1 小时前
写小说谁家强?GPT-5.6、Claude 4.8 Opus、Gemini 3.5文学素养硬核横评
人工智能·gpt·aigc
科技大视界1 小时前
企业 Agent 2026 选型指南:智能体应用进入深水区
大数据·人工智能
wujian83111 小时前
怎么用AI做excel表格 AI导出鸭来救场
人工智能·ai·excel·豆包·deepseek·ai导出鸭
lichuangcsdn1 小时前
【Spring AI 学习(一)】spring ai是什么
人工智能·学习·spring·spring ai
叫我Paul就好1 小时前
RAG 入门到精通 - 一次完整的评估过程
人工智能·软件工程·rag
小保CPP1 小时前
OpenCV C++基于模糊数学的图像滤波
c++·人工智能·opencv·计算机视觉
武子康1 小时前
从 OpenAI 披露的自主 Agent 越界事件看:高能力模型评估为什么需要一份可验证的 Containment Contract
人工智能·openai·agent
木心术12 小时前
2026年设计类职业AI工具推荐与技能图谱
人工智能