预过滤与后过滤(以及为什么Qdrant两者都不用)

预过滤与后过滤(以及为什么Qdrant两者都不用)

💡 原文英文,约800词,阅读约需3分钟。
📝

内容提要

Qdrant在向量搜索中采用过滤内置于搜索的方式,而非预过滤或后过滤。预过滤成本高,后过滤可能返回不足。Qdrant通过HNSW图遍历时检查过滤条件,并用Filterable HNSW和ACORN修复严格过滤导致的路径断裂。查询规划器按过滤匹配度选择路径,如过滤索引或全扫描,确保高效准确。

🔎

延伸解读

过滤策略的权衡

预过滤与后过滤各有适用场景:预过滤在过滤条件严格时能保证结果准确,但成本随匹配点数增加而急剧上升,可能退化为暴力扫描;后过滤则依赖过采样,宽松过滤有效,但严格过滤可能导致结果不足。实际应用中,过滤条件往往处于中间地带,既不够宽松也不够严格,此时两种策略都难以兼顾效率与准确性。

Qdrant的解决方案

Qdrant将过滤嵌入HNSW图遍历过程,每个候选点即时检查过滤条件,跳过不匹配的点,从而避免预过滤的全局扫描和后过滤的过采样问题。针对严格过滤导致的路径断裂,Qdrant通过Filterable HNSW增加索引时边,以及ACORN在查询时修复路径,确保过滤查询仍能高效找到最佳匹配。

查询规划器的动态路由

Qdrant的查询规划器根据过滤匹配度动态选择执行路径:过滤索引、HNSW图、ACORN或全扫描。例如,当过滤条件匹配1%的点时,大部分查询走payload索引,少数走图遍历。这种按查询决策的方式,使过滤策略不再固定,而是根据数据分布和过滤条件灵活调整,兼顾效率与准确性。

Q&A

Qdrant在向量搜索中如何处理过滤条件?

Qdrant将过滤条件内置到搜索过程中,在HNSW图遍历时对每个候选点进行过滤检查,跳过不匹配的点,而不是采用预过滤或后过滤。

预过滤和后过滤各有什么优缺点?

预过滤先计算通过过滤的点集,再在其中搜索,结果精确但成本高,宽泛过滤会退化为暴力搜索。后过滤先搜索再过滤,需要过度获取,宽松过滤有效,但严格过滤可能导致结果不足。

Qdrant如何解决严格过滤导致的路径断裂问题?

Qdrant采用两种修复方法:Filterable HNSW在索引时添加额外边,ACORN在查询时通过不匹配的邻居找到匹配点。

Qdrant的查询规划器如何选择执行路径?

查询规划器估计通过过滤的点数,选择四种路径之一:filterable HNSW图、带ACORN的图、payload索引或全扫描。例如,当过滤匹配1%的点时,大多数查询会使用payload索引。

为什么预过滤和后过滤在中间地带会失效?

当过滤条件匹配的点数既不太多也不太少时,预过滤成本高,后过滤可能返回不足,导致效果不佳。

Qdrant的Filterable HNSW在哪些情况下不会添加额外边?

当某个值被太多点共享(如大租户或热门类别)时,不会添加额外边;AND过滤即使每个字段有边,也不会为组合添加边。

ACORN在Qdrant中如何工作?

ACORN在查询时修复遍历,通过不匹配过滤条件的邻居找到匹配点,从而恢复严格过滤下的召回率。

🏷️

标签

➡️

继续阅读