RAG Optimization Map

Pipeline

1
2
3
4
5
6
7
8
9
source parsing
→ chunking and metadata
→ embedding / sparse index
→ query transformation
→ retrieval
→ fusion and reranking
→ context construction
→ generation with citations
→ evaluation and feedback

检索组合

  • Sparse:BM25 等词项匹配。
  • Dense:embedding 语义检索。
  • Hybrid:合并 sparse/dense 候选,可用 RRF 等排名融合。
  • Reranker:cross-encoder 或任务特定模型重排候选。

评测分层

  • Retrieval:recall、precision、MRR/nDCG、证据覆盖。
  • Generation:answer correctness、faithfulness、citation accuracy。
  • End-to-end:任务成功率、延迟、成本和失败类型。

多跳 RAG 不只是“把问题拆成多个问题”,还需要中间状态、实体桥接、迭代检索、停止条件与证据聚合。

诊断顺序

1
2
3
4
5
答案错
→ 证据库里没有?解析/chunk 丢了?
→ 候选没召回?query rewrite/embedding/index 有问题?
→ 召回了但排序差?reranker/context budget 有问题?
→ 证据正确但生成错?prompt、引用绑定或模型推理有问题?

先用带 gold evidence 的集合评估 retrieval recall,再评估 reranking 和 context 选择,最后才看生成。扩大 top-k 不能修复解析丢失,也可能把噪声塞满上下文;提高模型大小不能替代权限过滤、版本一致和引用可追溯。

横向决策

症状 优先检查 不要直接做
专有名词召回差 BM25/hybrid、别名和 metadata 只换更大生成模型
长文证据被截断 chunk overlap、压缩、context budget 无限制增大 top-k
多跳链断裂 entity bridge、中间状态、停止条件 把所有候选拼进 prompt
答案像对但无依据 citation binding、faithfulness、拒答 只调 temperature

先修数据,再修检索

RAG 最常见的误诊是把所有问题归咎于 embedding。先随机抽取一批用户问题,人工标出“应该支持答案的原文片段”,再沿下面的路径逐层检查:

1
2
3
4
5
6
7
原文是否存在且用户有权限
→ 解析是否保留标题、表格、代码和版本
→ chunk 是否能独立表达必要条件
→ query 的实体/别名是否进入索引
→ 候选是否包含 gold evidence
→ rerank 是否把它放进 context budget
→ 生成是否把 claim 绑定到证据

如果 gold evidence 根本没有进入候选,生成模型再大也只能猜;如果候选里有证据但回答没有引用,问题已经从 retrieval 迁移到排序、context 构造或生成约束。每一步都要保留中间结果,不能只保存最终答案。

解析和 chunk 的具体取舍

固定长度 chunk 容易实现,却可能把“适用范围”“例外条款”和表格列拆开;按句切分保留语义边界,却可能丢掉标题提供的实体上下文。更稳妥的做法不是追求一个全局最优 chunk size,而是把标题路径、文档版本、权限和原文 offset 写进 metadata,并用同一文档的问答集合比较不同切法的证据覆盖率。对代码和 API 文档,函数签名、参数表和错误码通常应作为结构单元保留。

版本与权限是检索正确性的前置条件:索引里存在旧政策并不意味着应该返回它,用户无权读取的片段即使相似度最高也必须在检索前过滤。这个边界要在离线集合中加入“同名旧版本”和“越权文档”样本测试。

多跳不是无上限循环

多跳检索适合问题包含实体桥接,例如“某项目的作者所在机构在 2024 年有哪些相关论文”。第一跳应产出稳定实体和证据,第二跳才使用实体查询;每一跳记录 query、候选、选择理由和停止条件。若中间实体置信度不足,应拒答或请求澄清,而不是继续扩大 top-k。否则 agent 形式的 RAG 只会把一次召回错误放大成一条看似连贯的幻觉链。

用失败切片决定优化方向

建立四个互斥的错误桶:missing-in-corpuslost-before-retrievalranked-out-of-contextgeneration-not-grounded。对每个桶分别计算数量、延迟和成本;只有桶边界稳定,A/B 测试才知道是在改善哪一层。线上还要监测索引新鲜度、权限过滤拒绝率、引用点击/核验率和无证据回答率,而不仅是用户点赞。

相关的 Agent 多跳控制见 Agent Loop,端到端任务的验收见 Agent Evaluation