一、RAG 在解决什么
模型的知识有截止时间,也不知道你的内部文档。三种补法:
| 方式 | 成本 | 适用 |
|---|---|---|
| 微调 | 高,需要数据与训练 | 固定风格、特定任务 |
| 长上下文全塞 | 每次调用都贵,且长文效果下降 | 临时、少量文档 |
| RAG 检索 | 中,需要索引与切分 | 知识库问答、文档助手 |
RAG 的核心优势是可更新、可引用、成本可控:文档改了只重建索引,回答能标注来源。
二、流程五步
文档 → 切分 → 向量化 → 存储索引 → 检索 → 拼上下文 → 生成
1. 切分(chunking)
- 按固定长度切(如 500 字,重叠 50 字):简单,但可能把一句话切成两半。
- 按结构切:按标题、段落、列表项切,语义更完整,推荐。
- 按语义切:用模型判断边界,成本高。
重叠(overlap)的作用是避免关键信息刚好落在切口处。经验值:chunk 300–800 字,重叠 10%–20%。
2. 向量化
用 embedding 模型把每个 chunk 转成向量(如 768 或 1536 维)。同一批数据必须用同一个模型,换模型要重建全部索引。
3. 存储与检索
向量库(如 FAISS、Milvus、pgvector)按相似度返回 top-k 片段。常见混合检索:
- 向量检索(语义相似)
- 关键词检索(BM25,精确匹配术语、型号、人名)
两者结合(hybrid search)效果通常比单用向量好,尤其是查询里有专有名词时。
4. 重排(rerank)
先召回 20–50 条,再用重排模型精排到 3–8 条。重排能显著提升相关性,代价是多一次模型调用。
5. 拼接与生成
请只根据以下资料回答,资料中没有的信息请说「资料未提及」。
回答末尾标注引用的资料编号。
[1] ...
[2] ...
问题:...
三、效果不好时怎么排查
按顺序定位,不要一上来就换模型:
- 检索到了吗:把 top-k 片段打印出来,看有没有正确内容。没有 → 问题在切分或 embedding。
- 切分是否合理:关键信息被切断?chunk 太大导致噪声多?调整大小与重叠。
- 查询是否需要改写:用户问「怎么退款」,文档写的是「售后流程」,语义检索可能召不回。可以让模型先把问题改写成多个查询。
- 重排是否有效:加了重排后 top-1 是否更相关。
- 提示是否约束了「只用资料」:没有约束,模型会用自己知识编。
- 上下文是否过长:塞太多片段会稀释重点,也会让模型忽略中间内容。
四、控制幻觉
- 明确要求「只依据资料回答,不确定就说不知道」。
- 要求给出引用编号,便于核对。
- 对关键数字做二次校验(正则抽取 + 原文比对)。
- 提供「转人工」出口,而不是硬答。
即便如此,模型仍可能把两段资料「拼接」成一个不存在的事实。涉及金额、日期、条款的答案必须人工复核。
五、常见坑
- 切分把表格拆散:表格应整体保留,或转成「字段: 值」的文本。
- PDF 解析丢失结构:多栏排版、页眉页脚会被混进正文,先清洗再切分。
- 同义词缺失:用「报销」查不到「费用核销」,需要同义词表或混合检索。
- 索引不更新:文档改了但没重建索引,回答仍是旧内容。
- 权限未隔离:不同用户能检索到彼此无权访问的文档,是严重的安全问题。
六、评估
不要凭感觉判断「效果变好了」。建一个小测试集(30–100 条真实问题 + 期望答案要点),每次改切分或模型都跑一遍,看:
- 检索命中率(正确片段是否在 top-k 里)
- 答案正确率
- 拒答率(该说「不知道」时是否说了)
小结
RAG 的瓶颈通常在检索而非生成;切分按结构、留重叠;向量 + 关键词混合检索再重排;提示里限定「只用资料」并要求引用;效果差先看检索到的片段对不对。