距离度量
可用的距离度量
如果未显式指定,Weaviate 中的默认距离度量是 cosine。它可以在模式的一部分中,在 vectorIndexConfig 字段中设置为以下任何类型 (示例)
在所有情况下,较大的距离值表示较低的相似度。相反,较小的距离值表示较高的相似度。
| 名称 | 描述 | 定义 | 范围 | 示例 |
|---|---|---|---|---|
cosine | 余弦(角度)距离。 [参见注 1] | 1 - cosine_sim(a,b) | 0 <= d <= 2 | 0:相同的向量2:相反的向量。 |
dot | 基于点积的距离指示。 更准确地说,是负点积。 [参见注 2] | -dot(a,b) | -∞ < d < ∞ | -3:比 -2 更相似2:比 5 更相似 |
l2-squared | 两个向量之间的平方欧几里得距离。 | sum((a_i - b_i)^2) | 0 <= d < ∞ | 0:相同的向量 |
hamming | 向量在每个维度上的差异数量。 | sum(|a_i != b_i|) | 0 <= d < dims | 0:相同的向量 |
manhattan | 沿直角轴测量的两个向量维度的距离。 | sum(|a_i - b_i|) | 0 <= d < ∞ | 0:相同的向量 |
如果您缺少您最喜欢的距离类型并希望将其贡献给 Weaviate,我们很乐意审核您的 PR。
- 如果选择
cosine,所有向量将在读取时归一化为长度 1,并使用点积来计算距离,以提高计算效率。 - 点积本身是一种相似度度量,而不是距离度量。因此,Weaviate 返回负点积,以坚持较小的距离值表示更相似的结果,而较大的距离值表示不太相似的结果的直觉。
距离实现和优化
在典型的 Weaviate 用例中,CPU 时间的大部分用于计算向量距离。即使使用近似最近邻索引 - 这会导致更少的计算 - 距离计算的效率对 整体性能 产生重大影响。
Weaviate 使用 SIMD(单指令多数据)指令来处理以下距离度量和架构。可用的优化按所示顺序解析(例如 SVE -> Neon)。
| 距离 | arm64 | amd64 |
|---|---|---|
cosine、dot、l2-squared | SVE 或 Neon | Sapphire Rapids with AVX512,或 Any with AVX2 |
hamming、manhattan | 无 SIMD | 无 SIMD |
如果您喜欢处理汇编编程、SIMD 和向量指令集,我们很乐意收到您对尚未获得 SIMD 特定优化的组合的贡献。
API 中的距离字段
API 中以两种方式公开了 distance
- 每当涉及 向量搜索 时,距离可以作为结果的一部分显示,例如使用
_additional { distance } - 每当涉及 向量搜索 时,距离可以指定为限制条件,例如使用
nearVector({distance: 1.5, vector: ... })
距离与确定性
在 v1.14 版本之前,API 中仅提供 certainty。确定性的原始想法是将距离分数归一化为 0 <= certainty <= 1 之间的值,其中 1 表示相同的向量,0 表示相反的向量。
然而,这个概念仅适用于 cosine 距离。对于其他距离度量,分数可能是无界的。因此,首选的方法是使用 distance 而不是 certainty。
为了保持向后兼容性,当距离为 cosine 时,仍然可以使用 certainty。如果选择任何其他距离,则无法使用 certainty。
另请参阅 搜索 API:附加属性(元数据)。
更多资源
问题和反馈
如果您有任何问题或反馈,请在 用户论坛 中告诉我们。
