你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

将 Azure AI 功能集成到 Azure Database for PostgreSQL - 灵活服务器中

适用于: Azure Database for PostgreSQL 灵活服务器

azure_ai 扩展添加了使用大型语言模型 (LLM) 的功能,还集成了 Azure AI 服务的强大功能,以便在 Azure Database for PostgreSQL 灵活服务器数据库中构建生成式 AI 应用程序。 生成式 AI 是一种形式的人工智能,在这种形式中,LLM 被训练基于自然语言输入生成原创内容。 使用 azure_ai 扩展时,你可以直接从数据库使用生成式 AI 的自然语言查询处理功能。

本教程介绍如何使用 azure_ai 扩展向 Azure Database for PostgreSQL 灵活服务器实例添加丰富的 AI 功能。 它介绍如何使用该扩展将 Azure OpenAIAzure AI 语言服务集成到你的数据库中。

先决条件

  • Azure 订阅 - 免费创建订阅

  • 已在所需的 Azure 订阅中授予对 Azure OpenAI 的访问权限。 目前,对此服务的访问权限由应用程序授予。 可以通过在 https://aka.ms/oai/access 上填写表单来申请对 Azure OpenAI 的访问权限。

  • 部署了 text-embedding-ada-002(版本 2)模型的 Azure OpenAI 资源。 此模型当前仅在特定区域中可用。 如果你没有资源,Azure OpenAI 资源部署指南中阐述了创建资源的过程。

  • Azure AI 语言服务。 如果没有资源,可以按照摘要快速入门文档中提供的说明在 Azure 门户中创建语言资源。 可以使用免费定价层 (Free F0) 试用该服务,之后再升级到付费层以用于生产。

  • 你的 Azure 订阅中的 Azure Database for PostgreSQL 灵活服务器实例。 如果没有资源,请使用 Azure 门户Azure CLI 指南创建一个。

在 Azure Cloud Shell 中使用 psql 连接到数据库

在 Web 浏览器中打开 Azure Cloud Shell。 选择 Bash 作为环境,如果出现提示,请选择用于 Azure Database for PostgreSQL 灵活服务器数据库的订阅,然后选择“创建存储”。

要检索数据库连接详细信息:

  1. Azure 门户中,导航到你的 Azure Database for PostgreSQL 灵活服务器资源。

  2. 在左侧导航菜单中,选择“设置”下的“连接”,然后复制“连接详细信息”块。

  3. 将复制的环境变量声明行粘贴到上面打开的 Azure Cloud Shell 终端中,将 {your-password} 令牌替换为创建数据库时设置的密码。

    export PGHOST={your-server-name}.postgresql.database.azure.com
    export PGUSER={your-user-name}
    export PGPORT=5432
    export PGDATABASE={your-database-name}
    export PGPASSWORD="{your-password}"
    

    在提示符下输入以下内容,从而使用 psql 命令行实用工具连接到你的数据库。

    psql
    

安装 azure_ai 扩展

Azure AI 扩展和 OpenAI

azure_ai 扩展让你能够将 Azure OpenAI 和 Azure 认知服务集成到数据库中。 要在数据库中启用该扩展,请执行以下步骤:

  1. 扩展 - Azure Database for PostgreSQL 灵活服务器中所述,将扩展添加到允许列表。

  2. psql 命令提示符处运行以下命令,验证扩展是否已成功添加到允许列表:

    SHOW azure.extensions;
    
  3. 在计划使用 azure_ai 扩展的数据库中,使用 CREATE EXTENSION 命令安装它。

    CREATE EXTENSION azure_ai;
    

检查 azure_ai 扩展中包含的对象

查看 azure_ai 扩展中包含的对象可以更好地了解它提供的功能。 可以在 psql 命令提示符处使用 \dx 元命令列出扩展中包含的对象。

\dx+ azure_ai

该元命令输出显示 azure_ai 扩展会在数据库中创建三个架构、多个用户定义的函数 (UDF) 和数个复合类型。 下表列出了该扩展添加的架构,并描述了每个架构。

架构 说明
azure_ai 配置表和用于与其交互的 UDF 所在的主体架构。
azure_openai 包含实现调用 Azure OpenAI 终结点的 UDF。
azure_cognitive 提供与将数据库与 Azure 认知服务集成相关的 UDF 和复合类型。

函数和类型都与其中一个架构相关联。 要查看 azure_ai 架构中定义的函数,请使用 \df 元命令,指定应显示其函数的架构。 \df 命令之前的 \x auto 命令用于自动打开和关闭展开的显示,使命令的输出更易于在 Azure Cloud Shell 中查看。

\x auto
\df+ azure_ai.*

azure_ai.set_setting() 函数让你可以为 Azure AI 服务设置终结点和关键值。 它接受一个密钥和分配给它的值。 azure_ai.get_setting() 函数提供了一种方法来检索你使用 set_setting() 函数设置的值。 它接受你要查看的设置的密钥。 对于这两种方法,密钥必须是下列项之一:

说明
azure_openai.endpoint 支持的 OpenAI 终结点(例如 https://example.openai.azure.com)。
azure_openai.subscription_key OpenAI 资源的订阅密钥。
azure_cognitive.endpoint 支持的认知服务终结点(例如 https://example.cognitiveservices.azure.com)。
azure_cognitive.subscription_key 认知服务资源的订阅密钥。

重要

由于 Azure AI 服务的连接信息(包括 API 密钥)存储在数据库的配置表中,因此 azure_ai 扩展定义了一个名为 azure_ai_settings_manager 的角色,用于确保此信息受到保护,并且仅供分配了该角色的用户访问。 此角色允许读取和写入与扩展相关的设置。 只有超级用户和 azure_ai_settings_manager 角色的成员才能调用 azure_ai.get_setting()azure_ai.set_setting() 函数。 在 Azure Database for PostgreSQL 灵活服务器中,所有管理员用户都分配有 azure_ai_settings_manager 角色。

使用 Azure OpenAI 生成矢量嵌入

azure_ai 扩展的 azure_openai 架构允许使用 Azure OpenAI 为文本值创建矢量嵌入。 使用此架构时,可以直接从数据库使用 Azure OpenAI 生成嵌入,以创建输入文本的矢量表示形式,然后可将其用于矢量相似性搜索,并由机器学习模型使用。

嵌入是一种使用机器学习模型来评估信息接近程度的技术。 此方法可有效识别数据之间的关系和相似性,使算法能够识别模式并做出准确的预测。

设置 Azure OpenAI 终结点和密钥

使用 azure_openai 函数之前:

  1. 使用 Azure OpenAI 服务终结点和密钥配置扩展。

  2. 在 Azure 门户中导航到你的 Azure OpenAI 资源,然后从左侧菜单中选择“资源管理”下的“密钥和终结点”项。

  3. 复制你的终结点和访问密钥。 可以使用 KEY1KEY2。 始终准备好两个密钥可以安全地轮换和重新生成密钥,而不会导致服务中断。

在以下命令中,将 {endpoint}{api-key} 令牌替换为你从 Azure 门户检索到的值,然后在 psql 命令提示符处运行命令,将值添加到配置表。

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

验证在配置表中写入的设置:

SELECT azure_ai.get_setting('azure_openai.endpoint');
SELECT azure_ai.get_setting('azure_openai.subscription_key');

azure_ai 扩展现已连接到你的 Azure OpenAI 帐户,并准备好生成矢量嵌入了。

在数据库中填充示例数据

本教程使用 BillSum 数据集的一小部分,该数据集提供了美国国会和加州州法案的列表,在这里提供用于生成矢量的示例文本数据。 可以从 Azure 示例 GitHub 存储库下载包含这些数据的 bill_sum_data.csv 文件。

要在数据库中托管该示例数据,请创建一个名为 bill_summaries 的表。

CREATE TABLE bill_summaries
(
    id bigint PRIMARY KEY,
    bill_id text,
    bill_text text,
    summary text,
    title text,
    text_len bigint,
    sum_len bigint
);

psql 命令提示符处使用 PostgreSQL COPY 命令,将 CSV 中的示例数据加载到 bill_summaries 表中,指定 CSV 文件的第一行是标头行。

\COPY bill_summaries (id, bill_id, bill_text, summary, title, text_len, sum_len) FROM PROGRAM 'curl "https://raw.githubusercontent.com/Azure-Samples/Azure-OpenAI-Docs-Samples/main/Samples/Tutorials/Embeddings/data/bill_sum_data.csv"' WITH CSV HEADER ENCODING 'UTF8'

启用矢量支持

azure_ai 扩展让你可以为输入文本生成嵌入。 要使生成的矢量与数据库中的其余数据一起存储,必须按照在数据库中启用矢量支持文档中的指南安装 pgvector 扩展。

将矢量添加到数据库后,向 bill_summaries 表添加一个新列,使用 vector 数据类型将嵌入存储在表中。 text-embedding-ada-002 模型会生成具有 1536 个维度的矢量,因此必须指定 1536 为矢量大小。

ALTER TABLE bill_summaries
ADD COLUMN bill_vector vector(1536);

生成和存储矢量

现在 bill_summaries 表已准备好存储嵌入。 使用 azure_openai.create_embeddings() 函数时,你会为 bill_text 字段创建矢量,并将它们插入 bill_summaries 表中新创建的 bill_vector 列。

在使用 create_embeddings() 函数之前,请运行以下命令来检查它并查看所需的参数:

\df+ azure_openai.*

\df+ azure_openai.* 命令的输出中的 Argument data types 属性会显示函数期望的参数列表。

参数 类型 默认 说明
deployment_name text 包含 text-embeddings-ada-002 模型的 Azure OpenAI 工作室中的部署的名称。
input text 用于创建嵌入的输入文本。
timeout_ms integer 3600000 超时的毫秒数,超过该时间后操作将停止。
throw_on_error boolean 指示函数是否应在错误时引发异常并导致包装事务回滚的标志。

第一个参数是 deployment_name,它是在你的嵌入模型部署到 Azure OpenAI 帐户时分配的。 要检索此值,请转到 Azure 门户中你的 Azure OpenAI 资源。 在那里,在左侧导航菜单中选择“资源管理”下的“模型部署”项,以打开 Azure OpenAI Studio。 在 Azure OpenAI Studio 中的“部署”选项卡上,复制与 text-embedding-ada-002 模型部署关联的“部署名称”值。

嵌入用于集成 AI 的部署的屏幕截图。

使用此信息,运行查询以更新 bill_summaries 表中的每条记录,使用 azure_openai.create_embeddings() 函数将为 bill_text 字段生成的矢量嵌入插入 bill_vector 列。 将 {your-deployment-name} 替换为从 Azure OpenAI Studio 的“部署”选项卡复制的部署名称值,然后运行以下命令:

UPDATE bill_summaries b
SET bill_vector = azure_openai.create_embeddings('{your-deployment-name}', b.bill_text);

执行以下查询以查看为表中第一条记录生成的嵌入。 如果输出难以读取,则可以先运行 \x

SELECT bill_vector FROM bill_summaries LIMIT 1;

每个嵌入是浮点数的一个向量,向量空间中两个嵌入之间的距离与原始格式的两个输入之间的语义相似性相关。

向量相似性是一种通过将两个项目表示为向量(即一系列数字)来衡量其之间相似程度的方法。 矢量通常用于使用 LLM 执行搜索。 矢量相似性的计算通常使用距离指标(如欧氏距离或余弦相似性)。 欧几里得距离测量 n 维空间中两个向量之间的直线距离,而余弦相似性测量两个向量之间夹角的余弦值。

要更有效地搜索 vector 字段,可使用余弦距离和 HNSW(分层可导航小世界的缩写)在 bill_summaries 上创建一个索引。 HNSW 允许 pgvector 使用基于图形的最新算法来近似最近邻域查询。

CREATE INDEX ON bill_summaries USING hnsw (bill_vector vector_cosine_ops);

现在一切就绪,你可以对数据库执行余弦相似性搜索查询了。

在下面的查询中,为输入问题生成了嵌入,然后该嵌入被强制转换为一个矢量数组 (::vector),这样就可以将其与 bill_summaries 表中存储的矢量进行比较。

SELECT bill_id, title FROM bill_summaries
ORDER BY bill_vector <=> azure_openai.create_embeddings('embeddings', 'Show me bills relating to veterans entrepreneurship.')::vector
LIMIT 3;

该查询使用 <=> 矢量运算符,它表示用于计算多维空间中两个矢量之间距离的“余弦距离”运算符。

集成 Azure 认知服务

azure_ai 扩展的 azure_cognitive 架构中包含的 Azure AI 服务集成提供了一套丰富的 AI 语言功能,可直接从数据库使用。 这些功能包括情绪分析、语言检测、关键短语提取、实体识别和文本摘要。 可通过 Azure AI 语言服务启用这些功能。

要查看可通过该扩展使用的全部 Azure AI 功能,请查看将 Azure Database for PostgreSQL 灵活服务器与 Azure 认知服务集成

设置 Azure AI 语言服务终结点和密钥

azure_openai 函数一样,要使用 azure_ai 扩展成功调用 Azure AI 服务,必须提供 Azure AI 语言服务的终结点和密钥。 在 Azure 门户中导航到语言服务资源,然后从左侧菜单中选择“资源管理”下的“密钥和终结点”项来检索这些值。 复制你的终结点和访问密钥。 可以使用 KEY1KEY2

在以下命令中,将 {endpoint}{api-key} 令牌替换为你从 Azure 门户检索到的值,然后在 psql 命令提示符处运行命令,将值添加到配置表。

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

汇总账单

为了演示 azure_ai 扩展的 azure_cognitive 函数的一些功能,你生成了每个账单的摘要。 azure_cognitive 架构提供了两个用于汇总文本的函数:summarize_abstractivesummarize_extractive。 抽象式摘要生成的摘要会从输入文本中捕获主要概念,但可能不会使用相同的字词。 抽取式摘要会通过从输入文本中提取关键句子来组成摘要。

要使用 Azure AI 语言服务的功能生成新的原创内容,请使用 summarize_abstractive 函数创建文本输入的摘要。 在 psql 处再次使用 \df 元命令,这次专门关注 azure_cognitive.summarize_abstractive 函数。

\df azure_cognitive.summarize_abstractive

\df azure_cognitive.summarize_abstractive 命令的输出中的 Argument data types 属性显示了函数期望的参数列表。

参数 类型 默认 说明
text text 要汇总的输入文本。
language text 输入文本所用语言的双字母 ISO 639-1 表示形式。 查看语言支持,了解允许的值。
timeout_ms integer 3600000 超时的毫秒数,超过该时间后操作将停止。
throw_on_error boolean 指示函数是否应在错误时引发异常并导致包装事务回滚的标志。
sentence_count integer 3 要包含在生成的摘要中的最大句子数。
disable_service_logs boolean false 语言服务会将你的输入文本记录 48 小时,仅用于排除故障。 将此属性设置为 true 后,会禁用输入日志记录,并可能会限制我们调查所发生的问题的能力。 有关详细信息,请参阅 https://aka.ms/cs-compliance 处的认知服务合规性和隐私说明,以及 https://www.microsoft.com/ai/responsible-ai 处的 Microsoft 负责任 AI 原则。

summarize_abstractive 函数需要下列参数:azure_cognitive.summarize_abstractive(text TEXT, language TEXT)

针对 bill_summaries 表的以下查询使用 summarize_abstractive 函数为账单文本生成新的一句话摘要,使你可以将生成式 AI 的强大功能直接整合到查询中。

SELECT
    bill_id,
    azure_cognitive.summarize_abstractive(bill_text, 'en', sentence_count => 1) one_sentence_summary
FROM bill_summaries
WHERE bill_id = '112_hr2873';

该函数还可用于将数据写入数据库表。 修改 bill_summaries 表以添加一个新列,用于在数据库中存储一句话摘要。

ALTER TABLE bill_summaries
ADD COLUMN one_sentence_summary TEXT;

接下来,用摘要更新表。 summarize_abstractive 函数会返回文本的数组 (text[])。 array_to_string 函数会将返回值转换为其字符串表示形式。 在下面的查询中,throw_on_error 参数已设置为 false。 此设置允许摘要过程在发生错误时继续。

UPDATE bill_summaries b
SET one_sentence_summary = array_to_string(azure_cognitive.summarize_abstractive(b.bill_text, 'en', throw_on_error => false, sentence_count => 1), ' ', '')
where one_sentence_summary is NULL;

在输出中,你可能会注意到有关无效文档的警告,提示无法为它们生成适当的摘要。 此警告产生的原因是在上述查询中将 throw_on_error 设为了 false。 如果该标志被留为默认值 true,则查询将失败,并且不会将任何摘要写入数据库。 要查看引发警告的记录,请执行以下操作:

SELECT bill_id, one_sentence_summary FROM bill_summaries WHERE one_sentence_summary is NULL;

然后,可以查询 bill_summaries 表以查看 azure_ai 扩展为表中其他记录生成的新一句摘要。

SELECT bill_id, one_sentence_summary FROM bill_summaries LIMIT 5;

结论

恭喜,你刚刚学会了如何使用 azure_ai 扩展将大型语言模型和生成式 AI 功能集成到数据库中。