Faithfulness、Context Recall…RAGAS 核心指标怎么算(检索侧)(4/13)

📅 发布时间:2026/10/14 3:21:03
Faithfulness、Context Recall…RAGAS 核心指标怎么算(检索侧)(4/13)
总目录[第 1 章] 你的 RAG 为什么总在「一本正经地胡说」[第 2 章] 一张图看懂 RAGAS核心概念与 7 大指标[第 3 章] 数据构建——样本、数据集与模型接入[第 4 章] Faithfulness、Context Recall…RAGAS 核心指标怎么算[第 5 章] 生成侧指标与指标选型别再乱用 Faithfulness[第 6 章] 把指标真正跑起来执行、质控与回归闸门[第 7 章] 没标注数据用 RAGAS 自动合成测试集[第 8 章] 让评估贯穿研发实验追踪与 experiment/Dataset 工作流[第 9 章] 从笔记本到 CI把 RAGAS 做成生产级流水线[第 10 章] 内置不够用手搓 RAGAS 自定义指标含 SQL/MultiHop[第 11 章] RAGAS 不是唯一6 大评估工具横向对比功能篇[第 12 章] 怎么选不同团队画像的选型决策矩阵[第 13 章] 团队落地 RAGAS 的五阶段路线图可直接抄作业在上一篇文章《3 步把 RAG 输出变成可评估数据集附代码》中我们跑通了从真实 RAG 输出到分数的最小闭环用SingleTurnSample/EvaluationDataset把数据组织起来。接下来我们逐一拆解 RAGAS 的核心指标——先从检索侧Faithfulness、Context Recall 等说起。本章定位在第 2 章指标全景与第 3 章跑通第一个评估的基础上逐一拆解 RAGAS 的核心指标。每个指标都按测什么 → 怎么算 → 代码怎么跑 → 怎么解读四步展开让你既能读懂分数也能知道分低了去改哪一段。前置章节第 1–3 章已学完 RAGAS 是什么、reference-free 思想、数据流与最小可运行评估。运行依赖ragas0.4.3、openai建议 Python ≥ 3.9。约定呼应第 2 章事实标注客观、可通过官方文档/源码与实测验证的陈述API 行为、输入字段、分数区间等。观点标注主观建议选型、阈值、改进方向请在你的团队/业务里自行校准。全章代码示例统一使用collections 类式 API并以print(result.value)取MetricResult的分数。4.1 指标体系总览呼应第 2 章全景第 2 章把指标按它在评估系统的哪一段分成了检索侧与生成侧。本章就沿着这条线把每个指标拆开讲透。先给一张带输入与是否需参考的速查表作为全章地图。事实下表是否需要 reference由指标的输入字段决定——需要reference标准答案/参考文本的指标离线有黄金集才能算不需要的reference-free可在生产流量上直接跑。指标所属侧是否需要 reference关键输入分数方向Context Precision含 with_reference检索是with_referenceuser_input,reference,retrieved_contexts越大越好Context Recall检索是user_input,reference,retrieved_contexts越大越好Context Entities Recall检索是reference,retrieved_contexts越大越好Noise Sensitivity噪声敏感度检索是user_input,response,reference,retrieved_contexts越小越好Response Relevancy检索相关性闸门否user_input,response越大越好ContextUtilization上下文利用率检索否user_input,response,retrieved_contexts越大越好Faithfulness忠实度生成否user_input,response,retrieved_contexts越大越好Answer Relevancy答案相关性生成否user_input,response越大越好观点把是否需要 reference当成你选型的第一道筛子。离线有黄金集CI 门禁就优先用 reference 类指标拿绝对值线上无标注流量则用 reference-free 指标Faithfulness、ContextUtilization、Response/Answer Relevancy做回归监控。详见 4.4。哪些是 reference-free无参考明确标注检索侧 reference-freeContextUtilization、Response Relevancy。生成侧 reference-freeFaithfulness、Answer Relevancy。必须带 referenceContext Precisionwith_reference 形态、Context Recall、Context Entities Recall、Noise Sensitivity。事实上述归属来自 v0.4.3 各指标ascore()的必需入参见官方迁移指南与指标文档链接见 4.7。其中Context Precision的无参考形态即ContextUtilization见 4.2.6Context Recall不存在无参考形态见 4.2.2。本节小结指标按检索侧/生成侧划分检索侧看召回的上下文好不好生成侧看基于上下文生成的答案好不好。选型第一步先分清reference-free vs 需要 reference前者可上生产后者宜进离线黄金集。注意方向陷阱Noise Sensitivity是越小越好其余指标均越大越好。4.2 检索侧指标检索侧回答一个问题“召回的上下文本身质量如何以及它有没有把答案带偏”下面 6 个指标每个都按测什么 / 怎么算 / 代码怎么跑 / 怎么解读展开。先放一段公共环境准备后续每个示例都假设已执行它保证每个片段可独立粘贴运行。# 环境准备ragas0.4.3, openai# ——只需执行一次fromopenaiimportOpenAIfromragas.llmsimportllm_factoryfromragas.embeddings.baseimport(embedding_factory,)fromragas.metrics.collectionsimport(ContextPrecision,ContextRecall,ContextEntityRecall,NoiseSensitivity,ContextUtilization,AnswerRelevancy,Faithfulness,)client(OpenAI())# 同步客户端配合 .score()llmllm_factory(gpt-4o-mini,clientclient)# 裁判 LLM# 仅 AnswerRelevancy 需要embeddingsembedding_factory(openai,modeltext-embedding-3-small,clientclient,)事实llm_factory是 v0.4 推荐的模型注入方式会从模型名推断厂商embedding_factory同步注入 Embedding。两者均来自 collections API。版本说明evaluate()legacy在 v0.4.3 会触发DeprecationWarning官方对何时移除表述不一指标文档曾写 v1.0迁移指南写未来版本——以你实际安装的版本实测为准。ragas.metrics小写单例如ragas.metrics.faithfulness官方明确计划在v1.0 移除新代码请用ragas.metrics.collections。4.2.1 Context Precision上下文精确率含 with_reference 变体测什么衡量召回的上下文里到底有多少对回答问题真的有用并且对排序敏感——排在前面的相关上下文越多分数越高。它判断的是检索的精确率precision。怎么算事实在 collections API 中ContextPrecision是ContextPrecisionWithReference的别名默认即带参考形态。算法让 LLM 逐条判断这个上下文是否对得出 reference 答案有用得到 verdict 序列[1,0,1,...]再算平均精度Average PrecisionAP Σ_k (Precisionk × rel_k) / (相关上下文总数)其中rel_k为第 k 个上下文是否有用1/0。相关上下文排得越靠前Precisionk越高总分越高。代码怎么跑scorerContextPrecision(llmllm)# 默认即 with_reference 形态resultscorer.score(user_input埃菲尔铁塔位于哪里,reference(埃菲尔铁塔位于法国巴黎。),retrieved_contexts[埃菲尔铁塔位于法国巴黎。,勃兰登堡门位于德国柏林。,],)print(result.value)with_reference 变体说明事实ContextPrecisionContextPrecisionWithReference必须传reference。它的无参考孪生兄弟是ContextUtilizationContextPrecisionWithoutReference见 4.2.6后者把对照物从 reference 换成生成的response因此不需要 reference。两者导入写法fromragas.metrics.collectionsimport(ContextPrecision,)# 带参考fromragas.metrics.collectionsimport(ContextUtilization,)# 无参考对照 response怎么解读分数高相关上下文排在前面、噪声少 → 检索/重排质量好。分数低要么召回了大量无关上下文要么相关项被埋在后面 → 优先检查召回策略、重排器、chunk 切分。观点它是检索精确率的代理指标适合在离线黄金集上衡量检索是否干净线上无 reference 时改用ContextUtilization。4.2.2 Context Recall上下文召回率含 with_reference 变体测什么衡量回答所需的事实是否都被召回了——即检索的召回率recall。它关心该找的有没有找全与 4.2.1 的找得准不准互补。怎么算事实算法把reference拆成若干陈述句逐句判断是否能被至少一段retrieved_contexts支撑得到[1,0,1,...]分数 被支撑句数 / 总句数Context Recall Σ(被支撑的陈述) / (reference 总陈述数)代码怎么跑scorerContextRecall(llmllm)resultscorer.score(user_input埃菲尔铁塔位于哪里,reference(埃菲尔铁塔位于法国巴黎。它建于 1889 年。),retrieved_contexts[埃菲尔铁塔位于法国巴黎。,勃兰登堡门位于德国柏林。,],)print(result.value)with_reference 变体说明事实Context Recall在 RAGAS 中只存在带参考形态——reference是必需输入因为它要拿 reference 做拆分与归因。换言之它没有无参考without_reference变体这是它与Context Precision有 with/without 两种在设计上的关键区别。如果你只有线上流量、没有标准答案就无法直接计算 Context Recall应改用ContextUtilization或Faithfulness。怎么解读分数高reference 里的关键事实基本都被检索命中 → 召回覆盖充分。分数低大量事实没被召回漏检→ 优先扩召回混合检索、query 改写、放宽 top-k、补索引。观点Precision 与 Recall 通常是trade-off。改进时别只盯一个把 Context Precision 拉满却牺牲 Recall答案是干净但答不全。建议两个一起看见 4.4 选型。4.2.3 Context Entities Recall关键实体召回率测什么衡量reference 里出现的关键命名实体人、地、机构、术语等有多大比例出现在召回的上下文中。它是 Context Recall 的实体粒度补充对实体密集的问答如医疗、法律、金融尤其敏感。怎么算事实先从reference中抽取实体集合再判断每个实体是否出现在retrieved_contexts通常结合精确/语义匹配分数 命中的实体数 / reference 实体总数。注意它只需要reference与retrieved_contexts不需要user_input/response。代码怎么跑scorerContextEntityRecall(llmllm)resultscorer.score(reference(OpenAI 于 2015 年在旧金山成立由 Sam Altman 等人创办。),retrieved_contexts[(OpenAI 是一家人工智能公司总部位于旧金山。),(Sam Altman 是 OpenAI 的联合创始人之一。),],)print(result.value)怎么解读分数高关键实体基本被召回 → 检索在抓重点对象上表现好。分数低reference 里的核心实体没被检索到 → 可能 entity 相关文档未被索引或 chunk 没覆盖到实体出现处。观点当你的业务答错一个实体就出大事如用药剂量、法律条款主体时把它和 Context Recall 一起纳入门禁比单看 Context Recall 更稳。4.2.4 Noise Sensitivity噪声敏感度测什么衡量当检索结果里混入了无关上下文时生成答案是否被带偏、产生错误声明。它专门测系统的抗噪鲁棒性。怎么算事实对response中的每条声明判断它a相对reference是否正确、b能否归因到相关/无关上下文。默认moderelevant时noise sensitivity(相关) (response 中错误声明的总数) / (response 中声明的总数)分数范围0–1越小越好注意方向。还支持modeirrelevant改测在无关上下文干扰下是否仍出错。代码怎么跑scorerNoiseSensitivity(llmllm)# 默认 moderelevant# scorer NoiseSensitivity(llmllm,# modeirrelevant)resultscorer.score(user_input(印度人寿保险公司LIC以什么闻名),response(LIC 是印度最大的保险公司以庞大的投资组合闻名并为国家金融稳定做出贡献。),reference(LIC 是印度最大的保险公司成立于 1956 年以管理庞大投资组合闻名。),retrieved_contexts[LIC 成立于 1956 年。,(LIC 是印度最大的保险公司拥有庞大的保单网络与投资。),(LIC 管理巨额资金贡献国家金融稳定。),(印度经济是增长最快的主要经济体之一。),# 噪声],)print(result.value)怎么解读分数低接近 0即使混入噪声答案仍基本正确 → 抗噪好。分数高噪声让模型产生了错误声明 → 脆弱需加强重排/过滤、或在生成侧加仅依据给定上下文作答的约束。观点这是少数越小越好的指标也是 4.5 要讲的高分≠好陷阱的典型反例——别把它和其他指标一起求平均时忘了取反。建议把它单列监控。4.2.5 Response Relevancy回答相关性检索侧视角测什么衡量生成的回答是否紧扣原始问题。事实在 RAGAS 文档中该指标亦称Response Relevancy其 collections 实现类就是AnswerRelevancy见 4.3.2。第 2 章把它列在检索侧是因为它常被用作检索→生成链路上的相关性闸门——召回的上下文是否足以支撑一个切题的回答。它不需要 reference属于 reference-free。怎么算事实让 LLM 从response逆向生成 N 个问题默认 3由strictness控制计算原始user_input的 embedding与各生成问题的 embedding之间的余弦相似度均值Answer Relevancy mean( cosine_sim(E_原始问题, E_生成问题_i) )只衡量切题不衡量事实对错事实对错看 Faithfulness。代码怎么跑scorerAnswerRelevancy(llmllm,embeddingsembeddings)# 需注入 embeddingsresultscorer.score(user_input(第一届超级碗是什么时候举行的),response(第一届超级碗于 1967 年 1 月 15 日举行。),)print(result.value)事实该指标只吃user_input与response外加一个 Embedding 组件不接收reference因此可纯线上运行。分数范围通常 0–1但余弦相似度数学上可达 -1~1极端情况未必严格落在 0–1。怎么解读分数高回答切题、没有跑题或答非所问。分数低回答空洞、偏离问题或只覆盖了问题的一个侧面 → 检查问题理解/检索是否命中了正确意图。观点把它放在检索侧是为了用回答是否切题反向校验检索是否把对的内容喂进来了。若检索侧 Context Precision 高、但 Response Relevancy 低往往是生成/问题理解环节的问题而非检索。4.2.6 ContextUtilization上下文利用率——必补指标测什么衡量召回的上下文中有多少真正被生成的回答用到了。它是ContextPrecisionWithoutReference的现代别名不需要 reference只用response做对照。第 2 章指标全景把它列为检索侧第 6 个指标这里补全。怎么算事实ContextUtilization是ContextPrecisionWithoutReference的包装别名namecontext_utilization。与 4.2.1 的ContextPrecision对照reference不同它把对照物换成生成的response逐条判断这个上下文是否对生成该response有用再算平均精度AP。因此它是reference-free的上下文有用性指标。ContextUtilization AP( 逐上下文是否有用于生成 response )代码怎么跑scorerContextUtilization(llmllm)# ContextPrecisionWithoutReferenceresultscorer.score(user_input埃菲尔铁塔位于哪里,response埃菲尔铁塔位于法国巴黎。,retrieved_contexts[埃菲尔铁塔位于法国巴黎。,(勃兰登堡门位于德国柏林。),# 无关应被降权],)print(result.value)事实导入写法from ragas.metrics.collections import ContextUtilization等价地也可写from ragas.metrics.collections import ContextPrecisionWithoutReference。两者在 v0.4.3 行为一致迁移指南明确 ContextUtilization 现在是后者的兼容包装。怎么解读分数高回答几乎用到了召回的大部分上下文 → 检索召得准且用得上冗余少。分数低召回了大量但回答根本没用到的上下文 → 检索噪声大、或生成时没善用上下文。可与Noise Sensitivity、Context Precision联动看。观点当你没有标准答案、又想评估检索质量时ContextUtilization是Context Precision的最佳无参考替代它和第 2 章reference-free 评估的初衷最契合。4.2 检索侧小结检索侧 6 指标覆盖精确率Context Precision、召回率Context Recall、Entities Recall、抗噪Noise Sensitivity、相关性闸门Response Relevancy、无参考有用性ContextUtilization。需要 referenceContext Precision(with_reference)、Context Recall、Context Entities Recall、Noise Sensitivity。不需要 referenceContextUtilization、Response Relevancy——可上生产。方向唯一反例Noise Sensitivity越小越好别在汇总时误当越大越好。前一章《3 步把 RAG 输出变成可评估数据集附代码》后一章生成侧指标与指标选型别再乱用 Faithfulness