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

采用 Azure SQL 数据库的智能应用程序

适用于:Azure SQL 数据库

本文概述了如何使用人工智能 (AI) 选项(如 OpenAI 和矢量)构建采用 Azure SQL 数据库的智能应用程序。

有关示例,请访问 SQL AI 示例存储库

观看 Azure SQL 数据库 Essentials 系列中的此视频,大致了解如何构建 AI 就绪应用程序:

概述

大型语言模型 (LLM) 使开发人员能够创建具有熟悉用户体验的 AI 支持的应用程序。

如果模型能在正确的时间从应用程序的数据库中访问正确的数据,那么在应用程序中使用 LLM 就能带来更大的价值和更好的用户体验。 此过程称为检索增强生成 (RAG),Azure SQL 数据库有许多支持这种新模式的功能,使其成为构建智能应用程序的绝佳数据库。

以下链接提供了用于构建智能应用程序的各种 Azure SQL 数据库选项的示例代码:

AI 选项 说明
Azure OpenAI 为 RAG 生成嵌入内容,并与 Azure OpenAI 支持的任何模型集成。
矢量化 了解如何在 Azure SQL 数据库中存储和查询矢量。
Azure AI 搜索 将 Azure SQL 数据库与 Azure AI 搜索结合使用,从而使用数据训练 LLM。
智能应用程序 了解如何使用可在任何应用场景中复制的通用模式创建端到端解决方案。
Copilot skills in Azure SQL Database 了解旨在简化 Azure SQL 数据库驱动的应用程序的设计、操作、优化和运行状况的一组 AI 辅助体验。

使用 Azure SQL 数据库和 Azure OpenAI 实现 RAG 的关键概念

本部分包含使用 Azure SQL 数据库和 Azure OpenAI 实现 RAG 所必需的关键概念。

检索增强生成 (RAG)

RAG 是一种技术,通过从外部源检索其他数据,增强了 LLM 生成相关性和信息性响应的能力。 例如,RAG 可以查询包含与用户问题或提示相关的特定领域知识的文章或文档。 当生成响应时,LLM 可以使用检索到的数据作为参考。 例如,使用 Azure SQL 数据库的简单 RAG 模式可以:

  1. 将数据插入 Azure SQL 数据库表。
  2. 将 Azure SQL 数据库链接到 Azure AI 搜索。
  3. 创建 Azure OpenAI GPT4 模型并将其连接到 Azure AI 搜索。
  4. 使用应用程序和 Azure SQL 数据库中经过训练的 Azure OpenAI 模型聊天并询问有关数据的问题。

具有提示工程的 RAG 模式通过向模型提供更多上下文信息来提高响应质量。 RAG 通过将相关的外部源纳入生成过程,使模型能够应用更广泛的知识库,从而获得更全面、更明智的回答。 有关 LLM 接地的详细信息,请参阅 LLM 接地 - Microsoft Community Hub

提示和提示工程

提示是指特定的文本或信息,这些文本或信息用作 LLM 的指令,或作为 LLM 进行构建的上下文数据基础。 提示可以采用各种形式,例如问题、语句甚至代码片段。

可用于从 LLM 生成回答的示例提示:

  • 指令:向 LLM 提供指令
  • 主要内容:向 LLM 提供信息以供处理
  • 示例:帮助将模型设置为特定任务或进程
  • 提示:将 LLM 的输出定向到正确的方向
  • 支持内容:表示 LLM 可用于生成输出的补充信息

为方案创建高质量提示的过程称为提示工程。 有关提示和提示工程最佳做法的详细信息,请参阅 Azure OpenAI 服务

令牌

标记是通过将输入文本拆分为较小的段而生成的小文本块。 这些段可以是单词或字符组,长度从单个字符到整个单词不等。 例如,单词 hamburger 将分为多个标记 (如 hamburger),而短的常用单词 (如 pear ) 将被视为单个标记。

在 Azure OpenAI 中,提供给 API 的输入文本将转换为标记 (标记化) 。 每个 API 请求中处理的标记数取决于多种因素,例如输入、输出和请求参数的长度。 正在处理的标记数量也会影响模型的响应时间和吞吐量。 在 Azure OpenAI 的单次请求/响应中,每个模型可以使用的 token 数量都有限制。 要了解详细信息,请参阅 Azure OpenAI 服务配额和限制

向量

矢量是数字的有序数组 (通常是浮点),可以表示有关某些数据的信息。 例如,图像可以表示为像素值的矢量,或者文本字符串可以表示为矢量或 ASCII 值。 将数据转换为矢量的过程称为矢量化

嵌入

嵌入是表示数据重要特征的矢量。 嵌入通常是通过使用深度学习模型来学习的,机器学习和 AI 模型利用嵌入作为特征。 嵌入还可以捕获相似概念之间的语义相似性。 例如,在为单词“person”和“human”生成嵌入时,我们期望它们的嵌入 (矢量表示形式) 值相似,因为这两个单词在语义上也相似。

Azure OpenAI 拥有从文本数据创建嵌入的模型。 该服务将文本分解为标记,并使用 OpenAI 预先训练的模型生成嵌入。 要了解详细信息,请参阅使用 Azure OpenAI 创建嵌入

矢量搜索是指在语义上类似于特定查询矢量的数据集中查找所有矢量的过程。 因此,对于单词 human 的查询矢量会在整个字典中搜索语义相似的单词,并找到与之高度匹配的单次 person。 这种匹配度或距离可使用相似性指标 (如余弦相似性) 衡量。 矢量相似度越接近,它们之间的距离就越小。

考虑这样一个场景,你需要在数百万个文档中运行查询,以找到数据中最相似的文档。 你可以使用 Azure OpenAI 为数据和查询文档创建嵌入。 然后,你可以执行矢量搜索,以从数据集中查找最相似的文档。 但是,对少量示例执行矢量搜索的意义不大。 在数以千计或数以百万计的数据点上执行相同打搜索极具挑战性。 穷举搜索和最近的邻域(ANN)搜索方法之间也存在权衡,包括延迟、吞吐量、准确性和成本,所有这些都取决于应用的要求。

由于 Azure SQL 数据库嵌入可以使用列存储索引支持进行高效存储和查询,从而允许精确的最近的邻域搜索并具有出色的性能,因此不必在准确度和速度之间做出决定:你可以两者兼得。 在集成解决方案中将矢量嵌入与数据一起存储,最大程度减少了数据同步管理的需求,并加快了 AI 应用开发的上市时间。

Azure OpenAI

嵌入是指将现实世界表示为数据的过程。 文本、图像或声音都可以转换为嵌入内容。 Azure OpenAI 模型能够将现实世界的信息转换为嵌入内容。 模型可用以 REST 端点的形式提供,因此可以使用 sp_invoke_external_rest_endpoint 系统存储过程从 Azure SQL 数据库轻松使用:

DECLARE @retval INT, @response NVARCHAR(MAX);
DECLARE @payload NVARCHAR(MAX);

SET @payload = JSON_OBJECT('input': @text);

EXEC @retval = sp_invoke_external_rest_endpoint @url = 'https://<openai-url>/openai/deployments/<model-name>/embeddings?api-version=2023-03-15-preview',
    @method = 'POST',
    @credential = [https://<openai-url>/openai/deployments/<model-name>],
    @payload = @payload,
    @response = @response OUTPUT;

SELECT CAST([key] AS INT) AS [vector_value_id],
    CAST([value] AS FLOAT) AS [vector_value]
FROM OPENJSON(JSON_QUERY(@response, '$.result.data[0].embedding'));

使用对 REST 服务的调用获取嵌入只是使用 SQL 数据库 和 OpenAI 时拥有的集成选项之一。 你可以让任何可用模型访问在 Azure SQL 数据库中存储的数据,以创建用户可以与数据交互的解决方案,例如以下示例。

使用存储在 Azure SQL 数据库中的数据回答问题的 AI 机器人的屏幕截图。

有关使用 SQL 数据库 和 OpenAI 的其他示例,请参阅以下文章:

矢量化

尽管 Azure SQL 数据库没有原生矢量类型,但矢量本质是有序元组,而关系数据库非常擅长管理元组。 可以将元组视为表中行的正式术语。

Azure SQL 数据库还支持列存储索引和批处理模式执行。 基于矢量的方法用于批处理模式处理,这意味着批处理中的每一列都有自己的存储位置,并在其中存储为矢量。 这样就可以更快地更高效地批量处理数据。

以下示例显示如何在 SQL 数据库中存储矢量:

CREATE TABLE [dbo].[wikipedia_articles_embeddings_titles_vector]
(
    [article_id] [int] NOT NULL,
    [vector_value_id] [int] NOT NULL,
    [vector_value] [float] NOT NULL
)
GO

CREATE CLUSTERED COLUMNSTORE INDEX ixc
    ON dbo.wikipedia_articles_embeddings_titles_vector
    ORDER (article_id);
GO

有关使用 Wikipedia 文章的公共子集以及已使用 OpenAI 生成的嵌入的示例,请参阅使用 Azure SQL 数据库和 OpenAI 进行矢量相似度搜索

要在 Azure SQL 数据库中利用矢量搜索,另一个方法是使用集成矢量化功能来集成 Azure AI:使用 Azure SQL 数据库 和 Azure AI 搜索进行矢量搜索

使用 Azure SQL 数据库和 Azure AI 搜索实现 RAG 模式。 由于 Azure AI 搜索与 Azure OpenAI 和 Azure SQL 数据库的集成,可以对 Azure SQL 数据库中存储的数据运行支持的聊天模型,而无需训练或微调模型。 通过在数据上运行模型,可以更准确、更快速地在数据上进行聊天和分析。

智能应用程序

Azure SQL 数据库可用于构建包含 AI 功能的智能应用程序,例如推荐系统和检索增强生成 (RAG) 技术,如下图所示:

使用 Azure SQL 数据库生成智能应用程序的不同 AI 功能示意图。

有关使用会话抽象作为示例数据集构建支持 AI 的应用程序的端到端示例,请参阅:

LangChain 集成

LangChain 是一个广为人知的框架,用于开发由语言模型提供支持的应用程序。

有关演示如何使用 LangChain 根据自己的数据创建聊天机器人的示例,请参阅使用 Azure OpenAI GPT-4 为 Azure SQL 构建自己的 DB Copilot

语义内核集成

语义内核是一个开源 SDK,可轻松构建可以调用现有代码的代理。 作为高度可扩展的 SDK,可将 Semantic Kernel 与 OpenAI、Azure OpenAI、Hugging Face 等模型一起使用! 通过将现有的 C#、Python 和 Java 代码与这些模型相结合,可以构建能够回答问题和自动化流程的代理。

Microsoft Copilot skills in Azure SQL Database

Microsoft Copilot skills in Azure SQL Database(预览版)是一组 AI 辅助体验,旨在简化 Azure SQL 数据库驱动的应用程序的设计、操作、优化和运行状况。 Copilot 可以通过提供自然语言到 SQL 转换和自助数据库管理,来提高工作效率。

Copilot 为用户问题提供相关答案,通过利用数据库上下文、文档、动态管理视图、查询存储和其他知识源来简化数据库管理。 例如:

  • 数据库管理员可以独立管理数据库并解决问题,或详细了解数据库的性能和功能。
  • 开发人员可以像打字或说话一样来生成 T-SQL 查询,从而询问有关数据的问题。 开发人员还可以了解如何通过生成的查询的详细说明更快地编写查询。

注意

Microsoft Copilot skills in Azure SQL Database 当前为预览版,仅面向有限数量的早期采用者。 要注册此计划,请访问请求访问 Azure SQL 数据库的 Copilot 助手:个人预览版

Azure SQL 数据库的 Copilot 助手预览版包含以下两种 Azure 门户版本:

门户位置 体验
Azure 门户查询编辑器 自然语言到 SQL适用于 Azure SQL 数据库的 Azure 门户查询编辑器内的这种体验将自然语言查询转换为 SQL,使数据库交互更加直观。 有关自然语言到 SQL 功能的教程和示例,请参阅 Azure 门户查询编辑器(预览版)中的自然语言到 SQL
Microsoft Copilot for Azure Azure Copilot 集成:此体验将 Azure SQL 技能添加到 Microsoft Copilot for Azure,为客户提供自我引导式协助,使他们能够独立管理数据库和解决问题。

有关详细信息,请参阅有关 Microsoft Copilot skills in Azure SQL Database(预览版)的常见问题解答