为什么需要重排序
重排序是什么
重排序(Re-ranking)是对初步检索到的文档进行二次排序的关键步骤,目的是提升最相关文档的优先级,从而优化最终生成答案的质量。
为什么需要重排序
在 RAG 中,系统通常会使用:
BM25、TF-IDF 等稀疏方法,或
Embedding 相似度(如 DPR、ColBERT)等稠密方法
来先召回一批(如 top 100)候选文档。这些方法虽然快速,但准确率有限,容易混入不够相关的内容。
所以,需要一个更强的模型来对召回结果做重排序,从而:
提高 top-k 文档的相关性
帮助生成模块(如 GPT)拿到更有价值的信息
为什么嵌入模型还不够?需要 Re-ranker?
一句话总结:
嵌入模型关注“整体相似”,而 Re-ranker 关注“语义对齐”。
嵌入模型的优点与局限
优点:
高效:预先对文档进行编码,只需计算向量相似度(如余弦距离)。
可扩展:适用于百万甚至上亿文档的快速检索。
局限:
嵌入模型通常将整段文本“压缩”成一个固定维度的向量,比如 768 维。
这会导致 语义信息的平均化 或 特定细节的丢失,特别是在面对复杂、细粒度的查询时。
它不考虑当前的查询内容,只提供文档本身的“通用表示”。
例如:
查询:“退税证明可以在线申请吗?”
某篇文档整体讲了退税流程,但提到“证明需线下办理”。嵌入模型可能会因为“退税”两个字匹配就给它很高的分,但实际并不回答用户的“在线申请”诉求。
Re-ranker 是怎么解决这个问题的?
特点:
Re-ranker 是一个 query-aware 模型(通常是 Cross-Encoder)。
它将查询与候选文档 一起作为输入,进行上下文匹配判断。
可以看到词与词之间的具体交互,例如:问题中“在线申请”与文档中“只能线下办理”是否语义冲突。
缺点:
推理速度慢(需要每次 pairwise 编码)
通常只用于 top-k(如前100)文档的精排,而不是全部语料。
举个例子理解差异
比如你问:“迪士尼年卡是否能用于快速通道?”
嵌入模型可能找到了讲“年卡权益”或“快速通道”的文档;
Re-ranker可以判断这两段话是否明确说了“年卡可以/不可以用于快速通道”。
总结一句话
嵌入模型负责“粗筛”,重排序器负责“精挑”。只有两者配合,才能实现高效且高质量的检索增强生成(RAG)系统。