笃行
首页
个人 & 心法
互联网/硬件后台
游戏基础架构
UE 引擎
游戏业务
AI / 大模型
数据结构与算法
机器学习数学
通用基础
GitHub
首页
个人 & 心法
互联网/硬件后台
游戏基础架构
UE 引擎
游戏业务
AI / 大模型
数据结构与算法
机器学习数学
通用基础
GitHub
  • AI / 大模型

    • AI / 大模型
    • 大模型核心原理
    • 推理与微调优化
    • RAG 检索增强生成
    • RAG 上下文剪枝实战(Listwise Pruning 复现)
    • RAG 数据清理
    • RAG 存量数据清理
    • Agent 开发
    • Agent 运行时深水区
    • Multi-Agent 协作
    • Agent 评测与线上运营
    • AI 与游戏研发周期
    • 互动影游与长视频创作 Agent
    • LLM 应用安全
    • LLM 评测方法论
    • LLM 成本与延迟
    • 微调策略
    • AI 研发工程化

RAG 检索增强生成

动机与取舍 · 标准链路 · Chunking · 向量索引 · 混合检索 · Rerank · Query 改写 · 召回率详解 · 评测 · 常见坑 · 面试题

📚 RAG 专题地图(本篇为主线枢纽)

本篇讲 RAG 全链路主线。深入子专题:

  • RAG 数据清理——入库前:抽取/分块/元数据/去重/质量过滤(主线 Chunking 的实现级深潜)
  • RAG 上下文剪枝——检索后:用小模型砍掉废话保住召回(主线"上下文构造"的实现级深潜)
  • RAG 存量清理——运维/版本化:对已入库旧 chunk 的审计、淘汰、版本迁移

🧠 一句话记忆锚点

RAG = 离线把文档切块/向量化/灌库,在线把问题向量化去召回最相关的块塞进 prompt 让模型"看着资料答"。加事实/时效知识用 RAG(不是微调)。召回是漏斗,每一层(chunking→embedding→混合检索→rerank→剪枝)都在给最终 Recall 设天花板——先定位是"检索"还是"生成"的锅,再对症下药。

名词速查

首次阅读可跳过本表,直接看「场景问题」,遇到生词再回查。

本篇是检索这一组名词的枢纽归属页。好消息:这一整套几乎就是一个搜索引擎,你已经会的分库分表、倒排索引、跳表、多路归并、精排粗排,一一对得上——RAG 只是把"关键词匹配"换成了"语义向量匹配"。

名词后台类比在系统里干什么类比失效边界
Chunking(分块)分库分表的拆分键设计——粒度决定了后续所有查询的效率上限把长文档切成适合检索与塞进 prompt 的片段(定长+重叠 / 按语义 / 按结构)分表切错了还能按主键 join 回来;chunk 切断了语义就永久丢失——被切散的因果关系、跨段的表格、指代关系无法在检索时还原。这是 RAG 里最高杠杆也最不可逆的超参,实现细节见 RAG 数据清理
文本 Embedding一致性哈希——把任意输入映射到固定维度的空间,位置决定归属把一段文本压成定长向量(如 1024 维),让"语义相近"变成"空间距离近",从而可用向量检索哈希要求"相近输入映射到无关位置"(抗碰撞),embedding 要求恰恰相反——相近输入必须映射到相近位置。且它不可逆、不可解释,你无法从向量看出它编码了什么;换 embedding 模型意味着整库必须重算,见 RAG 存量清理
cosine / dot 相似度打分排序函数——比较两条记录的接近程度度量两个向量的语义接近度。向量归一化后两者等价业务打分函数的每一项都有明确业务含义;这里的分数是无量纲的相对值——0.82 本身不说明任何事,只有在同一次查询的候选之间比较才有意义。不要跨查询设固定阈值做过滤
ANN(近似最近邻)走索引的模糊查询 vs 全表扫描——放弃"保证找到最优解",换回几个数量级的速度向量检索的总称:HNSW、IVF-PQ 都属于它。用"极小概率漏掉真正最近的那个"换取从 O(n) 降到近似 O(log n)走索引的 SQL 查询结果与全表扫描完全一致,索引只影响速度;ANN 的结果可能与暴力检索不同——它会漏,且漏了不报错、不可察觉。所以召回率是要实测的指标(对照 Flat 暴力检索算基线),不是配好就不用管的东西
MRR / nDCG / Hit@k排序质量指标——衡量"该排前面的有没有真排前面"检索侧的排序类指标:MRR 看第一个相关文档排多前、nDCG 看整体排序质量、Hit@k 看前 k 个里有没有命中业务排序指标可直接对应收入或点击等真实目标;这几个指标衡量的是相对标注基准的排序质量,而基准本身由人工标注、覆盖有限。指标涨了不必然意味着最终答案变好——检索排序与生成质量之间还隔着上下文构造这一层
HNSW跳表——多层稀疏索引,上层大步跳、下层精确定位近似最近邻索引:用分层小世界图把检索复杂度从 O(n) 降到近似 O(log n),查得快、召回高跳表查询是精确的,要么找到要么没有;HNSW 是近似的——它可能漏掉真正的最近邻(尤其在高维、数据分布不均时),且这种漏召回静默发生、不报错。此外它内存占用高(图结构本身很大),且删除只是打墓碑标记,长期不重建会持续劣化
IVF-PQ先分桶再压缩存储——按桶缩小扫描范围,桶内用有损压缩省内存倒排文件(IVF)把向量聚成簇,只扫最近的几个簇;乘积量化(PQ)把向量压缩存储。内存省得多,代价是精度业务分桶键是确定的,落在哪个桶可预测;IVF 的簇是 k-means 聚出来的,查询向量落在簇边界时会漏掉邻簇里的真正近邻(靠 nprobe 多扫几个簇缓解,但那就变慢了)。PQ 的压缩是有损的,精度损失不可恢复
BM25 / 稀疏检索倒排索引 + TF-IDF 打分——经典关键词搜索按词项精确匹配打分。专治向量检索的软肋:人名、型号、错误码、专有名词这类"字面必须命中"的查询它对同义、换句表达完全无能("内存泄漏" vs "OOM" 命中不了)。所以它不是向量检索的替代品,两者是互补的——这正是混合检索存在的理由
混合检索(Hybrid Search)多路查询并行下发,各走各的索引同时跑稀疏(BM25)与稠密(向量)两路召回,取长补短多路查询通常可以直接 union 去重;这里两路的打分体系完全不可比(BM25 分数无上界、cosine 在 0~1),不能直接比大小或加权求和——必须用 RRF 这类只看排名的融合法
RRF(倒数排名融合)多路归并排序,但只按各路的名次加权,不看各路的原始分用 Σ 1/(k + rank) 融合多路结果,绕开分数不可比的问题普通归并依赖可比的排序键;RRF 刻意丢弃了分数信息——它不知道第一名是"完美匹配"还是"勉强凑数"。代价是:某一路极其确信的结果,也只能贡献一个名次权重,无法压倒性胜出
Rerank / Cross-Encoder粗排 + 精排两级架构——先用便宜索引捞一批,再用贵模型精算对召回的 top-50 逐条做「query + chunk 一起进模型」的精细打分,重排出真正的 top-5。是提升准确率最划算的一环精排通常只是"更多特征的同类打分";Cross-Encoder 与召回用的 Bi-Encoder 是两种不同的模型结构——它没有可预先计算的向量,必须在线逐条推理,因此延迟随候选数线性增长,候选数是硬性预算约束,不能无脑放大
Query Rewrite(查询改写)请求预处理 / 参数归一化——把用户的糙输入整理成检索友好的形式补全指代、拆分多意图、扩展同义词,解决"用户问法与文档措辞不一致"参数归一化是确定的规则映射;改写由 LLM 完成,会引入幻觉——它可能"补全"出用户没提的约束,把检索带偏。且多加一次模型调用,直接抬高 TTFT
HyDE以答案找答案——先造一份假想答案,用它去检索让 LLM 先编一个假设性答案,再用这个答案的向量去检索。因为"答案与答案"的语义距离比"问题与答案"更近它不需要假想答案事实正确(只要文体和用词像目标文档就行),这点反直觉但确实成立;失效之处是——当问题涉及模型完全没有的知识时,编出来的假答案用词会整体偏离,反而检索得更差
迷失在中间(Lost in the Middle)
亦作 中间遗忘
长列表里中间项被忽略——像超长日志里最容易漏看中段描述一个实测现象:塞进 prompt 的多个 chunk 中,开头和结尾的内容被利用得最好、中间的常被忽略。所以最相关的要放两端日志漏看是人的注意力问题,加个高亮就解决;这是模型的注意力分布特性,无法通过"提醒它注意中间"来修复,只能靠调整摆放顺序和减少 chunk 数量来规避——这也是要做上下文剪枝的动因,见 RAG 上下文剪枝
RAGAS分环节的 SLI 指标体系——把端到端故障拆到各环节归因一组 RAG 专用指标:faithfulness(答案是否忠于检索内容)、answer relevance、context precision / recall。用来判断"是检索的锅还是生成的锅"SLI 是确定的数值统计;RAGAS 的多数指标是用 LLM 打分算出来的——它本身带噪声与偏差,适合看趋势与做相对比较,不适合当精确 KPI 卡验收。其可靠性总论见 评测方法论
GraphRAG从单表查询升级到关联查询——先建实体关系再按图遍历抽取实体与关系建知识图谱,检索时沿图游走,擅长"需要多跳串联"的全局性问题数据库外键是人工建模、精确可靠的;GraphRAG 的实体与关系是 LLM 抽出来的,本身带错误率,错误会沿图传播放大。且离线构图成本很高(每份文档都要过若干次模型),增量更新麻烦
Agentic RAG从固定流程升级到可循环的状态机——查不到就换策略再查让 Agent 自主决定"查什么、要不要再查一轮、够不够答",把一次性检索变成多轮迭代检索状态机的转移条件是写死的、可穷举;这里"够不够"由模型自己判断,可能过早停止也可能无限循环,必须外挂轮次上限与预算护栏。这些机制的实现见 Agent 运行时深水区

本篇引用的其他上下文名词

名词在本篇里的角色完整解释去哪读
token embedding(模型内部权重)与本篇"文本 embedding"同名异义,务必区分大模型核心原理 · 名词速查
context(注意力窗口)上下文构造的物理上限推理与微调优化 · 名词速查
LLM-as-judge / 基准污染RAGAS 打分可靠性的总论评测方法论 · 名词速查
listwise 剪枝 / 自适应保留数上下文构造环节的深潜RAG 上下文剪枝 · 名词速查
结构化抽取 / 两阶段去重 / 质量门禁入库前环节的深潜RAG 数据清理 · 名词速查
陈旧向量 / 蓝绿双写 / 版本切换向量库运维环节的深潜RAG 存量清理 · 名词速查

场景问题

为什么需要 RAG,而不是直接问模型 / 直接微调?

场景:给企业内部知识库/产品文档做问答机器人。直接问通用大模型会遇到三座大山:

  • 幻觉:不知道就编,且编得一本正经。
  • 知识时效:模型训练有 cutoff,新文档/最新政策它不知道。
  • 私域知识:内部文档从没进过训练集。

两条路:微调 vs RAG。

维度微调 (Fine-tune)RAG
加事实知识慢、贵、易遗忘、难更新✅ 改库即更新,实时
改风格/格式/能力✅ 擅长一般
知识更新成本重新训练改向量库,秒级
可解释/可溯源黑盒✅ 能给出引用来源
数据隐私数据进权重数据留在库里,按需检索

结论:加知识、要时效、要溯源 → RAG;改行为/风格 → 微调;二者常组合使用。

RAG 标准链路

一句话:离线把文档切块、向量化、灌进向量库;在线把用户问题向量化去召回最相关的块,塞进 prompt 让模型"看着资料回答"。

实现方案

Chunking:切块策略决定召回上限

切得太大 → 一个块混多主题,向量语义模糊、召回不准、还占 context;切得太小 → 语义被切断、上下文不完整。主流做法:

  • 定长 + 重叠(overlap):如每块 512 token、重叠 50,避免在句中硬切、保留跨块连续性。
  • 按结构切:按 Markdown 标题 / 段落 / 代码块 边界,保持语义完整(推荐)。
  • 按语义切(Semantic Chunking):用 embedding 相似度找"语义断点"再切。
  • 父子块 / 小块召回大块(Small-to-Big):用小块做精准召回,喂给模型时补上其所在的大块上下文。
def chunk_by_paragraph(text, count, max_tokens=512, overlap=50):
    # count(list)->token 数;优先按段落边界切,超长再定长切,块间保留 overlap 防止语义断裂
    chunks, buf = [], []
    for para in text.split("\n\n"):
        if count(buf) + count([para]) > max_tokens and buf:
            chunks.append("\n\n".join(buf))
            buf = buf[-overlap:] if overlap else []   # 滑动重叠
        buf.append(para)
    if buf:
        chunks.append("\n\n".join(buf))
    return chunks

Embedding 与相似度

  • 用 embedding 模型(如 bge、gte、text-embedding-3、Cohere embed)把文本映射到稠密向量。
  • 相似度:cosine(最常用,对模长不敏感)或 dot product(需向量归一化后与 cosine 等价)。
  • 关键坑:query 和 document 要用同一个模型、同一归一化方式;embedding 与业务语料存在 domain gap 时,通用模型召回会明显变差,需选领域模型或微调 embedding。

打个比方:RAG 就像开卷考试——考前不必把整本书背下来(不做全参微调),考试时按题目翻目录(Embedding 检索最相似的章节)、再挑最相关的几页(Rerank 精排)、抄进答卷(拼进 prompt 让模型"看着资料答")。所以事实、时效、私域知识优先走 RAG,而不是塞进模型权重。类比失效边界:开卷考试能拿分的前提是书里真有答案——一旦问题超出知识库覆盖(out-of-domain)、或答案分散在多章需要跨页合成,RAG 会硬拿"最相似的无关段落"塞回去让模型编造,幻觉反而比不给知识时更严重(模型看到有引用会更自信);所以生产上要给 RAG 配"我不知道"的兜底出口,并把 Faithfulness / Context Recall 纳入评测,别让检索器把无关内容伪装成"依据"。

向量索引:精度 / 内存 / 速度的三角

索引原理特点
Flat(暴力)逐一算相似度100% 精确,慢,仅适合小库
HNSW多层近邻图导航高召回、快,内存占用大,主流默认
IVF-PQ倒排聚类 + 乘积量化压缩省内存、适合超大库,精度略降、需调 nprobe

面试点:"HNSW 和 IVF 怎么选?"——中小库/重召回精度用 HNSW;亿级向量/省内存用 IVF-PQ。二者都是 ANN(近似最近邻),用少量召回率换巨大的速度提升。

HNSW/IVF/PQ 三家索引结构的原理视角(分层图、k-means 聚类、乘积量化码本、召回率×延迟×内存三角权衡),见 数据库范式与存储引擎 · 向量索引三家。

混合检索(Hybrid Search):稠密 + 稀疏

  • 稠密向量擅长语义("如何退款" ↔ "退货流程"),但对专有名词/型号/ID弱。
  • 稀疏检索(BM25 / 关键词)擅长精确 term 匹配,但不懂同义/语义。
  • 混合:两路各召回一批,用 RRF(Reciprocal Rank Fusion) 按排名融合,取长补短。
def rrf_fuse(dense_ranked, sparse_ranked, k=60):
    # RRF:每个文档得分 = Σ 1/(k + rank),对两路排名做融合,无需分数归一化
    scores = {}
    for ranking in (dense_ranked, sparse_ranked):
        for rank, doc_id in enumerate(ranking):
            scores[doc_id] = scores.get(doc_id, 0) + 1.0 / (k + rank)
    return sorted(scores, key=scores.get, reverse=True)

Rerank:召回要"广",精排要"准"

召回(Bi-Encoder,query 和 doc 分别编码)为了速度牺牲了精度。Rerank 用 Cross-Encoder——把 query+doc 拼起来一起过模型算相关性,精度高但慢,所以只对召回的 top-N(如 50)精排,取 top-k(如 5)进 prompt。"召回 recall 优先拉多,rerank 精度优先选准"是 RAG 提效最划算的一步。

查询侧优化:问题本身也要"翻译"

用户的问法常和文档表述对不上,只优化索引不够:

  • Query Rewrite:口语化/多轮指代 → 改写成完整、检索友好的查询。
  • HyDE(假设性文档):先让 LLM "假装"生成一段答案,用这段答案去检索(答案和文档在同一语义空间,比问题更接近)。
  • Multi-Query / Step-back:把一个问题扩成多个子查询/更抽象的问题,多路召回后合并,提升覆盖。
  • Query 路由:先分类问题该查哪个库/该不该查(闲聊就别检索)。

召回率是什么:先把概念钉死

面试问"怎么提升召回率"之前,得先答清楚召回率(Recall)到底衡量什么。一句话:在所有"本该被检索出来的相关文档"里,你实际检索出来了多少比例。

Recall=检索到的相关文档数全部相关文档数 \text{Recall} = \frac{\text{检索到的相关文档数}}{\text{全部相关文档数}} Recall=全部相关文档数检索到的相关文档数​

它和精确率(Precision)是一对,两者常此消彼长:

Precision=检索到的相关文档数检索到的全部文档数 \text{Precision} = \frac{\text{检索到的相关文档数}}{\text{检索到的全部文档数}} Precision=检索到的全部文档数检索到的相关文档数​

  • 召回率高:宁可多召回(不漏),代价是可能混进无关的(Precision 下降)。
  • 精确率高:召回的都很准,但可能漏掉一些相关的(Recall 下降)。

为什么 RAG 尤其在意召回率

RAG 是"检索→生成"两段式,生成端只能在检索给的上下文里作答。如果相关文档没被召回(漏召/False Negative),LLM 手里根本没有正确资料,再强的模型也只能幻觉或说不知道。所以 RAG 里召回率是答案质量的天花板——这也是下面"下游只能删不能补"心法的根源。相比之下精确率的损失可以靠 rerank/剪枝在下游补救,召回的损失无法补救。

RAG 里要区分两种"召回率"(这个区分答出来直接加分):

类型衡量什么归属层掉了往哪查
检索召回(Retrieval Recall)gold 文档有没有进候选池(top_n/top_m)切块/embedding/索引/检索往上游查漏召的那一层
答案召回(Answer Recall / recall@needed)进 prompt 的上下文够不够答对剪枝/截断截断策略太狠,放宽保留数

配套的排序类指标:MRR(第一个相关文档排多前)、nDCG(考虑相关文档整体排序质量)、Hit@k / Recall@k(前 k 个里有没有/召回了多少 gold)。离线用标注集算这些做回归。

系统性提升召回率:把召回当"漏斗"看

面试高频题——"你的 RAG 召回不准,怎么提升召回率?"。零散地答"加 rerank""换 embedding"是扣分的,正确姿势是先把召回看成一条逐层收窄的漏斗,每一层都在给最终 recall 设天花板:

核心心法(也是最容易被追问的一句):下游只能"删",不能"补"。 rerank、剪枝、重排位置都只能在上一层已召回的候选里做取舍——gold chunk 一旦没进 top_n/top_m,后面再强的模型也救不回来。所以定位召回问题要自上而下逐层查 gold coverage(标注集里每题的必要 chunk,在每一层的候选里还在不在),找到第一个丢它的层,只修那一层:

漏斗层常见丢召回的原因边际收益最高的动作
Chunk答案被切在两块交界处结构化切 + overlap + small-to-big(小块召回、大块喂模型)
Embedding专业语料 domain gap,query/doc 表述错位换领域模型 / 微调 embedding;查询侧上 HyDE / Multi-Query 扩召回
索引 ANNHNSW ef_search、IVF nprobe 默认值过小,漏掉近邻调大 ef_search/nprobe(用召回率换延迟);小库直接 Flat
单路检索稠密漏专名、稀疏漏语义混合检索 BM25 + 稠密,RRF 融合取并集
top_n / top_m候选池太窄,gold 排在第 8、9 位被截断先拉大 top_n/top_m,把 recall 顶上去,再靠 rerank/剪枝收窄

两个关键区分,答出来直接拉开档次:

  • 两种 recall 别混:检索 recall(gold 有没有进候选池,检索/rerank 层的事)vs 答案 recall / recall@needed(进 prompt 的上下文够不够答对,剪枝/截断层的事)。掉的是前者 → 往上游查;掉的是后者 → 是截断策略太狠。
  • "先拉多再收窄"是最划算的顺序:召回阶段 recall 优先(top_n 拉大、多路并集),精排/剪枝阶段 precision 优先(rerank + 自适应保留)。在窄候选池上调 rerank 是本末倒置——见 RAG 上下文剪枝实战 里"pruner 是 reranker 的放大器不是替代品"的实测证据。

反直觉的坑

"多跳/组合型问题"上单纯调 rerank 往往无效——rerank 是逐点打分,看不到"这几条 chunk 拼在一起才够答",会把其中一条挤出 top_m。这类问题要么拉大候选池 + 多路召回,要么上 listwise 剪枝让模型一次看完所有候选再决定保留几条。

提升召回率的手段总览(面试速答版)

把"有哪些手段提升召回率"按作用的漏斗层归类,答题时从上游往下游一层层说,逻辑最清晰:

层手段原理代价
切块结构化切 + overlap + small-to-big避免答案被切在块交界处丢失索引存储略增
Embedding换领域模型 / 微调 embedding消除 query↔doc 的 domain gap,让 gold 排得上来微调成本
查询侧Query Rewrite / HyDE / Multi-Query / Step-back让"问法"更贴近"文档表述",多路扩召回覆盖面多次 LLM 调用、延迟
检索混合检索(BM25+稠密)+ RRF稠密补语义、稀疏补专名,取并集系统更复杂
索引参数调大 HNSW ef_search / IVF nprobeANN 搜更多近邻,减少漏召延迟上升
候选池拉大 top_n / top_m先把 recall 顶上去,再靠 rerank 收窄下游算力略增

一句话心法

"召回优先拉多(recall),精排剪枝优先选准(precision),先拉多再收窄。" 提升召回率的所有手段本质都在做一件事:让 gold chunk 尽早、尽全地进入候选池——因为下游只能删不能补。

上下文构造:召回到了也可能答不好

  • top-k 选择:不是越多越好——"迷失在中间":模型对长上下文首尾信息利用好、中间易忽略,把最相关的放两端。
  • 去重 / 压缩:多路召回有重复,去重并可做上下文压缩,避免稀释和撑爆窗口。
  • prompt 模板:明确"只依据给定资料回答,无依据就说不知道,并标注引用来源"——直接压制幻觉。

为什么这么做

评测:RAG 坏了要能定位是"检索"还是"生成"的锅

RAG 是两段式,评测要分段归因。RAGAS 框架的核心指标:

  • Context Precision / Recall:召回的上下文相不相关、全不全 → 检索质量。
  • Faithfulness(忠实度):答案是否严格基于召回上下文(越低=越幻觉)→ 生成质量。
  • Answer Relevancy:答案切不切题。

工程上还看:检索命中率 / MRR / nDCG(离线用标注集回归)、端到端人工评分、线上点赞点踩。先看 Context Recall——检索没召回到,生成再强也白搭。

为什么别的选择不行

检索方式对比

方式强项弱项用在
稠密向量语义相似、同义改写专名/型号/精确匹配弱语义问答主力
稀疏 BM25精确关键词、专名、可解释不懂语义/同义补充精确匹配
混合 + RRF兼顾语义与精确系统更复杂生产推荐默认

RAG 十大常见坑

  1. 分块切断语义:答案跨块被切开 → 结构化切 + overlap + small-to-big。
  2. 召回相似但事实相反:"支持 X" 与 "不支持 X" 语义相近被误召 → rerank + 忠实度约束。
  3. 上下文过长稀释:塞太多无关块,模型抓不住重点 → 精排 + 压缩 + 控制 top-k。
  4. 迷失在中间:关键信息放中间被忽略 → 重排位置、最相关放两端。
  5. Embedding domain gap:通用 embedding 在专业语料召回差 → 换领域模型/微调 embedding。
  6. Query 与 doc 表述错位 → Query Rewrite / HyDE。
  7. 只召回不判断该不该召回:闲聊也硬检索 → Query 路由。
  8. 不标引用/无兜底:无依据仍强答 → prompt 强制"无依据就说不知道 + 标来源"。
  9. 索引参数不调:HNSW 的 ef、IVF 的 nprobe 默认值召回率低 → 按数据调参。
  10. 不评测:上线全靠感觉 → RAGAS + 检索命中率回归。

进阶范式(何时超出朴素 RAG)

  • 上下文剪枝(Listwise Pruning):rerank 之后再插一个小 LLM,一次看完所有候选、给每条打 1–5 分,按 threshold + keep-top-K 自适应保留——比固定 top-N 截断更懂"这题该留几条",在多跳问题上同时提升压缩率和 recall。完整实测见 RAG 上下文剪枝实战。
  • GraphRAG:把知识建成实体-关系图,适合需要多跳推理/全局归纳的问题(朴素 top-k 召回覆盖不了"跨文档综合")。
  • Agentic RAG:把检索当成 Agent 的一个工具,模型自主决定要不要查、查几次、怎么改写,多轮迭代检索——见 Agent 开发。

RAG 面试常见问题清单(按主题分类)

把高频问题按主题归好类,面试时能成体系地展开,而不是被单点问懵:

A. 概念与选型

  1. RAG 是什么?为什么不直接微调 / 不直接问大模型?(→ 幻觉/时效/私域三座大山,微调 vs RAG 对比表)
  2. RAG 和微调各自适合什么?能不能一起用?(加知识用 RAG、改风格用微调,常组合)
  3. 完整的 RAG 链路有哪些环节?(离线索引 + 在线检索生成,画链路图)

B. 召回率 / 检索质量(重灾区)
4. 召回率是什么?和精确率的区别?(Recall/Precision 公式 + 混淆矩阵)
5. RAG 里两种 recall 的区别?(检索 recall vs 答案 recall)
6. 召回不准怎么系统性排查和提升?(漏斗视角,自上而下查 gold coverage,逐层手段表)
7. 为什么说"下游只能删不能补"?(gold 没进候选池,rerank 也救不回)
8. 多跳/组合问题为什么单调 rerank 没用?(逐点打分看不到组合,要拉大候选池或 listwise)

C. 切块与向量
9. Chunk 怎么切?切大切小各有什么问题?(结构化切 + overlap + small-to-big)
10. Embedding 的相似度用什么?cosine 和 dot 的区别?(归一化后等价)
11. 向量索引 HNSW / IVF-PQ / Flat 怎么选?(中小库重精度 HNSW、亿级省内存 IVF-PQ)
12. ANN 的召回率和延迟怎么权衡?(ef_search / nprobe 调参)

D. 检索增强手段
13. 什么是混合检索?为什么要稠密+稀疏?RRF 怎么融合?
14. HyDE 是什么?为什么用"假设答案"去检索更准?
15. Query Rewrite / Multi-Query / Step-back 分别解决什么?
16. Rerank 为什么用 Cross-Encoder?和召回的 Bi-Encoder 有何不同?

E. 上下文与生成
17. "迷失在中间"是什么?怎么缓解?(最相关放首尾)
18. top-k 是不是越大越好?(否,稀释注意力 + 撑爆窗口)
19. 怎么用 prompt 抑制幻觉?(只依据资料 + 无依据说不知道 + 标引用)

F. 评测与工程
20. RAG 怎么评测?坏了怎么定位是检索还是生成的锅?(RAGAS:Context Recall / Faithfulness / Answer Relevancy)
21. 向量库数据怎么治理(去重、过期、模型升级重建)?(→ RAG 存储治理)
22. 数据清理有哪些环节?(→ RAG 数据清理)

G. 进阶范式
23. GraphRAG 解决朴素 RAG 的什么短板?(多跳推理 / 全局归纳)
24. Agentic RAG 是什么?和朴素 RAG 的区别?(模型自主决定查不查、查几次)
25. 上下文剪枝 / listwise pruning 相比固定 top-N 截断好在哪?(→ 剪枝实战)

沉淀结论

心法总结

RAG = 好切块 + 好 embedding + 混合召回(广) + rerank(准) + 会构造上下文 + 抑制幻觉的 prompt + 分段评测。 加知识/要时效/要溯源用 RAG,改风格用微调,二者可组合。定位问题先分清是检索的锅(Context Recall 低)还是生成的锅(Faithfulness 低)。

延伸阅读:大模型核心原理 · 推理与微调优化 · RAG 上下文剪枝实战 · Agent 开发

记忆口诀

  • 链路:离线切块/向量化/灌库 / 在线问题向量化召回 / 塞 prompt 看着答
  • 选型:加知识时效溯源用 RAG / 改风格能力用微调 / 二者可组合
  • 召回漏斗:切块 / embedding / 索引 ANN / 混合检索 / rerank / 剪枝——层层设天花板
  • 核心心法:下游只能删不能补 / 召回优先拉多 / 精排剪枝优先选准 / 先拉多再收窄
  • 两种 recall:检索 recall(gold 进没进候选池) / 答案 recall(上下文够不够答对)
  • 定位归因:Context Recall 低=检索锅 / Faithfulness 低=生成幻觉 / Answer Relevancy 低=答非所问

内容来源

综合整理:RAG(Lewis 2020)、HyDE、RRF、RAGAS、HNSW/IVF-PQ(FAISS/Milvus 文档)、GraphRAG(微软)、LangChain/LlamaIndex 官方文档(2026-07;领域更新快,请以最新论文与官方文档为准)。

自测:合上资料能说清楚吗?

  1. 同样是给模型"补知识",RAG 和微调你会怎么选?各自适合什么、能否组合?
参考答案

加事实/时效/私域知识、要溯源用 RAG(改库即更新、可给引用);改风格/格式/能力用微调。加知识微调慢贵易遗忘难更新,故二者常组合:RAG 供知识、微调调行为。

  1. RAG 里有"检索 recall"和"答案 recall"两种召回率,它们分别衡量什么?掉了各往哪查?
参考答案

检索 recall:gold 文档有没有进候选池,属切块/embedding/索引/检索层,掉了往上游逐层查漏召。答案 recall:进 prompt 的上下文够不够答对,属剪枝/截断层,掉了说明截断太狠,放宽保留数。

  1. 为什么说 RAG 里"下游只能删不能补"?这句心法如何指导排查召回问题?
参考答案

rerank/剪枝只能在上一层已召回的候选里取舍,gold 一旦没进 top_n/top_m 后面再强也救不回。故召回是答案质量天花板,排查要自上而下逐层查 gold coverage,找到第一个丢它的层只修那一层。

  1. "召回不准怎么提升?"——请用漏斗视角成体系地回答,而不是零散堆手段。
参考答案

把召回看成逐层收窄漏斗(切块→embedding→索引→检索→剪枝),每层设天花板。自上而下:结构化切+overlap+small-to-big;换/微调领域 embedding+HyDE/Multi-Query;调大 ef_search/nprobe;混合检索+RRF;先拉大 top_n 再靠 rerank 收窄。

  1. 答案质量差时,怎么判断是"检索的锅"还是"生成的锅"?各自怎么修?
参考答案

看 RAGAS 指标:Context Recall 低=检索锅→自上而下查漏斗;Faithfulness 低=生成幻觉→强化 prompt 只依据资料+标引用;Answer Relevancy 低=答非所问→Query 改写/意图路由。先看 Context Recall,检索没到生成再强也白搭。

最近更新: 2026/9/10 11:38
Prev
推理与微调优化
Next
RAG 上下文剪枝实战(Listwise Pruning 复现)