了解 Azure Database for PostgreSQL 的 RAG 模式

已完成

假设你正在构建一个内部助理来回答有关公司策略的员工问题。 大型语言模型(LLM)可以生成流畅的响应。 但是,如果它无权访问最新的公司数据,LLM 会提供过时或不正确的答案。 检索扩充生成(RAG) 通过将 LLM 的推理能力与你自己的数据的准确性相结合来解决此问题。

为什么 RAG 很重要

LLM 经过海量文本训练,但并不了解你所在组织的数据或专有内容。 为了解决此问题,RAG 从你提供的受信任来源检索相关信息,从而奠定了 LLM 模型的响应。 此方法可提高准确性,减少可能不正确的 AI 生成的响应,并确保答案基于你控制的事实。

RAG 管道的工作原理

RAG 管道由多个关键组件组成,这些组件协同工作以提供准确且相关的响应。 将 RAG 视为一系列协同工作的步骤:

  • 准备和存储内容:将文档分解为较小的区块,并存储它们以高效搜索。
  • 创建嵌入内容:将文本转换为数字向量,以捕获含义,因此即使措辞不同,也可以查找相关内容。
  • 检索相关的区块:当用户提出问题时,系统会使用矢量相似性搜索在数据库中查找最相似的区块。
  • 生成答案:检索的区块通常传递给调用语言模型的应用程序,进而从实际数据中生成自然语言响应。

因此,例如,如果将公司策略存储在数据库中,则 RAG 管道可以帮助检索你自己的公司最相关的策略,而不是 LLM 本身可能提供的通用数据。

Azure Database for PostgreSQL 在 RAG 管道中的作用

Azure Database for PostgreSQL 可以处理此管道的检索层。 Azure Database for PostgreSQL 包括对矢量嵌入和相似性搜索的内置支持。 这意味着,可以使用数据库的功能有效地管理和查询嵌入内容。 Azure Database for PostgreSQL 提供了两个关键扩展,使此过程成为可能:

  • azure_ai 扩展:直接从 SQL 调用 Azure AI 服务(如 Azure OpenAI)以生成嵌入内容。 它还提供语义 运算符 ,这些运算符可以生成响应(azure_ai.generate)、计算语句(azure_ai.is_true)、提取结构化值(azure_ai.extract)并在数据库中重新调整文档(azure_ai.rank)。 这些功能支持高级生成和推理工作流,而无需离开 SQL 环境。
  • vector (pgvector) 扩展:存储数据库中的嵌入内容,并高效运行相似性搜索。

因此,无需单独的向量数据库。 可以将所有内容、结构化数据、元数据和嵌入内容保存在 PostgreSQL 实例中,这也简化了治理和安全性。

简单的 RAG 示例

例如,Azure Database for PostgreSQL 可用于为公司内部知识库实现 RAG 管道。 应用程序使用 Azure Database for PostgreSQL 查询数据库以获取相关文档,并将其用作生成答案的上下文。 然后将该上下文馈送到语言模型中,以生成自然语言响应。

例如,假设你有一个称为 company_policies公司策略的表。 可以使用 azure_ai 扩展为每个策略生成嵌入内容,并将其与同一表上的文本一起存储。 这样,当员工提出问题时,问题将被转换为嵌入向量,你可以立即检索到匹配的公司策略。 以下 SQL 命令演示如何设置此内容:

注释

在你可以运行 CREATE EXTENSION 命令启用这些扩展之前,必须先通过 Azure 门户或 CLI 命令在 Azure Database for PostgreSQL 服务器上将 azure_aivector 添加到 azure.extensionsServer 参数

-- Enable required extensions (to enable, only need to be run once per database)
CREATE EXTENSION IF NOT EXISTS azure_ai;
CREATE EXTENSION IF NOT EXISTS vector;

-- Configure Azure OpenAI endpoint and key (requires azure_ai_settings_manager role)
SELECT azure_ai.set_setting('azure_openai.endpoint', '<your-endpoint>');
SELECT azure_ai.set_setting('azure_openai.subscription_key', '<your-key>');

-- Create a table to store documents and embeddings
CREATE TABLE IF NOT EXISTS company_policies (
    id bigserial PRIMARY KEY,
    title text,
    policy_text text NOT NULL,
    embedding vector(1536) -- set to your model's dimension
);

-- Insert a sample row and generate its embedding in one step.
-- Obviously your table will have hundreds, thousands or millions of rows.
INSERT INTO company_policies (title, policy_text, embedding)
VALUES (
    'vacation policy',
    'Employees receive 15 vacation days per year. Unused days can roll over to the next year.',
    azure_openai.create_embeddings('<embedding-deployment-name>',
                                   'Employees receive 15 vacation days per year. Unused days can roll over to the next year.')
);

-- Run a quick test to retrieve the most similar chunk to a sample question.
-- Notice how you are converting the question into an embedding for the search,
-- then using that embedding to find the closest match in the database.
SELECT id, title, policy_text
FROM company_policies
ORDER BY embedding <-> azure_openai.create_embeddings('<embedding-deployment-name>',
                                                      'How many vacation days do employees get?')::vector
LIMIT 1;

-- This query returns the most relevant row that matches the query. 
-- The final step on a RAG is to pass 'both' the returned row(s) and the question back 
-- to your application. Your application then passes that context to the LLM
-- to generate a natural language answer.

在此示例中,该表现在已准备好存储策略及其嵌入矢量。 可以使用 SQL 命令将策略插入表中,并使用 Azure AI 服务生成嵌入。 你将在后面的部分中介绍索引编制和查询这些嵌入内容。

无论自己的解决方案的复杂性如何,都可以使用类似的方法来设置自己的环境。 首先,启用所需的扩展,然后使用各自的矢量列创建表,然后开始插入内容并将其嵌入在一起。 然后,您提出问题,并将这些问题的嵌入与表格的嵌入进行比较。 最后,从数据库返回的行用于向 LLM 提供上下文以生成自然语言答案。 通过这些步骤,可以轻松在 PostgreSQL 数据库的基础上生成 RAG 应用程序。

关键结论

Azure Database for PostgreSQL 可以通过应用其内置的 AI 和矢量搜索功能来有效实现 RAG 模式。 该 azure_ai 扩展允许与 Azure OpenAI 和 Azure AI Services 无缝集成,以便直接在 SQL 查询中生成嵌入内容、创建聊天完成以及使用语义运算符执行文本生成、信息提取、真相评估和排名等任务。 vector (pgvector) 扩展有助于高效存储和检索嵌入内容,因此无需单独的矢量数据库即可执行相似性搜索。 将这些方法应用于新场景时应从小规模开始,在自己的环境中完善方法后再逐步扩大范围。