客服知识库检索实战:BM25、向量检索、RRF 与 Reranker 的组合

_

如果只看一些演示效果,向量检索真的很容易让人上头。语义相近的问题能召回,看起来比关键词检索聪明很多。我一开始也有过这种判断,觉得把 embedding 和向量库接好,RAG 这件事就算走上正轨了。

但真正把它放进客服场景之后,我很快就被现实教育了。

为什么我后来不再迷信单一路径

客服问题和普通问答有个很大的不同,就是它特别“杂”。用户会把商品名、规则名、活动名、型号、单号和口语化描述混在一起问。这个时候,如果你只依赖向量检索,很多强关键词问题会飘;如果只依赖 BM25,语义改写又会漏掉很多本该命中的答案。

我就是在这个阶段慢慢意识到,检索这件事不能押宝在某一种方案上。它更像是做一条组合拳,而不是找一个“最强组件”一把梭。

我为什么最后选了这套组合

aibotchat 里,我更认可的方向是把 BM25、向量检索、RRF 和 Reranker 组合起来用。原因很简单,它们解决的其实不是同一个问题。

  • BM25 更擅长抓住关键词、术语、规则名、编号这类强文本信号。
  • 向量检索 更适合处理“用户虽然换了个说法,但问的还是同一件事”。
  • RRF 能把不同召回结果揉到一起,尽量降低某一边失手时的波动。
  • Reranker 则负责最后那一步,把“看起来都差不多”的候选重新排一遍,让真正相关的片段往前走。

这套组合对我来说最有价值的地方,不是看起来高级,而是它更稳。客服系统最怕的不是偶尔不惊艳,而是经常不稳定。

做着做着,我最在意的反而不是召回率

一开始我会盯着召回结果看,想的是“有没有搜到”。后面做久了,我更在意的是:为什么搜到了还答不好,为什么这次走了检索,为什么那次没有走。

这会逼着你去认真看职责边界。文档导入怎么切片,检索器怎么融合,重排器怎么做最后判断,路由器什么时候该让请求进入 RAG,这些问题如果不拆开看,系统一旦答错,你连该从哪一层排查都不清楚。

这也是为什么我越来越觉得,RAG 真正的工程价值不只是“把知识接进模型”,而是把“应该给模型什么上下文”这件事从玄学变成可分析、可迭代的链路。

我踩过的几个坑

这块我自己印象比较深的几个坑,基本都和“过度简化检索”有关:

  • 以为向量检索可以通吃,结果关键词问题频繁失手。
  • 为了省事把所有请求都塞进 RAG,最后延迟和噪声一起上来了。
  • 只看最终回答,不看召回链路,出了问题根本解释不清。
  • 把重排当可有可无,结果候选一多,真正相关的片段排不上来。

这些坑让我慢慢接受一件事:检索不是外挂,也不是附属模块,它本身就是客服系统里最需要认真经营的一条链路。

我现在怎么理解这件事

如果现在让我再做一次,我不会再问“该不该上 RAG”,而会直接问“这条检索链路要怎么做得足够稳”。因为对客服来说,稳定命中、可解释、可优化,通常比单次回答特别惊艳更重要。

从这个角度看,aibotchat 给我的启发并不只是某几个技术名词,而是它让我更认真地去看待检索系统的工程边界。RAG 只有真的落进这种边界里,才会从概念变成能力。

仓库地址:https://github.com/ShadowHunt-yi/aibotchat

从 FastAPI 到 RAG:我如何搭建一个 AI 客服中台 2026-04-11
把 AI 客服系统真正跑起来:aibotchat 的部署与监控实践 2026-04-11

评论区