No.333
RAG 的完整链路是怎样的?怎么提升检索效果?
一句话回答
RAG(检索增强生成)分离线索引和在线问答两条链路。离线:把文档解析、切块、向量化后存入向量库。在线:把用户问题向量化,检索出最相关的若干片段,拼进提示词,让模型基于这些资料回答。效果好坏主要取决于能不能检索到对的内容。
详细解析
链路
文本
离线:文档 → 解析(PDF / Word / 网页)→ 清洗 → 切块 → Embedding → 写入向量库(带上元数据)
在线:问题 → 改写 → Embedding → 检索 Top-K → 重排 → 拼接上下文 → 模型生成 → 附上引用来源
常见优化手段
| 环节 | 手段 |
|---|---|
| 解析 | 保留表格和标题层级等结构;扫描件先做 OCR |
| 切块 | 按标题、段落等语义边界切,而不是按固定字数硬切;相邻块保留少量重叠;每块带上所属文档和章节标题 |
| 检索 | 混合检索:向量检索(语义)+ BM25 关键词检索(专有名词、编号),再用 RRF 等方法融合排序 |
| 查询 | 改写问题、拆分子问题;HyDE(先让模型写一个假设答案,再用它去检索) |
| 重排 | 先粗召回几十条,再用 rerank 模型精排,取前几条 |
| 生成 | 要求"只根据资料回答,资料里没有就说不知道",并标注引用 |
怎么评估
检索和生成要分开评估:
- 检索:正确的片段有没有被检索到、排在第几位,常用 Recall@K、MRR
- 生成:答案是否忠实于检索到的资料(faithfulness),是否回答了问题(answer relevance)
- 准备一批"问题 + 标准答案 + 应命中的文档"作为评测集,每次调整后跑一遍做回归
面试官可能追问
chunk 切多大合适?
没有固定答案,常见在几百到一千 token 左右。太小语义不完整,太大噪声多、浪费上下文。最好用评测集对比不同的切法。
向量检索和关键词检索各有什么短板?
向量检索擅长匹配意思相近的表达("怎么退款"能匹配到"退货流程"),但对型号、人名、错误码这类精确匹配不敏感;关键词检索正好相反。所以生产环境常用混合检索。
文档有访问权限怎么办?
在元数据里记录权限(部门、用户组等),检索时就按当前用户的权限过滤。不要先检索出来再交给模型去"过滤",否则无权查看的内容已经进入了上下文。
模型的上下文窗口越来越大,还需要 RAG 吗?
需要。知识库通常远超上下文窗口;全量塞进去成本高、延迟大,长上下文中间部分的信息也容易被忽略。RAG 还能给出可追溯的引用来源。
易错点
- 效果差时先检查检索结果对不对,而不是先换更大的模型
- 更换 Embedding 模型后,所有文档都要重新向量化
AI 模拟面试官
用自己的话回答,AI 对照参考答案打分、指出遗漏,再追问,最多 3 轮
登录后就可以和 AI 面试官对练,面试记录也会保存下来。登录
这道题你掌握了吗?
选一个最接近的状态,没掌握的题会出现在"我的进度 · 待复习"里。
学习记录暂存在本机浏览器。登录后自动同步到账号,换设备也能看到。