背景

在使用 DeepEval 对 GraphRAG 系统进行无标准答案(no-reference)评测时,我们发现 FaithfulnessMetric 在特定场景下会给出误导性的满分结果。

问题现象

我们向 GraphRAG 提出了一个关于 5GC PDU Session 建立流程的复杂问题。系统返回了详细的技术回答(涉及 AMF、SMF、UPF、PCF 等网元的具体职责),但检索到的 context 仅包含 3GPP 文档的目录结构,例如:

The document contains a section '5.6 Session Management' with several sub-subsections.
The document contains a section '5.2 Network Access Control' with several sub-subsections.

Context 中没有任何实质性的技术内容,但 Faithfulness 评分为 1.00(满分)

根因分析

Faithfulness metric 的评估分为 4 步:

Step 作用
1. Truths 提取 从 retrieval_context 提取事实列表
2. Claims 提取 从 actual_output 提取声明列表
3. Verdicts 判定 将每条 claim 与 context 比对,判定 yes/no/idk
4. Score 计算 根据 verdicts 计算最终分数

关键在于 Step 3 的判定规则:

  • yes — claim 与 context 一致
  • no — claim 与 context 直接矛盾
  • idk — context 中找不到相关信息,无法判断

以及 Step 4 的默认计分公式

score = (总数 - no的数量) / 总数

idk 不计入扣分。 只有明确矛盾(no)才会降低分数。

实际案例

我们的评测中,LLM judge(换用更严格的模型后)对 20 条 claims 全部判定为 idk

{
  "verdicts": [
    {"verdict": "idk"},
    {"verdict": "idk"},
    ...  // 共 20 条,全部 idk
  ]
}

计分结果:score = (20 - 0) / 20 = 1.00

最终 reason 输出:

"The score is 1.00 because there are no contradictions; the actual output fully aligns with the retrieval context."

这显然是误导性的 — 回答中的所有声明都没有被 context 支撑,但因为也没有被"矛盾",所以得了满分。

本质问题

Faithfulness 衡量的是"有没有与 context 矛盾",而不是"有没有被 context 支撑"

这两个是完全不同的维度:

场景 Faithfulness Groundedness
回答完全基于 context
回答正确但 context 无关 高(无矛盾) 低(无支撑)
回答与 context 矛盾

当 retrieval context 只包含目录级、摘要级信息时,几乎不可能与任何具体声明产生"直接矛盾",Faithfulness 就会永远满分。

解决方案

方案 1:开启 penalize_ambiguous_claims

DeepEval 提供了内置参数:

FaithfulnessMetric(model=model, threshold=0.5, penalize_ambiguous_claims=True)

开启后计分公式变为:

score = (总数 - no的数量 - idk的数量) / 总数

此时 20 条全 idk 的分数为:(20 - 0 - 20) / 20 = 0.00,更真实地反映了 context 对回答的支撑程度。

方案 2:补充 Groundedness 指标

使用 GEval 自定义一个 Groundedness metric,直接评估回答是否被 context 支撑:

GEval(
    name="Groundedness",
    criteria="Determine whether the actual output is fully supported and grounded by the retrieval context. "
             "Penalize claims in the output that cannot be traced back to specific information in the retrieval context.",
    evaluation_params=[SingleTurnParams.INPUT, SingleTurnParams.ACTUAL_OUTPUT, SingleTurnParams.RETRIEVAL_CONTEXT],
    model=model,
    threshold=0.5,
)

建议

两个方案并用: - 保留 Faithfulness(开启 penalize_ambiguous_claims)检测矛盾和无支撑 - 增加 Groundedness 从正面评估支撑程度 - 在报告中注明 Faithfulness 的局限性,避免误读

补充缺陷:总结性 claim 被误判为 idk

即使 context 中包含了具体的细节信息,当 actual output 对这些细节做了归纳总结时,judge 仍然可能将其判为 idk

实际案例

Context 中包含了 PDU Session 建立的具体步骤细节(AMF 处理注册、SMF 选择 UPF、N4 会话建立等),而 actual output 中有一条总结性 claim:

"从UE尝试访问特定DNN直到实现有效的用户面转发,整个过程涉及到了多个核心网元之间的紧密合作,每个组件都扮演着不可或缺的角色。"

Judge 的判定:

{
  "verdict": "idk",
  "reason": "The claim is a summary statement; the context provides specific procedural details but does not directly confirm this overall description."
}

原因

Faithfulness 的 prompt 对 judge 有严格约束:

"Only use 'no' if retrieval context DIRECTLY CONTRADICTS the claim — never use prior knowledge."
"Use 'idk' for claims not backed up by context — do not assume your knowledge."

Judge 被要求做字面级匹配,而不是语义级推理。即使 context 中的细节完全可以推导出这个总结,但因为 context 没有"直接确认"这句话,judge 就只能判 idk

影响

对于 RAG 系统来说,回答本来就应该基于 context 做归纳总结,这是正常且期望的行为。但 Faithfulness 的字面级判定会将这类合理总结视为"无支撑",导致开启 penalize_ambiguous_claims 后分数偏低。

可能的改进

DeepEval 的 FaithfulnessMetric 支持 evaluation_template 参数,可以继承 FaithfulnessTemplate 并修改 verdict guidelines,将"可从 context 细节合理推导出的总结"纳入 yes 的判定范围。但这需要修改评测标准的语义,应谨慎使用。

结论

Faithfulness metric 的设计初衷是检测 hallucination(幻觉),即模型是否编造了与 context 矛盾的信息。但它存在两个层面的局限:

  1. idk 默认不扣分 — context 无关时永远满分(通过 penalize_ambiguous_claims=True 解决)
  2. 字面级匹配过于严格 — 合理的归纳总结也会被判为无支撑(需自定义 template 或依赖 Groundedness 指标补充)

评测 RAG 系统时,需要同时关注 Faithfulness 和 Groundedness 两个维度,才能全面评估回答质量。

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐