面试官问:线上 RAG 系统回答不准确,该怎么办?
哈喽,大家好,我是大都督周瑜。从这篇文章开始,我会给大家更新一系列的AI相关的面试题。我们先从这一道面试题开始:线上RAG系统回答不准确,我们该如何定位和优化?
先别急着调提示词

这道题目考的其实是你对RAG系统了解的程度。你肯定不能一上来就说改提示词、换模型,你如果这么回答面试官,面试官立马就会让你出门右转。
正确的做法是,我们应该先定位问题。因为一般的RAG系统都会有5个核心步骤,我们应该先确定问题出在哪个步骤,或者哪些步骤,然后再有针对性地进行优化,而不是做无用功。
优化完之后,我们还要对优化的动作进行验证。我们不能凭感觉,要用数据证明优化是真的有效。
RAG 链路的 5 个环节
接下来我们就来看一下RAG这条链路里面5个重要的步骤:
- Query理解
- 知识库检索
- 重排序与过滤
- 上下文组装
- 大模型生成
其中任何一个环节如果有问题,答案都不会准。所以我们应该顺着这条链路,一个环节一个环节地去排查。
环节1 Query理解:把「人话」翻译成「规范查询」
我们先来看第一个环节,Query理解。Query理解的核心,是要把人话翻译成规范查询。具体什么意思呢?我这里列举了5种类型的问题:
- 简单问题:用户直接问「你好」「你是谁」,我们可以直接回答,而不需要走后续的检索、排序等等流程;
- 指代问题:用户说「这个能退吗」,那「这个」具体是指哪一个呢?在检索之前要先做指代消除,确定用户说的这个到底是哪个;
- 复合问题:用户问「X7能退吗?X8多少钱?」,这实际上是两个问题,应该拆开之后单独检索。因为这本质上一个是售后问题、一个是售前问题,在你的RAG系统里可能是两个不同的知识库,所以要分别去走后续的检索、排序等流程;
- 乱码问题:用户贴的是一段HTML------可能是从其他地方复制过来的,HTML里有用户想问的问题,但同时还有很多额外的乱码。带着这些乱码是没办法直接检索知识库的,应该先格式化、对数据清洗之后,再走后面的步骤;
- 意图路由:如果RAG系统涉及多个业务域,比如人事、比如财务,那么用户提问的时候,需要先判断这个问题对应的是哪个业务域,再到对应业务域的知识库里去进行检索。
所以从这里可以看出,作为一个RAG系统,最重要的第一步,其实就是把人话翻译成适合RAG系统工作的规范Query。你直接拿人话去搜去查,可能查不到;但把它转成更规范的查询之后再去检索,就能检索到更相关的知识点。
环节2 知识库检索:查不到,后面全白搭
Query理解做完之后,接下来我们就要拿这个Query,或者说是改写之后的规范查询,到知识库里面去进行检索。
这里有一个非常重要的环节,其实是知识库的创建:它需要根据你具体的文档,可能是PDF,可能是HTML,可能是Markdown等等,对文章里面的段落、标题、图表去进行切分,然后进行向量化,生成最终的向量知识库。关于这一部分,我后面会单独分享一个视频来讲解。
那知识库构建好之后,真正处理用户Query的时候,我们就需要到这个知识库里面去进行检索。一般来说,我们都会用混合检索,也就是向量检索和关键字检索两者结合起来:
- 关键字检索,适合明确信息:比如用户问「X7000能退吗」,如果用向量检索,很有可能会把X6000、X8000相关的知识块捞回来,这种是没有必要的,而且捞出来之后其实是会有副作用的。所以这种Query就特别适合关键字检索,直接用X7000去关键字搜索,搜出来的肯定都是跟X7000相关的知识点;
- 向量检索,适合语义模糊匹配:比如用户问「超过7天能不能退」,就很容易匹配到我们知识库里面「7天内无条件退款」的知识点。
因此我们在做检索的时候,应该用混合检索,来更好地把跟用户问题匹配的知识点找出来。
排查的时候,首先要确定用户问题对应的知识点到底在不在知识库里面:
- 不在知识库里:先更新知识库;
- 在知识库里,但没检索出来:具体看向量检索以及关键字检索是不是有问题,可能需要调整TopK或者具体的检索逻辑,或者还要调整知识块的切分逻辑,尽可能把用户问题所需要的知识点检索出来。
环节3 重排序与过滤:找得到只是及格,排得对才看得对
检索做完之后,可能会检索出来很多知识点。这些知识点里面,我们不能保证一定都是跟当前Query非常相关的,很有可能有一些没那么相关的知识点也被找出来了。这时候我们就需要对检索出来的知识点进行排序,把跟Query非常相关的排在前面,没那么相关的排在后面,所以一般来说我们会用Rerank模型来进行排序。
当然,在排序之前,其实还可以先做两件事:
- 去重:通过向量检索、关键字检索,很有可能会找到相同的知识点,那我们就可以通过知识点的ID,或者其他的一些维度来进行去重;
- 版本过滤:如果知识库里某些知识点发生了更新,但旧版本还留在知识库里的话,你检索出来的内容可能既包含新的版本、也包含老的版本,所以检索出来之后还要做版本过滤,根据版本号、根据时间来过滤。
只有对检索出来的知识点做了正确的去重、过滤、排序,我们最终才能得到一份更好的知识点列表。
环节4 上下文组装:别把关键信息压丢了
拿到排序之后的知识点列表,我们就需要把知识点、用户的问题,连同系统提示词一起发给大模型。但要注意,除了这三者,我们还需要把对话历史也发送给大模型。
所以这个地方就要注意,如果你当前的对话已经很长,再加上刚刚找出来的知识点的内容,很有可能会超过大模型现在的上下文窗口,所以就需要做上下文压缩。
而一旦做了上下文压缩,就要注意:会不会把回答用户问题的关键信息丢失掉。如果丢失掉了回答问题的关键信息,那么大模型尽管接收到了我们检索出来的知识点,最终也可能回答不准确。
所以我们需要做好上下文工程------长期记忆、短期记忆、结构化记忆,包括压缩提示词,都要认真设计。所以在排查问题的时候,我们要去检查真正发送给大模型的数据里面,到底有没有包含回答用户问题所检索出来的资料,如果发现有丢失、有遗漏,那就要去优化我们的上下文工程。
环节5 大模型生成:忠实度不够怎么办
如果发送给模型的数据里面,包含了解决用户问题所需要的数据,但模型最终仍然没有回答准确,这就表示忠实度不够。所谓忠实度,就是明明给了参考资料,模型却不参考,而是自由发挥,这是生成环节的典型问题。
要解决这个问题,就需要提示词工程。我们在RAG的系统提示词里面,至少要有三条铁律:
- 第一条,只依据资料回答,不能自由发挥,不能脑补;
- 第二条,保留前提、例外、否定,像「7天内」「不含激活费」「除外情况」,这些都不能忽略;
- 第三条,资料不足就说无法确认,答不了就明说,别硬编,恰当拒答也是正确答案。
所以一旦发现模型的忠实度比较低,我们就要去优化提示词。如果提示词也优化了,给的资料也充足了,模型仍然还是回答不对,这个时候可能就要考虑换模型了。
改完怎么证明有效?建一套评估集
最后,经过上面这些步骤的排查和优化,我们还要对优化的动作进行验证、进行评估,所以要准备一套评估题目,也就是评估集。这个评估集里面的题目类型要全一点,这样我们才能评得更准一点。比如:
- 常见问题 + 标准答案:我们肯定要有,这样才能守住基本盘;
- 用户真实问题:也要拿来进行测试;
- 回答不了的问题:看我们的RAG系统能不能拒绝回答;
- 有问题的问题:就是我前面讲的复合问题、指代问题、乱码问题等等,要看系统能不能正确处理。
另外,我们还要持续不断地补充新的Badcase到评估集里面。
还有一点,我们每次优化的时候,建议只改一个变量,也就是只改一个步骤,然后来进行评估。因为如果你改了多个步骤,最后发现效果提升了或者变得更差了,你也不知道到底是哪个步骤影响的。所以建议每改一个步骤,就做一次测试和评估。
总结:四层排查路径,照着答拿高分
最后总结一下。面试官问:RAG系统回答不准确,如何定位和优化?我们的排查思路就是:
- 先看知识库里面有没有------如果没有,就补充知识库;
- 知识库里有,但检索没找到------检查知识块的切分,以及混合检索的逻辑是不是需要优化;
- 检索到了,但排序有问题------检查去重、排序、过滤的逻辑;
- 排序也没问题------检查上下文工程以及提示词工程。
按照这个思路来回答这道题目,一定能让你拿到高分。
最后
最后感谢大家的观看,希望能得到大家的点赞、收藏、关注,谢谢大家。
作者:IT周瑜(大都督周瑜)| 近二十年 IT 从业经验,做过架构师、技术专家、金牌讲师 | 零一教育创始人,《AI原生超级全栈开发工程师训练营》主讲人 | 公众号「IT周瑜」