是否应该尽可能使用混合搜索来限制结果?

上次更新时间:2024 年 3 月 22 日

问题

是否应该尽可能使用混合搜索来限制结果?

答案

如果应用了正确的过滤器,混合搜索可以限制结果空间。如果您有一个过滤器可以生成一组小的 KNN 查询候选集,我们不会执行任何花哨的算法,但会直接检查每个候选集与其查询向量的距离,并返回前 k 个。这被称为 AD_HOC_BF,它适用于候选集较小的集合,因为它会导致随机内存访问以获取向量索引中的候选集向量。

如果您有一组较大的候选集,随机内存访问会降低性能,这可以通过 BATCHES 模式解决,您可以将其视为 KNN 查询迭代器/分页器。我们将运行向量索引查询算法,维护其状态,并尝试与过滤器结果相交。如果我们没有 K 个结果,我们将从保留的状态继续并获取另一批最近邻,依此类推。根据经验,我们平均会这样做两次。为此,实现了“批处理迭代器”。首先,它在整个向量索引上应用向量搜索以获得 x 个结果,并过滤掉不相关的文档。然后,它从该点继续向量索引搜索并返回下一个前 x 个结果。它重复此过程,直到找到与过滤器匹配的 k 个结果(前 k 个结果)。

请注意,ADHOC_BF 将执行精确的评分计算,而与索引方法(FLAT 或 HNSW)无关。您可以在文档中了解更多信息

请注意,无论使用何种方法(BATCHESADHOC_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 的语义不同,其语义是“我想要空间中所有与我的查询向量相距一定半径的向量”。关于范围搜索以限制结果空间,没有最佳实践。

参考文献

请参考 预筛选查询属性