RAG 的平衡:召回完整性与响应速度怎么兼得

RAG 的平衡:召回完整性与响应速度怎么兼得 RAG 的平衡召回完整性与响应速度怎么兼得为什么知识库里明明有答案RAG 还是会答错比如用户问这个买完不想要了咋办知识库里其实写了几条规则购买后 7 天内可以申请退款虚拟商品不支持退款已经使用的优惠权益不能退款。如果系统只检索到第一条模型很可能会回答购买后 7 天内可以申请退款。这句话听起来没问题但如果用户买的是虚拟商品答案就错了。很多 RAG 的问题表面上是模型不会回答本质上是检索环节只找回了决定结论的那一半资料。这背后是一个躲不开的取舍资料找得越全检索范围越大、处理内容越多、响应越慢找得太少又容易漏掉改变结论的关键条件。这篇文章就专门回答这个取舍怎么破先立起完整性和速度两根轴看清楚它们为什么互相拖累再给出一套分两层的平衡方法——什么时候多花成本、花在哪以及怎样让同样的完整性花更少的延迟。一、先看清链路问题出在哪一环RAGRetrieval-Augmented Generation检索增强生成不是把一堆文档直接塞给大模型而是先完成一次检索再让模型基于检索结果回答这条链路里有四个动作经常被混为一谈检索拿着 Query 去索引里查找内容召回把可能有用的候选资料先找回来重排Rerank在候选资料中重新判断哪些最相关生成模型组织语言、回答用户。一句话分工召回负责别漏掉重排负责别选错生成负责说清楚。工程上通常先多召回一些候选再通过重排和上下文控制挑出少量真正有用的资料。而如果关键资料在召回阶段就没出现后面的模型再强也无法凭空补出这条规则。二、两根轴完整性收益减少延迟成本增加什么叫召回完整性召回完整性不是找回来的片段越多越好而是回答问题所需要的关键证据有没有找齐。还是退款问题。要准确回答这个商品能不能退款系统可能需要同时找到通用退款期限、商品类型限制、已使用权益的规则以及当前版本或地区的特殊说明。只找到在规定期限内可以退款、漏掉虚拟商品不支持退款那不是结果数量少而是决定结论的条件缺失。完整性通常有三个层次文档级相关的基础政策、特殊商品说明是否被找回片段级文档里真正包含条件、限制和例外的段落是否被找回条件级问题所需的时间、范围、版本和例外条件是否齐全。把三个概念分开召回完整性关注必要证据有没有出现检索相关性关注找回的内容是不是与问题有关答案忠实性关注模型有没有超出证据范围。召回很多段不相关内容不能说明完整性高。为什么资料越全响应越慢多找一些的成本会传递到后面每一环第一更多 Query 意味着更多次检索第二候选资料越多Rerank 要比较的文本越多第三最终上下文越长模型输入、理解和生成的成本越高。如果所有环节串行执行耗时基本会一段一段累加把多路检索并行只能把检索等待压到最慢一路候选数量带来的重排和上下文成本仍然存在。还有一个容易忽略的地方Query 改写和 HyDE 可能各自增加一次 LLM 调用。很多系统只盯着向量库查询本身却忽略了额外模型调用和过长上下文可能才是主要耗时。先理解这组取舍关系从关系上看扩大召回范围完整性的边际收益通常会递减该找到的证据逐渐找齐新增内容里噪声的比例可能上升与此同时候选处理和上下文生成的成本会继续增加。平衡不是调一个 TopK 参数而是一组决策选择检索强度决定什么问题值得多花成本花多少花在哪一步降低处理成本让同样的证据覆盖用更少的等待时间完成。后面两部分分别展开。这也是本文真正要讨论的平衡。三、选择合适的检索强度1. 先有一条稳定的默认链路不要让每个问题都走最复杂的流程但也不要让基线太弱。对多数知识库可用的基线可以如下其中最关键的是区分两个 K召回 TopK从索引中检索回多少条候选可以适当多召回一些减少漏检上下文范围KRerank 之后最终送入模型的片段数量应该明显小于候选范围压噪声和延迟。也就是先多找再精挑最后少喂。不要一开始就把 TopK 设得很小也不要把所有召回结果原样塞给模型。2. 按问题难度路由简单问题走快路径一个成熟的 RAG 系统应该让不同问题付不同的成本问题类型推荐策略主要取舍简单 FAQ缓存或一次混合检索较小 TopK优先响应速度术语、错误码、接口查询关键词检索 元数据过滤优先精确命中规则判断混合检索、Rerank、例外条件检查适当增加候选多文档总结或对比多 Query、问题拆解、上下文压缩接受更高延迟高风险问题扩大召回、保留引用、检查冲突优先完整性路由依据可以是下面这些是否含错误码、订单号这类精确词是否多轮指代是否涉及多文档对比。发票入口在哪里通常不需要 HyDE不同版本的退款条件有什么差异才值得按版本分别召回。3. 自适应加深检索不够时才多花第一次检索后不要只看 Top1 的分数要检查结果是否覆盖了问题。出现下面几种情况就触发 Query 扩展、问题拆解、扩大 TopK 或检索其他索引Top1 分数很低或者前几名分数都不高问题中的产品、版本和地区没有出现在结果里找到了主规则却没有找到限制条件和例外不同文档对同一条件说法冲突命中的文档已经过期或适用范围不明确。这相当于给 RAG 一个还没找够的判断简单问题不为它付出额外成本困难问题接受更长一点的等待。为了避免无限加深可以给追加检索设置轮次上限和单轮延迟上限超时就带着现有证据回答并说明信息可能不全。4. 用延迟预算倒推参数与其拍脑袋调 TopK不如先给整条链路定一个业务目标再根据线上监控把预算分配到各环节。具体目标应该由用户体验、模型服务能力和业务容忍度共同确定不能直接套用别人的数字。环节预算原则控制手段Query 处理改写、补全在整体目标内分配固定预算使用轻量模型缓存稳定的改写结果并行检索在整体目标内分配固定预算低优先级通道设置超时超时后降级合并与 Rerank受候选数量上限约束只对有限候选做精排生成保留稳定的生成时间按上下文 Token 预算组织内容预算定下来之后该不该多召回就从感觉问题变成了工程问题每个环节超了多少、砍哪里都有账可算。四、第二件事降低同等完整性下的处理成本第三章解决选择多深的检索这一章解决怎样让同样的证据覆盖花更少的延迟。这些手段不改变取舍逻辑而是降低每一个检索方案的处理成本。1. 并行 超时关键词、向量、FAQ 多路检索尽量并行总等待接近最慢一路同时给低优先级通道设置超时避免某一路异常拖慢全部请求。高优先级通道核心保底比如向量检索或 BM25它们通常是最基础、最稳定的必须保证返回结果。 低优先级通道锦上添花比如知识图谱检索、外部搜索引擎等。它们可能在某些特定问题上表现极好但有时会因为底层服务复杂而响应缓慢。2. 两阶段召回多、精排少Rerank 只处理有限候选。检索阶段可以相对多找一些最终只精选少量片段进入上下文这是常见的两阶段思路不要对全库文档做精排。3. 去重同一个片段可能被多个 Query 同时命中。重复内容既浪费上下文也会让模型误以为某个观点被多次独立证明。合并时按文档或片段 ID 去重。4. 缓存高频 FAQ 可以缓存 Query 处理结果、检索结果甚至最终答案。但实时订单状态、权限判断和频繁变化的规则不适合用没有时效保证的最终答案缓存。5. 切分保留结构文档切分时保留标题、版本和上下文关系child chunk 用于精准命中parent section 用于补充完整语义。切分质量直接决定召回全了但读不懂的问题会不会出现。6. 上下文按预算组织最终交给模型的内容围绕哪些证据能支撑答案组织优先直接相关片段再补会改变结论的限制、时限和例外删重复和背景但别删不支持“仅限”截至某日期这类限定词。权限过滤应该在检索阶段完成而不是召回之后再靠 Prompt 约束——权限本身就是检索条件还能减少无效候选、提升速度。五、地基把问题问对、地方找对前面所有决策都建立在两件基本功上。这里压缩成速览细节需要展开的话值得单独成篇。怎么问五种 Query 处理方法解决什么代价书面化口语表达 → 接近文档用语一次轻量改写上下文补全多轮对话的指代和省略需要携带历史多 Query从不同表达角度扩大召回增加检索次数问题拆解一个问题包含多个查找目标多次检索 结果重组HyDE疑问句 → 更像文档的语义表示让 LLM 先生成一段假设答案再用它去检索一次额外 LLM 调用两条红线改写只能把用户已表达的意图说清楚不能替用户补充事实HyDE 的假设答案只是检索用的中间表示最终答案必须以真实召回的文档为准。去哪找四种检索方式关键词检索倒排索引 BM25一种基于词频的经典打分算法擅长精确命中适合型号、错误码、政策编号向量检索擅长语义泛化“开票这个在哪里弄能匹配用户可在订单详情页申请发票”但语义相似不等于业务适用不同版本的退款规则可能写得非常像混合检索用 RRF倒数排名融合按各路结果的排名倒数合并分数等方法融合两路结果是多数场景的默认选择元数据过滤和结构化查询先用产品、版本、地区、权限缩小范围订单状态、余额等实时数据走业务 API而不是从向量库里猜。关键词解决有没有明确提到向量解决是不是在说同一件事。一句话原则不同类型的知识用适合它的检索方式——文档负责解释规则业务系统负责提供实时事实。六、串一个完整例子用户连续问会员自动续费怎么取消 那已经扣费了还能退吗**第一步补全问题。**结合上一轮把第二句整理为“会员自动续费已经完成扣费后用户是否还可以申请退款退款条件、时限和例外规则是什么”**第二步生成互补 Query。**分别覆盖退款条件、时间限制、操作步骤和例外情况而不是把怎么退重复说四遍。**第三步并行检索。**关键词负责自动续费“扣款”退款等固定词向量负责订阅产生费用后的撤销规则这类相近表达FAQ 索引召回关闭步骤版本和地区条件过滤失效政策。第四步检查证据是否找齐这一步就是第三章自适应加深的具体应用如果只找到如何关闭自动续费、没找到退款规则系统就不应该直接回答能不能退而应继续扩大检索或明确告诉用户还缺哪些信息。**第五步让模型在证据范围内回答。**关闭步骤、退款条件和特殊情况分开说标注来源。文档只说可以提交退款申请就不能被夸大成肯定可以退款。七、怎么判断优化有没有用只看最终回答是否通顺无法判断问题出在检索还是生成。比较可靠的做法是准备一批真实问题并标记每道题的必要证据、限制条件和例外规则。然后分开看几个指标RecallK必要证据是否出现在前 K 条候选中K 由测试目标决定PrecisionK 或 nDCG排在前面的结果是否真正相关Evidence Recall决定答案的规则和例外是否覆盖齐全Faithfulness答案是否都能在召回资料中找到依据P50、P95 延迟大多数请求和慢请求分别需要多久调用次数和 TokenQuery 改写、HyDE、Rerank、生成分别产生了多少成本。诊断也按链路分流如果 RecallK 低优先检查 Query 改写、文档切分和 Embedding召回很全但噪声多检查混合检索和 Rerank资料已经正确但答案遗漏检查上下文排序和压缩答案准确但响应慢检查额外模型调用、候选数量和上下文长度。这样定位问题通常比直接换一个更大的模型更有效。总结平衡是一次检索决策不是一个参数回到开头的问题。RAG 的平衡不是一味提高 TopK也不是每个问题都启用所有高级策略而是三层决策选择检索强度快慢路由决定谁多花成本自适应加深决定何时多花候选和上下文范围决定花在哪延迟预算决定上限降低处理成本并行、去重、缓存和合理的上下文组织让同样的完整性花更少的延迟用指标验证完整性和速度分开度量先定位环节再谈优化。简单问题走快路径复杂问题才增加多 Query、问题拆解或 HyDE检索结果不确定时继续查证据够了就及时停止。RAG 的价值不是让模型看到尽可能多的内容而是在可接受的等待时间里让模型看到足以支撑答案的正确内容。你的 RAG 项目目前卡在哪一环是召回不全、重排不准还是响应太慢欢迎在留言区聊聊你遇到的具体场景。