适用于:SQL Server 2025 (17.x) 在
Microsoft Fabric 中预览
Azure SQL 数据库
Azure SQL 托管实例 SQL 数据库
矢量是数字的有序数组 (通常是浮点),可以表示有关某些数据的信息。 例如,图像可以表示为像素值的向量,也可以将文本字符串表示为 ASCII 值的向量。 将数据转换为矢量的过程称为矢量化。
注释
- 预览版中的矢量支持,可能会更改。 请务必阅读 联机服务的服务级别协议(SLA)中的预览使用条款。
- 矢量功能在配置了 Always-up-to-date 策略的 Azure SQL 托管实例中可用。
嵌入
嵌入是表示数据重要特征的矢量。 嵌入通常是通过使用深度学习模型来学习的,机器学习和 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 v1,
CAST(JSON_ARRAY(1.0, -0.2, 30) AS VECTOR(3)) AS v2;
或使用隐式转换
DECLARE @v1 VECTOR(3) = '[1.0, -0.2, 30]';
DECLARE @v2 VECTOR(3) = JSON_ARRAY(1.0, -0.2, 30);
SELECT @v1 as v1, @v2 as v2;
同样,将矢量转换为 JSON 数组也是如此:
DECLARE @v VECTOR(3) = '[1.0, -0.2, 30]';
SELECT
CAST(@v AS NVARCHAR(MAX)) AS s,
CAST(@v AS JSON) AS j
精确搜索和矢量距离(最接近的邻居)
精确搜索(也称为 k-Nearest Neighbor (k-NN) 搜索,涉及计算给定向量与数据集中所有其他向量之间的距离,对结果进行排序,并根据指定的距离指标选择最近的邻居。 此方法可以保证精确检索最接近的邻居,但可以计算密集型,尤其是对于大型数据集。
矢量距离函数用于测量向量之间的接近度。 常见的距离指标包括 Euclidean 距离、余弦相似性和点积。 这些函数对于执行 k-NN 搜索并确保准确的结果至关重要。
精确近邻(ENN)矢量搜索对所有索引向量执行详尽的距离计算,以确保根据指定的距离指标检索最近的邻居。 此方法非常精确,但资源密集型,使其适用于较小的数据集或准确性至关重要的方案。
在 SQL 数据库引擎中,可以使用 VECTOR_DISTANCE 函数执行 k-NN 搜索,从而有效计算矢量之间的距离,并有助于检索最近的邻居。
以下示例演示如何执行 k-NN 以将表中存储 content_vector
的前 10 个最相似的向量返回到给定的查询向量 @qv
。
DECLARE @qv VECTOR(1536) = AI_GENERATE_EMBEDDING(N'Pink Floyd music style' model Ada2Embeddings);
SELECT TOP (10) id, VECTOR_DISTANCE('cosine', @qv, [content_vector]) as distance, title
FROM [dbo].[wikipedia_articles_embeddings]
ORDER BY distance
如果搜索的矢量不多(作为一般建议的矢量少于 50,000 个),建议使用确切的搜索。 只要您的搜索谓词能将用于邻居搜索的向量数量减少到 50,000 或更少,表格就可以包含更多的向量。
近似向量索引和向量搜索(近似最近邻)
识别靠近给定查询向量的所有向量需要大量资源来计算查询向量与表中存储的向量之间的距离。 搜索靠近给定查询向量的所有向量涉及对表的完整扫描和大量 CPU 使用率。 这称为『最近邻居』或『KNN』查询,并返回『k』个最接近的向量。
矢量用于查找用于回答用户查询的 AI 模型的类似数据。 这涉及到使用距离度量查询与查询向量最近的“k”个向量的数据库,这些度量包括内积、余弦相似性或欧几里得距离。
KNN 查询通常难以实现扩展性,因此在许多情况下,可以为了显著的速度提升而权衡一些准确性,特别是召回率。 此方法称为近似最近邻(ANN)。
召回在使用或计划使用向量和嵌入的过程中,是一个每个人都应该熟悉的重要概念。 实际上,召回率衡量的是算法对近似最近邻的识别比例,与详尽搜索所返回的确切最近邻相比。 因此,它是一个评估算法执行近似质量的良好标准。 完美的召回率相当于无近似值,为 1。
对于 AI 应用程序,权衡相当合理。 由于矢量嵌入已近似表示概念,因此只要召回率接近 1,使用 ANN 就不会显著影响结果。 这可确保返回的结果与 KNN 的结果非常相似,同时提供显著提高的性能并显著减少资源使用量,这对作数据库非常有利。
请务必了解,在引用 向量索引 时,术语“index”的含义与用于在关系数据库中使用的索引不同。 事实上,向量索引返回近似结果。
在 MSSQL 引擎中,矢量索引基于 DiskANN 算法。 DiskANN 依赖于创建图形来快速浏览所有索引矢量,以查找与给定向量最接近的匹配项。 DiskANN 是基于图形的系统,用于使用有限的计算资源对大型矢量数据集进行索引和搜索。 它有效地使用 SSD 和最小内存来处理比内存中索引更多的数据,同时保持每秒高查询(QPS)和低延迟,确保内存、CPU 和 I/O 使用情况与搜索性能之间保持平衡。
可以先使用 CREATE VECTOR INDEX T-SQL 命令创建矢量索引,然后使用 VECTOR_SEARCH T-SQL 函数运行近似搜索,然后执行近似邻居算法搜索。
DECLARE @qv VECTOR(1536) = AI_GENERATE_EMBEDDING(N'Pink Floyd music style' model Ada2Embeddings);
SELECT
t.id, s.distance, t.title
FROM
VECTOR_SEARCH(
TABLE = [dbo].[wikipedia_articles_embeddings] as t,
COLUMN = [content_vector],
SIMILAR_TO = @qv,
METRIC = 'cosine',
TOP_N = 10
) AS s
ORDER BY s.distance