实现矢量数据类型和矢量搜索

已完成

SQL Server 2025 包括对 矢量数据类型 和矢量搜索的本机支持。 借助此功能,可以将高维矢量嵌入与关系数据一起存储,并执行相似性搜索,从而生成了解数据中的语义关系的应用程序。

矢量搜索解决了传统数据库查询的限制。 传统数据库擅长完全匹配和结构化查询,但它们难以理解上下文和含义。 矢量搜索通过启用语义理解来改变这一点,即使它们不共享确切关键字,也能在概念上找到类似的项。 例如,搜索“舒适的跑步鞋”可以找到描述为“缓冲运动鞋”的产品,因为它们的矢量嵌入捕获类似的语义含义。

对于开发人员而言,这意味着无需管理单独的矢量数据库或复杂的数据同步过程,即可生成智能应用程序。 通过将矢量与 SQL Server 中的关系数据一起保留,可以保持 ACID 符合性,使用现有的安全策略,使用熟悉 的 T-SQL 语法,并简化体系结构。 此集成适用于以下方案:

  • 语义搜索和建议: 基于含义查找相关的产品、文档或内容,而不仅仅是关键字
  • 问答系统:为聊天机器人和虚拟助理提供支持,使其能够理解并回应针对企业数据的自然语言查询
  • 异常情况检测: 通过查找与正常行为语义上相距的数据点来识别异常模式
  • 内容去重: 检测相似项或重复项,即使它们的措辞不同
  • 个性化引擎: 根据细微差别相似性将用户首选项与产品或内容匹配

浏览矢量数据类型

SQL Server 2025 中的 向量数据类型 旨在有效地存储浮点数数组。 矢量通常用于表示 AI 模型生成的嵌入,其中每个维度捕获数据的特定特征或语义特征。

探索关键特征

  • 优化的存储格式: 矢量在内部以优化的二进制格式存储,但作为 JSON 数组公开以方便使用和兼容性。
  • 灵活的精度: 矢量中的每个元素都可以使用单精度(4 字节)或半精度(2 字节)浮点值进行存储,从而平衡准确性和存储效率。
  • 维度支持: SQL Server 2025 支持具有最多 1998 个维度的矢量,用于单精度,3,996 个维度用于半精度,同时容纳广泛的嵌入模型。

创建和存储向量

可以通过将 JSON 数组强制转换为 vector 数据类型来创建矢量。 下面是一个示例:

-- Create a vector from a JSON array
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 字符串文本转换为三维向量或使用 JSON_ARRAY 函数。 这两种方法生成相同的结果,将值 [1.0, -0.2, 30] 存储在矢量数据类型中。

在表中存储向量:

CREATE TABLE products (
    product_id INT PRIMARY KEY,
    product_name NVARCHAR(100),
    description NVARCHAR(MAX),
    embedding VECTOR(1536)  -- Common dimension for OpenAI embeddings
);

此代码创建一个表来存储产品信息以及一个 1536 维矢量嵌入。 维度大小 1536 通常用于 OpenAI 的文本嵌入模型,使此表准备好存储从产品说明生成的嵌入内容。

将矢量转换为 JSON

可以轻松地将向量转换回 JSON 数组进行显示或处理:

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

此代码将向量转换回可读格式。 将CASTNVARCHAR(MAX)向量作为字符串返回,同时CASTJSON将其作为 JSON 数组返回,这对于与应用程序和 API 的互作性非常有用。

执行精确最近邻搜索 (k-NN)

精确最近邻(k-NN)搜索涉及计算查询向量与数据集中所有向量之间的距离,然后返回距离最近的k个匹配项。 此方法保证精确结果,但对于大型数据集而言,计算密集型。

使用 VECTOR_DISTANCE 函数

VECTOR_DISTANCE 函数使用指定的距离指标度量两个向量之间的相似性:

DECLARE @query_vector VECTOR(1536) = AI_GENERATE_EMBEDDINGS(
    N'Pink Floyd music style' 
    USE MODEL Ada2Embeddings
);

SELECT TOP (10) 
    product_id, 
    product_name,
    VECTOR_DISTANCE('cosine', @query_vector, embedding) AS distance
FROM products
ORDER BY distance;

使用 Ada2Embeddings 模型为查询文本“Pink Floyd 音乐风格”生成嵌入式表示,然后查找与该查询最相似的嵌入式表示的 10 个产品。 该 VECTOR_DISTANCE 函数计算查询向量与每个产品的嵌入之间的余弦距离,距离较小,表示更相似。

选择距离指标

SQL Server 2025 支持多种距离指标:

  • 余弦相似性: 测量矢量之间的角度,非常适合文本嵌入
  • 欧几里得距离: 测量向量空间中的直线距离
  • 点积: 适用于规范化向量

建议在使用精确搜索时:

  • 要搜索的矢量少于 50,000 个
  • 查询谓词将数据集筛选为可控的规模
  • 需要完美的召回率(100% 准确性)
  • 可以接受额外的计算成本

实现近似邻近搜索 (ANN)

对于较大的数据集,近似近邻 (ANN) 搜索在速度和准确性之间提供了平衡。 SQL Server 2025 使用 DiskANN 算法实现 ANN,该算法创建基于图形的索引以实现高效的矢量导航。

了解召回

召回率衡量的是,与精确搜索结果相比,ANN 算法识别出的真实最近邻所占的比例。 召回率为 1.0(100%)意味着近似搜索返回的结果与精确搜索相同。 在实践中,召回率高于 0.95 的值通常为 AI 应用程序提供出色的结果,同时提供显著的性能改进。

创建矢量索引

若要启用 ANN 搜索,请在向量列上创建 矢量索引

CREATE VECTOR INDEX idx_product_embedding 
ON products(embedding);

此代码使用 DiskANN 算法在嵌入列上创建矢量索引。 该索引通过创建图形结构以高效矢量导航来提高对大型数据集的近似邻域搜索的性能。

SQL Server 2025 中的矢量索引:

  • 使用 DiskANN 算法进行基于图形的有效搜索
  • 支持有限的内存和 CPU 资源
  • 平衡磁盘 I/O、内存使用情况和查询性能
  • 数据更改时自动更新

使用 VECTOR_SEARCH 函数

VECTOR_SEARCH 函数执行近似最近邻搜索:

DECLARE @query_vector VECTOR(1536) = AI_GENERATE_EMBEDDINGS(
    N'Pink Floyd music style' 
    USE MODEL Ada2Embeddings
);

SELECT 
    t.product_id,
    t.product_name,
    s.distance
FROM
    VECTOR_SEARCH(
        TABLE = products AS t, 
        COLUMN = embedding, 
        SIMILAR_TO = @query_vector, 
        METRIC = 'cosine', 
        TOP_N = 10
    ) AS s
ORDER BY s.distance;

此查询使用前面创建的矢量索引执行近似近邻搜索。 该 VECTOR_SEARCH 函数使用 DiskANN 算法查找 10 种最相似的产品,而无需扫描所有向量,从而为大型数据集提供性能改进,同时保持较高的准确度。

考虑性能优势

ANN 搜索优惠:

  • 加快查询执行速度: 尤其是对于具有数百万矢量的数据集
  • 降低资源消耗: 与确切搜索相比,CPU 和内存使用率降低
  • 可伸缩性: 高效处理大规模矢量数据集
  • 高召回率: 通常实现高于 95%的召回率,确保质量结果

生成混合搜索方案

SQL Server 2025 支持将矢量搜索与传统的 SQL 操作结合,用于混合搜索方案。

还可以使用矢量执行语义搜索,同时应用传统筛选器:

DECLARE @query_vector VECTOR(1536) = AI_GENERATE_EMBEDDINGS(
    N'comfortable running shoes' 
    USE MODEL Ada2Embeddings
);

SELECT 
    t.product_id,
    t.product_name,
    t.category,
    t.price,
    s.distance
FROM
    VECTOR_SEARCH(
        TABLE = products AS t, 
        COLUMN = embedding, 
        SIMILAR_TO = @query_vector, 
        METRIC = 'cosine', 
        TOP_N = 20
    ) AS s
WHERE 
    t.category = 'Footwear'
    AND t.price BETWEEN 50 AND 150
ORDER BY s.distance;

此混合搜索将语义相似性搜索与传统的 SQL 筛选相结合。 首先,它发现20种语义上最类似于“舒适的跑步鞋”的产品,然后筛选这些结果,只包括价格在50美元到150美元之间的鞋类项目。 此方法在使用语义理解时可实现精确的目标。

全文搜索 与矢量搜索相结合,以获取全面的结果:

DECLARE @query_vector VECTOR(1536) = AI_GENERATE_EMBEDDINGS(
    N'sustainable materials' 
    USE MODEL Ada2Embeddings
);

SELECT 
    t.product_id,
    t.product_name,
    s.distance,
    fts.RANK AS text_rank
FROM
    VECTOR_SEARCH(
        TABLE = products AS t, 
        COLUMN = embedding, 
        SIMILAR_TO = @query_vector, 
        METRIC = 'cosine', 
        TOP_N = 50
    ) AS s
INNER JOIN CONTAINSTABLE(products, description, 'sustainable OR eco-friendly') AS fts
    ON t.product_id = fts.[KEY]
ORDER BY (s.distance * 0.6) + ((1.0 - fts.RANK/1000.0) * 0.4);

此查询将矢量搜索与全文搜索相结合。 它使用矢量嵌入来查找在语义上类似于“可持续材料”的产品,然后将这些结果与说明中包含关键字“可持续”或“生态友好”的全文搜索结果进行联接。 最终排名将两个分数与加权公式(60% 语义相似性,40% 关键字匹配)组合在一起。

应用最佳做法

在 SQL Server 2025 中实现矢量搜索时:

  • 选择正确的精度: 如果存储是一个考虑因素,建议在较大维度中使用半精度
  • 从战略上编制索引: 针对经常搜索的列创建矢量索引
  • 监视召回率:测试 ANN 查询,以确保在用例中达到可接受的召回率
  • 优化查询: 在进行矢量操作之前,使用适当的筛选器减少搜索空间
  • 批处理作: 在批处理中生成和插入嵌入内容以提高性能

通过使用这些向量功能,可以构建 AI 驱动的应用程序,这些应用程序可以理解语义关系、提供智能建议并提供自然语言搜索体验(全部在受信任的 SQL Server 平台中)。