三个通道返回30条结果,最终只给模型5条
开篇引言
上一篇拆解了多通道并行检索的内部实现——SearchChannel 接口抽象、两级线程池隔离、AbstractParallelRetriever 模板方法模式、CompletableFuture 并行调度与容错。读者已经知道怎么把一个用户问题同时丢给多个通道、怎么让通道之间互不阻塞、怎么在某个通道挂掉时返回空结果而不拖垮全局。
文章最后留了一个问题:定向检索从两个 Collection 搜回了 14 条,全局检索从 5 个 Collection 搜回了 15 条,加起来 29 条 Chunk——能直接塞进 LLM 的 Prompt 吗?
V1 版本 Ragent AI 代码未接入关键词检索,但是文章预留了关键词检索通道进行讲解。
答案是不能。把场景拉回电商客服。用户问了一句“AirPods Pro 怎么退货?”,经过意图识别和多通道并行检索后,三个通道各自返回了结果:
- 意图定向通道(
INTENT_DIRECTED):命中 3C 数码退货政策 Collection,返回 10 条 Chunk,分数范围 0.82~0.45 - 关键词检索通道(
KEYWORD_ES):用 BM25 在全局搜到包含 AirPods、退货关键词的 8 条 Chunk,分数范围 12.5~3.2 - 全局向量检索通道(
VECTOR_GLOBAL):在所有 Collection 中做向量检索,返回 10 条 Chunk,分数范围 0.78~0.35
三个通道合计 28 条 Chunk。这 28 条有三个问题:
- 有重复:同一篇退货政策文档在意图定向和全局向量两个通道都被捞到了,不去重就会在 Prompt 里出现两次,白白浪费 Token
- 分数不可比:向量通道返回的分数是余弦相似度(0~1),ES 通道返回的是 BM25 分数(理论上无上界),意图定向的 0.82 和 ES 的 12.5 放在一起排序毫无意义
- 数量太多:28 条 Chunk 的文本量可能上万 Token,全塞进 Prompt 会挤压生成空间,核心信息被大量低相关内容稀释
后处理流水线要解决的就是这三个问题:去重 → 精排 → 截断,最终只留下最相关的 topK 条喂给大模型。