多阶段检索把语义相似度、关键词匹配和元数据过滤整合进一次API调用。本文用年报检索场景对比主流向量数据库,解释为何Qdrant能在图遍历中同步过滤,并给出可运行的代码示例,让搜索既精确又可解释。

真实业务里,搜索从不是“找相似”这么简单。一份上千页的年报,里面全是强结构信息:品牌、季度、章节、财务指标。只靠向量召回,经常把对的答案放在错的上下文里。好的解法是多阶段查询:一次 API 调用完成语义检索、关键词匹配、结构过滤三件事。
假设场景:从美妆集团 H 的年报中,找品牌 B 在 FY25 报告期“风险因素”章节里,关于“活性成分供应链风险”的内容。系统会应用类似 SQL WHERE 的规则:
brand_name = '品牌B'fiscal_year = 'FY25'document_section = '风险因素'这些规则是一票否决项。来自品牌 A 的段落,即使余弦相似度高达 0.99,只要品牌不符,直接丢弃。

过去团队常用 Postgres 管结构数据,向量索引管 embedding,然后在内存里做合并胶水代码。能跑,但慢、脆弱、难同步。如果向量数据库原生支持过滤,架构会简洁得多。
过去两年,每家厂商都在喊混合检索。真正决定体验的,是检索时过滤到底发生在哪个环节。对比主流引擎:

在这个负载下,Qdrant 有三个关键优势:

PDF 解析成 text chunk,用规则和 LLM 对每个 chunk 打上品牌、章节、财年标签,然后统一 embedding,连同 payload 写入 Qdrant。payload 与向量同库同索引,一次写入,后续查询直接从库里过滤。

用户输入“品牌B在FY25风险因素章节中,供应链风险里的活性成分有哪些?”
from qdrant_client.models import Filter, FieldCondition, MatchValue
results = client.search(
collection_name='enterprise_docs',
query_vector=query_vector,
query_filter=Filter(must=[
FieldCondition(key='entity_name', match=MatchValue(value='品牌B')),
FieldCondition(key='document_section', match=MatchValue(value='风险因素')),
FieldCondition(key='fiscal_year', match=MatchValue(value='FY25')),
]),
limit=5,
)
Qdrant 在遍历向量图时同步应用过滤。不符合品牌、章节、财年约束的 chunk,在打分前就被移除。一个来自品牌 A 的高相似度段落,永远不会进入候选集。这就是“演示级 AI”和“业务级 AI”的分水岭。

“Niacinamide”这类专有化学成分,embedding 模型常常无感;监管编码、SKU 也一样。稀疏向量(BM25)能精准匹配这些 token。在 Qdrant 里,可以把稠密向量、稀疏向量、元数据过滤放在同一个请求中,具体 API 参数可参考官方混合检索指南。
把文本当纯粹 float 数组,结果就是不准确、不可信。真实的业务数据都有结构:年报、合同、合规文件、产品目录。摄入时丢掉结构,等于丢掉最好的过滤器。
两步检索 = 结构约束 × 语义灵活性
大多数向量数据库把过滤当补丁,Qdrant 把过滤当核心。选择引擎,就是选择是否尊重数据的结构。
想动手跑一遍?Google Colab Notebook 免配置运行。
参考:
免费获取企业 AI 成熟度诊断报告,发现转型机会
关注公众号

扫码关注,获取最新 AI 资讯
3 步完成企业诊断,获取专属转型建议
已有 200+ 企业完成诊断