跳到主要内容
技术WHITEHOLE

多路召回:合并、去重与延迟预算

多路召回,指的是同时用几种不同的检索方式取候选,再把结果合并成一份候选集。它的价值来自不同方式各有盲区,代价是合并与去重的复杂度,以及延迟上升。本文说明为什么需要多路、合并与去重的具体策略、延迟预算怎么定,以及验收方式

技术RAG企业架构

多路召回,指的是同时用几种不同的检索方式取候选,再合并成一份候选集交给排序。它存在的前提是:没有任何一种检索方式能覆盖全部情况,而业务问题恰好分布在不同的盲区里

为什么需要多路

  • 语义检索擅长处理表述差异:同一个意思的不同说法能被匹配上。
  • 关键词检索擅长精确命中:编号、系统字段名、产品代码这类字符串语义检索容易漂移。
  • 结构化过滤擅长范围限定:按部门、时间或类型先缩小范围,再谈相关性。

三类方式的能力互补,这也是多数企业内部检索最终都会走向多路的原因。但多路并不等于简单叠加 —— 叠加之后的问题从「找得到吗」变成了「怎么合」。

合并策略

  • 分数归一化:不同来源的分数量级不同,合并前需要先统一到可比范围。
  • 按来源配额:给每一路保留固定数量的候选,避免某一路结果特别多时把其余全部挤掉。
  • 保留来源标记:合并后仍能看出每条候选来自哪一路,便于事后排查。
  • 按问题类型加权:编号类问题提高关键词路权重,描述类问题提高语义路权重。

去重怎么做

  • 同一条目多路命中:按条目标识去重,保留分数较高的那次。
  • 同一文档不同片段:相邻片段的重复内容需要合并,避免上下文被同一份材料占满。
  • 近似重复:不同版本的同名文档同时命中时,按版本或时效保留有效的一份。

延迟预算怎么定

  • 并行发起:多路请求同时发出,总延迟取决于最慢的一路,而不是相加。
  • 单路超时:为每一路设置超时,避免某一路拖慢整体响应。
  • 总预算:先约定检索环节可接受的耗时上限,再据此决定路数与候选数量。
  • 降级策略:超预算时退化为单路检索,并记录降级次数作为容量依据。

什么时候不值得做多路

内容总量很小、问题类型单一、或者单路检索已经能满足要求时,多路带来的复杂度与延迟代价并不划算。判断依据仍然是分阶段指标:如果召回遗漏比例很低,就不必再加一路。

验收

  • 每一路都有独立的命中统计,能说明它贡献了什么。
  • 合并与去重规则有记录,且可从结果反查来源。
  • 延迟分布有测量,包含降级发生的次数。
  • 新增一路之前与之后有对照结果,而不是凭感觉认为更全;长期没有贡献的路应当撤下。
  • 问题表达高度一致时不必多路:使用者始终用同一种说法提问,单路往往已经足够。

与排序环节的分工

多路召回解决的是「候选里有没有」,排序解决的是「候选里哪条更该用」。两者职责不同,指标也应分开记录,否则合并策略的问题会被误判成排序问题

  • 召回阶段只关心是否遗漏,不追求前几名的顺序。
  • 合并之后再去比较不同来源的贡献,判断某一路是否值得保留。
  • 排序阶段不再回退调整召回参数,避免两段互相干扰。

FAQ

常见问题

与这篇相关、并且被问得最多的几个问题

多路召回是不是越多越好
不是。每一路都会增加延迟与合并复杂度,收益取决于它是否覆盖了其他路的盲区。应当先测量遗漏比例再决定是否增加
合并时按分数排序有什么问题
不同来源的分数量级通常不可比,直接按分数合并会让某一类结果系统性占优,需要先归一化或按来源配额
去重会不会丢掉有价值的内容
正常情况下不会。去重去掉的是重复表达,保留的是信息本身;需要谨慎的是不同版本同时命中的情况,应按版本与时效取舍