使用交叉编码器重新排序
使用廉价嵌入检索前 50 个结果,再用较慢的交叉编码器对前 5 个结果重新排序,以提高精确率。
使用交叉编码器重新排序 是 CoddyKit 上的免费 AI Agents 课时。 这是第 1 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 AI Agents 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 AI Agents 课程共包含 4 节课。
本课时的部分内容尚未翻译,以英文显示。
为什么重新排序?
嵌入相似度是快速而粗略的第一轮筛选。它经常会检索出与查询包含相同 KEYWORDS、但实际上与 QUESTION 并不相关的片段。
重新排序器会接收(查询、片段)对,并计算更加精确的相关性分数。
双编码器与交叉编码器
文本相似度有两种架构:
- 双编码器——分别嵌入查询和片段,然后计算余弦相似度。速度快(只需向量化一次即可重复使用),但准确度较低。
- 交叉编码器——将(查询、片段)一起输入模型运行。速度慢(每对都要单独处理),但准确度高得多。
两阶段检索
将两者结合起来的模式:
- 双编码器快速检索前 50 个候选项
- 交叉编码器将结果重新排序,取前 5 个
- 将前 5 个候选项放入 LLM 提示中
这样既获得了双编码器的速度,也获得了交叉编码器的精确度。
使用 Cohere Rerank
最容易用于生产环境的交叉编码器:
import cohere
co = cohere.Client(COHERE_KEY)
results = co.rerank(
model='rerank-multilingual-v3.0',
query='What is the refund policy?',
documents=top_50_chunks,
top_n=5
)
for r in results.results:
print(r.index, r.relevance_score, top_50_chunks[r.index])开源重新排序器
BGE 重排序器是领先的 OSS 选项:
from sentence_transformers import CrossEncoder
model = CrossEncoder('BAAI/bge-reranker-base')
pairs = [(query, chunk) for chunk in candidates]
scores = model.predict(pairs)
ranked = [c for _, c in sorted(zip(scores, candidates), reverse=True)][:5]Voyage Rerank
import voyageai
vo = voyageai.Client(api_key=VOYAGE_KEY)
res = vo.rerank(
query=query,
documents=candidates,
model='rerank-2',
top_k=5
)适合重新排序的场景
- 候选列表较长(50–200 项)
- 相关性差异细微
- 包含否定或比较的查询
- 多语言场景
不适用的场景
- 候选集合已经很小(双编码器返回的前 5 个)
- 对延迟敏感且风险较低的查询
成本权衡
交叉编码器会为每一对候选项执行一次推理。对 50 个候选项重新排序,就需要调用模型 50 次(使用 Cohere/Voyage 时成本较低,自行托管时速度较慢)。
重新排序时使用 50–200 个候选项即可,更多候选项通常不值得。
Integrating into LangChain
from langchain.retrievers import ContextualCompressionRetriever
from langchain.retrievers.document_compressors import CohereRerank
compressor = CohereRerank(top_n=5)
retriever = ContextualCompressionRetriever(
base_compressor=compressor,
base_retriever=vector_retriever
)Integrating into LlamaIndex
from llama_index.postprocessor.cohere_rerank import CohereRerank
rerank = CohereRerank(top_n=5)
query_engine = index.as_query_engine(
similarity_top_k=20,
node_postprocessors=[rerank]
)考虑多样性的重新排序
有时您需要的是多样化的结果,而不只是得分最高的结果(后者可能几乎完全重复)。MMR(最大边际相关性)会在分数与多样性之间取得平衡:
from langchain.vectorstores import Chroma
results = store.max_marginal_relevance_search(query, k=5, fetch_k=20, lambda_mult=0.5)两阶段模式
为什么要使用双编码器加交叉编码器,而不是只使用其中一个?
回顾
双编码器检索 50 个结果,交叉编码器将其重新排序为 5 个。在生产环境中使用 Cohere 或 Voyage;自行托管时使用 BGE OSS。只需适度增加成本,就能显著提升准确度。
常见问题解答
「使用交叉编码器重新排序」课时是免费的吗?
是的 — 「使用交叉编码器重新排序」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 AI Agents 课程的其余内容,请升级到 CoddyKit PRO。 AI Agents 课程共包含 4 节课。
「使用交叉编码器重新排序」这节课中我会学到什么?
使用廉价嵌入检索前 50 个结果,再用较慢的交叉编码器对前 5 个结果重新排序,以提高精确率。 你通过在浏览器中直接运行的动手代码来练习 AI Agents,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 AI Agents 需要有经验吗?
无需任何先前经验。CoddyKit 上的 AI Agents 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 1 节课,共 4 节。
「使用交叉编码器重新排序」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 AI Agents 课中编写并运行代码吗?
能。每节 AI Agents 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。