系统学习 AI 学习路径:从 GPU 运行时到推理、微调与 RAG 评估

版本信息最后核对:2026-10-24

hybrid-search

混合检索: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
优点:不需要归一化不同检索器的分数;缺点:忽略分数差距

易错点与排错

相关命令

参考链接

读完自测

合上页面,先回答,再展开对照。

  1. 什么类型的查询最能体现混合检索的价值?
  2. RRF 相比“归一化后加权求和”有什么优缺点?
  3. 两路检索的过滤条件为什么必须一致?
答案
  1. 包含精确词(型号、错误码、缩写、人名)又需要语义泛化的查询;纯口语问答通常收益较小。
  2. RRF 不需要分数归一化、实现简单、鲁棒;但忽略分数差距,可能不如调好的加权融合。
  3. 否则一路过滤、一路不过滤,融合后可能把无权限文档带回结果,造成越权或数据泄漏。
微信小程序码:扫码打开命令速查小程序

小程序版

微信扫码,随时查命令