ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

RAG评估体系实战:从检索命中率到忠实度的完整方法论

RAG评估体系实战:从检索命中率到忠实度的完整方法论

做了快三年检索增强生成(RAG)相关的项目,我最大的体会是:大部分团队把一条RAG链路跑通,就觉得可以交差了。拿着几个精心设计的高质量问题轮番演示,答案漂亮、引用正确、速度也快,看起来很完美。但真接到真实业务场景里,用户的问题稍微绕一点、文档库涨到几万篇、文档隔三差五更新,系统就开始胡说八道、答非所问,或者自信地给出一段"看起来完全正确"的幻觉内容。

问题不在模型,也不在向量库,更不在embedding选得不够好,而在于整个团队对"什么算答得好"这件事根本没有定义。RAG从来就不是"能答就行",它是检索链路和生成链路的叠加,任何一个环节悄悄失效,你拿到的都是一份自然流畅却完全不能用的回答。要让系统真正达到生产可用,一套可落地的RAG评估体系是必不可少的,它能把你手下人对"感觉还不错"的直觉,变成一组可量化、可追踪、可回归的客观指标。

这篇文章我会从为什么不能靠人工抽查验收入手,把RAG评估应该覆盖哪些维度、评估集怎么建、自动化指标怎么选、完整跑一轮评估又是什么流程,全部展开讲一遍,最后附上我踩过的坑和排查经验。不管你是刚接触RAG的开发者,还是已经在维护一条线上RAG系统的老手,这套方法论都可以直接拿过去用。

1. 为什么"能答就行"的验收逻辑,在RAG项目里最先翻车

1.1 RAG一次失败可能发生在两个完全不同的环节

很多刚接触RAG的朋友,习惯把整个系统当成一个"智能问答机器人"来看:输入问题,输出答案。这种视角在demo阶段没问题,但一旦进入工程化阶段,它会让你的排查效率变得极低。

RAG的本质是把一个复杂的问答任务拆成两段:第一段是从文档库中找到和当前问题相关的片段,这由检索模块负责;第二段是把这些片段整理成连贯、准确的自然语言答案,这由大模型负责。这两个模块的错误模式完全不同,失败原因也几乎不相关。

举个例子,用户问"我们公司今年第一季度华东区的销售退回率是多少",如果检索模块没有召回正确的季度报表,那生成模块再强也是巧妇难为无米之炊。反过来,如果检索召回了正确的报表,但大模型在归纳数字时看错行、或者把两个年份的数据做了合并,那答案依然是不对的。

"能答就行"这种验收方式,只关心最终答案对不对,完全不关心错误发生在哪一段。结果就是:系统上线后,用户反馈十条问题,有八条不靠谱,你根本不知道是向量检索的相似度阈值设得不对,还是prompt里对"多久以内的数据算有效"约束得不够。你只能一遍遍改,改完之后还不知道改对了没有。

1.2 人工抽查为什么撑不过三个星期

我见过不少团队,最初的评估方案是"让一位同事每天拿20个问题试一遍,看看答得好不好"。这种做法听起来直接,实际上有几个绕不过去的问题。

第一个问题是标准漂移。周一A同学觉得"答案提到关键词就算对",周五B同学觉得"必须把数值也算对"。同一个答案,不同人打分能差出两分。第二个问题是覆盖面有限。人工测试的问题往往集中在系统做得好的区域,因为业务方最熟悉的问题就那几个,真实世界里的冷门问法、跨文档推理、隐含否定词这些最难的情况,很少出现在抽查列表里。第三个问题是不可回归。今天改了一版prompt,oracle测试感觉"好像变好了",但说不清好在哪里,更说不清是不是只是换了一批测试问题带来的错觉。

人工评估不是完全不能用,而是它只能在有明确评分标准、有限样本量、以及跨期一致性保证的前提下作为辅助手段。真正的生产级RAG系统,需要的是一套能自动执行、能重复跑、能给出趋势对比的评估机制。

注意:如果你现在的RAG项目还是靠"让实习生每天问20个问题"来验收,那这篇文章后面的内容建议你认真读完。你缺的不是更好的模型,是评估手段。

2. 一套可落地的评估体系到底该评估哪些维度

2.1 从检索质量到生成质量,拆开看才有意义

在设计评估体系之前,先要把"答得好"拆成一组可单独量化的维度。我常用的拆法是把RAG评估分成两大层:检索层评估和生成层评估。

检索层关注的是:有没有把真正相关的上下文找回来?这层最常见的指标是命中率(Hit Rate)、排序质量(MRR)和上下文精确度(Context Precision)。命中率衡量的是"正确答案所在的文档有没有出现在召回列表里",它是最粗但也最重要的一道关口——检索都没召回,生成注定是错的。MRR进一步看的是排在最前面的正确片段位置靠不靠前,因为大多数RAG实现只会把top-k片段塞给大模型,排太靠后的片段实际上不会被使用。

生成层关注的是:"给定召回的上下文,模型生成的答案是否忠实地基于这些信息?"这里最核心的两个指标是忠实度(Faithfulness)和答案相关性(Answer Relevancy)。忠实度回答的问题是:答案中的每一条关键信息,是否都能在上文给出的检索片段里找到依据?如果模型在上下文之外额外补充了"自己的知识",哪怕那段知识是对的,在RAG体系里也要记为不忠实的。答案相关性回答的问题是:输出内容是不是真的在回答用户问的那个问题,有没有答非所问、说了半天废话却没触及核心。

这两个层面的指标必须分开看,混在一起只有一个综合分的话,你会丢失定位问题的能力。我自己跑评估时,打开结果表第一件事就是对比"检索命中率"和"生成忠实度"这两列——如果命中率低,问题大概率出在索引、切分和embedding侧;如果命中率挺高但忠实度低,问题大概率出在prompt设计或者大模型自身能力上。方向明确,调试才有意义。

2.2 还有一些容易被忽略的非功能性指标

除了检索和生成两大层,生产级RAG系统还必须监控一组容易被忽略的边缘指标。

第一个是合理的拒答率。不是所有问题都该回答。文档库里没有的信息,模型应该明确说"在提供的资料中没有找到相关内容",而不是硬凑一段推断出来。Too many RAG系统的幻觉,其实都发生在"该拒答却强行回答"的场景里。我在评估体系里专门加了一个"拒答准确率":系统拒绝回答的问题里,有多少是确实不该回答的;该拒答却没拒答的,在线上比答错更危险。

第二个是答案中的引用可追溯性。现在很多RAG界面会显示"参考来源",但引用和答案内容是不是真的对得上,是另一回事。模型完全有可能在答案里写了一句来源文档里根本不存在的话,却照旧附上了文档引用。这个维度很难完全自动化判断,但至少要抽样检查。

第三个是鲁棒性,也叫稳定性。同一个问题,同一套文档库,换一种问法、改几个标点符号、换个同义词,答案的核心信息不应有剧烈变化。RAG的上游检索对输入非常敏感,稍微改写就可能导致召回片段完全不同,这个问题在真机上非常常见。

把这些维度放一起看,你会发现"能答就行"确实太粗糙了。一个系统可能对100个演示问题中的95个回答得精彩,但对用户真实问题里的10个变体每个都答错,同时对100个不该答的问题硬答了80个。这种系统,演示的时候谁都说好,上线第一天就会被骂回来。

2.3 常用维度速查表

评估维度核心问题典型评估方式失败示例
命中率 / Recall相关文档有没有被召回到人工标注相关文档集合,检查召回列表是否包含问"退款政策",只召回销售政策页
MRR / NDCG相关文档是否排在靠前位置基于排序位置计算相关文档排在第7位,超出top-k范围
上下文精确度召回的片段里有多少是真正有用的检查上下文片段与问题的相关程度召回5段,只有第4段有用
忠实度 / Faithfulness答案是否完全来源于给定上下文提取答案断言,逐条对照上下文验证答案里混入模型自身固有知识
答案相关性 / Relevancy答案是否确实在回答用户问题语义相关性打分用户问原因,答案只给结论
拒答准确率不该回答时是否明确拒绝对无答案问题测试文档库没有的信息被强行编造回答
引用一致性引用来源是否真的支撑答案内容抽样人工核查引用A文档,内容来自B文档
鲁棒性输入变体是否导致答案剧烈漂移对同一问题生成多种改写后对比换词后检索结果完全不同

3. 评估集构建才是RAG评估体系的真正地基

3.1 先想清楚一个反常识:评估集比指标公式更重要

很多团队谈RAG评估,第一反应是选指标、写prompt、调评估框架。但我的经验是:指标和自动化评估器都是相对通用的,真正决定你评估体系有没有价值的,是你手里的那一批评估问题集。一个垃圾评估集配上精心调校的指标,只会给你一份精确的错误报告——它精确地告诉你"这里表现好、那里表现差",但它的判断本身就是错的。

举个例子,你用20个从文档里手工挑出来的"标准问答对"去构建评估集,系统跑出来的分数肯定不错,因为这些问题的问法和文档写法高度一致,检索很容易命中。但线上用户的真实问法是口语化的、跳跃的、夹着业务黑话甚至错别字的。你的评估体系如果建立在20个"理想问题"上,等于拿学生手册去考开放题,考出来的高分毫无意义。

我建议的评估集构建思路是:以真实用户问题为种子,再通过类型扩展和难度叠加来补全覆盖度。优先级从高到低是先收集一段线上日志里的真实问题,再做多样化改写,最后针对薄弱环节补充对抗性问题。

3.2 分层构建:从真实问题、问题变体到对抗样本

具体操作上,我一般分四步。

第一步是采集真实问题。如果系统还没上线,就去业务团队那里收集他们平时最常被用户问到的问题类型,或者从客服对话记录、行业论坛、搜索下拉词里获取。这一步的目标不是拿到完美问题,而是拿到"真实分布在用户脑子里"的问题。我自己负责过的一个知识库项目,就曾从客服部要到了过去三个月的高频咨询记录,其中有一半问题让我很意外——真正的问法比我自己设想的复杂得多。

第二步是做问题变体。把每个真实问题改写3到5个变体,变体类型包括:换表达("怎么申请退款"改为"退钱要走什么流程")、加限定("周末能不能退早餐券")、拉长问法("如果我在APP上买完东西,第二天就不想要了,钱还能退吗")。变体的意义在于测鲁棒性,搜索词离文档原文越远,越能测出检索阶段的真实水平。

第三步是构造对抗性样本。这类问题不是"正常用户会问的",而是用来摸底系统边界的。包括:文档库里有但表述完全不同的专业术语问题、需要跨多个章节拼接才能回答的复合问题、包含否定信息的排除性问题、以及文档库中完全没有对应答案的"不可回答问题"。对抗性样本通常占整个评估集的10%到20%,它们的存在是为了防止系统在"舒适区"里自嗨。

第四步是为每个问题标注"预期答案要素"。不一定需要写完整的参考回答,但至少要列出用户期望答案里出现的3到5个关键信息点。这些关键信息点之后既可以用来自动评估召回内容,也可以用来做人工评分时的对照基准。标注这一步最费人力,但它是整个评估体系里含金量最高的资产。

3.3 评估集的规模和管理

起步阶段,评估集不用追求巨大,但要追求分层合理。我自己常用的配置是40个基础真实问题+每个问题3个变体+20个对抗问题,加起来大概180条左右。这180条足够发现系统的主要问题方向,也方便每轮迭代后快速重跑。

规模再往上走,管理就成为挑战。我的建议是:把评估集当成代码一样纳入版本管理。每一次评估集变更,都要记录变更原因——是新增了业务方向,还是发现了某类bug需要固定为回归用例。运行评估脚本时,必须输出当前评估集的版本号,否则过两个月你拿到一份评估报告,甚至不知道它是基于哪批问题跑出来的。

这里说句题外话:很多人去优化RAG时,只看指标数字,"分数从0.62涨到0.75,系统变好了"——但如果你没记录评估集变化,这个结论就没有意义。因为0.75用的可能是一批难度更低的新增问题。

4. 自动化评估:从人工打分到LLM-as-a-Judge

4.1 为什么必须走向自动化评估

人工评估有几个先天限制:成本高、速度慢、标准不稳定。一个超过200条的评估集,靠人工每轮打分,一个工程师半天时间就搭进去了,而且打出来的分数还带主观性。如果你的团队打算每两周迭代一次RAG链路,人工评估根本无法支撑这个节奏。

所以,一套可落地的RAG评估体系,最终必须走向自动化评估。自动化评估不等于"完全不需要人",而是把人的参与收窄到三个环节:构建评估集、定期抽检校准、审核边界case。日常的指标计算,全部交给代码自动完成。

常用的自动化方案有两类。第一类是基于规则和检索匹配的评估,比如通过对比"预期答案要素"是否出现在召回片段中来计算命中率,这类方法可靠性高但灵活性低,适合评估检索层。第二类是基于大模型打分(业内常称LLM-as-a-Judge,也叫AI评估器)的评估,用一套精心设计的裁判prompt,让大模型阅读"问题-上下文-答案",再从多个维度打分,这类方法灵活、覆盖度高,是评估生成层的主流方案。

4.2 基础指标的计算方式

先看检索层。假设你的评估集里第i个问题标注了"预期答案所在的文档编号集合"为 R_i,系统检索返回了top-k文档集合为 C_i,那么:

命中率 = (所有问题中 R_i 与 C_i 交集非空的问题数) / 总问题数

这个指标非常直白:只要正确文档出现在召回列表里,就算命中。它不关心位置,所以是排查"检索方向是否整体错误"的第一道筛子。

如果要看排序质量,用MRR(平均倒数排名):

MRR = (1/N) * Σ_{i=1..N} (1 / rank_i)

其中 rank_i 是第i个问题第一个正确文档在召回列表里的位置。如果正确文档根本没被召回,那这一项的贡献为0。MRR能告诉你"正确的文档是不是足够靠前",因为RAG最终只会把排在最前面的几段内容交给模型生成。

生成层的忠实度计算逻辑略有不同,它不再依赖标注好的文档集合,而是要逐句判断"答案里的每个关键断言是否在给定上下文中找到支撑"。这一步非常适合用大模型裁判来做。具体流程是:先把答案拆成若干条简短的断言句,再对每条断言单独问裁判模型"这条信息是否被给定的检索上下文支持",最后统计支持的比例。

这个"先拆断言、再逐条判断"的设计很重要,因为它避免了裁判模型被整段流畅答案"带偏"。一段答案前两句没问题、最后一句在编造,整体打分会很纠结,但拆成断言之后,每条独立判断,哪句失实一目了然。

4.3 裁判模型的Prompt设计要点

用大模型做裁判,prompt就决定了评估结果的可信度。我自己迭代了好几版,沉淀出几个核心经验。

第一,输出格式要严格受限。不要让它自由发挥打分理由,强制输出一个固定的JSON结构,比如{"faithfulness": true, "reason": "..."}。结构化输出方便后续代码解析,也减少模型"答非所问"的概率。

第二,提供明确的操作定义。什么叫"完全被上下文支持"?我给出的定义是"答案中的信息必须能在上下文中找到直接对应的表述,或在上下文的基础上通过简单的常识推理得到,不得引入外部知识"。没有这个定义,裁判模型会把"答案信息是真实世界的常识"误判为"被上下文支持",忠实度指标就会虚高。

第三,引入对比类和批评类提示。不要只问"这个回答好不好"这么模糊的问题,可以追问"如果用户需要的是A信息,这个回答是否给出了A信息"。有时候把裁判模型放到"用户视角"去读答案,比让它以"评估者视角"打分更准确。

下面是一段我常用的忠实度裁判prompt简化示意,语言是中文,实际操作时也可以直接用英文版,效果无太大差异:

你是一名信息核对员。你的任务有且只有一个:判断ER那句被评估的说明是否完全由给定的资料片段所支持。 资料片段: {documents} 被评估的说明: {claim} 判断标准: 1. 如果资料片段中包含与说明内容直接对应的表述,回答 yes 2. 如果说明需要通过资料片段之外的背景知识才能成立,回答 no 3. 如果说明中包含任何资料片段中不存在的具体细节(数字、日期、人名、步骤等),回答 no 输出JSON: {"supported": "yes/no", "evidence": "从资料片段中摘录出支持或反驳该说明的关键原句"}

注意这里让裁判模型输出"evidence"片段,这对后续人工抽检非常有用。当你发现某条答案的忠实度被判为no时,可以直接看evidence,快速判断是答案确实编造了,还是裁判模型判断失误。

4.4 从指标到告警:阈值怎么定

有了指标之后,还得设置合理的阈值,才能让评估体系真正驱动迭代。阈值不是拍脑袋定的,我建议分三步。

第一步,跑一轮当前系统的评估,得到各项指标的基线。不必追求完美,程序能跑通就记录结果。第二步,挑出你认为"勉强能用"和"一定不能用"的边界样例,人工给这些样例打分,形成你自己的校准标准。比如,你抽查了30条elderly样本,发现忠实度在0.7以上时答案基本可信,0.5以下几乎都在编,那你就可以把0.6作为安全阈值,0.7作为发布标准。第三步,把阈值写进CI管道,任何一个新改动导致忠实度或者命中率跌破阈值,就直接拦截发布。

阈值还需要分版本观察,不要用一次运行的分数做长期标准。因为裁判模型本身可能升级、评估集可能微调,分数会有微小的系统漂移,一般每两周到一个月要校验一次。

5. 实操记录:用评估体系驱动一轮完整的RAG优化

5.1 一个典型的内部知识库场景

为了把上面的方法串起来,我描述一个实际的模拟项目。项目背景是某公司要做一个内部政策问答助手,文档库是HR和行政发布的几十份规章制度,总共差不多800页PDF。系统第一版是常规的"PDF切块+向量检索+大模型生成"结构,团队的初步反馈是"看起来能答,但经常答不到点上"。

我用上面说的方法搭了一套评估体系。第一步,从邮件和IM群聊里收集了60个真实员工问题,类型包括"年假怎么算""出差报销需要什么材料""电脑坏了怎么办"等等。第二步,为每个问题生成3个改写变体。第三步,加了一组对抗问题,比如"产假期间工资怎么发"(这个信息可能在文档里分布在三个不同章节)、"哺乳假和年假能不能一起休"(需要排除性推理)、"申请加薪的流程是什么"(文档里其实没有明确流程说明,应拒答)。

评估集最终是60+180+30,共270条。我用两天时间完成了所有问题的预期答案要点标注。

5.2 第一轮评估结果与问题定位

第一轮自动化评估跑完,结果让我很意外:

评估维度得分初步结论
命中率(top-5)0.78尚有超过两成问题相关文档未被召回
MRR0.51正确文档经常排在第三、第四位
忠实度0.72约三成答案存在一定程度的扩展或编造
答案相关性0.81大多数情况下答非所问的情况不严重
拒答准确率0.30对抗性问题绝大多数被系统硬答了

这份报告的价值在于,它把模糊的"看起来能答但答不到点上"变成了清晰的行动清单。

拒答准确率0.30是最大问题,说明系统的prompt里完全没有"不知道就承认不知道"这种约束,模型对任何问题都会强撑出一个答案。我第一时间修改了系统prompt,加入了明确的拒答规则,并给模型提供了"判断依据不足时的标准回复模板"。

命中率0.78也说明检索侧有真实缺陷。抽样看那些未命中的问题后,我发现一个共性:凡是员工用口语化词(比如"报账"而不是"报销")提问,召回效果就急剧下降。问题出在上游没有做查询改写,直接把口语化问题拿去向量检索了。于是我在链路里加了一步查询改写,把用户问题先交给大模型扩展成几个适合检索的书面语query,再多路召回。

5.3 第二轮迭代前后的对照

改完这两处之后,我在同一套评估集上重跑了一遍,没有更换任何一个问题。

评估维度第一轮第二轮变化
命中率(top-5)0.780.91+0.13
MRR0.510.64+0.13
忠实度0.720.86+0.14
答案相关性0.810.83+0.02
拒答准确率0.300.87+0.57

这份对比表就是评估体系最直观的价值体现——它让我们可以自信地说"这次改动是有效的"。而且,从分数变化还能看出一个额外信息:答案相关性几乎没变,说明"答非所问"的核心原因可能不在model生成能力,而在检索质量的上限以及prompt对答案聚焦的要求。下一步的优化重点,应该是继续提升检索精度,而不是换一个更大的生成模型。

现实中你可能会看到一些细节问题,比如命中率提升了,但忠实度没有同步提升,这通常意味着"检索到了更多相关文档,但模型在整合多文档信息时出现了新的不忠实表述",需要针对"多文档融合"场景做专门的prompt优化。我在迭代过程中就遇到过这个情况,一度很困惑,后来靠逐条抽样检查evidence才发现模式。

5.4 评估脚本的工程化落点

评估体系要可持续运行,必须有稳定的脚本和简洁的数据流。我通常会把评估集存成一个JSONL文件,每一行是一条测试用例,结构大概这样:

{ "question": "公司对产假期间的工资发放标准是如何规定的?", "question_type": "multi_hop", "expected_doc_ids": ["doc_hr_0123", "doc_hr_0456"], "expected_points": ["产假工资基数", "发放比例", "申请材料"], "variants": ["产假的时间工资怎么结算?", "休产假期间公司还发钱吗?"] }

评估脚本读这个文件,调用RAG系统跑一遍,对每个问题记录检索到的文档列表和生成的答案,然后再调用评估模块计算各维度得分。最终输出一份包含原始结果和汇总指标的JSON报告,方便在监控看板上展示。

需要刻意强调的是,评估脚本不要跟 RAG 主链路耦合太深。我曾经见过有人把评估逻辑直接写进RAG的服务代码里,导致每次改动主链路都会不小心影响评估逻辑。正确做法是把RAG系统当成一个黑盒,通过API调用获取回答,评估端再独立处理结果。这样主系统的行为发生任何变化,评估端都能客观捕捉到,不会因为共享代码而被"污染"。

6. 常见问题与排查技巧实录

6.1 裁判模型本身的偏置问题

用大模型做裁判,最大的隐患是裁判模型自己有偏置。我知道的常见偏置包括位置偏置(答案里前面的内容容易被当作更可信)、长度偏置(越长的答案越容易被判为"更完整")、以及自我偏置(裁判模型更认可与自己风格一致的答案)。

我的应对方法有几个:一是把答案里的句子顺序随机打乱,多跑几次取平均,降低位置偏置;二是在裁判prompt里明确要求"只看信息是否完整覆盖问题,不要因为答案简短而扣分,也不要因为答案冗长而加分";三是定期人工抽检裁判结果,统计"裁判认为忠实但实际不忠实"的比例,如果这个比例超过20%,说明裁判prompt需要重新设计。

6.2 小样本评估集导致分数震荡

有些团队习惯用20条问题跑评估,结果发现分数很不稳定。这很正常,样本量太小时,个别问题的随机波动会对整体分数产生显著影响。假设你有20个问题,其中一个问题的答案因为模型温度随机性变了,整体忠实度就可能掉3个到5个百分点。

解决方法是引入统计思维。不要在20条样本上追求绝对分数变化,而是看多轮评估的分数趋势,并配合抽样人工核查。条件允许的话,把评估集规模扩到100条以上,分数波动就会明显减小。我实际用下来,100条以上配合3次重复运行取平均,基本可以给出稳定的趋势判断。

6.3 评估集内容泄露的隐蔽问题

所谓内容泄露,是指评估集里的问题,或者问题的答案要点,被模型"提前看到"了。这在RAG评估里尤其隐蔽。比如你为了构建评估集,把文档库里的一些章节直接改成了Q&A对,然后把这个Q&A对也存进了向量库。结果系统回答时直接检索到了这条Q&A,回答得又准又漂亮——但这不是系统能力变强了,只是你把答案本身塞回了文档库。

这在工程上叫"评估集污染"。我的自查方法是:检查命中率超高的系统,把召回的top-1文档调出来看,如果发现大量"问题和答案紧挨着"的文档结构,就要警惕是不是评估集被检索到了。解决方案是评估集单独存放,禁止进入生产向量库,同时定期做重复度检查。

6.4 指标与业务感受脱节

最后一类常见问题,是指标跑出来挺漂亮,但业务方依然说"不好用"。这种情况通常意味着你选的指标没有对齐真实业务目标。比如,你的忠实度指标是0.9,但业务方关心的是"能不能让员工在两分钟内找到办离职手续的全部步骤",那0.9的忠实度可能对应的是答得非常详细但步骤之间顺序混乱,或者漏掉了一条必要的线下材料说明。忠实度只能回答"答出来的部分是不是有依据",回答不了"信息完整不完整、流程顺不顺"。

所以我在设计评估体系时,除了技术维度,还会让业务方参与定义"业务可接受"的判定规则。常见做法是挑选20条评估集问题,让业务方记录"如果客服人工给出这个答案,你是否觉得满意",得到的满意度分数作为一个业务层校准指标。技术指标和业务满意度不应该是两张皮,而是要定期对比,如果出现长期背离,说明你的评估维度设计有遗漏。

6.5 问题排查速查表

现象涉及维度优先排查方向
答案流畅但信息是编的忠实度提示词是否约束"仅基于给定上下文";上下文里是否本身信息不足
问法一变就答错命中率、鲁棒性检索前查询改写逻辑;embedding对同义词的支持能力
答案内容对但不是用户想要的答案相关性提示词是否引导模型先解析用户意图;多轮对话上下文管理
该拒答时硬答拒答准确率是否设置了拒答规则;模型对未知内容的自信心过高
引用标注和答案内容不匹配引用一致性引用生成逻辑是否以答案实际使用的上下文为准;切分是否合理
分数高但业务反馈差综合校准检查是否评估集覆盖不足;评估维度缺少信息完整性

一点个人的收尾建议

最后分享一个我自己的习惯:每次对RAG链路做任何改动——不管是换embedding模型、调整chunk大小、改prompt、还是升级生成模型——我都会在固定的评估集上跑一遍完整回归,把得分变化记录在一个简单的表格里。这个表格时间跨度拉长之后,会成为这个项目最宝贵的资产。因为它不只是记录了分数的起伏,更记录了每一次改动的真实效果,帮我避开了很多"感觉变好了其实变差了"的坑。

RAG系统是一个迭代型系统,不存在一劳永逸的调优。没有评估体系,你每一次改动都是在盲人摸象;有了评估体系,你至少知道改动把你带向哪个方向。如果你的项目也卡在"感觉能用又不敢上线"的状态,不妨从今天开始,先构建一个100条的小评估集,跑一遍分,你会立刻发现很多之前完全没意识到的问题。

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进