本页面介绍如何在 Spanner 中提供的向量距离函数中进行选择,以测量向量嵌入之间的相似度。
根据 Spanner 数据生成嵌入后,您可以使用矢量距离函数执行相似度搜索。下表介绍了 Spanner 中的矢量距离函数。
函数 | 说明 | 公式 | 与不断增加的相似性之间的关系 |
---|---|---|---|
点积 | 计算角度 \(\theta\) 的余弦乘以相应向量量级的积。 | \(a_1b_1+a_2b_2+...+a_nb_n\) \(=|a||b|cos(\theta)\) | 增加 |
余弦距离 | 余弦距离函数会从 1 (cosine_distance() = 1 - cosine similarity ) 中减去余弦相似度。余弦相似度用于衡量两个向量之间角度 \(\theta\) 的余弦。
|
1 - \(\frac{a^T b}{|a| \cdot |b|}\) | 减少 |
欧几里得距离 | 测量两个矢量之间的直线距离。 | \(\sqrt{(a_1-b_1)^2+(a_2-b_2)^2+...+(a_N-b_N)^2}\) | 减少 |
选择相似度度量
根据是否所有向量嵌入都进行了归一化,您可以确定要用于查找相似度的相似度度量。归一化向量嵌入的大小(长度)正好为 1.0。
标准化数据
如果您的数据集中的所有向量嵌入都经过归一化,则所有这三个函数都会提供相同的语义搜索结果。实质上,虽然每个函数返回的值不同,但这些值的排序方式相同。当嵌入标准化时,DOT_PRODUCT()
的计算效率通常最高,但在大多数情况下,差异可以忽略不计。但是,如果您的应用对性能非常敏感,DOT_PRODUCT()
可能会有助于调整性能。
非规范化数据
如果您有未对向量嵌入进行归一化的数据集,那么使用 DOT_PRODUCT()
作为距离函数在数学上是不正确的,因为点积作为函数不会测量距离。根据嵌入的生成方式和首选搜索类型,余弦距离或欧几里得距离函数产生的搜索结果在主观上优于另一个函数。
不确定数据是标准化还是非标准化
如果您不确定数据是否经过标准化,并希望使用 DOT_PRODUCT()
,我们建议您改用 COSINE_DISTANCE()
。COSINE_DISTANCE()
类似于内置标准化的 DOT_PRODUCT()
。使用COSINE_DISTANCE()
衡量的相似度的范围为 -1
至 1
。如果结果接近 0
,则表示向量非常相似。
后续步骤
- 详细了解如何通过查找 k 最近邻来执行向量搜索。
- 了解如何将嵌入导出到 Vertex AI Vector Search。
- 详细了解 GoogleSQL
COSINE_DISTANCE()
、EUCLIDEAN_DISTANCE()
和DOT_PRODUCT()
函数。 - 详细了解 PostgreSQL
spanner.cosine_distance()
、spanner.euclidean_distance(), and spanner.dot_product()
函数。