Administrator 3 阅读 agent

RAG 面试手册

依据 《从零开始学 Agent》第 6 章 整理,改成能讲、能对比、能说代价的面试口径。不是把教程代码背下来。


0. 30 秒开场(可直接说)

RAG 是先从外部知识库找出相关段落,再让模型基于这些段落回答。用来补三块短板:知识会过期、看不到公司内部文档、容易瞎编。今天线上一般是「切块 → 向量化 → 检索 →(可选精排)→ 拼进提示词生成」。原始 2020 论文是检索器和生成器一起训;现在几乎都拆开,检索用通用 embedding,生成用现成大模型。


1. 为什么要 RAG(必问)

大模型三件事做不好:

问题 例子 RAG 怎么补
知识截止日期 「最新版有什么功能」 文档更新了就能查到
没有私有知识 「我们公司退款政策」 检索内部知识库
幻觉 编造不存在的论文 逼它对着真实段落写,并能引用来源

加分句: RAG 减幻觉,不是消灭幻觉。检索错了,生成也会错。所以瓶颈往往在检索,不在模型文笔。

别把 RAG 吹成万能。 书里点的局限,面试要能自己说:

  • 检索质量差,后面再强也救不了
  • 塞太多段会稀释重点(top_k 别乱加大)
  • 答案散在多篇文档里,一次检索不好拼(要多跳 / Map-Reduce / 图)
  • 索引不更新就会过时
  • 表格、数据库不如上 Text-to-SQL

2. 一条流水线(白板就画这个)

离线(建库): 加载文档 → 切成 Chunk → Embedding → 写入向量库(带 metadata:来源、页码、时间)

在线(问答): 用户问题 →(可选改写)→ 检索 Top-N →(可选重排序到 Top-k)→ 把段落塞进 Prompt → LLM 生成(要求:只用资料、没有就说没有、注明来源)

四个名词用大人话:

  • Chunk:切出来的一小段,独立存、独立搜。切坏了,后面全坏。
  • Embedding:把文字变成一串数字。意思近的,数字也近。
  • 相似度检索:拿问题的向量去库里找最近的几段。常用余弦相似度。
  • 上下文注入:找到的段落写进提示词,不是写进模型权重。

3. 切分(面试官很爱追,因为很多人只会调模型)

原则:每一块最好是自己能看懂的一小段完整意思。在句子、概念中间砍断,检索回来就是残句。

书里三种切法:

  1. 递归分隔符:先按段落 \n\n,再按行、句号,最后才硬切。最常用。
  2. 按 Token:卡 embedding 上限或计费时用。
  3. 按 Markdown 标题:一块带着面包屑路径,例如 [Python入门 > 数据类型],单独搜到也知道它属于哪一节。

重叠 overlap: 关键句卡在两块交界时,重叠保证至少有一块是完整的。

块大小没有万能值,对齐问题粒度:

场景 建议(书中口径) 原因
具体问答 300–500 字 更准、噪音少
摘要 / 总结 800–1500 字 上下文更完整
代码 按函数 / 类 语义边界天然在这

加载侧:PDF / Word / 网页结构完全不同,用策略模式按后缀选 loader 即可(这点和设计模式能串起来讲)。


4. 向量与数据库

选 embedding 看三件事:效果、钱、维度(维度越大越占存储、检索也可能更慢)。

书中对比(价格会变,面试说「以官网为准」):

  • text-embedding-3-small:多数场景性价比首选
  • text-embedding-3-large:更准、更贵、维度更高
  • 本地 BGE 等:隐私、不想走 API
  • 中文场景优先考虑中文优化过的模型

向量库:开发用 Chroma(像 SQLite,本地文件持久化)很常见;规模上去换 FAISS / Pinecone / Weaviate 等。索引常用 HNSW。检索可加:

  • metadata 过滤(来源、时间)
  • 最低相关度阈值(太不像的丢掉,书中示例 0.3)
  • 批量 embedding,少打几次 API

余弦相似度: 看两个向量方向像不像,不看绝对长度。Chroma 里 distance 常是 1 - 相似度,所以代码里会 relevance = 1 - dist。面试说到这个,显得你读过实现而不是只听过名词。


5. 检索策略(第 6.4 节,你前面问的就是这块)

纯向量有两个坑:

  1. 语义漂:问「Error 404」,可能捞到「HTTP 错误」科普,而不是真写了 404 的段落。
  2. 召回不够:同一问题有很多问法,一条 query 会漏。

书里三条优化,对应搜索引擎的老套路:先求召回,再求精准。

5.1 混合检索(向量 + BM25)

  • 向量:懂同义,对不准专有名词
  • BM25:按字眼打分,FastAPI、工单号很稳,不懂同义
  • 融合:两边各搜一批,加权合成(书中默认向量 0.7、关键词 0.3,可调)
  • 中文 BM25 前要分词(jieba 一类)

面试怎么说: 两条腿走路。线上默认我会上混合,不先上 Agent。

5.2 重排序

粗找 10~20 条「大概相关」,真正最相关的可能排在第 5。精排把「问题和每一条」放在一起再打分,只留 3~5 条给生成模型。

两阶段:

  • 第一阶段要召回(别漏)
  • 第二阶段要精准(最相关的排前面)

和你之前那个问题对齐: 书第 6.4 节的示例是把候选交给 LLM(如 gpt-4.1-mini) 打分排序。这是一种做法。工业界更常见的是专用 reranker / cross-encoder(BGE-reranker 等):只判断贴不贴,比回答用的大模型小、便宜、快。
所以标准答法:是二次精排;不一定是那个写答案的大模型。

5.3 查询扩展

用户只会一种问法。让小模型改写成 2~3 个变体,分别检索,合并去重。提高召回,再交给重排序。

书中完整管道:

查询扩展 → 多路检索 → 合并去重 → 重排序 → 取最终 k 条


6. 一个能讲清楚的问答 Agent(第 6.5 节)

面试别背 300 行。讲四个盒子:

  1. 初始化:向量库 + 短对话历史
  2. 入库:切块 → embedding → 带上 source / 时间
  3. 问答:检索 → 过滤低相关 → 只取前几条拼 prompt → 生成
  4. 约束:只用资料、没有就承认、引用「根据文档 X」

书中几个工程细节值得提:

  • 中文没空格,不能按空格切,要按段落、句号
  • 相关度低于阈值直接扔(示例 0.3)
  • 生成只喂前 3 段,防止稀释
  • 历史只留最近几轮,避免上下文爆炸
  • 库是空的或检索为空,直接说找不到,不要硬编

7. 范式演进(第 6.6 节,论文口试)

按时间线说,比报论文名好看:

阶段 一句话 代表
Naive RAG 检索完就生成,每问必检索 2020 Lewis 等
Advanced RAG 检索前改写、检索后精排 混合 / 扩展 / rerank
Modular RAG 模块可插拔、可自适应 Self-RAG、CRAG
Agentic RAG Agent 决定检不检、检什么、不够再检 LangGraph 编排

原始 RAG(2020)

知识写在参数里:难更新、长尾差、不能溯源。论文把 DPR 检索和 BART 生成端到端一起训。
今天:检索和生成解耦,embedding 用通用模型,生成用 GPT/Claude。思想没变:生成时能看外部知识。

两种老变体能提一句:RAG-Sequence(一篇文档生成一整段再加权)vs RAG-Token(每个 token 可以看不同文档)。知道即可。

Self-RAG:要不要检索,模型自己想

传统 RAG 每个问题都检索,有的问题模型自己会,检索反而添乱;有的要检多次。
做法:训练模型吐反思标记——要不要检索、文档相关吗、生成有没有文档撑着、回答有没有用。
对 Agent 的启示:先判断;检索后要验相关;生成后要验是不是胡编。

CRAG:检索差了怎么办

向量高分 ≠ 真相关。来了垃圾上下文,答案一起烂。
一个轻量评估器,按质量走不同路:够用就用 / 不行就过滤或改去 Web 搜 / 大段里只抽几句关键。
启示:检索不是终点;要有降级;大段要压缩。

GraphRAG(微软,2024)

向量块适合「X 是什么」这种局部题。不适合「各团队怎么协作」「这批文档主题是什么」这种全局题。
先抽实体和关系建成图,再社区摘要。局部题走邻居,全局题对社区摘要做 Map-Reduce。书中写全局题质量可高一大截,但建索引很烧 LLM。

LightRAG

GraphRAG 贵、慢、加几篇可能要重建。LightRAG:抽取得更省、双层检索(具体 + 抽象)、增量更新。适合知识库经常变。面试对比就一句话:要图能力但钱紧、更新勤,用轻量图;静态语料、关系特别重,才上完整 GraphRAG。

Agentic RAG

从「固定水管」变成「会想的侦探」:检不检、用哪条 query、结果够不够、不够就改写或换数据源。组件来自上面那些论文:自适应检索、纠错、改写、多源、多轮(IRCoT)、用状态机把检索嵌进推理。

新论文很多(MASS-RAG、隐空间加速、SQL 超边等),面试点到「方向」即可:多智能体拆证据、检索加速、结构化/SQL 补向量、图和文本互证。不必背 arXiv 号。


8. 工程落地怎么选(第 6.7 节)

朴素 RAG 的隐藏假设:答案一定在某几个相邻块里。 下面三类题它会跪:

  • 全局:「各部门工作交叉点」
  • 关系:「A 和 B 的间接合作」
  • 多跳:「为什么结论是 X,请逐步推」
题型 架构 思想
全局 / 跨文档关系 GraphRAG / LightRAG 关系显式存在图上
多跳 / 不确定 / 要不要检索不一定 Agentic RAG Agent 动态决策

GraphRAG 两种搜:

  • Local:具体人、具体事 → 找节点 → 逛邻居
  • Global:主题、全貌 → 社区摘要再综合

LightRAG 查询模式:naive / local / global / hybrid(默认优先)。

别过度设计(书里的选型函数就是这个意思):

  • FAQ、文档少、没有全局题 → 朴素 RAG 够了
  • 文档多、偶有全局题、要省钱或常更新 → LightRAG
  • 静态语料、要最强关系推理 → GraphRAG
  • 客服、研究助手、问题忽难忽易 → Agentic RAG

Agentic RAG 四个零件(面试按流程说,不要背代码):

  1. 决策器:要不要检索(常识 / 已在历史里 → 不检;内部、时效、精确数字 → 检)
  2. 改写器:口语变检索用语,2~3 条
  3. 评估器:相关吗、够不够、缺什么
  4. 带引用生成:[1][2] 标来源

LangGraph 编排要点:

  • 重试必须有上限(书中 ≥2 次就停,防死循环)
  • 评估标准要写死,否则模型会把什么都判成「够了」
  • 决策、改写、评估用小模型;最终回答用大模型
  • top_k 3~5,变体 2~3,再多噪音和钱一起涨

生产里两者常组合:先判断题型,关系题走图,事实题走向量+改写。

书中踩坑表(很好用):

坑 表现 处理
GraphRAG 没估 token 索引到一半额度爆了 先 10~20 篇试成本
Agentic 无上限 某个问题检索到死 retry 封顶
LightRAG 模式选 naive 莫名其妙差 默认 hybrid
评估过松 垃圾检索也过 prompt 里写清「足够」= 有数字/日期/专名

「要不要检索」的提示词太糊,模型会觉得营收这种题训练数据里有,结果永远不检索。必须写明:公司内部、时效、精确数据 → 要查。


9. 对比速记(口试一页纸)

对比 怎么分
RAG vs 微调 知识常变、要溯源 → RAG;风格/格式/稳定技能 → 微调。可以一起用。
RAG vs 加长上下文 库大、要精确定位 → RAG;材料少且必须通读 → 长上下文。
向量 vs BM25 同义 vs 关键字。生产常混合。
装饰性 rerank vs 生成模型 精排用小 reranker 或小 LLM;写答案用大模型。
Graph vs 向量 关系/全局 vs 局部事实。
GraphRAG vs LightRAG 质量/成本/能否增量更新。
朴素 vs Agentic 固定管道 vs 动态决策;后者更慢更贵。

10. 项目怎么讲(准备一个就够)

我们做内部文档问答。先按标题和段落切,重叠 50~100,块大约 400 字,metadata 带来源和时间。检索用向量 + BM25 混合,粗召回 20,rerank 留 5。Prompt 写死:只用资料、没有就说没有、带引用。后来发现「各部门协作」这种题向量搜不准,全局题走图检索,事实题仍走混合检索。坑是:中文按空格切切不动;AOP 式自调用不是这块,这块的坑是 Agent 检索没上限、评估过松。

把「内部文档」换成你真实的库。主动说坑,比报名词像做过。


11. 高频追问

Q:RAG 一定比直接问模型好吗?
A:私有、时效、要引用时是。常识题检索可能添噪,所以 Self-RAG 才要先判断。

Q:chunk 越大越好吗?
A:越大越完整也越吵。问答偏小,总结偏大。

Q:top_k 调大能不能提高正确率?
A:召回可能升,但上下文被稀释,还可能超窗口。先精排和压缩,别只加 k。

Q:如何评估 RAG?
A:拆开看:检索有没有把金段落召回(Recall@k);答案是否有依据、是否忠于文档;延迟和费用。别只看「感觉回答得好」。

Q:幻觉还在怎么办?
A:检索错 / 评估松 / prompt 没禁止编造 / 模型不听引用。对症:混合+精排、强制无依据就拒绝、引用校验。

Q:和记忆系统什么关系?
A:长期知识进知识库;刚聊过的进短期记忆。别把聊天记录和制度文档混成一种索引。


12. 复习优先级

必须能讲 8 分钟: 为何 RAG、五步流水线、切块与 overlap、混合检索、重排序(专用模型 vs LLM)、Self-RAG 的「先判断」、CRAG 的「检索后评估」、Graph 适合全局题。

能对比即可: LightRAG、Agentic 四组件、LangGraph 重试上限、Chroma/HNSW/余弦。

点到为止: RAG-Sequence/Token、2026 一长串新论文。


来源:hao zhe-xing《从零开始学 Agent》第 6 章(6.1–6.7)。本手册是面试重组,不是原文摘录。细节以原章为准:https://haozhe-xing.github.io/agent_learning/zh/chapter_rag/index.html