Skip to content
🔗 分享本题
查看我的学习进度 →

混合检索三路召回、过滤、融合与重排机制图

🧠 记忆锚点:语义找相关,关键词保精确,元数据守约束;先保证过滤正确,再融合重排。

💡 答案要点

混合搜索 = 向量检索 + 标量过滤 + 关键词检索 融合

为什么需要混合搜索?

用户问题:"帮我找2024年发布的、关于AI大模型的学术论文"

向量检索(语义):找出"关于AI大模型的学术论文"
→ 找到语义相关的文档
→ 但可能包含2023年或2025年的

标量过滤(metadata filter):"2024年"
→ 按时间过滤,只保留2024年的

混合搜索 = 语义相关 + 时间符合 = 精准答案

实现方式对比:

展开 Python 代码示例(35 行)
python
# Pinecone 混合搜索
index.query(
    vector=query_emb,
    filter={"year": {"$eq": 2024}, "category": "论文"},  # 标量过滤
    top_k=10,
    include_metadata=True
)

# Milvus 混合搜索
search_params = {
    "metric_type": "IP",
    "params": {"nprobe": 10}
}
results = collection.search(
    data=[query_emb],
    anns_field="embedding",
    expr='year == 2024 and category == "论文"',  # 标量过滤表达式
    search_params=search_params,
    top_k=10
)

# Qdrant 混合搜索(原生支持,最灵活)
from qdrant_client import QdrantClient
client = QdrantClient("localhost", port=6333)
results = client.search(
    collection_name="papers",
    query_vector=query_emb,
    query_filter={
        "must": [
            {"key": "year", "match": {"value": 2024}},
            {"key": "category", "match": {"value": "论文"}}
        ]
    },
    top=10
)

为什么 Qdrant 混合搜索更强?

python
# Qdrant 支持复杂条件组合
{
    "must": [                    # AND
        {"key": "year", "range": {"gte": 2023, "lte": 2025}},
        {"key": "authors", "match": {"any": ["张三", "李四"]}}
    ],
    "should": [                 # OR(加分项)
        {"key": "cited_by", "range": {"gt": 100}}
    ],
    "must_not": [               # NOT
        {"key": "status", "match": {"value": "draft"}}
    ]
}
# Pinecone 和 Milvus 的过滤表达能力不如 Qdrant

面试话术:

"当查询同时包含语义、精确词项或结构化条件时,混合检索和元数据过滤值得评估;但不是所有场景都必须混合。选数据库时应检查过滤是在 ANN 前、中还是后执行,以及过滤选择性对召回和延迟的影响,而不是只比较表达式语法。"