我觉得这道题问的其实是,在[[RAG]]系统里,为什么不能只靠一次检索搞定,非要再加一道[[重排]]。说白了,就是召回率和精度之间的取舍,你没法用一个模型同时把两件事都做到极致。
先说一下向量检索的局限。不管是[[Embedding]]还是[[Bi-Encoder]],本质是把query和文档独立编码成向量,然后算个余弦相似度。这种双塔结构只能捕捉粗粒度的语义,像主题匹配、领域对齐这种,但它做不了精细的交互。比如用户搜“苹果笔记本”,你召回“苹果公司财报”和“MacBook Pro评测”,向量上可能都很近,但用户要的是产品本身。再一个,向量维度有限,信息压缩过程中会损失很多细节,比如实体精确匹配、否定词这种,[[Faiss]]或者[[HNSW]]索引再快,也解决不了语义颗粒度的问题。
所以两阶段架构就来了。第一阶段用向量检索或者[[BM25]]做召回,目标是高召回、快,允许精度低一点,比如从百万级文档里先捞出Top 100。第二阶段用Rerank模型,只对这100条做精排,目标是把最相关的几条顶到前面。你可以这么理解,召回是海选,重排是决赛。海选要快,淘汰大部分不相关的;决赛要准,花更多资源做深度匹配。
那Rerank的核心优势是什么呢?最关键的其实是细粒度的语义理解。比如[[Cross-Encoder]],它把query和文档拼接成一个序列,让模型做self-attention,这样就能捕捉到词级别的交互,比如“退款”和“退货”在客服场景里的细微差别。另外,计算资源后置也是一个很实际的好处。重排只处理Top K,成本可控;如果全库都用Cross-Encoder,那延迟和计算量都受不了。
举个例子,在电商客服场景里,用户问“订单超时未发货怎么退款”,如果只靠向量检索,可能召回一堆“退款流程”和“发货政策”的文档,但重排模型能更精确地判断哪篇文档里同时提到了“超时”和“退款”的逻辑关系,把最对症的那条置顶。
这里有个坑,就是重排模型本身也有前提和风险。首先,它的效果依赖召回的覆盖度,如果第一阶段没把相关文档捞进来,重排再强也没用。所以召回阶段要保证高召回,比如用[[Hybrid Search]]结合向量和关键词。其次,重排模型的计算开销还是不小的,如果Top K设得太大,比如500,延迟就会变高,影响用户体验。上线我会特别关注两个指标:一是重排后的Recall@K有没有提升,二是端到端延迟是否在可接受范围内。另外,重排模型要定期更新,因为数据分布会漂移,比如电商大促期间,用户query的语义可能跟平时不一样。
说到更新,其实有个延伸话题:如果知识库频繁变动,重排模型要不要跟着在线微调?我个人觉得,大多数场景下离线定期更新就够了,但如果是实时性要求很高的场景,比如金融行情问答,可能需要引入增量学习或者更轻量的模型,比如[[ColBERT]]这种Late Interaction方案,在效率和效果之间做平衡。
所以,我更倾向于把Rerank看成RAG系统里的一个质量把关者,而不是性能瓶颈。落地的时候,我会先评估业务对精度的要求有多高,如果只是随便问问,Top 1够用,那甚至不需要重排;但如果涉及到客服退款、合规审查这种风险敏感场景,重排就是必须的。我的取舍是:宁可多花几十毫秒做重排,也不让用户看到无关结果。