是否应该尽可能使用混合搜索来限制结果?
上次更新时间:2024 年 3 月 22 日
问题
是否应该尽可能使用混合搜索来限制结果?
答案
如果应用了正确的过滤器,混合搜索可以限制结果空间。如果您有一个过滤器可以生成一组小的 KNN 查询候选集,我们不会执行任何花哨的算法,但会直接检查每个候选集与其查询向量的距离,并返回前 k 个。这被称为 AD_HOC_BF,它适用于候选集较小的集合,因为它会导致随机内存访问以获取向量索引中的候选集向量。
如果您有一组较大的候选集,随机内存访问会降低性能,这可以通过 BATCHES 模式解决,您可以将其视为 KNN 查询迭代器/分页器。我们将运行向量索引查询算法,维护其状态,并尝试与过滤器结果相交。如果我们没有 K 个结果,我们将从保留的状态继续并获取另一批最近邻,依此类推。根据经验,我们平均会这样做两次。为此,实现了“批处理迭代器”。首先,它在整个向量索引上应用向量搜索以获得 x 个结果,并过滤掉不相关的文档。然后,它从该点继续向量索引搜索并返回下一个前 x 个结果。它重复此过程,直到找到与过滤器匹配的 k 个结果(前 k 个结果)。
请注意,ADHOC_BF 将执行精确的评分计算,而与索引方法(FLAT 或 HNSW)无关。您可以在文档中了解更多信息
请注意,无论使用何种方法(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
的语义不同,其语义是“我想要空间中所有与我的查询向量相距一定半径的向量”。关于范围搜索以限制结果空间,没有最佳实践。
参考文献
请参考 预筛选查询属性