Retrieval-Augmented Generation¶
RAG 把外部语料作为可检索的非参数记忆,在生成前选择证据。Retrieval-Augmented Generation 给出了参数记忆与检索记忆联合建模的经典框架;工程系统还要处理索引、权限、新鲜度、引用和拒答。
RAG 深读回到论文中的 RAG-Sequence、RAG-Token 与 latent-document marginalization,并用小型精确检索器展示概率融合;从 REALM 到工具智能体的更长脉络见检索、工具与智能体。
闭环而非组件¶
这条链可以分成三个控制面:
| 控制面 | 核心问题 | 专题 |
|---|---|---|
| 候选集合 | 正确证据有没有被解析、切分并召回 | 索引与召回 |
| 有限上下文 | 哪些候选值得保留,怎样避免重复与位置偏差 | 重排与上下文工程 |
| 输出契约 | 哪些陈述有证据,引用是否支持,何时不回答 | 证据约束生成 |
把所有失败都归因于 embedding 会导致无效优化。解析丢表格、ACL 过滤过早、查询改写漂移、reranker 截断或引用错配,都可能产生相同的“没有答对”表象。
两种概率视角¶
经典 RAG-Sequence 对潜在文档 \(z\) 求和:
其中 \(p_\eta\) 是检索器,\(p_\theta\) 是生成器,\(\mathcal Z_k(x)\) 是 top-\(k\) 文档集合。生产系统通常不联合训练这两个分布,却仍应保留这一分解:答案错可能来自候选集,也可能来自条件生成。
若证据由多个片段组成,还需评估集合覆盖:
\(G\) 是完成答案所需的 gold evidence,\(E\) 是进入上下文的证据。单个相关片段的 Recall@k 不能代表多跳问题已经可解。
数据契约¶
每个可检索单元至少携带:
- 稳定文档与片段标识;
- 标题、章节路径和相邻结构;
- 来源 URI、版本、抓取与生效时间;
- 内容哈希与解析器版本;
- 租户、权限标签和保留策略;
- 文本在原文中的 span 或页码;
- 适合展示的引用标签。
索引是源数据的派生物,不是事实来源。删除、权限变化和新版本必须能传播到倒排索引、向量索引、缓存和引用层。
离线与在线分离¶
离线评测回答“固定语料与查询上哪种方法更好”;在线系统还需回答:
- 增量更新多久可见;
- 索引版本怎样与生成请求绑定;
- 查询高峰是否降低 ANN 搜索深度;
- reranker 超时怎样降级;
- 证据被删除后缓存怎样失效;
- 权限服务不可用时是 fail closed 还是继续返回。
这些行为必须进入请求追踪,否则离线 Recall@k 很高也无法解释线上错误。
基线顺序¶
一个可审计的升级顺序通常是:
- 精确关键词检索与明确 metadata filter;
- dense retrieval,与关键词结果分开测;
- rank fusion,而不是直接相加不可比的原始分数;
- reranker 与上下文去重;
- 查询分解、迭代检索或结构化索引;
- 自反思或检索策略学习。
后一步只有在前一步的失败已被数据证明时才值得引入。复杂流水线会同时增加延迟、调参空间和不可解释的耦合。
安全边界¶
检索内容属于不可信数据,不因进入 prompt 就升级为指令。至少隔离:
- 文档中的 prompt injection 与伪造系统消息;
- 跨租户或跨权限组召回;
- 恶意文件、解析器漏洞和索引投毒;
- PII、机密数据和删除请求;
- 过期事实与相互冲突的版本;
- 显示链接与真实证据 span 不一致。
RAG 不自动消除幻觉;它只提供了让陈述可核验的机会。引用支持性见证据约束生成,端到端攻击面见智能体安全。
最小验收¶
- 构造“能答、缺证据、证据冲突、无权限、已删除、注入文本”六类查询;
- 分别记录解析、过滤、召回、重排、组装、生成和引用结果;
- 对正确答案检查引用是否真的蕴含相应陈述;
- 对拒答检查是合理识别证据不足,而非单纯检索超时;
- 对每次实验固定语料快照、索引版本、模型版本与参数。
核心检索与融合代码见手撕:检索与智能体,统计评测见手撕:评测工具。