版本信息最后核对:2026-10-24
混合检索:BM25 与向量召回融合,兼顾关键词精确命中与语义泛化
纯向量检索擅长语义相似,但对产品型号、错误码、人名、缩写等精确词不敏感;BM25/全文检索擅长精确匹配,但不懂同义表达。混合检索把两路结果融合,常见做法是 RRF(Reciprocal Rank Fusion)或归一化后加权求和,再交给 reranker 精排。
适合混合检索的场景:技术文档、错误码、日志、商品/SKU、法律条款、代码搜索。不适合:纯口语问答、向量召回已经足够且延迟敏感的场景。混合检索会增加索引、查询和运维复杂度,先用评估证明收益。
# Qdrant:向量 + 稀疏向量/全文的混合查询(按版本支持)
from qdrant_client import QdrantClient, models
client = QdrantClient(url="http://localhost:6333")
results = client.query_points(
collection_name="docs",
prefetch=[
models.Prefetch(query=dense_vector, using="dense", limit=50),
models.Prefetch(query=models.SparseVector(indices=[1, 7], values=[0.8, 0.2]),
using="sparse", limit=50),
],
query=models.FusionQuery(fusion=models.Fusion.RRF),
limit=10,
query_filter=models.Filter(must=[models.FieldCondition(
key="tenant_id", match=models.MatchValue(value=42))]),
)
# LangChain:BM25 + 向量 retriever 融合
# LangChain 1.x:EnsembleRetriever 已移至 langchain-classic
from langchain_classic.retrievers import EnsembleRetriever
from langchain_community.retrievers import BM25Retriever
bm25 = BM25Retriever.from_documents(docs)
vector = vectorstore.as_retriever(search_kwargs={"k": 10})
hybrid = EnsembleRetriever(retrievers=[bm25, vector], weights=[0.4, 0.6])
RRF 公式:score(d) = Σ 1 / (k + rank_i(d)),k 常取 60
优点:不需要归一化不同检索器的分数;缺点:忽略分数差距
合上页面,先回答,再展开对照。
小程序版
微信扫码,随时查命令