应该在可能的情况下使用混合搜索来限制结果吗?

最后更新:2024年3月22日

问题

应该在可能的情况下使用混合搜索来限制结果吗?

答案

混合搜索可以通过应用正确的过滤器来限制结果空间。如果你有一个过滤器,它可以为 KNN 查询筛选出一个小量的候选项集合,我们将不会执行任何复杂的算法,而是直接检查每个候选项与查询向量的距离,并返回前 k 个结果。这被称为 AD_HOC_BF,它适用于少量候选项的集合,因为它会导致随机内存访问以在向量索引中获取候选项的向量。

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

请注意,无论索引方法是 FLAT 还是 HNSWADHOC_BF 都会执行精确的分数计算。更多内容请参阅文档

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

参考资料

参考预过滤查询属性