尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
RAG 评测:传统检索指标与 RAGAS
RAG 评测传统检索指标与 RAGAS本文是 RAG 系列第三篇重点讨论如何评估 RAG 系统的检索质量和生成质量并使用 RAGAS 定位问题、驱动优化。参考文章《干货大厂常用的主流 RAG 评估框架》当前目录的RAGAS部分图片摘自上述blog如有侵权可删除一、为什么需要 RAG 评测只看最终答案是否“看起来合理”是不够的。RAG 的问题可能来自不同环节文档没有解析好 → Chunk 切分不合理 → Query 没有理解或改写好 → 召回没有找到关键内容 → Rerank 排序不准确 → 模型没有正确使用上下文如果没有评测数据就无法判断问题到底出在哪里也无法验证一次优化是否真的有效。RAG 评测的目标不是只给系统一个总分而是回答三个问题检索到了正确的内容吗 模型使用了这些内容吗 最终答案真正解决了问题吗二、F1、Recall、Precision传统评估指标Precision、Recall 和 F1 最初常用于分类和信息检索也可以用来评估 RAG 的候选召回结果。使用这些指标前必须先定义什么是“相关内容”并准备问题、相关文档或 Chunk 的标注结果。2.1 混淆矩阵与指标基础对于一个检索结果可以把“相关文档”视为正类预测为相关预测为不相关实际相关TP真正例找到了相关内容FN假负例漏掉了相关内容实际不相关FP假正例召回了无关内容TN真负例正确排除了无关内容在 RAG 中通常更关注 Top-K 候选中的 TP、FP 和 FNTP召回的 Chunk 确实能够帮助回答问题FP召回了与问题无关或噪声较大的 ChunkFN知识库中存在相关 Chunk但没有被召回。多分类任务可以针对某一个类别采用“一类对其余类别”的方式计算 TP、FP、FN 和 TN。下面的混淆矩阵示例以 A 类为目标类别帮助理解多分类场景下的指标计算2.2 Precision、Recall 与 F1Precision 关注找出来的结果中有多少是真的相关。Precision TP / (TP FP)例如系统检索出 10 个 Chunk其中 8 个相关、2 个无关Precision 8 / 10 0.8Precision 低通常意味着召回噪声较大需要检查 Chunk 质量、元数据过滤、BM25 与向量召回配置以及是否需要 Reranker。Recall 关注所有真正相关的内容中有多少被找回来。Recall TP / (TP FN)例如知识库中有 20 个与问题相关的 Chunk系统找回了其中 12 个Recall 12 / 20 0.6Recall 低说明系统漏掉了重要内容通常需要检查 Query 表达、Chunk Size、Embedding 模型、召回 Top-K、Hybrid Search 和 Query Enhancement。F1 是 Precision 和 Recall 的调和平均值F1 2 × Precision × Recall / (Precision Recall)当 Precision 0.8、Recall 0.6 时F1 2 × 0.8 × 0.6 / (0.8 0.6) ≈ 0.686F1 适合同时关注“找得准”和“找得全”的场景但它不一定适合作为唯一指标。若系统更害怕漏掉关键资料可以更重视 Recall若系统更害怕把无关内容送入 Prompt则应更重视 Precision。当 Precision 和 Recall 的重要性不对称时可以使用 F-betaFβ (1 β²) × Precision × Recall / (β² × Precision Recall)F0.5更重视 PrecisionF2更重视 Recall。2.3 RAG 中的 Top-K 与排序指标RAG 通常只向后续重排和生成阶段传递 Top-K 结果因此还需要观察排名位置指标主要含义PrecisionK前 K 个结果中相关 Chunk 的比例RecallK所有相关 Chunk 中出现在前 K 个结果的比例MRR第一个相关结果排名倒数的平均值NDCG同时考虑相关性等级和排名位置的排序指标例如Recall10 关注“相关内容有没有进入前 10 个候选”而 MRR 更关注“第一个相关内容排得是否足够靠前”。三、RAGAS3.1 检索质量与生成质量检索评测关注系统是否找到了正确、完整、相关的上下文常用 PrecisionK、RecallK、MRR、NDCG、Context Precision 和 Context Recall。生成评测关注模型是否基于上下文生成了相关、忠实、正确的答案常用 Faithfulness、Answer Relevance 和 Answer Correctness。检索质量和生成质量需要分开分析如果相关内容根本没有被召回单纯更换生成模型通常无法解决如果上下文已经正确但答案仍然胡编则应重点检查 Prompt 和生成模型。RAGAS 官方文档 提供了一组面向 RAG 应用的评测指标用于分别衡量检索上下文和生成答案的质量。3.2 Faithfulness忠实度Faithfulness 衡量答案中的陈述能否从检索到的上下文中得到支持答案中的陈述是否有上下文依据它不是事实正确率。如果知识库本身存在错误模型忠实地复述错误上下文Faithfulness 仍然可能很高。因此Faithfulness 衡量的是“基于上下文的可支持率”而不是现实世界中的绝对正确性。3.3 Answer Relevance答案相关性Answer Relevance 关注 Query 与 Answer 的关系答案是否真正回答了用户的问题一个答案即使事实正确如果答非所问、偏离用户意图或只回答了问题的一小部分相关性仍然可能较低。它主要衡量生成结果是否切题不直接衡量检索上下文是否正确。3.4 Context Precision上下文精确率Context Precision 主要衡量检索结果的排序质量相关 Chunk 是否排在无关 Chunk 前面。检索到的上下文中有多少真正有助于回答问题该指标较低时通常可以检查Chunk 是否过大包含过多无关内容Top-K 是否设置过高Embedding 是否适合当前领域BM25、向量召回和 Hybrid Search 是否配置合理是否需要 Cross-Encoder Reranker。3.5 Context Recall上下文召回率Context Recall 主要衡量回答所需的关键信息是否被完整召回参考答案需要的信息是否都能在检索上下文中找到该指标较低时可以检查Query 是否表达清楚是否需要 Query Rewrite、Query Decomposition 或 Multi-QueryChunk 是否切得过碎导致相关内容分散召回 Top-K 是否过小是否需要 Parent-Child 或多路召回。3.6 RAGAS 指标之间的区别指标主要关系典型问题Context PrecisionQuery / 参考答案 ↔ Retrieved Context找到的内容噪声多不多Context Recall参考答案 → Retrieved Context关键内容有没有找全FaithfulnessRetrieved Context → Answer答案有没有脱离上下文编造Answer RelevanceQuery → Answer答案有没有真正回答问题最容易混淆的是 Faithfulness 和 Context RecallFaithfulness答案有没有超出上下文乱说 Context Recall上下文有没有把回答所需的信息找全需要注意RAGAS 的 Context Recall 与传统 RecallK 不完全相同。传统 RecallK 通常依赖相关文档标注RAGAS 的 Context Recall 更关注参考答案中的关键信息是否能够在检索上下文中找到。3.7 用四个问题理解 RAGAS如果暂时不看公式可以把四个指标理解成四个问题阶段指标直观问题检索Context Precision排在前面的上下文是否大多真正相关检索Context Recall回答问题所需的信息是否被找全生成Faithfulness答案中的陈述是否都能被上下文支持生成Answer Relevance答案是否真正回应了用户的问题从计算直觉上看Context Precision 会关注相关内容在候选列表中的排名相关 Chunk 越靠前得分通常越高Context Recall 会把参考答案拆解为若干信息陈述检查检索上下文覆盖了多少Faithfulness 会检查答案中的陈述是否能够在上下文中找到依据Answer Relevance 则常通过让评测模型根据答案反向生成问题再与原问题计算语义相似度判断答案是否切题。这些描述是帮助理解的简化版本不等同于所有 RAGAS 版本的精确实现。尤其要注意参考文章中“四个指标都不需要人工标准答案”的说法不能直接泛化。Faithfulness和通常的Answer Relevance可以不依赖标准答案但Context Precision、Context Recall的常见实现仍需要reference或相关性标注是否支持无参考答案模式要以具体 RAGAS 版本和指标类为准。3.8 使用 Python 调用 RAGAS下面是一个基于 RAGAS 新版collectionsAPI 的核心调用示例需要放在async函数中执行。实际项目通常会把模型配置、异步客户端和异常处理进一步封装起来但核心输入基本一致问题、回答、检索上下文以及部分指标需要的参考答案。工程中可以把四项指标封装成一个评测器类统一处理输入校验、指标调用和分数提取importmathfromtypingimportAnyfromragas.metrics.collectionsimport(AnswerRelevancy,ContextPrecision,ContextRecall,Faithfulness,)classRAGASEvaluator:def__init__(self,llm:Any,embeddings:Any):self.llmllm self.embeddingsembeddingsstaticmethoddef_validate_text(**values:str)-None:forname,valueinvalues.items():ifnotisinstance(value,str)ornotvalue.strip():raiseValueError(f{name}必须是非空字符串)staticmethoddef_validate_contexts(contexts:list[str])-None:if(notisinstance(contexts,list)ornotcontextsorany(notisinstance(item,str)ornotitem.strip()foritemincontexts)):raiseValueError(contexts 必须是非空文本列表)staticmethoddef_score(result:Any)-float:scorefloat(result.value)ifnotmath.isfinite(score):raiseValueError(RAGAS 返回了无效分数)returnscoreasyncdefanswer_relevancy(self,question:str,answer:str)-float:self._validate_text(questionquestion,answeranswer)resultawaitAnswerRelevancy(llmself.llm,embeddingsself.embeddings).ascore(user_inputquestion,responseanswer)returnself._score(result)asyncdeffaithfulness(self,question:str,answer:str,contexts:list[str])-float:self._validate_text(questionquestion,answeranswer)self._validate_contexts(contexts)resultawaitFaithfulness(llmself.llm).ascore(user_inputquestion,responseanswer,retrieved_contextscontexts,)returnself._score(result)asyncdefcontext_precision(self,question:str,contexts:list[str],reference:str)-float:self._validate_text(questionquestion,referencereference)self._validate_contexts(contexts)resultawaitContextPrecision(llmself.llm).ascore(user_inputquestion,retrieved_contextscontexts,referencereference,)returnself._score(result)asyncdefcontext_recall(self,question:str,contexts:list[str],reference:str)-float:self._validate_text(questionquestion,referencereference)self._validate_contexts(contexts)resultawaitContextRecall(llmself.llm).ascore(user_inputquestion,retrieved_contextscontexts,referencereference,)returnself._score(result)asyncdef__aenter__(self):returnselfasyncdef__aexit__(self,*_):# 如果由评测器内部创建客户端应在这里关闭示例中客户端由外部注入。returnFalse这个类本身不决定使用哪一家模型服务llm和embeddings可以由 OpenAI、Qwen、DeepSeek 或其他 OpenAI-compatible 服务创建后注入。这样做可以把“评测逻辑”和“模型配置”分离也便于替换评测模型。生产实现还应补充异步客户端的创建与aclose()资源释放下面链接中的完整工程类已经包含这些处理。fromragas.embeddingsimportembedding_factoryfromragas.llmsimportllm_factoryfromragas.metrics.collectionsimport(AnswerRelevancy,ContextPrecision,ContextRecall,Faithfulness,)# llm 和 embeddings 需要根据实际模型服务配置llmllm_factory(your-judge-model,provideropenai)embeddingsembedding_factory(openai,modelyour-embedding-model)question公司的年假规则是什么answer员工入职满一年后可以享受带薪年假。contexts[员工入职满一年后可根据公司制度享受带薪年假。,员工福利还包括节日礼品和团建活动。,]reference员工入职满一年后可以享受带薪年假。# Faithfulness答案是否被检索上下文支持不需要 referencefaithfulnessawaitFaithfulness(llmllm).ascore(user_inputquestion,responseanswer,retrieved_contextscontexts,)# Answer Relevance答案是否真正回答了问题需要 LLM 和 Embeddinganswer_relevanceawaitAnswerRelevancy(llmllm,embeddingsembeddings).ascore(user_inputquestion,responseanswer)# Context Precision / Recall需要 referencecontexts 应保持原始检索顺序context_precisionawaitContextPrecision(llmllm).ascore(user_inputquestion,retrieved_contextscontexts,referencereference,)context_recallawaitContextRecall(llmllm).ascore(user_inputquestion,retrieved_contextscontexts,referencereference,)print({faithfulness:faithfulness.value,answer_relevance:answer_relevance.value,context_precision:context_precision.value,context_recall:context_recall.value,})这段代码中的llm通常是用于判断和拆解答案的评测模型embeddings用于计算问题与答案之间的语义相关性。生产环境建议使用异步客户端、统一的模型配置和aclose()释放资源并记录问题、检索结果、模型版本、指标分数、延迟和成本。完整的工程封装示例可参考evaluator.py。该实现还补充了 OpenAI-compatible 服务配置、输入校验、NaN/Infinity 检查、资源关闭以及通过RAGAS_DO_NOT_TRACK关闭遥测等工程处理。对于多条测试数据不应每条数据都重复创建 LLM 和 Embedding 客户端。可以复用一个RAGASEvaluator再通过asyncio.Semaphore控制并发最后计算各指标的平均分importasynciofromstatisticsimportmeanfromevaluatorimportRAGASEvaluatorasyncdefevaluate_one(evaluator,item):return{answer_relevancy:awaitevaluator.answer_relevancy(item[question],item[answer]),context_precision:awaitevaluator.context_precision(item[question],item[contexts],item[reference]),context_recall:awaitevaluator.context_recall(item[question],item[contexts],item[reference]),faithfulness:awaitevaluator.faithfulness(item[question],item[answer],item[contexts]),}asyncdefmain(dataset,concurrency2):# llm 和 embeddings 由前面的模型配置创建后注入asyncwithRAGASEvaluator(llm,embeddings)asevaluator:semaphoreasyncio.Semaphore(concurrency)asyncdefworker(item):asyncwithsemaphore:returnawaitevaluate_one(evaluator,item)resultsawaitasyncio.gather(*(worker(item)foritemindataset))averages{name:mean(result[name]forresultinresults)fornameinresults[0]}print(averages)asyncio.run(main([{question:法国的首都是哪里,answer:法国的首都是巴黎。,contexts:[巴黎是法国的首都。,柏林是德国的首都。],reference:巴黎。,}]))真实项目还应记录每条 case 的编号、耗时、模型版本和原始检索结果并根据 API 限流设置并发数和请求间隔。完整的单条/批量调用示例可参考example.py。四、评测数据集与优化闭环4.1 如何构建评测数据集一个可用的 RAG 评测集至少应包含用户问题 参考答案 相关文档或参考上下文 问题类型 来源和版本信息问题应覆盖真实业务中的不同情况事实查询多轮追问和指代问题比较、因果和多跳问题包含实体、编号、年份和版本限制的问题知识库没有答案的拒答问题多来源冲突或文档版本变化的问题。评测集不能只包含容易回答的问题否则指标会过于乐观。还应按照问题类型、文档类型、用户权限和数据版本进行分层统计。4.2 评测驱动优化评测不是流程终点而是优化的反馈信号建立基线 ↓ 运行评测 ↓ 定位低分指标 ↓ 修改对应环节 ↓ 重新评测并保留实验记录常见定位方式RecallK / Context Recall 低 → 检查分块、Query Rewrite、Embedding、召回 Top-K 和多路召回 PrecisionK / Context Precision 低 → 检查召回噪声、BM25 与向量权重、RRF 和 Reranker Faithfulness 低 → 检查上下文组织、Prompt 约束和生成模型 Answer Relevance 低 → 检查 Query Understanding、问题改写和回答格式每次优化都应记录数据版本、代码版本、模型版本、参数、延迟、成本和评测结果避免只凭少量案例判断效果。五、评测注意事项与总结5.1 不要只看单一指标提高 Context Recall 可能带来更多噪声Context Precision 反而下降提高 Faithfulness 也可能让模型过于保守。因此应同时观察检索、排序和生成指标。5.2 不要把 Faithfulness 当作事实正确率Faithfulness 衡量“答案是否被上下文支持”而不是“上下文本身是否正确”。法律、金融、医疗等高风险场景仍需要人工审核或权威数据校验。5.3 评测集、延迟与成本公开数据集可以用于初步测试但最终决策应基于真实用户问题、真实文档、权限约束和业务验收标准。Query 改写、Multi-Query、Rerank 和 RAGAS 评测都可能增加模型调用、延迟和费用。效果提升必须和系统吞吐、响应时间及调用成本一起评估。RAG 评测的核心不是给系统打一个分而是定位问题传统指标检索结果准不准、全不全、排得好不好 RAGAS上下文是否相关、答案是否忠实、回答是否切题 评测闭环根据低分指标回到具体环节继续优化完整的 RAG 学习和工程闭环可以表示为RAG 概览 ↓ RAG 细节与优化 ↓ RAG 评测 ↺ 根据评测结果回到具体环节继续优化个人声明本文内容是个人在学习、实践和工程探索过程中的整理与理解评测指标和工具会随着版本与实践持续演进。具体项目应结合真实数据、人工标注、业务风险、延迟和成本进行综合判断。本文后续会继续补充 RAGAS 实践、评测数据集构建和工程落地案例。
RELATED

相关推荐

解构企业级文档知识库:深入剖析 KY KMS 的 Elasticsearch 倒排检索与权限分层架构

解构企业级文档知识库:深入剖析 KY KMS 的 Elasticsearch 倒排检索与权限分层架构

解构企业级文档知识库:深入剖析 KY KMS 的 Elasticsearch 倒排检索与权限分层架构 项目规格书、技术白皮书、合同、审计凭证、内部制度……企业里的非结构化文档每年都在成倍增长。它们散落在文件服务器、网盘、部门共享目录和个人电脑里,形成典型的“知…

📅 2026/10/13 7:07:26
智能制造数字化工艺设计管理系统:从数据建模到集成落地

智能制造数字化工艺设计管理系统:从数据建模到集成落地

简介:面向制造业转型升级的智能制造数字化工艺设计管理系统方案,重点解决传统工艺设计效率低、可重复性差、难以适配快速变化生产需求等问题,适合制造企业工艺规划、数字化工厂建设及智能制造研究人员参考。压缩包内为1个PDF文件(…

📅 2026/10/13 7:07:26
ControlNet双CPU冗余实战:通信链路、状态同步与毫秒级切换

ControlNet双CPU冗余实战:通信链路、状态同步与毫秒级切换

简介:本资源是一份面向工业自动化工程师与PLC系统设计人员的技术论文,聚焦于提升关键产线连续运行能力的双CPU冗余控制方案。针对高可靠性要求的中大型PLC系统,文章基于罗克韦尔ControlLogix 756-L55双CPU控制器,结合ControlNet现…

📅 2026/10/13 7:07:26
MORE NEWS

更多资讯

📰

VSCode配置C++环境:从编译器安装到可调试工程的完整指南

1. 为什么VSCode配C环境让很多人卡在第一步?这根本不是编辑器的问题“VSCode安装、配置c运行环境、插件安装以及常见问题”——这个标题看着平平无奇,但背后藏着一个真实现状:超过65%的初学者在搭建C开发环境时,不是败在语法上&am…

📰

编译原理期末试题解答:DFA最小化与LL(1)分析表手算模板

简介:这份资源是吉林大学《编译原理》课程2003至2017级期末试题的解答合集,面向正在备考或希望巩固编译原理知识的高校学生。内容覆盖词法分析、语法分析、语义分析、中间代码生成、代码优化、目标代码生成、错误处理与运行时系统等核心章节,…

📰

2026年技术交叉风口:AI智能体、6G、量子计算与碳纤维

1. 为什么我说2026年的风口藏在"技术交叉处"2026年如果只用一个词概括科技圈的状态,我会用"格式化"。过去两年AI赛道的热度已经把概念炒得很高了,但一个明显的信号是,越来越多人开始意识到,真正的赢家不再比拼…

📰

深入理解C++ SFINAE:从enable_if到void_t,掌握模板编译期类型分发

写SFINAE这篇文章,其实是我最近在一个序列化库的编译期类型分发里把它用到极致后,又被模板报错折磨到想砸键盘,才决定好好整理一番。很多用C写了几年的人,看到模板堆里那一串 enable_if 、 void_t 、 decltype 的回声&#…

📰

开源能源管理系统MyEMS实战:部署、数据采集与告警全解析

1. 为什么我盯上了 MyEMS 这个开源能源管理系统 做节能改造和能源管理这行久了,你会发现一个很尴尬的现状:市面上的能源管理系统,要么是大型商业软件,功能确实全,但报价动辄几十万上百万,实施周期按季度算&…

📰

职场心理博弈漫画创作指南

1. 职场心理博弈的漫画化表达这个标题描述了一个极具戏剧性的职场场景:一位长期被领导打压的员工在获得年终奖后立即辞职,而领导却以"为你好"为由试图道德绑架。这种强烈的冲突感非常适合用漫画形式表现,既能突出黑色幽默&#xff…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬