DeepSeek面试官问:生产RAG系统回答不准确,该如何定位和优化?这样回答,能让面试官当场给你Offer!

面试官问:线上 RAG 系统回答不准确,该怎么办?

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

先别急着调提示词

这道题目考的其实是你对RAG系统了解的程度。你肯定不能一上来就说改提示词、换模型,你如果这么回答面试官,面试官立马就会让你出门右转。

正确的做法是,我们应该先定位问题。因为一般的RAG系统都会有5个核心步骤,我们应该先确定问题出在哪个步骤,或者哪些步骤,然后再有针对性地进行优化,而不是做无用功。

优化完之后,我们还要对优化的动作进行验证。我们不能凭感觉,要用数据证明优化是真的有效。

RAG 链路的 5 个环节

接下来我们就来看一下RAG这条链路里面5个重要的步骤:

  1. Query理解
  2. 知识库检索
  3. 重排序与过滤
  4. 上下文组装
  5. 大模型生成

其中任何一个环节如果有问题,答案都不会准。所以我们应该顺着这条链路,一个环节一个环节地去排查。

环节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系统回答不准确,如何定位和优化?我们的排查思路就是:

  1. 先看知识库里面有没有------如果没有,就补充知识库;
  2. 知识库里有,但检索没找到------检查知识块的切分,以及混合检索的逻辑是不是需要优化;
  3. 检索到了,但排序有问题------检查去重、排序、过滤的逻辑;
  4. 排序也没问题------检查上下文工程以及提示词工程。

按照这个思路来回答这道题目,一定能让你拿到高分。

最后

最后感谢大家的观看,希望能得到大家的点赞、收藏、关注,谢谢大家。


作者:IT周瑜(大都督周瑜)| 近二十年 IT 从业经验,做过架构师、技术专家、金牌讲师 | 零一教育创始人,《AI原生超级全栈开发工程师训练营》主讲人 | 公众号「IT周瑜」

相关推荐
“AI国潮设计-小江”1 小时前
【Python实战】SDXL精准控制“普宁英歌舞×星空蛋糕”IP落地,附核心Prompt与商用授权思路
开发语言·人工智能·python·prompt·aigc
k4m7v2pz1 小时前
从 Python 搬到 Rust:pyglet MIDI DAW 变成 egui 鬼畜采样器的迁移复盘
开发语言·python·rust
杨运交1 小时前
[069][公共模块]Spring Boot 全局异常处理与参数校验实战(下):校验异常精细化处理与 WebFlux 适配
java·spring boot·后端
tryCbest2 小时前
FastAPI中passlib包的作用
python·fastapi·passlib
Raas1002 小时前
MAI Gateway(魔芋企业级AI网关)对比分析:AI网关和OpenRouter区别?企业级能力差距一览
java·服务器·网络·人工智能·gateway·ai网关·mai gateway
心中有你02142 小时前
Python Tkinter 情侣恋爱日记桌面小程序(本地文件存储,无数据库)
开发语言·python
PFFstronger2 小时前
从 0 到 1 搭建接口自动化测试框架:分层架构 + 数据驱动 + 接口依赖编排
python·架构·自动化
Andya_net2 小时前
Spring Boot | 条件注解完全指南:从 @Conditional 到 @ConditionalOnExpression 的原理、实践与避坑
spring boot·后端·python
APItesterCris2 小时前
告别人工盯品!借助 Open‑Claw 快速搭建电商商品全自动监控与数据分析系统(完整实操代码)
java·大数据·前端·数据库