VECTOR_DISTANCE(Transact-SQL)

适用于:SQL Server 2025 (17.x) 在Microsoft Fabric 预览版中预览 Azure SQL 数据库Azure SQL 托管实例 SQL 数据库

VECTOR_DISTANCE 函数使用指定的距离指标计算两个向量之间的距离。 矢量距离始终精确且不使用任何向量索引,即使可用也是如此。 若要使用矢量索引并因此执行近似矢量搜索,必须使用 VECTOR_SEARCH 函数。 若要详细了解矢量索引和矢量搜索的工作原理,以及精确搜索和近似搜索之间的差异,请参阅 SQL 数据库引擎中的矢量

Note

VECTOR_DISTANCE 在具有 SQL Server 2025Always-up-to-date更新策略的 Azure SQL 托管实例中可用。

Syntax

Transact-SQL 语法约定

VECTOR_DISTANCE ( distance_metric , vector1 , vector2 )

Arguments

distance_metric

一个字符串,其中包含用于计算两个给定向量之间的距离的距离指标的名称。 支持以下距离指标:

  • cosine - 余弦距离
  • euclidean - Euclidean 距离
  • dot - (负数) 点积

vector1

计算结果为 向量 数据类型的表达式。

vector2

计算结果为 向量 数据类型的表达式。

距离指标

Metric Description Range Examples
cosine 余弦(角)距离 [0, 2] 0:相同的向量
2:对立向量
euclidean Euclidean 距离 [0、+∞] 0:相同的向量
dot 基于点产品的距离指示,
通过计算 点积获取
[-∞, +∞] 较小的数字表示更相似的向量

返回值

该函数返回一个标量浮点值,该值表示使用指定距离指标的两个向量之间的距离。

如果 distance_metric 不是有效的指标,并且提供的向 量不是矢量数据类型,则返回错误。

Examples

可以在 GitHub 上找到示例中使用的数据库的详细信息: 使用 Vector Embedding 下载和导入维基百科文章

示例假定存在一个表,该表具有wikipedia_articles存储标题的维基百科文章嵌入的类型title_vectorvectortitle_vector 假定是使用嵌入模型生成的嵌入,例如 text-embedding-ada-002 ,或 text-embedding-3-small返回具有 1,536 个维度的向量。

有关更多示例(包括端到端解决方案),请转到 Azure SQL 数据库矢量搜索示例 GitHub 存储库

答: 从 JSON 数组创建矢量

以下示例使用 JSON 数组从字符串创建具有三个维度的向量。

DECLARE @v1 AS VECTOR (2) = '[1,1]';
DECLARE @v2 AS VECTOR (2) = '[-1,-1]';

SELECT VECTOR_DISTANCE('euclidean', @v1, @v2) AS euclidean,
       VECTOR_DISTANCE('cosine', @v1, @v2) AS cosine,
       VECTOR_DISTANCE('dot', @v1, @v2) AS negative_dot_product;

B. 基于标题返回前 10 篇类似文章

下面的示例根据标题向量之间的余弦距离返回与给定文章最相似的前 10 篇文章。

DECLARE @v AS VECTOR (1536);

SELECT @v = title_vector
FROM [dbo].[wikipedia_articles]
WHERE title = 'Alan Turing';

SELECT TOP (10) id,
                title,
                VECTOR_DISTANCE('cosine', @v, title_vector) AS distance
FROM [dbo].[wikipedia_articles]
ORDER BY distance;

C. 基于特定矢量距离返回类似文章

下面的示例根据标题向量之间的余弦距离返回给定项目的所有类似项目,仅选择距离小于 0.3 的游戏。

DECLARE @v AS VECTOR (1536);

SELECT @v = title_vector
FROM [dbo].[wikipedia_articles]
WHERE title = 'Alan Turing';

SELECT id,
       title,
       VECTOR_DISTANCE('cosine', @v, title_vector) AS distance
FROM [dbo].[wikipedia_articles]
WHERE VECTOR_DISTANCE('cosine', @v, title_vector) < 0.3
ORDER BY distance;