SQL 数据库引擎中的矢量概述

适用于:Azure SQL 数据库

矢量是数字的有序数组 (通常是浮点),可以表示有关某些数据的信息。 例如,图像可以表示为像素值的矢量,或者文本字符串可以表示为矢量或 ASCII 值。 将数据转换为矢量的过程称为矢量化。

嵌入

嵌入是表示数据重要特征的矢量。 嵌入通常是通过使用深度学习模型来学习的,机器学习和 AI 模型利用嵌入作为特征。 嵌入还可以捕获相似概念之间的语义相似性。 例如,在为单词“person”和“human”生成嵌入时,我们期望它们的嵌入 (矢量表示形式) 值相似,因为这两个单词在语义上也相似。

Azure OpenAI 拥有从文本数据创建嵌入的模型。 该服务将文本分解为标记,并使用 OpenAI 预先训练的模型生成嵌入。 要了解详细信息,请参阅使用 Azure OpenAI 创建嵌入

生成嵌入后,可以将其存储在 SQL Server 数据库中。 这样,就可以将嵌入内容与它们表示的数据一起存储,并执行矢量搜索查询来查找类似的数据点。

矢量搜索是指查找数据集中类似于特定查询矢量的所有向量的过程。 因此,单词 human 的查询向量在整个数据集中搜索类似的向量,因此类似单词:在此示例中,它应将单词 person 查找为接近匹配项。 此接近度或距离是使用距离指标(如余弦距离)测量的。 越接近矢量,它们就越相似。

SQL Server 通过向量数据类型为向量提供对矢量内置支持。 矢量以优化的二进制格式存储,但为了方便起见,以 JSON 数组的形式公开。 矢量的每个元素都使用单精度(4 字节)浮点值进行存储。 除了数据类型之外,还有专用函数用于对向量进行操作。 例如,可以使用函数 VECTOR_DISTANCE 查找两个向量之间的距离。 该函数根据指定的距离指标返回一个标量值,其中包含两个向量之间的距离。

由于矢量通常作为浮点数组进行管理,因此只需将 JSON 数组 转换为矢量数据类型即可创建向量 。 例如,以下代码从 JSON 数组创建矢量:

SELECT CAST('[1.0, -0.2, 30]' AS VECTOR(3)) AS vector;

或者,使用隐式转换

DECLARE @v VECTOR(3) = '[1.0, -0.2, 30]';
SELECT @v;

同样,将矢量转换为 JSON 数组也是如此:

DECLARE @v VECTOR(3) = '[1.0, -0.2, 30]';
SELECT CAST(@v AS NVARCHAR(MAX)) AS vector;

限制

目前不支持从 JSON 数据类型转换到 JSON 数据类型和从中转换。 解决方法是先从/转换为 NVARCHAR(MAX), 然后再从 JSON 转换为/从 JSON。 例如,将矢量转换为 JSON 类型:

DECLARE @v VECTOR(3) = '[1.0, -0.2, 30]';
SELECT CAST(CAST(@v AS NVARCHAR(MAX)) AS JSON) AS j;

从 JSON 类型转换为矢量:

DECLARE @j JSON = JSON_ARRAY(1.0, -0.2, 30)
SELECT CAST(CAST(@j AS NVARCHAR(MAX)) AS VECTOR(3)) AS v;

有关如何在 SQL Server 中使用矢量的更多详细信息,请参阅以下文章: