AI_GENERATE_EMBEDDINGS(Transact-SQL)

适用于: SQL Server 2025 (17.x) 预览版

AI_GENERATE_EMBEDDINGS 是一个内置函数,它使用存储在数据库中的预先创建的 AI 模型定义创建嵌入(矢量数组)。

语法

Transact-SQL 语法约定

AI_GENERATE_EMBEDDINGS ( source USE MODEL model_identifier [ PARAMETERS optional_json_request_body_parameters ] )

论据

任何字符类型的表达式(例如 nvarchar、varcharncharchar)。

model_identifier

定义为用于创建嵌入向量数组的类型EMBEDDING的名称。

有关详细信息,请参阅 CREATE EXTERNAL MODEL

optional_json_request_body_parameters

其他参数的有效 JSON 格式列表。 在发送到 EXTERNAL MODEL终结点位置之前,这些参数将追加到 REST 请求消息正文中。 这些参数在终结点支持和接受的内容 EXTERNAL MODEL上是相提并置的。

返回类型

AI_GENERATE_EMBEDDINGS 返回一个单列表,其行是作为 JSON 返回的生成的嵌入向量数组。

返回格式

返回的 JSON 的格式如下所示:

[
    0.0023929428,
    0.00034713413,
    -0.0023142276,
    -0.025654867,
    -0.011492423,
    0.0010358924,
    -0.014836246,
    0.0035484824,
    0.000045630233,
    -0.027581815,
    0.023816079,
    0.005012586,
    -0.027732948,
    -0.010088143,
    ...
    -0.014571763
]

注解

先决条件

必须满足两个先决条件才能使用 AI_GENERATE_EMBEDDINGS

  • sp_invoke_external_endpoint 必须使用 sp_configure 在数据库中启用。

  • 类型的外部模型EMBEDDINGS,可通过正确的授予、角色和/或权限进行访问。

可选参数

optional_json_request_body_parameters当需要将终结点参数添加到嵌入请求消息的正文时,将使用参数。AI_GENERATE_EMBEDDINGS 如果模型定义中定义了该参数,则添加可选参数将替代运行时的值。

例如,如果 EXTERNAL MODEL 包含 dimensions 设置为 1536 的参数,则通过在运行时传递 optional_json_request_body_parameters 具有如下所示的新值来传递该参数: json_object('dimensions':755)dimensions 模型上的参数重写。

传入 optional_json_request_body_parameters 的值必须是有效的 JSON。

创建嵌入终结点

有关创建嵌入终结点的详细信息,请查看 Azure OpenAIOpenAIOllama 的过程。

扩展事件 (XEvent)

AI_GENERATE_EMBEDDINGS 具有可以启用故障排除的扩展事件(ai_generate_embeddings_summary)。 它包含有关 REST 请求和响应的信息,例如状态代码、遇到的任何错误、所使用的模型名称和嵌入终结点使用的令牌计数。 扩展事件 external_rest_endpoint_summary 包含可用于排查和调试 REST 请求的其他信息。

例子

答: 使用 SELECT 语句创建嵌入内容

以下示例演示如何将 AI_GENERATE_EMBEDDINGS 函数与返回向量数组结果的 select 语句一起使用。

SELECT id,
       AI_GENERATE_EMBEDDINGS(large_text USE MODEL MyAzureOpenAIModel)
FROM myTable;

B. 使用 AI_GENERATE_CHUNKS 使用 SELECT 语句创建嵌入内容

以下示例演示如何将函数与函数结合使用AI_GENERATE_EMBEDDINGSAI_GENERATE_CHUNKS,以指定区块大小传递分块大小的文本,该语句返回向量数组结果。

SELECT
    id,
    title,
    large_text,
    AI_GENERATE_EMBEDDINGS(c.chunk_text USE MODEL MyAzureOpenAiModel)
FROM
    myTable
CROSS APPLY
    AI_GENERATE_CHUNKS(source = large_text, chunk_type = N'FIXED' , chunk_size = 10) c;

C. 使用表更新创建嵌入内容

下面的示例演示如何将 AI_GENERATE_EMBEDDINGS 函数与表 update 语句结合使用,以将向量数组结果返回到向量数据类型列。

UPDATE t
    SET myEmbeddings = AI_GENERATE_EMBEDDINGS(t.text USE MODEL MyAzureOpenAiModel)
FROM myTable AS t;

D. 使用 SELECT 语句和 PARAMETERS 创建嵌入内容

以下示例演示如何将 AI_GENERATE_EMBEDDINGS 函数与 select 语句一起使用,并将可选参数传递给返回向量数组结果的终结点。

SELECT id,
       AI_GENERATE_EMBEDDINGS(large_text USE MODEL MyAzureOpenAIModel PARAMETERS '{"dimensions" : 768 }')
FROM myTable;

E. 包含分块、AI_GENERATE_EMBEDDINGS和模型创建的完整示例

此示例是创建 CREATE EXTERNAL MODEL、using AI_GENERATE_EMBEDDINGS和使用 AI_GENERATE_CHUNKS 将结果插入 具有矢量 数据类型的表中的完整流。 请记得用有效的密码替换 <password>

-- Turn external REST endpoint invocation ON in the database
EXECUTE sp_configure 'external rest endpoint enabled', 1;
RECONFIGURE WITH OVERRIDE;
GO

-- Create a master key for the database
IF NOT EXISTS (SELECT *
               FROM sys.symmetric_keys
               WHERE [name] = '##MS_DatabaseMasterKey##')
    BEGIN
        CREATE MASTER KEY ENCRYPTION BY PASSWORD = N'<password>';
    END
GO

-- Create access credentials to Azure OpenAI using a key:
CREATE DATABASE SCOPED CREDENTIAL [https://my-azure-openai-endpoint.openai.azure.com/]
    WITH IDENTITY = 'HTTPEndpointHeaders', secret = '{"api-key":"YOUR_AZURE_OPENAI_KEY"}';
GO

-- Create an external model to call the Azure OpenAI embeddings REST endpoint
CREATE EXTERNAL MODEL MyAzureOpenAiModel
WITH (
      LOCATION = 'https://my-azure-openai-endpoint.openai.azure.com/openai/deployments/text-embedding-ada-002/embeddings?api-version=2023-05-15',
      API_FORMAT = 'Azure OpenAI',
      MODEL_TYPE = EMBEDDINGS,
      MODEL = 'text-embedding-ada-002',
      CREDENTIAL = [https://my-azure-openai-endpoint.openai.azure.com/]
);

-- Create a table with text to chunk and insert data
CREATE TABLE textchunk
(
    text_id INT IDENTITY (1, 1) PRIMARY KEY,
    text_to_chunk NVARCHAR (MAX)
);
GO

INSERT INTO textchunk (text_to_chunk)
VALUES
('All day long we seemed to dawdle through a country which was full of beauty of every kind. Sometimes we saw little towns or castles on the top of steep hills such as we see in old missals; sometimes we ran by rivers and streams which seemed from the wide stony margin on each side of them to be subject to great floods.'),
('My Friend, Welcome to the Carpathians. I am anxiously expecting you. Sleep well to-night. At three to-morrow the diligence will start for Bukovina; a place on it is kept for you. At the Borgo Pass my carriage will await you and will bring you to me. I trust that your journey from London has been a happy one, and that you will enjoy your stay in my beautiful land. Your friend, DRACULA')
GO

-- Create a new table to hold the chunked text and vector embeddings
CREATE TABLE text_embeddings
(
    embeddings_id INT IDENTITY (1, 1) PRIMARY KEY,
    chunked_text NVARCHAR (MAX),
    vector_embeddings VECTOR (1536)
);

-- Insert the chunked text and vector embeddings into the text_embeddings table using AI_GENERATE_CHUNKS and AI_GENERATE_EMBEDDINGS
INSERT INTO text_embeddings (chunked_text, vector_embeddings)
SELECT c.chunk, AI_GENERATE_EMBEDDINGS(c.chunk USE MODEL MyAzureOpenAiModel)
FROM textchunk t
CROSS APPLY
    AI_GENERATE_CHUNKS(source = t.text_to_chunk, chunk_type = N'FIXED', chunk_size = 100) c;

-- View the results
SELECT * FROM text_embeddings;