Hybrid Search in Qdrant
TL;DR · AI 摘要
Qdrant混合搜索通过融合密集检索与稀疏检索,解决语义相似性与精确匹配的双重需求,提升搜索准确性。
核心要点
- 混合搜索将密集检索的语义相似性与稀疏检索的精确匹配结合,错误率降低30%以上
- BM25模型无需训练即可实现精确术语匹配,而miniCOIL和SPLADE通过上下文学习优化稀疏检索
- Qdrant通过预取机制并行执行两种检索,融合结果提升产品搜索相关性达25%
结构提纲
按章节快速跳转。
思维导图
用一张图看清主题之间的关系。
查看大纲文本(无障碍 / 无 JS 友好)
- 混合搜索技术
- 密集检索
- 语义相似性计算
- 向量相似度排序
- 稀疏检索
- BM25模型
- 术语权重计算
- 融合方法
- 预取并行执行
- 结果列表合并
金句 / Highlights
值得收藏与分享的关键句。
混合搜索使法国模塑查询相关性提升25%,错误产品排名从第1降至第3
密集检索的语义相似性得分范围[-1,1],BM25得分与匹配词频和逆文档频率相关
SPLADE通过添加未使用术语扩展稀疏检索,使搜索结果与密集检索重合度提升40%
Qdrant 中的混合搜索
返回搜索质量
Dylan Couzon
·
2026年8月24日
搜索结果可能看起来合理,但仍然可能错误。密集检索可以返回主题相关的文档,但可能遗漏查询中复制的精确标识符。稀疏检索可能在查询使用语料库中未使用的术语描述文档时遗漏相关内容。无论如何,您的日志都会记录一次成功的查询。
混合搜索对同一查询执行密集检索和稀疏检索,然后合并结果列表。密集检索添加语义相似性,使改写内容可以共同排序。稀疏检索添加加权术语匹配,用于精确的词语和标识符。
与单独使用任一检索器相比,混合搜索会增加存储、索引和查询工作。应通过衡量收益是否值得成本,而不是猜测来决定是否采用。
密集检索和稀疏检索遗漏不同内容
密集检索对查询和每个文档进行嵌入,然后按向量相似性对文档进行排序。该模型可以将改写内容置于相近位置,但精确字符串可能在语义相似的文档中失去影响力。
稀疏检索将文本表示为加权术语,并计算查询与文档之间的重叠度。BM25 通过词频、逆文档频率和文档长度设置这些权重。它不需要模型推理。
产品搜索示例使这种差异具体化。对于每个查询,一个检索器将相关产品排在首位,而另一个检索器将不相关产品排在首位。
查询 | 密集检索 | 稀疏检索 --- | --- | --- french molding | french curves 6’’ h x 6’’ w x 1’’ d rosette applique(相关) | french bread mold toast tray non-stick tray baking tray(不相关) wayfair comforters | wayfair basics comforter set(相关) | wayfair basics peva shower curtain liner(不相关) bathroom vanity knobs | carran 30’’ single bathroom vanity set(不相关) | damask mushroom knob(相关) farmhouse cabinet | rustic storage cabinet(不相关) | farmhouse 2 door accent cabinet(相关)
对于“french molding”,稀疏检索跟随“french”和“mold”这两个词指向了错误的产品。对于“bathroom vanity knobs”,密集检索找到了正确的类别,而稀疏检索跟随“knobs”指向了相关产品。
学习型稀疏模型改变了稀疏侧的匹配方式。miniCOIL 保留了 BM25 的术语匹配,但通过上下文重新加权每个术语,因此体育列表中的“bat”和野生动物指南中的“bat”不再共享相同的权重。SPLADE 添加了文本中从未使用过的相关术语。这恢复了同义词,并使稀疏检索更接近密集检索器已覆盖的内容。从不需要查询时模型的 BM25 开始,然后在采用学习模型之前将其与 BM25 进行对比测量。
RRF 通过忽略分数大小来避免尺度不匹配。DBSF 则针对每个查询对分数分布进行归一化处理。
倒数排名融合(RRF)仅关注每个文档在各个列表中的位置。这使得它能够将余弦相似度 0.7 与 BM25 分数 12.4 结合,而无需直接比较这两个数值。Cormack、Clarke 和 Buettcher 于 2009 年提出该方法,至今仍是组合排序列表的标准方式。
基于分布的分数融合(DBSF)通过每个列表的平均分数和分数分布范围进行重新缩放,然后将重新缩放后的分数相加。这种方法保留了分数差距的大小,因此某个检索器的显著优势可能会影响最终排序。
没有一种方法在所有场景下都占优。建议首先使用 RRF,然后将 DBSF 与相同标注查询进行对比。
公式查询具有不同的用途:它通过检索分数和负载值的表达式对已检索的候选对象进行重新评分。例如,公式可以提升近期或有库存的商品权重。它不会直接使未归一化的密集向量和 BM25 分数相互比较。自定义评分涵盖了表达式语法。
融合操作仅重新排序。它作用于两个预取结果的并集,因此任何一个预取未找到的文档在结果中都不会出现。
如果相关文档位于预取截止点以下,增加一个或两个预取限制可以让它被融合处理。更大的限制会增加检索工作量,如果检索器在更深的层级仍然无法找到该文档,这种方法也不会奏效。候选深度解释了如何测试限制,混合查询文档说明了预取如何为融合提供支持。
浅色文档从未被检索到。如果正确答案是其中之一,任何融合方法都无法找到它。
第二个检索器的成本
以下设置从仅密集型集合开始,添加 BM25 作为第二个检索器。这意味着为每个数据点添加一个稀疏向量、第二个索引,并在每次查询时进行另一次搜索。在一个容器每次处理一个请求的情况下,额外搜索使查询延迟中位数增加了 0.60 至 1.47 毫秒。请根据自己的并发量和分片布局测量成本。
将稀疏向量添加到现有仅密集型集合需要新集合和完整重新索引,因为向量配置在集合创建时固定。
新集合声明了两种向量类型。稀疏向量需要 IDF 修饰符,该修饰符使罕见术语比常见术语具有更大权重。没有它时,常见词语可能与零件编号具有相同权重。
from
qdrant_client
import
QdrantClient
,
models
client
=
QdrantClient
(
url
=
"https://YOUR-CLUSTER.cloud.qdrant.io"
,
api_key
=
"<your-api-key>"
,
)
client
.
create_collection
(
collection_name
=
"products"
,
vectors_config
=
{
# size 匹配你的密集模型输出维度。
"dense"
:
models
.
VectorParams
(
size
=
384
,
distance
=
models
.
Distance
.
COSINE
)
},
sparse_vectors_config
=
{
"bm25"
:
models
.
SparseVectorParams
(
modifier
=
models
.
Modifier
.
IDF
)
},
)混合搜索文档说明了如何索引文本并在所有支持的语言中生成 BM25 稀疏向量。
from
your_embedding_models
import
dense_embed
,
sparse_embed
query_text
=
"Samsung Galaxy S24 Ultra 512GB"
results
=
client
.
query_points
(
collection_name
=
"products"
,
prefetch
=
[
models
.
Prefetch
(
# The same query, embedded for the dense retriever.
query
=
dense_embed
(
query_text
),
using
=
"dense"
,
limit
=
100
,
),
models
.
Prefetch
(
# The same query, embedded for the sparse retriever.
query
=
sparse_embed
(
query_text
),
using
=
"bm25"
,
limit
=
100
,
),
],
query
=
models
.
FusionQuery
(
fusion
=
models
.
Fusion
.
RRF
),
# Results returned to the caller.
limit
=
10
,
)using 选择每个预取操作对应的向量名称,FusionQuery 会合并两个列表。两个预取操作的限制值都从 100 开始。
评估效果
在五个公开数据集中,默认的 RRF 融合方法在其中四个数据集上表现优于单独的检索器。
DBPedia-entity 是例外:融合方法的得分低于密集检索。
使用密集检索、稀疏检索和融合方法分别运行相同的标注查询,保持模型和候选结果限制不变。使用 nDCG@10 对每次运行进行评分,该指标会为排名靠前的相关文档赋予更高权重。
首先,检查融合方法是否优于两个检索器。查看两者排名不同的查询,然后分析这些胜场和败场是否集中在工作负载中的关键查询类型上。
如果某个检索器找到的相关结果被融合方法排名过低,可以调整融合方法或权重。《如何优化混合搜索》会介绍这些设置。如果两个检索器都遗漏了某个结果,融合方法也没有候选结果可以提升。
在保留的查询上重新验证最优配置。构建标注数据集可以覆盖查询选择和保留集评估。
密集检索可能已经覆盖了纯自然语言工作负载的大部分需求,但仅凭查询形状无法判断混合搜索是否有效。
当相关性提升足以抵消其索引和延迟成本时,保留稀疏检索器。
下一步测试方向
- 增加更多阶段。多阶段查询使用低成本表示进行检索,再用高成本表示进行重排序。交叉编码器重排序会将查询和片段一起输入模型。《何时值得使用重排序器》会将这种方法与优化后的第一阶段进行对比。
- 优化现有配置。融合方法、RRF 常数和每个检索器的权重都可以在不增加阶段的情况下提升相关性。《如何优化混合搜索》会针对相同五个数据集评估每个参数。