42-Agent面试题精讲:RAG篇
前言
这节开始更一下Agent岗的面试题,很多都是学员去面试真实遇到的。
大家可以先自己想一下怎么答,然后看一下思路解析和参考回答。
形成自己的答题思路。
这样面试遇到类似问题就能比较完整流畅的回答了。
这节先集中更RAG相关的
文章
说一下RAG的流程
RAG分为两个阶段:离线知识库构建阶段、在线问答阶段
知识库构建阶段,就是对各种格式的文档做解析、清洗、分块
分块后用嵌入模型生成向量,存入向量数据库,用于语义检索
构建BM25倒排索引,存入全文检索数据库,用于关键词检索
在线问答阶段,会对用户问题做 query 改写,换成更适合检索的表达。
然后会做混合检索:
向量检索根据语义匹配相似内容
关键词检索根据具体术语、专有名词去精确匹配内容。
之后用rerank 重排模型筛选和问题最相关的文档片段
两路检索完成后,之后会做去重、用RRF算法对结果做合并排序。
把筛选后的文档片段放入prompt,交给大模型生成回答。
这就是混合检索RAG的流程。

上面是参考回答
再额外解释下去重:
多路召回会出现同一个文本块同时被向量检索和BM25检索命中的情况,产生重复数据。我们基于Chunk唯一ID完成去重,但这要求:同一个文本块存入向量库、全文检索库时,绑定相同的chunk_id。
什么是RRF算法
向量检索的相似度分数,区间一般0~1,数值越大语义越匹配。
BM25关键词检索得分没有固定上限,可能是十几、几十甚至上百。
二者分数取值范围不同。
所以多路召回的两个结果列表不能直接融合
RRF(Reciprocal Rank Fusion)全称倒数排名融合,
它不看原始分数,只根据文本块在结果列表中的排名计算融合分值。
可以有效融合向量语义检索、BM25关键词检索两路结果。
之后再从融合后的列表截取前面部分,用rerank重排模型做深度语义排序。

上面是参考回答
有同学可能会有疑问,后续都会经过Rerank模型精排,为什么还需要先用RRF做粗融合?
举个例子:
向量召回100条、BM25召回100条。
先基于chunkid完成去重,再使用RRF重新排序。
从融合后的候选列表截取Top50,送入Rerank重排模型。
我们双路召回的结果会很多,用RRF粗融合之后,再从列表里截取一部分来精排。
你知道Graph RAG吗
Graph RAG是在向量+关键词混合检索RAG的基础上,引入知识图谱进行能力增强。
向量检索、BM25关键词检索仅针对文本块做匹配,缺少实体之间的关联链路,难以推导出分散文档里的间接关联
离线构建阶段,GraphRAG从文档中抽取实体、关系搭建知识图谱,同时对文本分片,构建向量索引与BM25索引。
在线问答阶段,一方面通过混合检索召回相关文本片段,另一方面提取Query内的实体,在图谱中遍历关联链路,找到分散在不同文档里的隐含信息。
把图谱关联信息和检索得到的文本内容整合在一起,交给大模型生成答案,解决传统混合检索RAG只能匹配片段,无法梳理实体关系链条的局限

什么是Agenic RAG
Agentic RAG是引入大模型来自主决策怎么检索
把混合检索、知识图谱检索、联网搜索等各类检索能力封装为工具
收到用户提问后,Agent 会理解需求,完成Query改写,自主选择调用哪种检索工具
拿到检索结果之后,Agent会校验现有信息是否能够充分解答问题
如果信息不足,它会优化查询语句,发起新一轮检索,形成规划、工具调用、结果评估、迭代重试的闭环
直到搜集到充足信息,再整合上下文输出答案。

你知道父子分块策略吗
父子分块策略,是先将长文档切分为粒度较大的父块,再在父块内部进一步切分出更小的子块。
子块做向量化,存在向量数据库,父块不做向量化,存在其他数据库。
子块通过parentid和对应父块建立关联。
子块负责向量检索,保障召回的精准度;
检索命中子块后,再通过关联关系取出完整父块,把父块作为上下文交给大模型做生成。
本质就是把检索用的分块和生成用的分块进行解耦,子块做检索,父块做生成。
好处是既能发挥小分块检索精准的优势,又解决了子块内容碎片化、上下文不全的问题。
同时规避大分块直接向量化造成的召回噪声,让大模型获取完整连贯的上下文,有效缓解幻觉,提升回答的完整度与准确性。

上面是参考回答
这里解释下召回噪声
长文档直接向量化,会导致召回不够精准,容易把无关的文档召回,这就是召回噪声,它属于检索阶段的概念。
用子块做检索可以缓解这类召回噪声,让检索更精准,定位到真正相关的父块;
之后再取出完整父块上下文交给大模型做生成。
如何降低大模型的幻觉
降低大模型幻觉可以从知识层、提示词层、模型层、校验层4个层面处理:
知识层:
接入RAG检索机制,保障知识库原始数据准确,合理划分Chunk。
采用向量检索+关键词混合检索,兼顾语义匹配与关键词精准匹配。
用Rerank重排模型,过滤相关度低的文档片段。
设置相似度阈值,阻止低相似度片段进入上下文。
引入Agentic RAG自主评估检索结果,信息不足时迭代补充检索,保障上下文充足可靠。
提示词层:
通过Prompt强约束模型,仅依据给定上下文生成答案,要求答案标注原文引用。
开启拒答机制,无匹配信息时如实回复,禁止模型编造内容。
模型层:
选用事实性、稳定性表现更优的大模型。
面向垂直领域,可使用高质量业务数据进行微调,让模型更倾向依据外部资料作答
校验层:
调用大模型对输出结果做二次事实核查,比对原始上下文。
识别出无依据、前后矛盾的内容,进行拦截、修正,减少错误输出。

RAG如何做权限过滤
我们项目基于RBAC模型做检索权限控制。
文档切片入库时,chunk会继承父文档的权限配置,将允许访问的角色、是否公开等权限信息作为元数据,同步存入向量数据库与全文检索库。
用户检索时,会先从获取当前用户的角色集合。
基于角色元数据做筛选,只在该用户有权访问的切片范围内执行语义与关键词匹配。
从源头拦截无权限的文档片段,之后再做 Rerank 重排,选出 Top-K相关chunk 交给大模型生成回答。

如何评估RAG的效果
评估RAG效果,一般会拆成检索层、生成层两个维度。
首先,首先要搭建一套贴近真实业务的测试数据集,覆盖高频问题、边界case、易混淆的问题等。
每个问题都要提前标注好标准答案、应该命中的文档以及核心chunk片段,作为后续评测的依据。
检索层主要看两点:
一是有效信息能否成功召回
二是召回的有效信息排序是否合理。
对应的量化指标可以用Recall@K、Hit@K、MRR等来评估。
生成层也主要看亮点:
一是忠实度,保证回答不瞎编、全部有据可依;
二是答案相关性、完整性,对标标准答案,校验回答是否答得准、答得全。
整体来看,检索层侧重信息的充分召回与合理排序,生成层侧重回答的答案准确、避免幻觉,二者共同构成完整的RAG效果评估体系。

上面是参考回答
具体的指标过一下:
检索层指标:
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评估的堂用指标

为什么Claude Code不用RAG检索代码而是用grep
Claude Code早期试过本地向量库+嵌入模型的RAG方案,后来放弃了,改用模型自主调用 grep、glob、read 等工具的 Agentic Search
有几个原因:
一是因为代码需要的是精确匹配,而不是语义模糊匹配
自然语言适合向量语义检索;但代码的函数名、类名、变量名、报错字符串本身就是标识符,更适合关键词精确查找
二是代码库高频变更,RAG索引很容易过时
代码库频繁改动,RAG要持续更新索引,滞后就会拿到已删除、重构的旧代码。
grep直接读取磁盘实时文件,结果和源码版本完全同步
Claude Code现在是 Agentic Search,让大模型自主决策检索过程:
决定使用grep做内容关键词检索,或是glob做文件名匹配
获取候选文件列表后,调用read读取目标文件完整内容
如果信息不足,自动调整搜索关键词,循环迭代继续查找
