应该在可能的情况下使用混合搜索来限制结果吗?
最后更新:2024年3月22日
问题
应该在可能的情况下使用混合搜索来限制结果吗?
答案
混合搜索可以通过应用正确的过滤器来限制结果空间。如果你有一个过滤器,它可以为 KNN
查询筛选出一个小量的候选项集合,我们将不会执行任何复杂的算法,而是直接检查每个候选项与查询向量的距离,并返回前 k 个结果。这被称为 AD_HOC_BF
,它适用于少量候选项的集合,因为它会导致随机内存访问以在向量索引中获取候选项的向量。
如果候选项集合很大,随机内存访问会严重影响性能,这通过 BATCHES
模式解决,你可以将其视为 KNN
查询的迭代器/分页器。我们将运行向量索引查询算法,维护其状态,并尝试与过滤器结果进行交集。如果我们没有得到 K 个结果,我们将从保留的状态继续,获取下一批最接近的邻居,依此类推。根据经验,我们平均执行两次。为此,实现了一个“批处理迭代器”。首先,它在整个向量索引上执行向量搜索以获得 x
个结果,并过滤掉不相关的文档。然后,它从该点继续向量索引搜索,并返回接下来的前 x
个结果。它重复此过程,直到找到与过滤器匹配的 k
个结果(即前 k 个)。
请注意,无论索引方法是 FLAT
还是 HNSW
,ADHOC_BF
都会执行精确的分数计算。更多内容请参阅文档。
请注意,无论使用何种方法(BATCHES
或 ADHOC_BF
),FT.EXPLAIN
计划报告的混合搜索输出都是相同的。在这两种模式下,语义总是相同的:搜索使用内部部分(本例中的 INTERSECT
)作为预过滤器,并从产生的子空间返回 KNN
结果。
VECTOR {
INTERSECT {
@content:carbonara
TAG:@genre {
technical
}
}
} => {K=2 nearest vectors to `$vec` in vector index associated with field @embedding, yields distance as `score`}
使用范围搜索
相反,范围搜索不限制结果空间。它与 KNN
有不同的语义,其语义是“我需要空间中距我的查询向量在一定半径内的所有向量”。关于使用范围搜索来限制结果空间,目前没有最佳实践。
参考资料
参考预过滤查询属性