使用 Azure AI 扩展创建嵌入

已完成

若要运行语义搜索,必须将查询嵌入与搜索项的嵌入进行比较。 Azure Database for PostgreSQL - 灵活服务器的 azure_ai 扩展与 Azure OpenAI 集成,以生成嵌入矢量。

关系图显示了将“lorem ipsum”输入文本发送到 Azure OpenAI 嵌入 API,从而生成了数字的矢量数组。

azure_ai 和 Azure OpenAI 简介

适用于 Azure AI 的 Azure Database for PostgreSQL 灵活扩展提供了用户定义的函数,从而与 Azure AI 服务集成,包括 Azure OpenAIAzure 认知服务

Azure OpenAI 嵌入 API 生成输入文本的嵌入矢量。 使用此 API 设置所搜索的所有项的嵌入。 通过 azure_ai 扩展的 azure_openai 架构,可以轻松地从 SQL 调用 API 以生成嵌入,无论是初始化项嵌入,还是即时创建查询嵌入。 然后,这些嵌入可用于执行矢量相似性搜索,或者换句话说,执行语义搜索。

azure_ai 扩展与 Azure OpenAI 配合使用

若要从 PostgreSQL 调用 Azure OpenAI 嵌入 API,需要启用和配置 azure_ai 扩展、授予 Azure OpenAI 访问权限,并部署 Azure OpenAI 模型。 有关详细信息,请参阅 Azure Database for PostgreSQL 灵活服务器上的 Azure OpenAI 文档

环境准备就绪并将扩展加入允许列表后,请运行以下 SQL:

/* Enable the extension. */
CREATE EXTENSION azure_ai;

还需要配置 OpenAI 服务资源的终结点和访问密钥

SELECT azure_ai.set_setting('azure_openai.endpoint', '{your-endpoint-url}');
SELECT azure_ai.set_setting('azure_openai.subscription_key', '{your-api-key}}');

配置了 azure_ai 和 Azure OpenAI 后,提取和存储嵌入只需在 SQL 查询中调用函数即可。 假设有一个表 listings,它有一个 description 列和一个 listing_vector 列,可以使用以下查询为所有房源生成并存储嵌入。 为你创建的模型将 {your-deployment-name} 替换为 Azure OpenAI Studio 中的“部署名称”。

UPDATE listings
SET listing_vector = azure_openai.create_embeddings('{your-deployment-name}', description, max_attempts => 5, retry_delay_ms => 500)
WHERE listing_vector IS NULL;

listing_vector 矢量列的维度数必须与语言模型生成的维度数相同。

若要查看文档嵌入,请运行以下查询:

SELECT listing_vector FROM listings LIMIT 1;

结果是浮点数的矢量。 可以先运行 \x,以使输出更易于阅读。

动态生成查询嵌入

要搜索的文档有了嵌入后,可以运行语义搜索查询。 为此,还需要为查询文本生成嵌入。

azure_ai 扩展的 azure_openai 架构让你可以在 SQL 中生成嵌入。 例如,要查找文本与查询“为我查找可步行的社区中的住处”在语义上最相似的前三个房源,请运行以下 SQL:

SELECT id, description FROM listings
ORDER BY listing_vector <=> azure_openai.create_embeddings('{your-deployment-name}', 'Find me places in a walkable neighborhood.')::vector
LIMIT 3;

<=> 运算符会计算两个矢量之间的“余弦距离”,即语义相似性指标。 矢量越接近,语义上就越相似:矢量越远,语义上就越不同。

::vector 运算符会将生成的嵌入转换为 PostgreSQL 矢量数组。

该查询会返回前三个房源 ID 和描述,排名按差异从小到大(类似性从高到低)。