RAG 与检索增强
RAG(Retrieval-Augmented Generation)把私有/最新知识检索出来,再交给模型生成,减轻幻觉与「训练集没有」的问题。LangChain / GraphRAG / LangGraph 如何分工见 RAG 与框架选型;LangGraph 动手见 [LangGraph 编排实践](/docs/ai/Agent/LangGraph 编排实践)。本篇讲面试答法与失效模式;动手见 RAG 落地实践(无框架)、[LangChain RAG 实践](/docs/ai/RAG/LangChain RAG 实践)、[Milvus 向量库实践](/docs/ai/RAG/Milvus 向量库实践);进阶见 [GraphRAG 概览与查询](/docs/ai/RAG/GraphRAG 概览与查询)。
Agent 会调检索工具,但 RAG ≠ Agent:很多产品只做「检索 + 生成」就够。
流水线(索引 → 检索 → 生成)
文档 → 切分(chunk) → 向量化(embedding) → 写入向量库
用户问题 → 向量化 → top-k 检索 → (可选重排)→ 拼进 Prompt → LLM 生成
| 阶段 | 关键决策 |
|---|---|
| 切分 | chunk 大小、重叠、按标题/段落切 |
| 嵌入 | 模型选择、维度、是否多语 |
| 检索 | top-k、相似度阈值、过滤条件 |
| 生成 | 如何引用片段、拒答策略 |
核心参数直觉
| 参数 | 太大时 | 太小时 |
|---|---|---|
| chunk | 噪声多、定位差 | 上下文碎、跨段难答 |
| top-k | 噪声进 Prompt、贵 | 关键段召不回 |
| 重叠 | 冗余、贵 | 边界处切断语义 |
没有万能默认值:用小评测集看召回与答案是否引用对段落。
Naive vs Advanced(点到为止)
| 形态 | 做法 | 何时想 |
|---|---|---|
| Naive | 问句向量 → top-k → 直接生成 | 基线、PoC |
| 混合检索 | 向量 + BM25/关键词 | 专有名词、编号 |
| 重排(rerank) | 先多召回再精排 | 噪声大、k 要开大 |
| 查询改写 | 多查询 / HyDE 等 | 用户问法飘 |
| GraphRAG | 实体关系图 + 社区摘要 | 全局主题、跨文档归纳、关系推理 |
面试说到「先 Naive 基线,再按失败 case 加混合/重排」比背一堆缩写更加分。单题深答见 [如何优化 RAG 检索效果](/docs/ai/Agent/面试/如何优化 RAG 检索效果)。工业界向量 RAG 常用 LangChain 拼装 Loader / Splitter / VectorStore / Retriever,见 [LangChain RAG 实践](/docs/ai/RAG/LangChain RAG 实践);向量搞不定的全局/关系题再考虑 [GraphRAG 概览与查询](/docs/ai/RAG/GraphRAG 概览与查询)。
与微调的边界
| RAG | 微调 | |
|---|---|---|
| 适合 | 知识常变、要可引用、要可撤 | 稳定风格/格式/领域话术 |
| 更新成本 | 改索引即可 | 重训/再对齐 |
| 风险 | 检索错 → 答错 | 过拟合、灾难性遗忘 |
常见答案:知识用 RAG,行为/格式用微调或强约束 Prompt;两者可叠加。 LoRA 是参数高效微调的主流做法,见 [LoRA 低秩适配与微调](/docs/ai/Agent/面试/LoRA 低秩适配与微调)。
失效模式(高频)
- 检索错:答得很自信但引用了无关段
- 切分坏:答案跨两个 chunk,两边都不完整
- 未拒答:库里没有仍胡编——要「无依据则说明找不到」
- 权限泄漏:检索未按租户/角色过滤
面试速记
- RAG 三步? 索引(切分+嵌入+入库)、检索 top-k、把片段塞进 Prompt 再生成。
- 为何用 RAG? 注入私有/新知识、可引用、比反复微调更易更新。
- chunk / top-k 怎么调? 看评测:过大噪声、过小碎片;无万能默认。
- RAG vs 微调? 知识变更多用 RAG;稳定风格/格式可微调;可组合。
- 典型翻车? 检索错、切分断语义、不拒答、权限不过滤。