使用 Azure AI 扩展创建嵌入
若要运行语义搜索,必须将查询嵌入与搜索项的嵌入进行比较。 Azure Database for PostgreSQL - 灵活服务器的 azure_ai
扩展与 Azure OpenAI 集成,以生成嵌入矢量。
azure_ai
和 Azure OpenAI 简介
适用于 Azure AI 的 Azure Database for PostgreSQL 灵活扩展提供了用户定义的函数,从而与 Azure AI 服务集成,包括 Azure OpenAI 和 Azure 认知服务。
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 和描述,排名按差异从小到大(类似性从高到低)。