跳到主要内容

42-Agent面试题精讲:RAG篇

前言

这节开始更一下Agent岗的面试题,很多都是学员去面试真实遇到的。

大家可以先自己想一下怎么答,然后看一下思路解析和参考回答。

形成自己的答题思路。

这样面试遇到类似问题就能比较完整流畅的回答了。

这节先集中更RAG相关的

文章

说一下RAG的流程

RAG分为两个阶段:离线知识库构建阶段、在线问答阶段

知识库构建阶段,就是对各种格式的文档做解析、清洗、分块

分块后用嵌入模型生成向量,存入向量数据库,用于语义检索

构建BM25倒排索引,存入全文检索数据库,用于关键词检索

在线问答阶段,会对用户问题做 query 改写,换成更适合检索的表达。

然后会做混合检索:

向量检索根据语义匹配相似内容

关键词检索根据具体术语、专有名词去精确匹配内容。

之后用rerank 重排模型筛选和问题最相关的文档片段

两路检索完成后,之后会做去重、用RRF算法对结果做合并排序。

把筛选后的文档片段放入prompt,交给大模型生成回答。

这就是混合检索RAG的流程。

image-20260806212328129

上面是参考回答

再额外解释下去重:

多路召回会出现同一个文本块同时被向量检索和BM25检索命中的情况,产生重复数据。我们基于Chunk唯一ID完成去重,但这要求:同一个文本块存入向量库、全文检索库时,绑定相同的chunk_id。

什么是RRF算法

向量检索的相似度分数,区间一般0~1,数值越大语义越匹配。

BM25关键词检索得分没有固定上限,可能是十几、几十甚至上百。

二者分数取值范围不同。

所以多路召回的两个结果列表不能直接融合

RRF(Reciprocal Rank Fusion)全称倒数排名融合,

它不看原始分数,只根据文本块在结果列表中的排名计算融合分值。

可以有效融合向量语义检索、BM25关键词检索两路结果。

之后再从融合后的列表截取前面部分,用rerank重排模型做深度语义排序。

image-20260806212435841

上面是参考回答

有同学可能会有疑问,后续都会经过Rerank模型精排,为什么还需要先用RRF做粗融合?

举个例子:

向量召回100条、BM25召回100条。

先基于chunkid完成去重,再使用RRF重新排序。

从融合后的候选列表截取Top50,送入Rerank重排模型。

我们双路召回的结果会很多,用RRF粗融合之后,再从列表里截取一部分来精排。

你知道Graph RAG吗

Graph RAG是在向量+关键词混合检索RAG的基础上,引入知识图谱进行能力增强。

向量检索、BM25关键词检索仅针对文本块做匹配,缺少实体之间的关联链路,难以推导出分散文档里的间接关联

离线构建阶段,GraphRAG从文档中抽取实体、关系搭建知识图谱,同时对文本分片,构建向量索引与BM25索引。

在线问答阶段,一方面通过混合检索召回相关文本片段,另一方面提取Query内的实体,在图谱中遍历关联链路,找到分散在不同文档里的隐含信息。

把图谱关联信息和检索得到的文本内容整合在一起,交给大模型生成答案,解决传统混合检索RAG只能匹配片段,无法梳理实体关系链条的局限

image-20260806212544762

什么是Agenic RAG

Agentic RAG是引入大模型来自主决策怎么检索

把混合检索、知识图谱检索、联网搜索等各类检索能力封装为工具

收到用户提问后,Agent 会理解需求,完成Query改写,自主选择调用哪种检索工具

拿到检索结果之后,Agent会校验现有信息是否能够充分解答问题

如果信息不足,它会优化查询语句,发起新一轮检索,形成规划、工具调用、结果评估、迭代重试的闭环

直到搜集到充足信息,再整合上下文输出答案。

image-20260806212619500

你知道父子分块策略吗

父子分块策略,是先将长文档切分为粒度较大的父块,再在父块内部进一步切分出更小的子块。

子块做向量化,存在向量数据库,父块不做向量化,存在其他数据库。

子块通过parentid和对应父块建立关联。

子块负责向量检索,保障召回的精准度;

检索命中子块后,再通过关联关系取出完整父块,把父块作为上下文交给大模型做生成。

本质就是把检索用的分块和生成用的分块进行解耦,子块做检索,父块做生成。

好处是既能发挥小分块检索精准的优势,又解决了子块内容碎片化、上下文不全的问题。

同时规避大分块直接向量化造成的召回噪声,让大模型获取完整连贯的上下文,有效缓解幻觉,提升回答的完整度与准确性。

image-20260806212714816

上面是参考回答

这里解释下召回噪声

长文档直接向量化,会导致召回不够精准,容易把无关的文档召回,这就是召回噪声,它属于检索阶段的概念。

用子块做检索可以缓解这类召回噪声,让检索更精准,定位到真正相关的父块;

之后再取出完整父块上下文交给大模型做生成。

如何降低大模型的幻觉

降低大模型幻觉可以从知识层、提示词层、模型层、校验层4个层面处理:

知识层:

接入RAG检索机制,保障知识库原始数据准确,合理划分Chunk。

采用向量检索+关键词混合检索,兼顾语义匹配与关键词精准匹配。

用Rerank重排模型,过滤相关度低的文档片段。

设置相似度阈值,阻止低相似度片段进入上下文。

引入Agentic RAG自主评估检索结果,信息不足时迭代补充检索,保障上下文充足可靠。

提示词层:

通过Prompt强约束模型,仅依据给定上下文生成答案,要求答案标注原文引用。

开启拒答机制,无匹配信息时如实回复,禁止模型编造内容。

模型层:

选用事实性、稳定性表现更优的大模型。

面向垂直领域,可使用高质量业务数据进行微调,让模型更倾向依据外部资料作答

校验层:

调用大模型对输出结果做二次事实核查,比对原始上下文。

识别出无依据、前后矛盾的内容,进行拦截、修正,减少错误输出。

image-20260806212854823

RAG如何做权限过滤

我们项目基于RBAC模型做检索权限控制。

文档切片入库时,chunk会继承父文档的权限配置,将允许访问的角色、是否公开等权限信息作为元数据,同步存入向量数据库与全文检索库。

用户检索时,会先从获取当前用户的角色集合。

基于角色元数据做筛选,只在该用户有权访问的切片范围内执行语义与关键词匹配。

从源头拦截无权限的文档片段,之后再做 Rerank 重排,选出 Top-K相关chunk 交给大模型生成回答。

image-20260806212930742

如何评估RAG的效果

评估RAG效果,一般会拆成检索层、生成层两个维度。

首先,首先要搭建一套贴近真实业务的测试数据集,覆盖高频问题、边界case、易混淆的问题等。

每个问题都要提前标注好标准答案、应该命中的文档以及核心chunk片段,作为后续评测的依据。

检索层主要看两点:

一是有效信息能否成功召回

二是召回的有效信息排序是否合理。

对应的量化指标可以用Recall@K、Hit@K、MRR等来评估。

生成层也主要看亮点:

一是忠实度,保证回答不瞎编、全部有据可依;

二是答案相关性、完整性,对标标准答案,校验回答是否答得准、答得全。

整体来看,检索层侧重信息的充分召回与合理排序,生成层侧重回答的答案准确、避免幻觉,二者共同构成完整的RAG效果评估体系。

image-20260806213027002

上面是参考回答

具体的指标过一下:

检索层指标:

Recall@K召回率

Top-K内是否包含需要的文档,衡量找得全不全

示例:

Recall@5=0.8,意味着 80%的测试样本中,回答问题必需的chunk落在检索返回的前5条结果内。

Precision@K 精确率

Top-K里相关文档占比,衡量噪声多少

示例:

返回5条结果,只有2条真正有用,剩下都是无关内容,精确率就是0.4

MRR衡量正确文档排序位置,越靠前分越高

示例:

正确内容排在第2位,就打1/2分,排得越靠前分数越高

Hit@K相关文档只要出现在Top-K即命中,只看有无,不看位置

检索指标小结:Recall保证不漏掉信息,Precision减少无效内容,MRR看排序好不好

检索层这些指标依赖标注好的标准文档,是可精确计算的客观指标,不依赖大模型打分。

生成层指标:

Faithfulness (忠实度)

校验输出内容是否全部来源于检索上下文,用来识别模型幻觉

示例:

资料写v2支持批量导入,AI说成v3支持,忠实度就很差,属于幻觉。

Answer Relevancy 答案相关性

回答是否针对用户提问,不跑题、不答非所问

示例:

用户问接口报错原因,模型大段讲业务背景,没有回答报错,相关性差。

Answer Completeness 答案完整性

是否覆盖标准答案全部关键要点。

示例:

问题需要返回3个配置项,回答只说了2个,完整性不足。

Context Utilization 上下文利用率

评估模型对检索回来的上下文信息的实际利用程度。

示例:

检索结果已经包含问题解决方案,但模型依旧输出通用套话,没有使用参考信息。

这几个生成层的指标一般都是LLMasJudge让大模型来判断打分,也可以人工复核

这些就是RAG评估的堂用指标

image-20260806213141200

为什么Claude Code不用RAG检索代码而是用grep

Claude Code早期试过本地向量库+嵌入模型的RAG方案,后来放弃了,改用模型自主调用 grep、glob、read 等工具的 Agentic Search

有几个原因:

一是因为代码需要的是精确匹配,而不是语义模糊匹配

自然语言适合向量语义检索;但代码的函数名、类名、变量名、报错字符串本身就是标识符,更适合关键词精确查找

二是代码库高频变更,RAG索引很容易过时

代码库频繁改动,RAG要持续更新索引,滞后就会拿到已删除、重构的旧代码。

grep直接读取磁盘实时文件,结果和源码版本完全同步

Claude Code现在是 Agentic Search,让大模型自主决策检索过程:

决定使用grep做内容关键词检索,或是glob做文件名匹配

获取候选文件列表后,调用read读取目标文件完整内容

如果信息不足,自动调整搜索关键词,循环迭代继续查找

image-20260806213413546

补充