为什么需要 RAG
直接把所有文档塞给模型有两个问题:装不下,以及长文本中靠后内容容易被忽略。RAG(检索增强生成)的思路是:先根据你的问题找到相关片段,再让模型只基于这些片段回答。
基本流程(四步)
- 切分:把文档切成较小的片段(按章节/段落,而非固定字数硬切)
- 索引:把每个片段转成向量存入向量库
- 检索:把你提问的内容也转成向量,找出最相似的若干片段
- 生成:模型只基于检索到的片段作答,并要求给出引用
决定效果好坏的三个关键点
1. 切分方式比想象中重要
- 按语义单元切(一个小节、一个问答对)优于按固定字数切
- 每个片段尽量自包含:能脱离上下文看懂
- 给片段加标题路径作为前缀(如「第三章 > 3.2 退款规则」),检索准确率会明显提升
2. 检索要「召回 + 重排」
单纯向量相似度会漏掉一些相关内容。实用做法:
- 先用向量检索召回较多候选(如 20 条)
- 再用更精确的方法重排,取最相关的几条
3. 让模型「只基于资料回答」
明确要求:
- 资料里没有就说「未找到」,不要推测
- 每个结论标注来自哪一段
- 区分「原文明确」与「推断」
常见坑与对策
| 现象 | 常见原因 | 对策 |
|---|---|---|
| 答非所问 | 切分破坏语义 / 文档未更新 | 按语义切分、重建索引 |
| 答案不完整 | 召回数量太少 | 增加候选数并重排 |
| 编造内容 | 未限制「只基于资料」 | 加约束 + 要求引用 |
| 同一问题答案不一致 | 检索结果波动 | 固定参数、记录日志排查 |
上线前必须确认
- 权限:不同人问同一问题,不应看到越权内容(检索阶段就要做权限过滤)
- 更新机制:文档变更后要重建索引,否则会答旧内容
- 敏感信息:入库前的脱敏与合规检查
小结
RAG 的核心不在模型,而在切分与检索质量。把文档切得合理、检索召回准确、并严格约束「只基于资料回答」,效果通常就能达到可用水平。