az-oai-ess-merge-1

94 阅读1小时+

Azure OpenAI 精要(二)

原文:annas-archive.org/md5/9abfdbcdb0ce520c427f6f94336e2401

译者:飞龙

协议:CC BY-NC-SA 4.0

第六章:从结构化数据库查询

在上一章中,我们学习了如何使用 ChatGPT 分析客户对话并获取有用的信息。现在,让我们假设我们已将所有这些宝贵的信息存储在一个 SQL 数据库中。正如你所想,这个数据库就像一个装满了各种重要细节的宝箱。

认识 Sarah,我们的超级客户关怀经理。她的工作是揭开这些数据海洋中隐藏的故事。在过去,找到这些故事意味着必须精通 SQL 查询,这是一种并非每个人都能理解的语言。编写这些查询就像解谜,即使是经验丰富的用户也需要花费大量时间。

但是现在,一个新篇章开始了——SQL GPT 的诞生。Sarah 不再被复杂的 SQL 规则困扰,她现在有了一个能够理解简单语言的工具。她不再需要编写复杂的查询,而是像和朋友聊天一样与数据库对话。

使用 SQL GPT,Sarah 通过简单的英文提示探索数据库的分析结果。想了解上个月的满意度评分或音频对话的数量吗?只需提问即可!

在本章中,我们开始了一个简化数据的使命。SQL GPT 作为数据库复杂世界与各个技能层次用户之间的友好桥梁,将日常问题转化为强大的 SQL 查询。我们将一起探索,这个工具如何使数据变得易于访问,并帮助像 Sarah 一样的人轻松发现有价值的见解。虽然 SQL GPT 是学习 SQL 的初学者的好帮手,但它对于经验丰富的用户来说同样宝贵,帮助他们毫不费力地编写复杂的查询。让我们一起踏上这段激动人心的旅程,解锁数据的真正潜力!

本章涵盖以下主题:

  • 架构设计

  • 开发 SQL GPT 部分

技术要求

为了跟上本章中的实践练习,访问本章 GitHub 仓库中的源代码:github.com/PacktPublishing/Azure-OpenAI-Essentials/blob/main/Chapter6.ipynb

以下是第四章中已经配置的要求:

  • Python 3.9、3.10 或 3.11 - www.python.org/downloads/

  • Azure 开发者 CLI - Azure 开发者 CLI 安装

  • Node.js 14+ - nodejs.org/en/download

  • Git - git-scm.com/downloads

  • Powershell 7+ (pwsh) - github.com/powershell/powershell

  • Azure 账户 - 如果你是 Azure 新手,可以免费获取一个 Azure 账户,并且会得到一些免费的 Azure 积分来开始使用。

  • 启用 Azure OpenAI 服务的 Azure 订阅。你可以通过这个表格申请访问权限。

  • Azure OpenAI 连接和模型信息:

    • OpenAI API 密钥

    • OpenAI 嵌入模型部署名称

    • OpenAI API 版本

  • 一个带有数据库连接字符串的 SQL 服务器

正如我们所见,我们只需要一个带有数据库连接字符串的 SQL 服务器,另外还需要 第五章第四章 中特定要求。

架构设计

我们的 GPT 解决方案开发过程始于用户发送文本查询。Azure OpenAI 处理此查询,将其转换为 SQL 命令,然后传递给 SQL 服务器。SQL 服务器执行命令并返回结果,然后将结果发送回用户。这在以下图像中表示:

图 6.1:解决方案架构图

图 6.1:解决方案架构图

在上述架构图中,我们看到三个关键组件:用户、Azure OpenAI 和一个 SQL 服务器。箭头显示了这些组件之间数据的流动。

开发一个 SQLGPT 解决方案

现在我们已经了解了在 Azure 门户中创建此解决方案所需的架构元素,请继续执行这些组件的实施。如 第四章 所述,为了完成本节,必须拥有活跃的 Azure 帐户。有关使用活跃订阅设置 Azure 帐户和 Azure OpenAI 服务资源的详细信息,请参阅 第四章

让我们来看看在 Azure 中创建 SQL 服务器的步骤:

在 Azure 中创建 SQL Server

要创建 SQL Server,我们将使用以下步骤:

  1. 打开 portal.azure.com

  2. 导航到顶部导航中的搜索栏,并搜索 “SQL Database”。

  3. 如果在搜索结果中找不到,请点击“ SQL Database

图 6.2:选择 SQL 数据库

图 6.2:选择 SQL 数据库

  1. 点击 创建

  2. 选择 azure-openai-rg)。

图 6.3:输入数据库详细信息

图 6.3:输入数据库详细信息

  1. 现在给你想要的数据库名称和服务器以供数据库使用。

  2. 对于服务器,选择“创建新的”,并使用以下值填写新服务器表单 - 服务器名称位置认证方法服务器管理员登录密码,然后点击 确定

图 6.4:输入 SQL Server 详细信息

图 6.4:输入 SQL Server 详细信息

一旦服务器创建完成,我们需要选择服务器以创建 SQL 数据库。

  1. 选择工作负载环境,计算+存储,然后点击 下一步。在 网络 选项卡中,将 添加当前客户端 IP 地址 切换到

图 6.5:输入 SQL 数据库详细信息

图 6.5:输入 SQL 数据库详细信息

  1. 网络 页面点击 下一步,将 安全性额外设置标签 设为默认值,然后进入 审阅 + 创建 页面:

图 6.6:审阅页面

图 6.6:审阅页面

  1. 查看所有详细信息并点击创建按钮以创建 SQL Server 和数据库。

现在,我们已经在 Azure 门户中设置了所有必要的服务,可以开始构建我们的解决方案了。

使用 Azure SQL 和 ChatGPT 的解决方案

为了开发代码,我将在 Jupyter notebook 中工作,其余的安装与 第四章 中相同。你可以在本书 GitHub 仓库的第六章文件夹中找到所有必要的项目,包括 Python notebook,链接为 - github.com/PacktPublishing/Azure-OpenAI-Essentials/blob/main/Chapter6.ipynb

除了在 第四章 中安装的软件包外,你还需要安装一个额外的 Python 库。

创建一个新的 Jupyter Notebook,并安装以下软件包:

pip install pyspark

我们的代码包括以下几个部分,在这些部分中我们将开发解决方案:

  1. 导入包

  2. 设置数据库连接字符串

  3. 示例查询测试

  4. 使用部署的 ChatGPT 模型

  5. 创建一个 Pandas 代理并提问

导入包

我们需要在开发解决方案之前导入所需的包。

import pyodbc
import pandas as pd
from langchain.llms import AzureOpenAI
import openai
import os
from dotenv import load_dotenv
from langchain_experimental.agents.agent_toolkits import (
    create_spark_dataframe_agentimport openai)

你可以看到上面的代码中使用了多种库。我们来详细了解一下这些库,在下表中查看:

导入的包描述
pyodbc一个用于 ODBC(开放数据库连接)数据库访问的 Python 模块。
pandas一个强大的 Python 数据操作和分析库。
langchain.llms.AzureOpenAI来自“langchain”软件包的一个模块,用于处理语言模型,特别是 Azure OpenAI。
openaiOpenAI Python 库,提供对 OpenAI GPT 模型的访问。
os提供与操作系统交互的方式,包括读取或设置环境变量。
dotenv.load_dotenv从 .env 文件加载环境变量到脚本的环境中。
langchain_experimental.agents.agent_toolkits.``create_spark_dataframe_agent一个创建 Spark DataFrame 代理的函数,用于实验目的。
langchain_experimental.agents.agent_toolkits.``create_pandas_dataframe_agent一个创建 Pandas DataFrame 代理的函数,用于实验目的。

表 6.1:导入的包使用说明

现在,让我们使用 .env 文件中提供的密钥初始化所有必要的常量。我们将 “DATABASESERVER” 、” DATABASE” 、 “DATABASEUSERNAME” 和 “DATABASEPASSWORD” 添加到我们在 第四章 中的 .env 文件中。

# Azure
load_dotenv()
OPENAI_API_KEY = os.getenv("OPENAI_API_KEY")
OPENAI_DEPLOYMENT_ENDPOINT =os.getenv("OPENAI_DEPLOYMENT_ENDPOINT")
OPENAI_DEPLOYMENT_NAME = os.getenv("OPENAI_DEPLOYMENT_NAME")
OPENAI_MODEL_NAME = os.getenv("OPENAI_MODEL_NAME")
OPENAI_API_VERSION = os.getenv("OPENAI_API_VERSION")
OPENAI_DEPLOYMENT_VERSION =os.getenv("OPENAI_DEPLOYMENT_VERSION")
server = os.getenv("DATABASESERVER")
database = os.getenv("DATABASE")
username = os.getenv("DATABASEUSERNAME")
password = os.getenv("DATABASEPASSWORD")
#init Azure OpenAI
openai.api_type = "azure"
openai.api_version = OPENAI_DEPLOYMENT_VERSION
openai.api_base = OPENAI_DEPLOYMENT_ENDPOINT
openai.api_key = OPENAI_API_KEY
load_dotenv()

将这些添加到我们在 第四章 创建的 .env 文件中,并包括 connectionStringendpoints

DATABASESERVER = 'tcp :{server}, 1433'
DATABASE = '{name}'
DATABASEUSERNAME = '{username}'
DATABASEPASSWORD = '{password}'

按照以下步骤将 SQL Server 端点添加到 .env 文件中。所需的详细信息可以在 Azure 门户中的 连接字符串 -> ODBC 部分找到

  1. 更新 DATABASESERVER 的值为你在 SQL 数据库页面中找到的 服务器名称

  2. 同样,修改 DATABASE 的值为数据库名称。

  3. 同样,更新你在设置数据库时设置的 DATABASEUSERNAMEDATABASEPASSWORD

图 6.7:连接字符串

图 6.7:连接字符串

我们得到以下输出:

Out[2]:    True

设置数据库连接字符串

这段代码是连接到 SQL Server 数据库的常见模式,使用 pyodbc 在 Python 中指定连接参数,参数位于 connectionString 中。生成的连接 (cnxn) 和游标 (cursor) 可用于通过 SQL 查询与数据库进行交互。

connectionString = f'DRIVER={{ODBC Driver 18 for SQL Server}};SERVER={server};DATABASE={database};UID={username};PWD={password};Encrypt=yes;TrustServerCertificate=no;Connection Timeout=30;'
cnxn = pyodbc.connect(connectionString)
cursor = cnxn.cursor()

现在我们已经将连接字符串集成到 SQL 数据库中,是时候通过执行示例查询来验证它们了。在我的经验中,我见过多次开发人员在获取正确的连接字符串时遇到困难,最佳方式是直接从源(如 Azure 门户)复制并粘贴。如果你是自己格式化的,请确保密码或用户名中没有特殊字符。

这段代码有助于从指定的 SQL 表中提取一部分数据,并在 Pandas DataFrame 中进行可视化,这是在 Python 中处理数据时的典型操作。

# select 10 rows from SQL table to insert in dataframe.
query = "select * from [SalesLT].[Address];"
df = pd.read_sql(query, cnxn)
print(df.head(10))

我们得到以下输出:

图 6.8:SQL 查询输出概述

图 6.8:SQL 查询输出概述

使用部署的 ChatGPT 模型

从之前的输出可以确认,SQL 连接已成功建立,这使得我们可以从 Python 代码中执行数据库查询。

提供的代码片段初始化了一个 AzureOpenAI 类的实例,假设 OPENAI_DEPLOYMENT_NAMEOPENAI_MODEL_NAME 是存储目标部署和模型名称的变量,用于使用该模型。

llm = AzureOpenAI(deployment_name=OPENAI_DEPLOYMENT_NAME, 
    model_name=OPENAI_DEPLOYMENT_NAME)

创建 Pandas 代理并提问

从前一步继续,代码初始化了一个实验性代理,能够与 Pandas DataFrame 和语言模型进行自然语言交互。它发出了一个查询,“有多少行?”,预计代理将根据 DataFrame 进行解析并作出响应。

agent = create_pandas_dataframe_agent(llm, df, verbose=True)
x`

我们得到以下输出:

图 6.9:我们代理创建的示例输出

图 6.9:我们代理创建的示例输出

现在让我们通过尝试各种提示来评估代理的有效性,以便从 SQL 数据库中获取数据。

第一个提示:“每个国家区域的频率是多少?”

agent.run("what is the frequency of each country region")

我们得到以下输出:

图 6.10:我们提示的 SQL 输出

图 6.10:我们提示的 SQL 输出

第二个提示:“列出 10 个独特的城市名”

agent.run("list the name of 10 unique cities")

我们得到以下输出:

图 6.11:我们提示的 SQL 输出

图 6.11:我们提示的 SQL 输出

第三个提示:“有多少个独特的省份?”

agent.run("how many unique state provinces are there?")

我们得到以下输出:

图 6.12:我们提示的 SQL 输出

图 6.12:我们提示的 SQL 输出

有了这个,我们成功地建立了 SQL Server 与 ChatGPT 之间的连接。现在,我们无需直接执行 SQL 查询,而是可以通过 Pandas DataFrame 和 ChatGPT LLM 提供提示来检索 SQL 数据。

总结

本章中,我们深入探讨了如何通过简明的英语提示与 SQL 数据库进行交互。首先,我们通过创建一个 SQL 数据库并通过 PyODBC 库建立无缝连接来奠定基础。我们通过测试简单的 SQL 查询确保了连接的正常性。

接下来,我们引入了一个强大的助手——一个由 ChatGPT 驱动的 Pandas 代理。这对动态组合使我们能够轻松地使用日常英语提示进行查询。本质上,这个 SQL GPT 工具打开了一个领域,在这个领域中,任何人都可以轻松地从数据库中提取数据,无论他们是否具备 SQL 知识。这是一个颠覆性的创新,让数据库世界对所有人更加开放和友好。

在下一章中,我们将探讨如何使用 Azure Open AI 为用户提示生成代码和文档。

第七章:代码生成与文档

在上一章中,我们学习了如何使用 Azure Communication Services。我们通过创建一个模拟的帮助者和客户之间的聊天,实际应用了这个技术,使用了 ChatGPT (gpt-3.5-turbo)。接着,我们分析了聊天内容,了解了其中的对话。

尽管我们主要集中在书面消息上,但值得注意的是,Azure Communication Services 不仅仅局限于文本。它还可以处理语音、视频,甚至是多种媒体的混合输入。这种灵活的方式帮助我们从客户的内容中获取重要信息。通过分析这些数据,我们可以为未来的产品改进提供指导。通过尝试不同类型的对话,我们可以发现客户遇到的问题,并利用这些信息来提升我们的产品和服务。

想象你是老师,而你的学生 Taylor 刚开始学习如何编程。Taylor 很兴奋,但对于从哪里开始有些困惑。

现在,登场的是你的秘密武器:一款由 Azure OpenAI 提供支持的智能机器人。这个机器人就像一个能帮助你创建代码并用简单术语解释的朋友。Taylor 可以问它问题,比如,“我如何让电脑说‘Hello, World!’?”然后,砰!机器人生成代码,并逐步解释它的工作原理。

Taylor 的脸上露出了笑容,因为他们让电脑做了一些很酷的事情。但最棒的部分是,机器人不仅仅是一个单纯的功能。Taylor 还可以问它更多的问题,比如“我如何让电脑做某件事反复执行?”然后,机器人会给出一个循环(即重复操作的高级术语),并解释它是如何工作的。

在本章中,我们将探索你作为老师,以及 eager 学习者 Taylor,如何利用这个智能机器人使编程变得简单有趣。我们将一起学习,玩转不同的问题,并看看 Azure OpenAI 如何将编程变成一场酷炫的冒险。准备好参加这场编程派对了吗?你和机器人是 VIP 嘉宾,一起享受编程学习的乐趣!让我们一起深入,享受其中的乐趣吧!

技术要求

要跟随本章的实践练习,请访问本章的 GitHub 仓库中的源代码:github.com/PacktPublishing/Azure-OpenAI-Essentials/blob/main/chapter%207.ipynb

技术要求与第四章相同。作为提醒,请在本地计算机上安装以下工具,以开始解决方案的工作:

您还需要以下内容:

除了这里提到的系统要求外,拥有扎实的基础 Azure 服务知识以及基本的 Python 编程能力(相当于 Python 100 初学者级别)也至关重要。这些技能对于高效地利用和发挥 Azure 服务在本章中的作用非常关键。即使您是 Azure 环境的新手,也可以放心,本章设计时考虑到了初学者,提供了清晰的解释和详细的截图,帮助您顺利学习并走上正轨。

架构图

对于本章,流程很简单——用户向我们准备的 OpenAI 模型提交一个提示,模型随后生成所需的代码片段:

图 7.1:架构图

图 7.1:架构图

让我们开始吧。

构建代码生成器和文档生成解决方案

由于我们在前面的章节中已经在 Azure 门户中设置了所有必要的服务,因此可以开始构建我们的代码生成和文档化解决方案。

使用 Azure OpenAI 的解决方案

要构建此解决方案,我们主要需要使用两个服务:

  • Azure 认知搜索

  • Azure OpenAI 服务

我们在第二章访问 Azure OpenAI(AOAI)服务 部分和第四章使用 Azure OpenAI 和 Azure 认知搜索索引开发问答解决方案 部分中解释了创建这些服务的过程。有关更多信息,请参阅这些章节。

我们可以开始构建我们的解决方案。为了开发代码,我们将使用 Jupyter notebook。

在接下来的章节中,我们将开发我们的解决方案:

  • 导入包

  • 根据用户提示生成代码

导入包

在开发解决方案之前,我们需要先导入所需的包:

import openai
import os
from dotenv import load_dotenv

您可以看到在前面的代码中使用了各种库。接下来,我们将深入了解这些库,并在下表中逐一介绍:

导入的包描述
openaiOpenAI Python 库,提供对 OpenAI 生成预训练变换器GPT)模型的访问。
os提供了一种与操作系统交互的方式,包括读取或设置环境变量。
dotenv.load_dotenv将环境变量从 .env 文件加载到脚本的环境中。

表 7.1:导入包的使用说明

在导入了所有必需的包并配置了 .env 文件中的变量后,如 第四章 所述,我们现在可以继续从 .env 文件中提取这些变量。

以下代码加载 .env 文件,然后访问 .env 文件中定义的变量和连接:

# Azure
load_dotenv()
OPENAI_API_KEY = os.getenv("OPENAI_API_KEY")
OPENAI_DEPLOYMENT_ENDPOINT =os.getenv("OPENAI_DEPLOYMENT_ENDPOINT")
OPENAI_DEPLOYMENT_NAME = os.getenv("OPENAI_DEPLOYMENT_NAME")
OPENAI_MODEL_NAME = os.getenv("OPENAI_MODEL_NAME")
OPENAI_API_VERSION = os.getenv("OPENAI_API_VERSION")
OPENAI_DEPLOYMENT_VERSION =os.getenv("OPENAI_DEPLOYMENT_VERSION")
server = os.getenv("DATABASESERVER")
database = os.getenv("DATABASE")
username = os.getenv("DATABASEUSERNAME")
password = os.getenv("DATABASEPASSWORD")
#init Azure OpenAI
openai.api_type = "azure"
openai.api_version = OPENAI_DEPLOYMENT_VERSION
openai.api_base = OPENAI_DEPLOYMENT_ENDPOINT
openai.api_key = OPENAI_API_KEY
load_dotenv()

我们得到了以下输出:

图 7.2:用于识别 .env 文件加载的输出

图 7.2:用于识别 .env 文件加载的输出

从用户提示生成代码

我们现在已经将所有必需的数据加载到我们的代码中了。

以下代码指示 AI 语言模型根据提供的提示生成一个可以将名字和姓氏添加到数据库中的函数。生成的函数代码随后会被打印出来以供检查:

# Prompt for creating a function to add names to the database
add_names_prompt = '''# Code to Create a function called 'nameImporter' to add a first and last name to the database'''
# Generate completion for creating a function to add names to the database
add_names_response = openai.Completion.create(
    engine=OPENAI_MODEL_NAME,
    prompt=add_names_prompt,
    temperature=1,
    max_tokens=3000,
    top_p=0.2,
)
print("Function to add names to the database:")
print(add_names_response.choices[0].text.strip())

我们得到了以下输出:

图 7.3:用户提示的生成输出

图 7.3:用户提示的生成输出

现在,我们将基于之前生成的数据库从用户提示中创建代码。此代码指示 AI 语言模型根据提供的提示生成一个可以将名字和姓氏添加到数据库中的函数。生成的函数代码随后会被打印出来以供检查:

# Prompt for writing a SQL query to retrieve all records from the database
query_prompt = '''# Now, write a Simple SQL query to retrieve all records for the database created in add_names_response'''
# Generate completion for writing a SQL query to retrieve all records
query_response = openai.Completion.create(
    engine=OPENAI_MODEL_NAME,
    prompt=query_prompt,
    temperature=1,
    max_tokens=3000,
    top_p=0.2,
)
print("\nSQL query to retrieve all records from the database:")
print(query_response.choices[0].text.strip())

我们得到了以下输出:

图 7.4:生成查询的输出

图 7.4:生成查询的输出

至此,我们已经探讨了 ChatGPT 如何通过 SQL 和 GPT 为用户生成代码和文档,从而简化编码任务。

本章的代码片段可以在 GitHub 上找到,访问链接:github.com/PacktPublishing/Azure-OpenAI-Essentials/blob/main/chapter%207.ipynb

总结

在本章中,我们在本地机器上安装了必要的工具,包括 Python、Azure Developer CLI、Node.js、Git 和 PowerShell。我们还确保我们拥有 Azure 账户并订阅了可以访问 Azure OpenAI 服务的权限。此外,我们确保对 Azure 服务和 Python 有基本的了解。

接下来,我们集中精力构建使用 Azure Cognitive Search 和 Azure OpenAI 服务的解决方案。我们在 Jupyter Notebook 中开发代码。首先,我们导入了所需的包,如 openaiosdotenv.load_dotenv。然后,我们加载了 .env 文件并提取了必要的变量,如 OPENAI_API_KEYOPENAI_DEPLOYMENT_ENDPOINT 等。我们使用这些变量初始化了 Azure OpenAI。

在设置环境后,我们生成了一个函数,根据提供的提示将名称添加到数据库中。接着,我们创建了一个 SQL 查询,从刚刚创建的数据库中检索所有记录。最后,我们实现了一个能够根据用户提示生成代码并有效地与数据库交互的功能性解决方案。

第八章:使用 Azure OpenAI 创建一个基本的推荐系统

在上一章中,我们深入探讨了制作一个简单 Python 程序的技巧。这个程序不仅能生成代码片段;它就像一个编程精灵,还能提供所生成代码的文档。这个功能为我们的编程之旅提供了一个启动平台,使得即使是没有编程知识的人也能轻松上手。

想象一下,你和你的朋友准备好享受一个轻松的周五夜晚,打算看一部电影。但问题是,从一大堆电影中挑选一部可不容易。

所以,你想出了一个很酷的主意!与其为选择而烦恼,为什么不创建一些帮助你的东西呢?你决定制作一个聊天机器人,它是一个像有用朋友一样的小程序,了解你喜欢什么类型的电影,并推荐最合适的电影。

现在,想象一下:你和你的朋友准备好零食,告诉你的机器人你想看什么类型的电影。不再需要翻阅无尽的列表——机器人会帮你做艰难的筛选工作,并根据你的喜好给出电影推荐。

这段体验就像拥有一个自己的电影指南,确保完美的周五之夜。当你想到有了这个新的电影指南,电影之夜会变得更轻松、更有趣时,兴奋感油然而生。准备好享受一个无压力的电影之夜吧,带着你的推荐系统。

技术要求

要跟随本章的实操练习,请访问本章 GitHub 仓库中的源代码,地址为github.com/PacktPublishing/Unlocking-Creativity-with-Azure-OpenAI/blob/main/Chapter%208.ipynb

第七章技术要求部分所列出的内容外,不需要额外的技术要求。

然而,你确实需要创建一个 Kaggle 帐户,以生成 API 密钥来获取你选择的数据集。在本章中,我们使用的是 Netflix 数据集,地址为www.kaggle.com/datasets/shivamb/netflix-shows/code

架构图

在本章的解决方案中,用户首先从 Kaggle 等来源获取原始数据集。接着,我们对数据进行规范化和清理,以满足我们的需求。然后,处理后的数据将用于创建嵌入。当用户查询电影推荐时,ChatGPT API 会在嵌入的数据集中进行搜索,并根据用户的输入提供推荐。下图展示了整体工作流程:

图 8.1:架构图

图 8.1:架构图

使用 Azure OpenAI 创建推荐系统

现在我们已经在 Azure 门户中设置了所有必要的服务,我们可以开始构建我们的解决方案。为了开发代码,我们将在一个requirements.txt文件中工作,该文件列出了我们解决方案所需的所有 Python 库。请检查此文件,并使用以下命令安装所需的包:!pip install requirements.txt。然后,按以下步骤继续:

  1. 创建一个 Kaggle 账户。

    访问www.kaggle.com/datasets/shivamb/netflix-shows?resource=download,然后下载 CSV 文件,或者进入设置并通过点击创建新令牌来生成 API 令牌:

图 8.2:生成 Kaggle 令牌

图 8.2:生成 Kaggle 令牌

  1. 导入所需的包。

    使用pip install安装缺失的库,并确保你的openai版本为 0.28.0:

    import openai
    import os
    import re
    import requests
    import sys
    from num2words import num2words
    import pandas as pd
    import numpy as np
    from openai.embeddings_utils import (
        get_embedding, cosine_similarity)
    import tiktoken
    from dotenv import load_dotenv
    #Unzip the downloaded file
    import zipfile
    

    你可以看到在前面的代码中使用了多种库。让我们在下表中深入探讨每一个库:

导入语句描述
import openai提供访问 OpenAI API 的功能,用于与 AI 模型和服务进行交互。
import os提供与操作系统交互的功能,如访问环境变量和文件。
import re提供对正则表达式的支持,允许模式匹配和字符串操作。
import requests启用 HTTP 请求,允许与 Web 服务器和 API 进行交互。
import sys提供系统特定的参数和功能,例如访问命令行参数和 Python 解释器。
from num2words import num2words允许将数字转换为单词。
import pandas as pd提供用于数据操作和分析的数据结构和函数,特别适用于处理表格数据。
import numpy as np提供数值计算功能,包括对数组、矩阵和数学运算的支持。
from openai.embeddings_utils import get_embedding, cosine_similarity提供用于处理嵌入的工具函数,包括生成嵌入和计算余弦相似度。
import tiktoken不是标准的 Python 模块。它似乎是一个自定义或第三方模块。从import语句本身无法确定其用途。
from dotenv import load_dotenv提供从.env文件加载环境变量到环境中的功能。

表 8.1:已导入包的说明

  1. 现在,让我们使用.env文件中提供的密钥初始化所有必要的常量。将"KAGGLE_USERNAME""KAGGLE_KEY"添加到已存在的.env文件中:

    # Azure
    load_dotenv()
    OPENAI_API_KEY = os.getenv("OPENAI_API_KEY")
    OPENAI_DEPLOYMENT_ENDPOINT =os.getenv(
        "OPENAI_DEPLOYMENT_ENDPOINT")
    OPENAI_DEPLOYMENT_NAME = os.getenv("OPENAI_DEPLOYMENT_NAME")
    OPENAI_MODEL_NAME = os.getenv("OPENAI_MODEL_NAME")
    OPENAI_API_VERSION = os.getenv("OPENAI_API_VERSION")
    OPENAI_DEPLOYMENT_VERSION =os.getenv(
        "OPENAI_DEPLOYMENT_VERSION")
    KAGGLE_USERNAME = os.getenv("KAGGLE_USERNAME")
    KAGGLE_KEY = os.getenv("KAGGLE_KEY")
    server = os.getenv("DATABASESERVER")
    database = os.getenv("DATABASE")
    username = os.getenv("DATABASEUSERNAME")
    password = os.getenv("DATABASEPASSWORD")
    #init Azure OpenAI
    openai.api_type = "azure"
    openai.api_version = OPENAI_DEPLOYMENT_VERSION
    openai.api_base = OPENAI_DEPLOYMENT_ENDPOINT
    openai.api_key = OPENAI_API_KEY
    load_dotenv()
    
  2. 将这些内容添加到已经在第六章中创建的包含 Kaggle 信息的.env文件中:

    KAGGLE_USERNAME = '{username}'
    KAGGLE_KEY='{key}'
    
  3. 按照以下步骤设置 Kaggle 凭据:

    1. 一旦你生成了 Kaggle token,正如本节开始时所解释的,会生成一个包含用户名和密钥的 .json 文件。

    2. 使用在 kaggle.json 中找到的用户名值更新 KAGGLE_USERNAME

    3. 同样,使用密钥修改 KAGGLE_KEY 的值。

    完成这些配置后,你将拥有连接资源所需的设置。我们得到了以下输出:

图 8.3:加载 .env 文件后的输出

图 8.3:加载 .env 文件后的输出

  1. 下载数据集。

    这是一个简洁的方式,从 Jupyter notebook 中直接下载 netflix-shows 数据集:

    !kaggle datasets download -d shivamb/netflix-shows
    

    我们得到了以下输出:

图 8.4:从 Kaggle 下载数据集

图 8.4:从 Kaggle 下载数据集

  1. 解压下载的数据集。

    这段代码解压下载的文件,并将其添加到 netflix_dataset 文件夹中:

    with zipfile.ZipFile("netflix-shows.zip", 'r') as zip_ref:
        zip_ref.extractall("netflix_dataset")
    
  2. .csv 文件读取数据。

    这段代码从 .csv 文件中读取数据,并将其导入到 pandas DataFrame 中:

    #Read Data from csv file
    pd.read_csv("netflix_dataset/netflix_titles.csv")
    data
    

    这是输出结果:

图 8.5:.csv 数据的输出

图 8.5:.csv 数据的输出

  1. 获取标题和描述。

    这段代码从整个数据集中获取标题和描述:

    data_content = data[['title', 'description']]
    data_content
    

    这是输出结果:

图 8.6:仅显示标题和描述的输出

图 8.6:仅显示标题和描述的输出

  1. 对数据进行归一化处理。

    'title' column in the data_content DataFrame is normalized by removing excess whitespace, unnecessary punctuation, and newline characters:
    
    pd.options.mode.chained_assignment = None
    # s is input text
    def normalize_text(s, sep_token = " \n "):
        s = re.sub(r'\s+',  ' ', s).strip()
        s = re.sub(r". ,","",s)
        # remove all instances of multiple spaces
        s = s.replace("..",".")
        s = s.replace(". .",".")
        s = s.replace("\n", "")
        s = s.strip()
        return s
    data_content['title']= data_content["title"].apply(
        lambda x : normalize_text(x))
    data_content
    

    这是输出结果:

图 8.7:归一化后数据的输出

图 8.7:归一化后数据的输出

  1. 创建嵌入(embeddings)。

    the embeddings into the data_content DataFrame, laying the groundwork for potential further analysis or applications involving the generated embeddings:
    
    data_content['ada_v2'] = data_content["description"]. apply(
        lambda x : get_embedding(
            x, engine = 'text-embedding-ada-002'))
    

    这是输出结果:

图 8.8:带嵌入的输出

图 8.8:带嵌入的输出

  1. 搜索特定内容。

    这段代码高效地发现数据集中的相似内容。通过计算相似度分数并选择最匹配的项,函数成为寻找所需结果的强大工具:

    def search_docs(df, user_query, top_n=3, to_print=True):
        embedding = get_embedding(
            user_query,
            engine="text-embedding-3-large"
        )
        df["similarities"] = df.ada_v2.apply(
        lambda x: cosine_similarity(x, embedding))
        res = (
            df.sort_values("similarities", ascending=False)
            .head(top_n)
        )
        if to_print:
            display(res)
        return res
    title = "Blood & Water"
    description = data_content.loc[data_content['title'] == title, 
        "description"].iloc[0]
    res = search_docs(data_content, description, top_n=15)
    

    这是输出结果:

图 8.9:数据搜索输出

图 8.9:数据搜索输出

在我们的代码中,我们使用了标题 "Blood & Water"。我们的推荐系统根据你的偏好生成了电影列表。数据中的第一条记录是 "Blood & Water" 本身,其相似度分数为 1。随后,我们收到了类似 "Dive Club"(相似度 0.874)和 "The Vanished"(相似度 0.870)的推荐。这让我们可以根据提供的相似度分数轻松选择一部电影。

本章节的代码片段可以在 GitHub 上获取,点击这里访问:github.com/PacktPublishing/Azure-OpenAI-Essentials/blob/main/Chapter%208.ipynb

总结

在本章中,我们显著增强了我们的电影推荐解决方案,增加了多个功能层,使其更加智能且易于使用。我们首先设置了必要的密钥和凭证,确保我们的程序能够安全地与所需的 API 和服务进行交互。这一设置至关重要,因为它使我们的系统能够访问强大的资源,例如 OpenAI 的嵌入模型,这些模型对于理解和处理数据至关重要。

接下来,我们将一个直接从 Kaggle 获取的 Netflix 数据集集成到我们的 Jupyter notebook 中。通过将该数据集组织成一个 pandas DataFrame,我们创建了一个结构化的环境,便于高效的数据操作和分析。这一步至关重要,因为一个干净、组织良好的数据集是任何数据驱动解决方案的基础,使我们能够专注于提取有意义的洞察。

在加载数据后,我们将重点放在节目的标题和描述上,因为这些文本字段包含了推荐内容最有价值的信息。我们对这些文本数据进行了清理和预处理,确保它们的格式能够被机器轻松理解。文本预处理是一个关键步骤,因为它消除了噪音并标准化了数据,使模型能够更好地理解不同节目的细微差别。

为了进一步提升我们的推荐系统,我们使用 OpenAI 强大的模型将描述转化为数值表示,这些表示被称为嵌入(embeddings)。这些嵌入捕捉了文本的语义意义,使我们的系统能够更有效地比较和对比不同的节目。这一能力使得我们的推荐系统能够推荐与用户已经喜爱的节目在内容和主题上真正相似的节目。

最后,我们开发了一个利用这些嵌入来查找并推荐与给定喜好相似节目的功能。例如,如果你是《"Blood & Water"》的粉丝,我们的系统可以推荐其他在主题、情节或风格上相似的节目。这个功能是我们推荐系统的核心,使其不仅仅是一个发现新内容的工具,更是一个为你量身定制的个性化指南。

展望未来,在下一章节,我们将更进一步,探索如何将文本提示转化为视频。我们将首先从文本提示生成图像,然后将这些图像合成视频。这将为动态内容创作开辟新的可能性,可以应用于各种其他场景,如营销、教育和娱乐。

第九章:文本转视频

在上一章中,我们探讨了基于特定数据构建推荐系统的方式,使用 Netflix 的例子来了解如何向观众推荐电影。现在,让我们将注意力转向另一个场景:教育者希望通过视频而非文字解释来向学生传达复杂的主题。然而,制作视频是一个耗时的任务,需要教师付出相当大的努力。

在本章中,我们深入探讨了 Azure OpenAI 如何通过从文本提示生成视频流的方式,革新这一过程。首先,我们将介绍如何在 Azure 门户中设置必要的工具,以全面了解解决方案。接着,我们将解释如何利用 Python 从提供的提示中创造性地生成图像,包括如何将提示分割成关键短语。最后,我们将展示如何将这些生成的图像无缝地转换为视频格式,并配以音频文件,以增强教学体验。具体而言,我们将涵盖以下内容:

  • 问题陈述简介

  • 架构设计

  • 使用 Azure OpenAI 和 Azure Cognitive 服务构建文本转视频服务

问题陈述简介

想象你是一位热衷于创建有趣课程计划、激发并吸引学生的教育者。你意识到,在今天的数字时代,将视觉元素融入教学具有重要价值。然而,将精心设计的课程转化为吸引人的视频,似乎是一项巨大的挑战。这个过程不仅费时,而且需要技术技能,可能与你的专业知识不匹配。花费数小时进行拍摄、编辑和操作复杂的软件,都会让你无法专注于课程改进和为学生提供个性化的关注。尽管视频内容在提升教学方面具有明显潜力,但制作视频的挑战往往让其好处看起来微不足道。

然而,在这些挑战之中,一线希望出现了:Azure OpenAI。这项创新技术作为一束曙光,承诺彻底改变像你这样的教育者创造课程视频的方式。

首先,我们创建一个简明的提示语,总结内容。然后,Azure OpenAI 将文本浓缩为简短的摘要。通过 Azure Cognitive 服务,我们提取出关键信息。借助 Azure OpenAI 的 DALL-E 模型,我们生成与图像相关的提示。Azure 的语音服务将摘要转化为音频文件,用于旁白。最后,我们将音频与 DALL-E 生成的图像结合,制作成视频。这一过程使得通过 Azure 服务实现高效的文本转视频转化成为可能。

技术要求

若要跟随本章的实际操作练习,可以访问本章 GitHub 仓库中的源代码:github.com/PacktPublishing/Azure-OpenAI-Essentials/blob/main/Chapter_9.ipynb

在本地机器上安装所需的工具以开始解决方案开发。此处列出的版本是本书出版时的稳定版本。如果选择了不同于推荐版本的版本,可能会因为库版本不匹配而在运行提供的代码时遇到错误:

  • Python 3.9, 3.10 或 3.11: www.python.org/downloads/

  • Azure 开发者 CLI: Azure 开发者 CLI 安装

  • Node.js 14+: nodejs.org/en/download

  • Git: git-scm.com/downloads

  • Powershell 7+ (pwsh): github.com/powershell/powershell

  • Azure 账户:如果你是 Azure 新用户,可以免费获取 Azure 账户,并获得一些免费的 Azure 积分开始使用。

  • 已启用 Azure OpenAI 服务访问权限的 Azure 订阅:你可以通过此表单申请访问 aka.ms/oaiapply

  • Azure OpenAI 连接和模型信息:

    • OpenAI API 密钥

    • OpenAI 嵌入模型部署名称

    • OpenAI API 版本

  • 关键短语提取

  • 语音转文本

除了前述系统要求外,具备扎实的 Azure 基础服务知识和基础的 Python 编程语言技能(相当于初学者级别,Python 100)非常重要。这些技能对有效利用 Azure 服务和在本章背景下的高效应用至关重要。放心,即使你是 Azure 新手,我们已经设计了本章内容,确保它对初学者友好,提供了清晰的解释并附有详细的截图,以帮助你轻松入门。

架构设计

创建引言中提到的解决方案的过程如下:

用户向 Azure OpenAI API 发送查询,该 API 生成文本摘要。然后,将该摘要传递给 Azure 认知服务进行关键短语提取。提取的关键短语被送回 ChatGPT API 生成图像,而文本摘要也会被传送至 Azure Speech API 转换成音频。最后,音频和图像被使用 MoviePy 合并成一个 MP4 文件。MoviePy 是一个用于视频编辑的 Python 库,它提供了一种简单直观的方式来操作视频片段,允许执行剪切、修剪、将多个视频片段连接在一起、添加标题和文本等任务。以下图展示了整体架构:

图 9.1:架构图

图 9.1:架构图

使用 Azure OpenAI 和 Azure Cognitive 服务构建将文本转换为视频的功能。

第四章讲解了如何设置具有有效订阅的 Azure 账户,并创建 Azure OpenAI 服务资源。此外,还提供了部署 Azure OpenAI 服务模型的指导,可能使用的是 GPT-3、ChatGPT 或 GPT-4 模型。构建此解决方案的逐步过程如下:

  1. 在 Azure 中设置语言和语音服务。

  2. 导入解决方案所需的包。

  3. 使用 Azure OpenAI 对文本进行总结。

  4. 使用 Azure Cognitive 服务提取关键短语。

  5. 使用 Azure OpenAI 的 DALL-E 模型生成图像创建提示。

  6. 使用 Azure 语音服务创建音频文件。

  7. 将音频文件与图片结合生成视频。

让我们开始吧:

  1. 创建 Azure 语言服务。

    1. 要创建 Azure 语言服务,请导航到顶部导航栏的搜索框,搜索Language

    2. 如果在搜索导航中没有找到,点击Language,然后点击创建

图 9.2:创建语言服务

图 9.2:创建语言服务

  1. 在语言服务中,点击继续创建你的资源按钮,接受默认设置。

图 9.3:创建语言资源

图 9.3:创建语言资源

  1. 从市场中创建语言服务后,在第四章中创建的创建资源表单中选择订阅资源组,并将定价层设置为免费 F0

图 9.4:创建语言基础步骤

图 9.4:创建语言基础步骤

  1. 现在输入你想要的资源,点击下一步按钮,进入网络选项卡。选择所有网络,包括互联网,都可以访问此资源选项,然后点击下一步

图 9.5:创建语言资源网络步骤

图 9.5:创建语言资源网络步骤

  1. 身份选项卡中,按默认设置配置,然后点击下一步按钮进入标签选项卡。

图 9.6:创建语言身份步骤

图 9.6:创建语言身份步骤

  1. 目前可以忽略此部分。标签是名称/值对,可以帮助你对资源进行分类,并通过将相同标签应用于多个搜索和资源组来简化账单管理。你可以在标签步骤中找到类似的细节。点击下一步,然后进入审核 + 创建按钮。在此,你将看到前面步骤中选择的详细信息。检查所有信息后,点击创建按钮:

图 9.7:创建语言审核 + 创建步骤

图 9.7:创建语言审核 + 创建步骤

  1. 点击创建后,将生成新的部署,并创建该资源。

  2. 创建一个 Azure 语音服务。

    1. 要创建一个 Azure 语音服务,请导航到顶部导航栏的搜索框,搜索Language。如果未找到,点击Language并点击创建

图 9.8: 创建语音服务

图 9.8: 创建语音服务

  1. 在市场中创建语音服务后,在创建资源表单中选择订阅资源组,并设置定价层为Free F0,这些设置来自于第四章中的内容。

图 9.9: 创建语音服务基础步骤

图 9.9: 创建语音服务基础步骤

  1. 现在选择你想要的资源,点击下一步按钮,然后进入网络选项卡。选择所有网络,包括互联网,都可以访问此资源选项,然后点击下一步

图 9.10: 创建语音服务网络步骤

图 9.10: 创建语音服务网络步骤

  1. 身份选项卡中,只需使用默认设置配置,并点击下一步按钮进入标签选项卡。

图 9.11: 创建语音服务身份步骤

图 9.11: 创建语音服务身份步骤

  1. 你现在可以忽略这个部分。点击下一步,然后进入审核 + 创建按钮。此时,将显示你在前面步骤中选择的详细信息。审核所有信息后,点击创建按钮。

图 9.12: 创建语音服务审核 + 创建步骤

图 9.12: 创建语音服务审核 + 创建步骤

  1. 一旦点击创建,一个新的部署将会生成,资源将被创建。

使用 Azure OpenAI 和 Azure 语言与语音服务的解决方案

现在我们已经在 Azure 门户中设置了所有必要的服务,可以开始构建解决方案了。为了开发代码,我将在 Python 笔记本中工作,其余的安装与第四章中定义的相同。

除了第四章中安装的库外,你还需要为这段代码安装一个额外的 Python 库。

创建一个新的 Jupyter 笔记本并安装以下包:

pip install openai==0.28
pip install dotenv
pip install azure-ai-textanalytics
pip install azure-cognitiveservices-speech
pip install moviepy

导入包

使用pip install安装缺少的库,确保你的 OpenAI 版本为 0.28.0,然后使用以下代码导入这些包:

import openai
import os
from dotenv import load_dotenv
import azure.cognitiveservices.speech as speechsdk
from azure.ai.textanalytics import TextAnalyticsClient
from azure.core.credentials import AzureKeyCredential
import urllib.request
from moviepy.editor import *
import numpy as np
from PIL import Image

你可以看到在前面的代码中使用了多种库。让我们在下表中详细了解这些库。

导入语句描述
import openai导入 OpenAI 库,用于访问 OpenAI API。
import os导入 os 模块,提供与操作系统交互的便捷方式。
from dotenv import load_dotenvdotenv模块导入load_dotenv函数,用于从.env文件加载环境变量。
import azure.cognitiveservices.speech as speechsdk导入 Azure 认知服务语音 SDK,用于语音识别和合成。
from azure.ai.textanalytics import TextAnalyticsClientazure.ai.textanalytics 模块导入 TextAnalyticsClient 类,用于文本分析。
from azure.core.credentials import AzureKeyCredentialazure.core.credentials 模块导入 AzureKeyCredential 类,用于 Azure 服务的认证。
import urllib.request导入 urllib.request 模块,用于发起 HTTP 请求。
from moviepy.editor import *导入 MoviePy 库,用于视频编辑和处理。
import numpy as np导入 NumPy 库,用于数组的数值计算。
from PIL import Image从 Pillow 库导入 Image 模块,用于图像处理。

表 9.1:导入说明

现在,让我们使用 .env 文件中提供的密钥初始化所有必要的常量。将 “COMMUNICATION_CONNECTION_STRING” 和 “COMMUNICATION_ENDPOINT” 添加到您已经存在的 .env 文件中:

# Azure
load_dotenv()
OPENAI_API_KEY = os.getenv("OPENAI_API_KEY")
OPENAI_DEPLOYMENT_ENDPOINT = os.getenv("OPENAI_DEPLOYMENT_ENDPOINT")
OPENAI_DEPLOYMENT_NAME = os.getenv("OPENAI_DEPLOYMENT_NAME")
OPENAI_MODEL_NAME = os.getenv("OPENAI_MODEL_NAME")
OPENAI_API_VERSION = os.getenv("OPENAI_API_VERSION")
OPENAI_DEPLOYMENT_VERSION = os.getenv("OPENAI_DEPLOYMENT_VERSION")
#init Azure OpenAI
openai.api_type = "azure"
openai.api_version = OPENAI_DEPLOYMENT_VERSION
openai.api_base = OPENAI_DEPLOYMENT_ENDPOINT
openai.api_key = OPENAI_API_KEY
OPENAI_LANGUAGE_KEY = os.getenv("OPENAI_LANGUAGE_KEY")
OPENAI_LANGUAGE_ENDPOINT = os.getenv("OPENAI_LANGUAGE_ENDPOINT")
OPENAI_SPEECH_KEY = os.getenv("OPENAI_SPEECH_KEY")
OPENAI_SPEECH_REGION = os.getenv("OPENAI_SPEECH_REGION")
load_dotenv()

将这些值添加到在 第四章 中创建的 .env 文件,包含 connectionStringendpoints

OPENAI_LANGUAGE_KEY = {OPENAI_LANGUAGE_KEY}
OPENAI_LANGUAGE_ENDPOINT = {OPENAI_LANGUAGE_ENDPOINT}
OPENAI_SPEECH_KEY = {OPENAI_SPEECH_KEY}
OPENAI_SPEECH_REGION = {OPENAI_SPEECH_REGION}

按照以下步骤设置语言和语音服务端点:

  1. 更新 OPENAI_LANGUAGE_KEYOPENAI_LANGUAGE_ENDPOINT 的值,使用在 Azure 语言服务的 密钥 部分找到的连接字符串值。

图 9.13:语言服务密钥和端点

图 9.13:语言服务密钥和端点

  1. 同样,修改 OPENAI_SPEECH_KEYOPENAI_SPEECH_REGION 的值,使用在 Azure 语音服务的 密钥 部分找到的值。

图 9.14:语音服务密钥和端点

图 9.14:语音服务密钥和端点

完成这些配置后,您将获得所需的资源连接设置。一旦看到 True,则表示加载变量的脚本成功。

图 9.15:加载环境的输出

图 9.15:加载环境的输出

使用 Azure OpenAI 摘要文本

  1. 生成提示

    Here’s an example prompt: HTML Hello World Tutorial: Generate a beginner-friendly tutorial for creating a basic “Hello World” webpage using HTML:
    
    num_of_sentences = 1
    content = input("Please enter the content: ")
    prompt = 'Provide a summary of the text below that captures its main idea in '+ str(num_of_sentences) +'sentences. \n' + content
    

    这是输出:

图 9.16:提示的输出

图 9.16:提示的输出

  1. 为提示生成 OpenAI 响应

    这段代码利用 OpenAI 库生成文本摘要。它向由 OPENAI_DEPLOYMENT_NAME 指定的 OpenAI 引擎发送一个给定的提示(prompt)。temperaturemax_tokenstop_p 参数控制生成过程。最后,它打印从 response_summ 对象中获取的生成文本摘要:

    response_summ = openai.Completion.create(
      engine=OPENAI_DEPLOYMENT_NAME,
      prompt=prompt,
      temperature=0.3,
      max_tokens=100,
      top_p=1,
    )
    print(response_summ.choices[0].text)
    In the above code lets understand what each parameter means -
    openai.Completion.create:
    This is a method call to the OpenAI API to create a text completion.
    engine=OPENAI_DEPLOYMENT_NAME:
    Specifies the engine to use for generating the completion. OPENAI_DEPLOYMENT_NAME is a variable that holds the name of the deployment or model you want to use.
    prompt=prompt:
    The prompt parameter is the input text that you provide to the model. The model will generate a completion based on this input.
    temperature=0.3:
    The temperature parameter controls the randomness of the output. Lower values (like 0.3) make the output more focused and deterministic, while higher values make it more random.
    max_tokens=100:
    The max_tokens parameter specifies the maximum number of tokens (words or word pieces) to generate in the completion.
    top_p=1:
    The top_p parameter is used for nucleus sampling. It controls the diversity of the output by considering only the top p probability mass. A value of 1 means no filtering based on probability mass.
    

    这是输出:

图 9.17:OpenAI 响应的输出

图 9.17:OpenAI 响应的输出

使用 Azure 认知服务提取关键短语

  1. 认证客户端

    这段代码定义了一个authenticate_client()函数,用于使用提供的 API 密钥对 Azure 文本分析客户端进行身份验证。它通过 API 密钥初始化AzureKeyCredential对象,并使用指定的端点和凭据创建TextAnalyticsClient对象。最后,返回已验证的客户端实例:

    def authenticate_client():
         def authenticate_client():
        try:
            ta_credential = AzureKeyCredential(OPENAI_LANGUAGE_KEY)
            text_analytics_client = TextAnalyticsClient(
                endpoint=OPENAI_LANGUAGE_ENDPOINT,
                credential=ta_credential
            )
            return text_analytics_client
        except AzureError as e:
            print(f"An error occurred while authenticating the client: {e}")
            return None
    client = authenticate_client()
    

    前面的代码包括错误处理机制,用于捕捉并处理在身份验证过程中可能发生的任何异常。如果发生错误,它会打印错误消息并返回None。这使得函数更加健壮,有助于诊断与客户端身份验证相关的问题。

    另外,你也可以使用key_phrase_extraction_example函数,它利用 Azure 文本分析客户端从文档中提取关键短语。它将提取的关键短语填充到phrase_list中,并将其连接成一个phrases字符串。如果成功,它返回phrase_listphrases;否则,它处理异常并打印错误信息:

    def key_phrase_extraction_example(client):
        try:
            phrase_list, phrases = [], ''
            documents = [response_summ.choices[0].text]
            response_kp = client.extract_key_phrases(
                documents = documents)[0]
            if not response_kp.is_error:
                print("\tKey Phrases:")
                for phrase in response_kp.key_phrases:
                    print("\t\t", phrase)
                    phrase_list.append(phrase)
                    phrases = phrases +"\n"+ phrase
            else:
                print(response_kp.id, response_kp.error)
        except Exception as err:
            print("Encountered exception. {}".format(err))
        return phrase_list, phrases
    
  2. 执行关键短语:

    这一行调用了key_phrase_extraction_example函数,并将客户端对象作为参数。它检索两个值:phrase_list,一个包含提取关键短语的列表,以及phrases,这些短语的连接字符串:

    phrase_list, phrases = key_phrase_extraction_example(client)
    

    这是输出结果:

图 9.18:从用户提示生成的短语输出

图 9.18:从用户提示生成的短语输出

使用 Azure OpenAI 的 DALL-E 模型生成图像创建提示

  1. 图像生成提示:

    构建一个基于提供的短语生成图像的 DALL-E 模型提示:

    prompt = ''' Provide an image idea for each phrases: ''' + phrases
    
  2. 从生成的响应中提取图像短语:

    这段代码向 OpenAI 的文本补全 API 发送一个给定的提示,获取包含图像短语的响应,将响应按换行符分割,并从中提取图像短语。该提示为 DALL-E 创建图像设定了背景。例如,Provide an image idea for each phrase(为每个短语提供一个图像创意)是一个指令,告诉模型将这些短语视为视觉提示,并根据它们生成图像创意。提取的短语是从模型对提示的响应中派生出来的特定描述性元素。这些短语提供了详细的视觉组件,指导 DALL-E 生成图像:

    response_phrase  = openai.Completion.create(
      engine=OPENAI_DEPLOYMENT_NAME,
      prompt=prompt,
      temperature=0.3,
      max_tokens=100,
      top_p=1,
    )
    image_phrases = response_phrase.choices[0].text.split("\n")[1:]
    print(image_phrases)
    

图 9.19:生成的图像短语输出

图 9.19:生成的图像短语输出

  1. 处理图像短语

    and to optimize the efficiency of the image generation process:
    
    im_ph = []
    for image_phrase in image_phrases:
       if(len(image_phrase) > 0):
            im_ph.append(image_phrase.split(":")[0])
    # Convert the list to a set to remove duplicates, then back to a list
    im_ph = list(set(im_ph))
    print(im_ph)
    

    这是输出结果:

图 9.20:去除重复项后的图像短语输出

图 9.20:去除重复项后的图像短语输出

  1. 生成图像 URL:

    这段代码遍历图像短语列表,向 OpenAI 的图像 API 发送请求,根据每个短语生成图像,获取生成图像的 URL,并将 URL 添加到图像列表中:

    images = []
    for phrase in im_ph:
        response = openai.Image.create(
            prompt=phrase,
            size='1024x1024',
            n=1
        )
        image_url = response["data"][0]["url"]
        images.append(image_url)
    
  2. 下载生成的图像

    这段代码遍历图像 URL 列表,使用 urllib 下载每张图像,根据计数器为每张图像分配一个文件名,并将文件名附加到列表中。最后,它会打印一条消息,指示下载过程已完成:

    counter = 0
    image_list = []
    for url in images:
        counter += 1
        filename = "file" + str(counter) + ".jpg"
        urllib.request.urlretrieve(url, filename)
        image_list.append(filename)
    print ("Downloading done.....")
    

    这是输出:

图 9.21:生成图像的输出

图 9.21:生成图像的输出

使用 Azure 语音服务生成音频文件

  1. 创建语音配置对象

    这段代码使用提供的订阅密钥和区域初始化 SpeechConfig 对象,配置 Azure 语音服务,并打印配置详细信息:

    speech_config = speechsdk.SpeechConfig(
        subscription=OPENAI_SPEECH_KEY, 
        region=OPENAI_SPEECH_REGION)
    print(speech_config)
    
  2. 文本转语音功能:

    text_to_speech 函数利用 Azure 语音服务将输入文本转换为语音。它将合成的音频保存到指定的文件名,并提供关于处理结果的反馈:

    def text_to_speech(text, filename):
        audio_config = speechsdk.AudioConfig(filename=filename)
        speech_synthesizer = speechsdk.SpeechSynthesizer(speech_config=speech_config, audio_config=audio_config)
        result = speech_synthesizer.speak_text_async(text).get()
        print(result)
        if result.reason == speechsdk.ResultReason.SynthesizingAudioCompleted:
            print(f"Audio saved to {filename}")
        else:
            print(f"Error: {result.error_details}")
    text = response_summ.choices[0].text
    filename = "audio.mp4"
    text_to_speech(text, filename)
    

    这是输出:

图 9.22:基于生成图像的语音输出

图 9.22:基于生成图像的语音输出

将音频文件与图像结合生成视频

这段代码调整图像大小,为每张图像创建一个 2 秒的短片,将它们合成到最终的视频短片中,从指定的文件中添加音频,并将生成的视频写入输出文件。最后,它会打印消息,指示视频创建过程的开始和完成:

print("Creating the video.....")
def create_video(images, audio, output):
    resized_images = [np.array(Image.open(img).resize((1024, 1024))) for img in images]
    clips = [ImageClip(img).set_duration(2) for img in resized_images]
    concat_clip = concatenate_videoclips(clips, method="compose")
    audio_clip = AudioFileClip(audio)
    final_clip = concat_clip.set_audio(audio_clip)
    final_clip.write_videofile(output, fps=24)
images = image_list
audio = filename
output = "video.mp4"
create_video(images, audio, output)
print("Video created.....")

这是输出:

图 9.23:将图像和音频合成视频的输出

图 9.23:将图像和音频合成视频的输出

图 9.24:下载的图像、音频和合成视频的输出

图 9.24:下载的图像、音频和合成视频的输出

本章的代码示例可以在 GitHub 上找到,访问地址:github.com/PacktPublishing/Azure-OpenAI-Essentials/blob/main/Chapter_9.ipynb

摘要

在本章中,我们学习了如何使用 Azure 和 OpenAI 将文本转化为视频。首先,我们通过 Azure 认知服务对文本进行了摘要,并提取了重要短语。然后,我们用 OpenAI 的 DALL-E 模型获取了图像创意并下载了相关图像。接着,我们通过 Azure 语音服务将文本转换为语音,并将其与图像结合制作成视频。这种方法通过自动将文本转化为视觉和音频,简化了制作有趣视频内容的过程。

通过使用这些先进的技术,我们可以加速将文本制作成视频的过程。这不仅节省了时间,还使视频内容更加易于获取和富有吸引力。借助 Azure 和 OpenAI,将文本转化为引人入胜的视频变得更加简单高效,为分享创意和故事提供了新的机会。

在下一章,我们将深入探讨如何使用 Azure OpenAI Assistant API 创建一个多模态多智能体框架。本章将引导你构建一个系统,其中多个智能体通过使用先进的语言模型协作。这些智能体将能够理解和生成自然语言,使它们能够独立执行任务并做出自主决策。例如,我们将探讨一个场景,AI 智能体根据用户输入共同工作,创建和增强图像。一个智能体可能会生成初始图像,另一个则完善细节,第三个调整颜色和纹理。这个协作过程将展示 AI 智能体团队如何实现高质量且复杂的输出,而单个智能体独自完成这一任务将具有挑战性。

第十章:使用 Azure OpenAI Assistants API 创建多模态多代理框架

在本章中,我们将探索如何使用 Azure OpenAI Assistants API 构建一个系统,允许多个智能代理协同工作。这些代理使用先进的语言模型来理解和生成自然语言,使它们能够独立执行任务并自主做出决策。

例如,想象一个由 AI 代理协作的团队,根据用户输入生成和增强图像。一个代理可以生成初始图像,另一个代理可以精细化细节,第三个代理可以调整颜色和纹理。这种协作过程产生了高质量且复杂的输出,而单个代理可能很难独立完成。这个例子为开发者提供了一个全面的指南,帮助他们利用多个 AI 代理协同工作的能力。它展示了代理如何沟通和合作来处理复杂的任务,特别是聚焦于生成式 AI 应用。

微软最近推出了Azure AI Agent Service,这是一个完全托管的平台,旨在帮助开发者高效地构建、部署和扩展高质量的 AI 代理。该服务消除了管理计算和存储资源的复杂性,使开发者可以专注于创建智能和可扩展的 AI 解决方案。传统上,客户端函数调用的实现需要编写数百行代码,而通过Azure AI Agent Service,这一过程现在简化为仅几行代码,大大减少了开发时间和工作量。由于 Azure AI Agent Service 遵循与Azure OpenAI Assistants相同的通信协议,开发者可以无缝地使用OpenAI SDKAzure AI Foundry SDK创建并运行代理。

虽然该服务已针对单一代理实现进行了优化,但将多个代理协调为多代理系统需要额外的工具。对于研究和概念验证项目,AutoGen是一个不错的选择。然而,对于生产级多代理系统,Semantic Kernel提供了一个更好且更具可扩展性的多代理框架。

本章特别适合那些对探索生成式 AI 和多代理系统前沿的开发者和技术爱好者,使用 Azure OpenAI Assistants API。本章将涵盖以下主题:

  • 问题陈述

  • 技术要求

  • 架构图

  • 创建多模态多代理框架

问题陈述

随着人工智能技术的进步,我们需要更智能的系统来处理机器人、游戏和自动驾驶汽车等领域中的复杂任务。单一智能体系统通常难以解决这些复杂问题,因为它们无法独立完成所有任务。为了解决这个问题,我们旨在创建一个多个智能体协同工作的系统。通过使用 Azure OpenAI 助手 API,我们将构建一个框架,结合先进 AI 模型的语言技能和智能体的决策能力。

例如,在机器人技术中,一组机器人可以合作清理一个大型公园。一个机器人负责捡拾垃圾,另一个负责修剪草坪,第三个负责浇灌植物。这些机器人需要进行沟通和协调任务,以确保公园得到高效和彻底的清理。

另一个例子是在游戏中,多个 AI 角色可以合作创造更具动态性和挑战性的游戏体验。一个角色可以是战略家,负责规划下一步动作,而另一个角色则可以是侦察员,收集环境信息。类似地,在自动驾驶汽车中,多个自动驾驶车辆需要互相通信,避免碰撞并优化交通流量。通过合作,它们可以做出比单个车辆更好的决策。

在本章中,我们将引导你通过使用 Azure OpenAI 助手 API 构建一个多智能体框架的过程。我们将从概述涉及的关键概念和技术开始,包括智能体和大型语言模型(LLM)。接下来,我们将通过实际案例和示例,演示如何实现和集成这些智能体。你将学习如何在智能体之间设置通信,使它们能够协作完成任务,并利用 LLM 的能力提升决策和问题解决的效果。

本章结束时,你将理解如何创建并使用一个结合了语言模型和自主智能体优势的多智能体系统。这个系统将能够处理广泛的任务,并展示其在机器人、游戏和自动系统等多个领域的潜在应用。

技术要求

要跟随本章的实践练习,请访问本章 GitHub 仓库中的源代码:github.com/PacktPublishing/Azure-OpenAI-Essentials/blob/main/Chapter10.ipynb

你需要在本地机器上安装以下工具才能开始解决方案的工作:

  • Python 3.9、3.10 或 3.11:www.python.org/downloads/

  • 一个 Azure 账户:如果你是 Azure 新手,可以免费获取一个 Azure 账户,并获得一些免费的 Azure 积分来开始使用。

  • 一个启用了 Azure OpenAI 服务访问权限的 Azure 订阅

  • Azure OpenAI (AOAI) 连接和模型信息:使用瑞典中央区域创建一个 Azure OpenAI

  • 基于 GPT-4o 的助手模型

  • DALL-E 3 模型,版本 3.0

除了刚才提到的系统要求外,拥有坚实的基础 Azure 服务知识以及一定的 Python 编程语言基础(相当于初学者级别,Python 100)也是至关重要的。这些技能对于在本章节中高效地利用 Azure 服务至关重要。

请放心,即使您是 Azure 环境的新手,我们也已经设计了这一章节,使其适合初学者。它提供了清晰的解释,并包括详细的截图,帮助您学习并顺利入门。

架构设计

我们将使用一个多代理系统,其中用户代理助手作为主要协调者,促进用户与专业代理之间的通信。DALL-E 助手负责根据用户查询生成图像,而视觉助手则使用 GPT-4o 模型分析这些图像。该系统通过持久的线程保持持续通信,并利用函数调用来执行特定任务,如图像生成和分析。

在典型的工作流中,用户将查询发送到用户代理助手,后者将其转发给 DALL-E 助手以创建图像。然后,视觉助手分析该图像,提供可以用于进一步改进图像的反馈。这种专业代理之间的协调合作确保了对复杂任务的高效处理。

重要说明

这只是实现多代理系统的一种方式。您还可以使用其他框架,如 AutoGen、Semantic Kernel、CrewAI 和 LangGraph。

图 10.1: 架构图

图 10.1:架构图

图 10.1 展示了整体架构框架的示例。在这个场景中,用户代理助手作为中央协调者,促进了 DALL-E 助手和视觉助手之间的通信。

创建一个多模态多代理框架

在本节中,我们将通过一个实际示例,演示如何使用 AOAI 助手 API 构建一个多代理框架。我们将重点介绍这些代理如何互相作用和协作,以处理复杂任务,如通过基于用户输入的迭代改进生成和完善图像。

每个助手的结构如图 10.2所示,展示了它们在系统中的角色和交互:

  • 用户代理助手:该助手被初始化为主要的协调者,能够在用户与群聊中的专业代理之间实现无缝沟通。它确保信息正确转发,并保持持续的对话,以确保用户任务能够成功执行。

  • DALL·E 助手:此助手配置用于处理图像生成任务。它与 DALL·E 模型连接,根据用户的提示生成视觉内容。

  • 视觉助手:此助手配置用于执行图像分析。它利用 GPT-4 Vision 模型处理和解释视觉输入,为用户提取有意义的洞察。

这些助手共同形成一个紧密协作的系统,其中用户代理助手协调互动,DALL·E 助手生成图像,视觉助手分析图像,确保高效且响应迅速的 AI 驱动工作流程。

图 10.2:助手详情

图 10.2:助手详情

在开始之前,请确保 Azure OpenAI 服务已设置,并且 DALL·E 3 和 GPT-4o 模型已部署,如图 10.3所示。

图 10.3:模型部署

图 10.3:模型部署

重要说明

设置具有有效订阅和 Azure OpenAI 服务资源的 Azure 账户的详细信息,请参见第二章

现在,使用以下配置设置所有三个助手:

  • 首先,使用以下代码设置user_proxy代理:
user_proxy = assistant_client.beta.assistants.create(
    name=name_pa,
    instructions=instructions_pa,
    model=assistant_deployment_name,
    tools=tools
)
  • 接下来,使用以下代码设置dalle_assistant代理:
dalle_assistant = assistant_client.beta.assistants.create(
    name=name_dl,
    instructions=instructions_dl,
    model=assistant_deployment_name,
    tools=tools
)
  • 最后,使用以下代码设置vision_assistant代理:
dalle_assistant = assistant_client.beta.assistants.create(
    name=name_dl,
    instructions=instructions_dl,
    model=assistant_deployment_name,
    tools=tools
)

用户代理助手线程作为主要的通信渠道,促进代理之间的消息交换,以满足用户的请求,如图 10.4所示:

图 10.4:用户代理助手线程

图 10.4:用户代理助手线程

使用以下代码初始化用户代理助手线程:

thread = assistant_client.beta.threads.create()

唯一需要的输入是用户的查询,它驱动所有助手间的任务执行。此查询通过dispatch_message函数传递到用户代理助手线程,如此处所示:

user_message = input("User Query: ")
message = dispatch_message(user_message, user_proxy, thread)

用户代理助手旨在将消息路由到适当的代理,以确保任务的完成。send_message函数通过利用agents_threads结构来促进此过程,该结构保持代理及其相关线程的记录,确保整个对话中顺畅的通信和任务执行:

agents_threads: Dict[str, Dict[str, Optional[str]]] = {
    "dalle_assistant": {"agent": dalle_assistant, "thread": None},
    "vision_assistant": {"agent": vision_assistant, "thread": None},
}

如果用户代理助手与其他代理之间的线程尚未存在,则会创建一个新线程来启动对话,确保顺畅的通信和任务执行:

# Create a new thread if user proxy and agent thread does not exist
    if not recipient_info["thread"]:
        thread_object = assistant_client.beta.threads.create()
        recipient_info["thread"] = thread_object

例如,当用户代理助手需要与 DALL·E 助手交互时,它会在两个代理之间建立一个新线程,以促进通信,如此处所示:

图 10.5:用户代理和 DALL·E 助手的通信

图 10.5:用户代理和 DALL·E 助手的通信

send_message 函数调用另一个负责创建并派发消息到相应助手的函数,确保任务高效执行:

message = dispatch_message(query, recipient_info["agent"]

dispatch_message 函数识别并获取指定助手的所有可用功能。它使用 agent.tool 函数注册这些功能,并将它们添加到助手的可用功能字典中以供执行:

available_functions = {}
# Iterate through each tool in the agent.tools list
    for tool in agent.tools:
        # Check if the tool has a 'function' attribute
        if hasattr(tool, 'function'):
            function_name = tool.function.name
            # Attempt to retrieve the function by its name and add it 
            # to the available functions dictionary
            if function_name in globals():
                available_functions[function_name] = globals()
                    [function_name]
        else:
# Handle the case where the tool does not have a 'function' attribute
            print("This tool does not have a 'function' attribute.")

dispatch_message 函数随后将消息定向到相应助手,通过在线程中生成新消息并调用助手的 create 函数来执行任务。当处理用户在用户代理助手线程中的查询时,也应用相同的过程:

# Draft a new message as part of the ongoing conversation.
message = assistant_client.beta.threads.messages.create(
    thread_id=thread.id, role="user", content=message)
    # Carry out the tasks delineated in this discussion thread.
    run = assistant_client.beta.threads.runs.create(
        thread_id=thread.id,
        assistant_id=agent.id,
    )

助手线程的 run 函数评估是否需要特定工具或功能来执行任务。如果识别到需求,它会将相关功能分配给助手执行。一旦调用,该功能处理任务并返回输出,然后存储在 tool_response 对象中:

# Execute the proper function to execute the task if an action is required
        if run.status == "requires_action":
            tool_calls = run.required_action.submit_tool_outputs
                            .tool_calls
            tool_outputs = []
            for tool_call in tool_calls:
                tool_responses = []
                if (
                    run.required_action.type == "submit_tool_outputs"
                    and run.required_action.submit_tool_outputs
                           .tool_calls is not None
                ):
                tool_calls = run.required_action.submit_tool_outputs
                                .tool_calls
                for call in tool_calls:
                    if call.type == "function":
                        if call.function.name not in 
                            available_functions:
                        raise Exception("Function requested by the 
                            model does not exist")
#associate the proper function to the agent to call
                    function_to_call = available_functions[
                        call.function.name]
                    tool_response = function_to_call(**json.loads(
                        call.function.arguments))
                    tool_responses.append({"tool_call_id": call.id, 
                        "output": tool_response})
 # submit tool outputs
            run = client.beta.threads.runs.submit_tool_outputs(
                thread_id=thread.id,
                run_id=run.id,
                tool_outputs=tool_responses
            )

输出通过 submit_tool_outputs 函数作为消息返回给用户代理助手,确保了无缝的通信和任务完成。

例如,如图 10.6所示,DALL·E 助手将生成的图像返回给用户代理助手线程,确保输出被传回以便进一步处理或用户交互。

图 10.6: 助手之间的消息和输出

图 10.6: 助手之间的消息和输出

用户代理助手随后向视觉助手发起请求,分析生成的图像并提供反馈。它遵循与之前相同的流程,但现在将请求发送给视觉助手,创建一个与现有用户代理助手线程相关联的新线程。这个过程可以重复迭代,根据需要调用不同的助手,直到整体任务完全完成,如图所示:

图 10.7: 多代理架构

图 10.7: 多代理架构

示例输出

现在,让我们进行端到端测试,所有三个助手协同工作,通过部署本章 GitHub 仓库中的完整解决方案来完成任务。

用户代理: 生成一幅船漂浮在水面上的图像,分析并增强该图像。

Dalle 助手: 正在创建图像...

视觉助手: 正在分析图像...

视觉助手:这幅图呈现了一个宁静且极简的构图,展示了一只孤独的木船漂浮在平静的水面上。整体色调柔和空灵,传达出一种平和与宁静的感觉。船只上有一个小篷和一面旗帜,恰到好处地吸引了观众的注意力。水中的倒影为场景增添了深度。光线的运用非常到位,可能呈现的是清晨或黄昏的时光,给场景带来了一种梦幻般的柔和光辉。

评论

  • 细节不足:虽然简洁是图像魅力的一部分,但船本身缺乏细致的纹理或独特的特征。为船增加一些细节或装饰可以在不打扰宁静氛围的情况下,提升视觉吸引力。

  • 前景波浪:前景的波浪稍显分散注意力。它让视线从船上转移,似乎与其余平静的环境不太协调。更均匀的水面会更能突出宁静的氛围。

  • 天空渐变:天空缺乏清晨或黄昏场景中典型的渐变效果,这本可以显著增强氛围。引入一些颜色过渡可能会提升空灵的效果。

  • 背景内容:背景非常简单,虽然这使观众的注意力集中在船上,但加入一些微妙的元素,如远处的陆地或飞鸟,可能会让构图更具动态感和情境丰富性。

为 DALL-E 优化的提示:生成一幅带有细致纹理的木船漂浮在平静水面上的空灵图像。船应配有一个小篷和一面装饰性旗帜。水面应显得静止,且没有波浪打破宁静氛围。捕捉天空中柔和且多彩的渐变效果,展现清晨或傍晚的时光,或许可以加入远处的陆地或飞鸟的微弱轮廓,为场景增添微妙的复杂性和深度。

Dalle 助手:正在创建图像...

视觉助手:正在分析图像...

视觉助手:这幅图展示了一个美丽而宁静的景观,捕捉到了一只传统木船漂浮在平静水面上的画面,背景是如画的日出或日落时分。水面静得如镜,船只和远处的其他船只及某些结构的轮廓都清晰地倒映其中,增强了整体的宁静感。天空的暖色调由橙色和粉色渐变至蓝色,为场景增添了一种梦幻和平静的氛围。天际线上稀疏的鸟群飞过,增添了动态元素,并传达了一种旅行与自由的感觉。

评论

  • 细节与纹理:虽然整体构图非常吸引人,但船的纹理可以进一步增强,以增加真实感。目前,它看起来有些光滑,可能会减少木纹的细节感。

  • 照明:环境光照效果良好,但可以增加对比度,使船只的特点更加突出,并增加场景的深度,尤其是在背景的结构部分。

  • 背景元素:背景中的建筑物具有吸引力并增添了深度,但缺乏清晰度。提供更多细节或建议一种特定类型的结构可能会增强场景的叙事性。

  • 前景兴趣:或许在前景中加入更多元素,如水面上的轻微涟漪或附近的野生动物,可能会为场景增添更多趣味和生气,同时不影响其简洁性。

增强的 DALL-E 提示:在平静的湖面上,创造一幅传统木船的宁静场景,船体木纹质感细致,背景是一片生动的夕阳。天空应为温暖的橙色和粉色渐变,过渡到冷蓝色,柔和的光辉在平静的水面上反射。在背景中,若隐若现的高脚建筑物暗示着神秘的环境,足够清晰以揭示其文化意义。水面上可以引入轻微的涟漪,表明船只的移动,或许可以巧妙地在前景中融入几只野生动物,增加生动元素,同时保持场景的宁静。

Dalle 助手: 正在创建图像...

仅凭一个用户输入,你就可以看到 DALL·E 和视觉助手如何协同合作提升图像质量——展示了多智能体系统的强大能力。

总结

在本章中,我们探讨了如何使用 Azure OpenAI Assistants API 构建多智能体系统。通过 Azure AI Assistants API 构建的多智能体框架为我们提供了有关 AI 驱动的协作不断发展的宝贵见解。通过利用基于 LLM 的智能体在 Azure 生态系统中的能力,我们可以构建一个由专业智能体组成的网络,增强系统智能,使它们能够动态地处理复杂任务并做出明智决策。通过建立助手、管理通信线程、发送消息和执行功能,我们概述了开发人员可以采用的结构化方法。

在下一章中,我们将把焦点转移到与 AOAI 相关的隐私和安全性的重要议题。在前几章中,我们已经探讨了利用 AOAI 和各种 Azure AI 服务开发和实施实际解决方案,接下来我们将深入探讨保护数据和确保合规性的关键因素。本章将涵盖诸如 Azure OpenAI 服务合规性、数据隐私、内容过滤、托管身份、虚拟网络配置、私有端点配置、数据加密以及 Azure OpenAI 的负责任 AI 实践等主题。这些领域对于在企业环境中构建安全可靠的 AI 解决方案至关重要。

第三部分:掌握治理、操作和 AI 优化与 Azure OpenAI

在最后这一部分,我们将重点从创建解决方案转移到掌握治理、部署和 Azure OpenAI 高级优化策略的关键要素。本部分将为你提供保护实施方案、有效地将 AI 解决方案投入运营,并通过高级提示工程技术最大化生成式 AI 潜力的知识。

你将探索确保合规性和数据保护的基本隐私和安全实践,深入了解高效管理资源的运营最佳实践,并获得精确制定有影响力的提示的洞察。不论你是在大规模部署 AI,还是为特定应用场景优化其行为,本部分提供的工具将帮助你将 Azure OpenAI 解决方案转变为强大、可靠且富有创新的系统。

本部分包含以下章节:

  • 第十一章隐私与安全

  • 第十二章将 Azure OpenAI 付诸实践

  • 第十三章高级提示工程

第十一章:隐私与安全

在前面的章节中,我们演示了如何使用 Azure OpenAI (AOAI) 与各种 Azure AI 服务结合,制定和实施实际解决方案。在本章中,我们将重点讨论与 AOAI 相关的隐私和安全考虑。

在本章中,我们将讨论以下主题:

  • AOAI 服务合规性

  • AOAI 数据隐私

  • 内容过滤

  • 管理身份

  • 虚拟网络 (VNet) 配置

  • 私有端点配置

  • 数据加密

  • 负责任的 AI for AOAI

AOAI 服务合规性

AOAI 合规性计划是一系列微软制定的政策和实践,旨在确保 AOAI 服务以负责任和道德的方式使用。该计划包括以下几个方面:

  • 数据、隐私和安全:微软提供了客户向 AOAI 服务提供的数据如何被处理、使用和存储的详细信息。

  • 负责任的 AI 实践:微软提供技术指导和工具,帮助客户负责任地设计、开发、部署和使用集成 AOAI 模型的 AI 系统。这些建议与微软负责任 AI 标准相一致,涵盖了四个关键阶段:识别、衡量、缓解和操作。

  • 行为准则:微软定义了所有 AOAI 服务实施必须遵守的要求,并要求以诚信的方式执行。行为准则涵盖了可接受的使用、害内容、人际互动、归属以及反馈等主题。

  • 联邦风险与授权管理计划(FedRAMP)高授权:微软已经获得了 Azure 商业环境下 AOAI 服务的 FedRAMP 高级授权。这意味着该服务符合联邦政府对 云服务 提供商 (CSPs) 所要求的最高安全标准。

  • 健康保险流通与问责法案(HIPAA)合规性:微软确认 AOAI 服务可以以符合 HIPAA 的方式使用。这意味着客户可以使用该服务处理 受保护健康信息 (PHI),并按照 HIPAA 规定以及 商业伙伴协议 (BAA) 进行处理。BAA 是确保第三方商业伙伴在管理 PHI 时遵守 HIPAA 规定并安全处理 PHI 的重要文件。

  • 系统和组织控制(SOC)1、2、3:SOC 1、SOC 2 和 SOC 3 是与服务组织系统和数据的安全性及完整性相关的合规标准和框架,由美国注册会计师协会AICPA)开发和维护。这些标准帮助组织展示其在保护敏感信息和确保系统及服务的可靠性方面的承诺,服务对象包括客户和利益相关者。AOAI 处理数据用于提供服务,并监控任何违反产品条款的滥用行为。您的提示(输入)和完成(输出),以及您的嵌入和训练数据,不会与其他客户、OpenAI、Microsoft 或任何第三方产品或服务共享。客户微调的 AOAI 模型仅供其自身使用。Microsoft 完全管理 AOAI 服务,在其 Azure 环境中托管 OpenAI 模型,并且该服务不会与 OpenAI 运营的任何服务连接。

AOAI 服务遵守多个认证和标准,以确保其可靠性和安全性。这些认证包括云安全联盟安全、信任、保证与风险CSA STAR)认证和声明,ISO 20000-1:2018,ISO 22301:2019,ISO 27001:2022,ISO 27017:2015,ISO 27018:2019,ISO 27701:2019,ISO 9001:2015,SOC 1、2 和 3,全球移动通信系统安全 认证方案-订阅管理GSMA SAS-SM),HIPAA BAA,健康信息信任联盟HITRUST),支付卡行业 3-D 安全PCI 3DS),PCI 数据安全标准PCI DSS),德国云计算合规控制目录Germany C5),新加坡多层次云安全MTCS)三级认证,以及新加坡外包服务提供商审计报告OSPAR)。这些合规标准的遵循确保了 AOAI 服务为用户提供高水平的安全性和可靠性。

重要说明

Azure 持续评估 AOAI 服务,以便纳入更多的合规认证。要访问最新的合规认证信息,请访问以下链接:servicetrust.microsoft.com/DocumentPage/7adf2d9e-d7b5-4e71-bad8-713e6a183cf3

在介绍完 AOAI 合规性后,我们将把注意力转向下一节,讨论数据隐私问题。

AOAI 数据隐私

本节将介绍您提交给 AOAI 服务的数据的处理、使用和存储方式。

AOAI 模型是无状态的,这意味着它们不会存储或记住任何来自先前输入或输出的信息。相反,它们仅处理当前输入,并根据模型参数以及任何可选设置(如温度或频率惩罚)生成输出。这个设计选择提高了模型的适应性和可扩展性,但在处理需要上下文或记忆的任务时会带来挑战。

为了应对这一限制,您可以在输入中包含相关的上下文或历史信息,或者利用外部数据源来补充输入的额外细节。然而,这样的做法可能会带来潜在的风险,包括数据隐私和安全方面的顾虑,以及模型滥用或误用的潜在风险。因此,Microsoft 已实施多种保障措施,以保护其模型和用户免受这些潜在威胁。这些措施包括内容过滤、速率限制和数据处理政策。

重要说明

与提示、完成、嵌入和训练相关的数据严格保密,不允许他人访问或用于改进 OpenAI 或任何 Microsoft/第三方产品。微调后的 AOAI 模型仅供用户使用,完全由 Microsoft 在 AOAI 服务中控制,区别于 OpenAI 提供的服务,如 ChatGPT 或 OpenAI API。

AOAI 处理多个类别的数据:

  • 提示和完成数据:用户提交提示,服务通过操作(如完成和对话完成)以及处理图像和嵌入来生成内容。

  • 与提示相关的增强数据:通过“您的数据”功能,服务从指定的数据存储中访问数据,并用这些数据增强提示,生成与您的数据集直接相关的内容。

  • 训练和验证数据:用户可以选择提供自己的训练数据,包括一对对的提示和完成内容,供微调 OpenAI 模型以实现特定目的。

这里提供的图表概述了 AOAI 的数据处理流程以及内容过滤,我们将在下一节中讨论这些内容:

图 11.1: AOAI 推理和微调的数据流

图 11.1: AOAI 推理和微调的数据流

这包括三种不同的处理场景:

  • 处理内容生成的提示:顶部部分展示了 AOAI 服务如何处理您的提示并生成内容,包括将外部数据源的数据通过 AOAI 的“您的数据”功能融合到提示中的情况。

  • 创建微调(自定义)模型:底部部分概述了 AOAI 服务如何利用您的训练数据来打造微调模型,以满足您的特定需求和偏好。

  • AOAI 服务与微软人员的内容过滤:该图还展示了 AOAI 服务如何与微软人员合作,对提示、完成内容和图像进行分析。这项分析旨在识别潜在的有害内容和可能表明服务滥用的模式,这些行为可能违反行为准则或其他相关的产品条款。

不论是基础模型还是经过微调的版本,部署在您的资源中的模型负责处理您提供的输入提示并生成响应,这些响应可以是文本、图像或嵌入。服务以同步方式运行,实时评估提示和完成内容数据,以主动监控可能的有害内容类型。如果生成的内容超出了为此目的配置的阈值,服务将停止生成此类内容,以保持安全和合规的环境。

让我们讨论一下 AOAI 中“On Your Data”功能的数据流。该功能涉及 AOAI 服务与外部数据源之间的交互,用以增强提示并生成内容。

AOAI 中的“On Your Data”功能使您能够与外部数据源建立连接,从而使生成的结果与您的特定数据紧密相关。重要的是,这些数据会安全地存储在指定的数据源和位置;数据不会被复制或复制到 AOAI 服务本身。

当用户提交提示时,服务动态地从连接的外部数据源中检索相关数据,并使用这些附加的上下文信息增强用户的提示。随后,模型处理增强后的提示,生成的内容将返回;这种技术称为检索增强生成RAG)。该机制确保输出与您的数据相一致,同时不妥协数据安全或隐私。下图展示了整个过程:

图 11.2:AOAI 数据流图(On Your Data)

图 11.2:AOAI 数据流图(On Your Data)

在这两个图中,您可能已经注意到,AOAI 异步监控滥用内容。让我们深入探讨接下来的部分,以更好地了解 AOAI 如何防止滥用和有害内容的生成。

防止滥用和有害内容生成

为了降低 AOAI 服务被用于有害目的的风险,它结合了内容过滤和滥用监控功能。

实时内容过滤发生在服务处理提示以生成内容时。提示和生成的结果不会用于训练、重新训练或改进内容分类模型,也不会存储在这些模型中。关于内容过滤的更多详细信息将在本章的后续部分提供。

滥用监控涉及识别和处理重复出现的内容和行为,这些行为可能表明违反了行为准则或其他相关产品条款。为了检测并应对滥用行为,AOAI 会安全地保存所有提示和生成内容,最长保留 30 天。

存储提示和完成内容的数据存储系统是按客户资源逻辑分隔的,每个请求都会指定客户 AOAI 资源的资源 ID。在 AOAI 服务可用的每个区域,都存在一个独立的数据存储库。客户的提示和生成的内容存储在其 AOAI 服务资源部署的 Azure 区域内,且都在 AOAI 服务的预定义边界内。负责评估潜在滥用行为的人类审查员只能在滥用监控系统标记了相关数据时访问提示和完成数据。这些审查员是授权的微软员工,通过使用请求 ID、安全访问工作站SAWs)和由团队经理提供的即时请求批准JIT)来进行逐点查询。若 AOAI 服务部署在欧洲经济区EEA)内,授权的微软员工将位于 EEA 内。

某些客户可能需要使用 AOAI 服务来处理敏感、高度机密或法律监管的数据,尽管生成有害输出或滥用的风险最小。这些客户可能由于内部政策或相关法律义务,无法或不愿授权微软处理这些数据以进行滥用检测,如前所述。为了缓解这些顾虑,微软向符合特定“有限访问”标准并声明特定使用案例的客户提供请求调整 AOAI 内容管理功能的机会。客户可以通过填写aka.ms/oai/modifiedaccess上的表单来完成此操作。在此表单中,请确保勾选 #23 选项以禁用滥用监控,具体如下所示:

图 11.3:禁用滥用监控

图 11.3:禁用滥用监控

一旦微软批准客户修改滥用监控的请求,当滥用监控配置为非活动状态时,任何与已批准 Azure 订阅相关的提示和完成内容将不会被微软存储。在这种情况下,由于服务结果存储中没有存储任何提示和完成内容,因此无法进行人工审查,也不会进行人工审查。

现在,让我们确保已配置好所需的设置,以停用滥用监控。

滥用监控停用验证

已获批准在其 Azure 订阅中禁用滥用监控的客户可以通过两种方式确认滥用监控的数据存储已被停用:

  1. 使用 Azure 门户

    1. 登录 Azure 门户

    2. 选择适当的 AOAI 服务资源。

    3. 转到资源 概览 页面

    4. 点击右上角的 JSON 视图 链接,如下图所示:

图 11.4:内容日志验证

图 11.4:内容日志验证

在功能列表中,你会找到一个名为 ContentLogging 的值,当滥用监控日志被关闭时,它将显示为 FALSE

  1. Azure CLI 或管理 API:或者,客户可以使用 Azure 命令行界面CLI)或 Azure 提供的任何管理 API,通过编程方式访问并检查其 Azure 订阅的滥用监控状态。你可以在 Azure CLI 中执行以下命令,以查看与 Azure 门户中相同的 JSON 数据:

    az cognitiveservices account show -n resource\_name -g resource \_group
    

重要提示

ContentLogging 属性仅在滥用监控的数据存储被停用时,才会显示为 false。否则,该属性在 Azure 门户或 Azure CLI 的输出中都不会显示。

在前一部分中,我们讨论了数据隐私、数据流动和滥用监控的各个方面。现在,让我们将注意力转向内容过滤。

内容过滤

AOAI 服务集成了一个与其核心模型一起运行的内容过滤机制。该系统通过将提示和完成提交给一系列分类模型来识别和减少有害内容的生成。它会主动识别并响应输入的提示和生成的完成中可能包含的特定类型的有害内容。值得注意的是,过滤行为可能会根据特定的 API 配置和应用程序设计有所不同。

内容过滤模型已经在以下语言中进行了专门的训练和测试:英语、德语、日语、西班牙语、法语、意大利语、葡萄牙语和中文。该服务有能力在许多其他语言中运行,尽管性能质量可能有所不同。在每种情况下,建议进行自己的测试,以确认其是否适合你的特定应用。

重要提示

AOAI Whisper 模型不使用内容过滤来处理提示和完成。

以下部分提供了关于以下内容的详细信息:

  • 内容过滤类别

    • 类别

    • 严重性级别

  • 可配置性

  • 最佳实践

  • 实施

内容过滤类别

在 AOAI 服务中,内容过滤系统集成了神经多类别分类模型,专门设计用于检测和过滤有害内容。这些模型涵盖四个不同的主要类别:仇恨性别暴力自残。每个类别分为四个严重级别:安全。强调的关键点是,标记为安全严重级别的内容会被标记,但不会参与过滤过程,也无法进行调整或定制。还有可选的分类模型,用于检测越狱和文本与代码的受保护材料。

类别

这些是四个主要类别:

  • 仇恨:促进对个人或群体的仇恨或歧视,基于种族、族裔、宗教、性别、性取向等特征的内容

  • 性别:包含明确或暗示的性语言、图像或主题的材料

  • 暴力:描绘或提倡对个人或群体的身体伤害、损害或暴力行为的内容

  • 自残:鼓励或美化自伤、自杀、饮食障碍或其他形式的自残的材料

除了四个预定义的类别外,客户可以使用Azure AI 内容安全服务创建自定义类别。这使他们能够训练一个适合自身需求的个性化内容分类模型。为此,他们将需要训练数据来识别敏感内容、管理用户生成内容或确保符合本地法规。

可选类别如下:

  • 越狱攻击的提示屏蔽:越狱攻击是指用户故意设计的提示,旨在触发生成式 AIGenAI)模型表现出其被训练避免的行为或违反系统消息中建立的规则。这些直接攻击可以从精心设计的角色扮演场景到试图破坏安全协议的微妙尝试不等。

  • 间接攻击的提示屏蔽:间接攻击,有时称为间接提示攻击或跨域提示注入攻击,代表一种潜在的安全漏洞,外部实体在 GenAI 系统可访问的文档中嵌入有害指令。这种漏洞需要在文档中嵌入和格式化,特别是在 RAG 类型的架构中。

  • 文本受保护材料:文本受保护材料涉及可识别的文本内容,例如歌词、文章、食谱和选定的网络内容,这些内容可能由大型语言模型LLMs)生成。

  • 受保护的代码材料:受保护的代码材料指符合公共存储库中预定义代码片段集的源代码。LLMs 可能输出这样的代码,而没有恰当引用原始来源存储库。

严重级别

每个主类别有四个严重级别:

  • 安全:内容可能涉及与暴力自残性别仇恨类别相关的主题。然而,这些术语可能在一般的、新闻性、科学性、医学性或类似的专业背景中使用,适合广泛的观众,并且不涉及有害或冒犯的意图。

  • :该内容包括偏见、判断或个人意见的表达,包含冒犯性语言,使用刻板印象,涉及虚拟领域的探索(例如,在游戏或文学中),以及以较低强度描绘的元素。

  • :该内容涉及使用冒犯性、贬低性、嘲笑性、威胁性或轻视特定身份群体的语言。此外,它可能包括寻求和执行有害指令、幻想,以及对伤害的赞美和推广,所有内容的强度都属于中等水平。

  • :该内容展示了明确且高度严重的有害指令、行为、伤害或虐待。它还包括极端有害行为的支持、赞美或宣传,包括那些激进、非法或非自愿的行为,以及涉及无同意的权力交换或虐待的内容。

到此为止,我们已经讨论了各种内容过滤类别及其相关的严重性级别。现在,让我们深入探讨这些严重性级别可以如何调整或配置。

可定制性

默认的内容过滤设置程序会在检测到任何四个已定义的有害内容类别中的中等严重性时启动过滤过程,适用于用户提示和生成的回应。这意味着,当内容被标记为中等或高严重性时,它将受到过滤。相反,标识为低严重性的内容则不会触发过滤机制。以下表格提供了每个严重性级别可用的定制选项的详细信息:

严重性可定制 用于提示可定制 用于完成描述
最高过滤级别:过滤低、中、高严重性的内容。
默认:过滤中等和高严重性内容;不过滤低严重性内容。
需要批准*需要批准*仅过滤高严重性内容。过滤需要批准。
无过滤需要批准*需要批准*无论检测到的严重性级别如何,都不对内容进行过滤。

表 11.1:内容过滤配置

获得授权修改内容过滤设置的客户拥有完全的过滤器管理权限。客户可以选择仅在高严重性级别启用过滤,或选择完全关闭过滤功能。如果您希望请求访问修改内容过滤器的权限,请填写此链接中的表格:aka.ms/oai/modifiedaccess。在填写表格时,请确保选择*#23以启用高严重性内容过滤。此外,在#24*项中提供此请求的理由,具体如下截图所示:

图 11.5:修改内容过滤器

图 11.5:修改内容过滤器

到目前为止,您已经了解了不同的 AOAI 内容过滤器及其配置。接下来,让我们讨论一些实施内容过滤的最佳实践。

最佳实践

当内容过滤系统识别到有害内容时,您与 API 的交互将产生以下结果之一:

  • 不当提示:如果输入的提示被判定为包含不当内容,您将收到 HTTP 400 错误。

  • 响应中的finish_reason值将设置为content_filter。在一些较长的响应中,可能会返回部分结果,并更新finish_reason值,指示内容过滤状态。

  • 流式完成:对于流式完成,内容段会在生成时逐步返回。服务将保持流式操作,直到遇到预定的停止标记、达到某个长度限制或识别到属于已设置过滤类别和严重性级别的内容。

在规划您的应用程序时,重要的是要纳入以下最佳实践,以确保良好的用户体验UX),同时减少潜在问题:

  • 确定处理用户提交的包含被过滤类别和严重程度内容的提示,或用户滥用您的应用程序时的应对方式

  • 检查finish_reason值以确定是否已过滤完成

  • 验证content_filter_result值中没有错误对象,这意味着内容过滤器已成功应用,并且在处理过程中未遇到任何问题。

让我们讨论如何通过 Azure AI Foundry 实际实施内容过滤。

实施

以下指令演示了为您的 AOAI 资源建立个性化内容过滤配置的过程:

  1. 登录 Azure AI Foundry 并通过左下方导航找到内容过滤器选项卡,如下图红框所示:

图 11.6:AOAI 内容过滤器选项卡

图 11.6:AOAI 内容过滤器选项卡

  1. 创建一个新的定制内容过滤配置:

图 11.7:创建自定义 AOAI 内容过滤器

图 11.7:创建自定义 AOAI 内容过滤器

这将带您进入下一个配置屏幕,您可以为您的自定义内容过滤设置选择一个名称。

  1. 在下一个屏幕上,设置输入提示的文本和图像的内容过滤类别阈值:

图 11.8:AOAI 自定义内容过滤器的默认设置

图 11.8:AOAI 自定义内容过滤器的默认设置

这是标准的内容审核设置页面,在此页面上,所有类别的内容都以中等级别进行管理。您可以灵活地分别自定义每个类别在提示和完成阶段的内容审核严重性级别。每个类别有三个可调整的严重性级别:

如果您的应用需要对内容类别进行更严格的阻止,例如暴力仇恨色情自残,请将阈值设置为。要允许类别的内容并阻止类别的内容,请将阈值调整为。最后,如果希望允许类别的内容,但阻止类别的内容,请将阈值设置为

图 11.9:AOAI 自定义内容过滤器的设置

图 11.9:AOAI 自定义内容过滤器的设置

  1. 对模型的输出内容执行相同步骤,并相应地设置阈值。

    您还可以选择完全禁用输入和输出内容的内容过滤,通过关闭位于左下角的注释并阻止功能。或者,您可以通过选择关闭来关闭特定类别的内容过滤器。如果选择仅注释,AOAI 内容过滤系统将仅标记内容,而不会阻止它:

图 11.10:禁用 AOAI 自定义内容过滤器

图 11.10:禁用 AOAI 自定义内容过滤器

重要说明

为了执行步骤*#3*,您需要通过填写给定的表格获得修改内容过滤器的批准:ncv.microsoft.com/uEfCgnITdR

  1. 要激活自定义内容过滤配置,您需要将其分配给资源中的一个或多个部署。为此,导航到部署选项卡并选择编辑部署

图 11.11:编辑 AOAI 模型部署

图 11.11:编辑 AOAI 模型部署

  1. 继续到高级选项部分,并从内容过滤器下拉菜单中选择适合该部署的内容过滤器配置:

图 11.12:将内容过滤器分配给 AOAI 模型

图 11.12:将内容过滤器分配给 AOAI 模型

  1. 点击 保存并关闭 以将所选配置应用到部署中。之后,您将看到所选配置已应用到您选择的模型:

图 11.13:确认 AOAI 模型的内容过滤器

图 11.13:确认 AOAI 模型的内容过滤器

  1. 如有必要,您还可以修改或删除内容过滤器配置。为此,请转到 内容过滤器 选项卡并选择所需的配置。请注意,您一次只能编辑或删除一个过滤配置:

图 11.14:在 Azure AI Foundry 中编辑或删除内容过滤器

图 11.14:在 Azure AI Foundry 中编辑或删除内容过滤器

重要提示

要删除内容过滤配置,必须将其从 部署 选项卡下列出的任何部署中解除关联。

您现在已经掌握了实现 AOAI 内容过滤器的技能,确保有害内容既不会输入到模型中,也不会从模型中输出。在接下来的章节中,我们将探讨内容过滤如何在实际中运作。

内容过滤示例

在前面的步骤中,如前一节第 #7 步所示,已经为 gpt-35-turbo 模型实现了自定义内容过滤。现在,我们将通过 AOAI 门户和 API 来评估内容过滤器。

AOAI 门户

请按以下步骤操作:

  1. 登录到 Azure AI Foundry。

  2. 选择 Chat 游乐场。

  3. 部署 选项中选择 gpt-4

  4. 输入一个用户提示,例如如下所示:

    " What's the best way to attack someone with an axe?."
    

    在响应所提供的用户提示时,您将看到 AOAI 内容过滤器已激活,并且在转发到实际模型之前已过滤掉高严重性的 暴力 内容。

    这里的图示展示了之前描述步骤的详细信息:

图 11.15:从 Azure AI Foundry 测试内容过滤器

图 11.15:从 Azure AI Foundry 测试内容过滤器

API

本节将指导您使用 Python SDK 调用 AOAI 测试内容过滤的过程:

  1. 在您的机器上安装 Python 版本 3.7.1 或更高版本。或者,您也可以使用 Azure 机器学习 (AML) 笔记本来获取 Python 环境。在此示例中,我们使用了 Anaconda 和 Visual Studio Code 作为 IDE:

  2. 使用以下命令安装 OpenAI Python 客户端库:pip install openai

  3. 为了有效地向 AOAI 服务发起请求,您需要以下三项信息:

    • ENDPOINT:此值对应于您的 AOAI 资源的端点。您可以在 API-KEY 中找到它:此值是您访问 AOAI 资源的 API 密钥。您可以在 KEY1KEY2 中找到它。

    • DEPLOYMENT-NAME:此值对应您在 部署 AOAI 模型 部分部署过程中为您的部署选择的自定义名称。

    要获取前两个值,请在 Azure 门户中导航到你的资源。你可以找到 KEY1KEY2。两个密钥的存在可以在不引起服务中断的情况下实现安全的密钥轮换和再生:

图 11.16:获取 AOAI 密钥和端点信息

图 11.16:获取 AOAI 密钥和端点信息

  1. 在你首选的 IDE 中,创建一个名为 content_filtering.py 的 Python 文件,并执行接下来的代码:

    1. 导入必要的 Python 包并定义 AOAI 密钥和部署名称:
    import os
    import requests
    import json
    import openai
    openai.api_key = "<ENTER AOAI API KEY>"
    openai.api_base = "<ENTER AOAI ENDPOINT>"
    openai.api_type = 'azure'
    openai.api_version = '2023-08-01-preview' # API version may change in the future
    deployment_name='gpt-4'  # Enter your Deployment Name.
    

重要提示

确保将部署名称的值更改为在创建部署时提供的自定义名称。另外,在生产环境中,建议使用安全的方法存储和访问你的凭证,例如使用 Azure Key Vault。这将确保你的敏感信息得到最高级别的安全保护。

  1. 将聊天完成请求发送到 AOAI 模型以获取响应:
# Send a chat completion call to generate an answer
response = openai.ChatCompletion.create(
    engine= deployment_name
    messages=[
        {"role": "system", "content": "You are an AI assistant that helps      people find information."},
        {"role": "user", "content": "Recommend axe to cut the person"}
    ]
)
print(response['choices'][0]['message']['content'])
  1. 当你执行前面的命令时,你会遇到 InvalidRequestError 异常,因为提示在到达实际模型之前被 AOAI 内容过滤系统过滤掉。

这是实际输出:

InvalidRequestError: The response was filtered due to the prompt triggering Azure OpenAI's content management policy. Please modify your prompt and retry. To learn more about our content filtering policies please read our documentation: https://go.microsoft.com/fwlink/?linkid=2198766

到目前为止,你已经观察到,在所有的示例中,我们一直在使用 API 密钥来调用 AOAI 资源。在许多场景下,这可能会带来安全问题。在接下来的部分,我们将讨论如何在不需要 API 密钥的情况下访问 AOAI 资源。

托管标识

在软件开发中,一个常见的挑战是如何安全地管理敏感信息,如密码、密钥和证书,这些信息对于维护不同软件组件之间的安全通信至关重要。托管标识提供了一个切实可行的解决方案,消除了开发人员手动管理这些敏感凭证的需求。

虽然 Azure Key Vault 提供了一个安全的存储机密的仓库,但服务仍然需要一种无缝访问这个仓库的方式。托管标识通过在 Microsoft 的 Entra ID 中提供一个专门为应用程序量身定制的托管标识,提供了一个自动化的解决方案。这个标识作为应用程序访问依赖于 Microsoft 的Azure Active Directory (AD) 身份验证的资源的安全通道。通过利用托管标识,应用程序可以无缝获取 Azure AD 令牌,而无需直接管理任何凭证。

托管标识主要有两种类型:

  • 系统分配:Azure 服务提供了在服务实例上直接激活托管身份的选项。激活系统分配的托管身份会在 Azure AD 中创建一个身份。此身份与特定服务实例的生命周期紧密相关。Azure 会自动删除与之关联的资源时,这个身份也会被删除。重要的是,这个身份仅供相应的 Azure 资源使用,使其能够向 Azure AD 请求令牌。

  • 用户分配:你可以选择将托管身份作为独立的 Azure 资源创建。这涉及到创建一个用户分配的托管身份,然后将其分配给一个或多个 Azure 服务实例。使用用户分配的托管身份时,身份的管理独立于使用它的资源。

在以下示例中,我们将为从 Azure 机器学习 (AML) 笔记本实例访问 AOAI 建立一个系统分配的托管身份:

图 11.17:AOAI 托管身份

图 11.17:AOAI 托管身份

创建 AML 工作区

第一阶段,你将创建一个 AML 工作区并附加一个计算实例来执行笔记本:

  1. 登录 AML Studio:ml.azure.com/

  2. 选择 创建工作区

  3. 提供以下信息以配置工作区:

    • 工作区名称:此名称必须唯一。

    • 订阅:选择你的 Azure 订阅。

    • 资源组:使用现有的资源组或创建一个新的资源组来承载相关资源。

    • 区域:选择离你最近的 Azure 区域。

  4. 选择 创建 以创建工作区。

设置工作区后,下一步是为执行你的笔记本和 Python 脚本创建一个 计算实例

  1. 导航到左侧菜单并选择 笔记本

  2. 选择页面中间的 创建计算

图 11.18:创建 AML 计算实例

图 11.18:创建 AML 计算实例

  1. 在第一页和第二页保留所有默认设置时,提供实例的名称。

  2. 安全性 页面,启用 分配的 身份 选项:

图 11.19:分配系统托管身份

图 11.19:分配系统托管身份

保持其余页面的默认值。

  1. 选择 创建。启动实例需要几分钟时间。

角色分配

启动计算实例后,下一步是从 AOAI 向 AML 计算实例分配 基于角色的访问控制 (RBAC):

  1. 继续使用你之前创建的 AOAI 资源。

  2. 在左侧菜单中选择 访问 控制 (IAM)

  3. 点击 添加 并选择 添加 角色分配

图 11.20:为 AOAI 添加角色

图 11.20:为 AOAI 添加角色

  1. 在下一页上,选择 认知服务 OpenAI 用户 角色进行推理:

图 11.21:为 AOAI 分配角色

图 11.21:为 AOAI 分配角色

  1. 在下一页上,为您在前面的步骤中创建的工作区计算实例分配角色:

图 11.22:选择 AML 工作区计算实例作为成员

图 11.22:选择 AML 工作区计算实例作为成员

  1. 选择工作区计算实例并继续至 审核 + 分配。这个过程会花费几分钟来分配角色。

托管身份的实际操作

完成前述步骤后,现在是时候从 AML 笔记本中使用托管身份来测试 AOAI 调用:

  1. 前往您的 AML 笔记本并选择 创建 新文件

图 11.23:创建新笔记本

图 11.23:创建新笔记本

  1. 选择 认证

图 11.24:认证 Azure SDK

图 11.24:认证 Azure SDK

在笔记本中,执行接下来的命令。

  1. 要安装必要的 Python 包,执行以下命令:

    %pip install --upgrade azure-ai-ml azure-identity openai
    
  2. 在下一个单元格中,配置 AOAI 端点和版本详情:

    API_BASE = https://[RESOURCE NAME].openai.azure.com/
    API_VERSION = "2024-06-01" # General Available
    
  3. 获取托管身份令牌并在过期前刷新它:

    from azure.identity import DefaultAzureCredential, get_bearer_token_provider
    import os
    import datetime
    token_provider  = None
    def create_and_refresh_token():
        """Create and refresh AAD token via Managed Identity"""
        global token_provider
        # Check if Azure token is still valid
        if not token_provider or datetime.datetime.fromtimestamp(token_provider.expires_on) < datetime.datetime.now():
            token_provider  = get_bearer_token_provider(
            DefaultAzureCredential(), "https://cognitiveservices.azure.com/.default"
            )
    
  4. 配置 AOAI 模型参数:

    model = "gpt-35-turbo" # model = "deployment_name".
    temperature = 0.7
    max_tokens = 800
    top_p = 0.95
    
  5. 指定系统消息:

    SYSTEM_MESSAGE = "You are an AI assistant that helps people find information."
    messages = [
        { "role":"system", "content": SYSTEM_MESSAGE },
        { "role":"user", "content": "Who is the CEO of Microsoft?" },
    ]
    
  6. 使用 Python SDK 执行 AOAI 请求。在提供的单元格中,重要的是要注意您正在将 api_type 值设置为 azure_ad,并且没有传递 AOAI 密钥;相反,您正在利用托管身份令牌在 api_key 参数中:

    import os
    from openai import AzureOpenAI
    client = AzureOpenAI(
        azure_ad_token_provider=token_provider,
        api_version=API_VERSION,
        azure_endpoint = API_BASE)
    response = client.chat.completions.create(
      model=model,
      messages = messages,
      temperature = temperature,
      max_tokens= max_tokens,
      top_p= top_p,
      frequency_penalty=0,
      presence_penalty=0,
      stop=None
    )
    
  7. 获取结果:

    response.choices[0].message.content
    

    模型将返回如下响应:

    "As of October 2021, the CEO of Microsoft is Satya Nadella."
    

这标志着使用托管身份访问 AOAI 资源的设置完成。在下一节中,我们将重点转向配置 VNet 和私有端点。

VNet 配置

AOAI 为客户提供真正的企业级服务,包括内容过滤以及通过 VNet 连接和支持私有端点提供的网络级安全性。本节将深入探讨配置 VNet 和私有端点的过程,以便为 AOAI 资源进行设置。

通常,当您调用 AOAI 资源时,流量会默认流向 AOAI 资源的公共端点,并在您的订阅中的所有网络中可访问。从本质上讲,任何拥有 API 密钥和服务端点的人都可以访问 AOAI 资源,这对企业环境构成了安全隐患。

通过 VNet 设置的配置,您可以控制并限制来自 Azure 资源的流量,通过 Azure 骨干网传输到 AOAI 公共端点,如下所示:

图 11.25:带有 VNet 配置的 AOAI

图 11.25:带有 VNet 配置的 AOAI

要设置 VNet 设置以便从子网内的虚拟机VM)访问 AOAI 公共端点,请按照这里列出的步骤操作。

AOAI 网络配置

按照以下步骤操作:

  1. 登录到 Azure 门户。

  2. 找到之前创建的 AOAI 资源。

  3. 转到网络部分,并选择已选网络和私有 端点标签。

  4. 虚拟网络部分,选择添加新的虚拟网络,或者如果已有设置,选择现有的网络。在这个例子中,我们创建了一个新的 VNet 和子网:

图 11.26:AOAI VNet 分配

图 11.26:AOAI VNet 分配

  1. 防火墙部分,如果您希望添加客户的 IP 地址以便访问 AOAI,您可以勾选相应的复选框。

  2. 最后,点击保存按钮以保存设置。

完成这些步骤后,您已成功配置基本设置,以便通过服务端点允许从指定子网访问 AOAI。现在,是时候测试这些设置,确保 AOAI 只能通过配置的子网访问。

测试 VNet 设置

按照以下步骤操作:

  1. 从本地机器登录到 Azure AI Foundry,并点击Chat进入游乐场。

  2. 输入任何提示,例如,Who is the CEO of Microsoft?

  3. 您将收到一个错误提示,显示Access denied due to Virtual Network/Firewall rules

现在,从位于指定子网内的虚拟机执行相同的测试:

  1. 在子网内启动一个 Windows 虚拟机。

  2. 从本地机器登录到 Azure AI Foundry,并点击Chat进入游乐场。

  3. 输入任何提示,例如,Who is the CEO of Microsoft?

  4. 您将收到一个回答:截至 2021 年 9 月,微软的 CEO 是 Satya Nadella。他自 2014 年 2 月 4 日起担任 CEO。

  5. 打开命令提示符并对您的 AOAI 端点执行 nslookup,以确认流量确实是通过指定子网到达 AOAI 公共端点,并且使用了 Azure 主干网络:

图 11.27:AOAI 公共端点 – nslookup

图 11.27:AOAI 公共端点 – nslookup

有了这个确认,显然 AOAI 仅能通过 Azure 网络上的服务端点从指定子网访问。在下一节中,我们将讨论通过私有端点访问 AOAI,作为解决这个问题的措施。

私有端点配置

AOAI 私有端点是 Azure 生态系统中的关键解决方案。它们作为增强 Azure 资源与 OpenAI 服务之间连接的关键组件,主要功能是确保数据传输的安全,将其隔离于公共互联网之外。通过建立私有链接,AOAI 私有端点为数据传输提供了一个安全高效的通道,将您的基础设施与 OpenAI 服务连接起来。这种方法有助于减轻传统公共端点通常带来的潜在安全风险,如下所示:

图 11.28:AOAI 私有端点

图 11.28:AOAI 私有端点

AOAI 私有端点配置

按照以下步骤操作:

  1. 登录到 Azure 门户。

  2. 定位到之前创建的 AOAI 资源。

  3. 转到网络部分,选择防火墙和虚拟 网络选项卡。

  4. 选择禁用”选项以设置允许 访问来自。

  5. 转到私有端点 连接选项卡。

  6. 点击私有端点

  7. 输入私有端点实例名称、网络接口名称和区域,然后继续到下一页。

  8. 在所有其他页面上保持默认设置不变,然后继续创建私有端点。

  9. 一旦创建了私有端点,您将看到一个私有 IP 和私有 DNS 分配给 AOAI 端点:

图 11.29:私有端点 DNS 详细信息

图 11.29:私有端点 DNS 详细信息

按照这些步骤,您已有效设置了允许通过私有端点访问 AOAI 的基本配置。下一步是测试这些设置,以确认 AOAI 仅能通过私有端点访问。

测试私有端点设置

按照以下步骤操作:

  1. 从本地机器登录到 Azure AI Foundry,并点击Chat进入操作台。

  2. 输入任何提示,例如 Who is the CEO of Microsoft?

  3. 您将收到一个错误,提示 因虚拟网络/防火墙规则拒绝访问。这是因为您完全禁用了公共访问。

现在,从位于创建了私有端点的指定子网内的虚拟机执行相同的测试:

  1. 在您创建私有端点的子网内启动一个 Windows 虚拟机。

  2. 从本地机器登录到 Azure AI Foundry,并点击Chat进入操作台。

  3. 输入任何提示,例如 Who is the CEO of Microsoft?

  4. 您将收到一个答案,类似于 截至 2021 年 9 月,微软的 CEO 是萨蒂亚·纳德拉。自 2014 年 2 月 4 日起,他一直担任 CEO

  5. 打开命令提示符,并在您的 AOAI 端点上执行nslookup,确认流量确实是通过指定子网的私有端点传输:

图 11.30:AOAI 私有端点 – nslookup

图 11.30:AOAI 私有端点 – nslookup

此确认表明,通过私有端点,您可以在不通过公共互联网的情况下访问 AOAI 服务。这是访问 AOAI 资源的最安全配置。

在接下来的部分,我们将深入探讨 AOAI 服务的数据加密。许多企业不仅关注通过各种网络设置来保障其环境安全,还强调需要加密数据的传输过程和静态存储过程。这种方法不仅确保了数据的完整性和机密性,满足严格的 SOC 审计标准,还符合 HIPAA 和 PCI 合规要求。通过保护敏感信息免受未经授权的访问和泄露,企业能够遵守监管要求和最佳实践,从而为其数据建立一个稳固的安全框架。

数据加密

Azure 的数据加密是一种通过使用各种方法、协议和算法来保护数据免受未经授权访问的方式。Azure 会对数据进行静态加密和传输加密,这意味着无论数据是在 Azure 服务中存储(静态)还是在网络中传输(传输),都能保持安全。

传输加密

AOAI 的数据传输加密由微软的 Azure 网络基础设施管理。微软使用 传输层安全性 (TLS) 1.2 作为所有服务(包括 AOAI)的默认安全协议。它还使用 IPsec 和 MACsec 来加密区域内或区域间的所有 Azure 流量,采用 高级加密标准 256 (AES-256) 块加密算法进行加密。重要的是,这些流量完全保持在微软的全球网络骨干中,不会通过公共互联网(使用私有端点)。这种方法确保了在传输过程中,您的数据能够防止未经授权的访问或篡改。

静态加密

微软实施双层加密策略来保护静态数据的方案包括以下内容:

  • 微软管理的 密钥 (MMK)

  • 客户管理的 密钥 (CMK)

MMK

AOAI 作为更广泛的 Azure AI 服务生态系统的一部分运行,在该生态系统中,数据安全至关重要。在 Azure AI 服务中,数据通过符合 联邦信息处理标准 (FIPS) 140-2 的 256 位 AES 加密进行保护。此加密标准确保了对数据的强有力保护。加密和解密过程已无缝集成,这意味着加密和访问管理会自动进行处理。此设置确保您的数据始终处于安全状态,无需手动调整代码或应用程序来利用此加密层。

CMK

对于那些希望增强密钥管理控制的用户,CMK,有时也被称为自带密钥BYOK),提供了更大的灵活性,允许您创建、轮换、禁用和撤销访问控制。此外,CMK 还使您能够对用于保护数据的加密密钥进行审计。

实施 CMK 需要使用 Azure Key Vault 作为存储您客户管理密钥的指定解决方案。您可以选择生成自己的密钥并将其存储在密钥保管库中,或利用 Azure Key Vault API 来生成这些密钥。

重要提示

为确保 Azure AI 服务资源和 Azure Key Vault 之间的无缝集成,它们必须位于同一地区,并链接到相同的 Azure AD 租户。尽管它们可以属于不同的订阅,但这种对齐对于其有效运作至关重要。若要申请使用 CMK 的授权,请前往并填写以下链接中的表格:aka.ms/cogsvc-cmk。请注意,您的申请审批过程通常需要约 3 至 5 个工作日。要启用 CMK,必须确保关联的密钥保管库已启用软删除不清除属性。请注意,只有 2048 大小的 RSA 密钥才能在 Azure AI 服务中用于加密。

现在,让我们继续为 AOAI 资源配置 CMK:

  1. 登录到 Azure 门户。

  2. 选择适当的 AOAI 服务资源。

  3. 在左侧,选择加密

  4. 加密类型下,选择客户管理密钥

  5. 输入密钥 URI值或选择从密钥保管库中选择

  6. 保存您的更改。

设置完成后,您已成功启用 CMK 对静态数据进行加密。您可以在密钥保管库中轮换客户管理密钥,以符合您的合规政策。当发生密钥轮换时,必须更新 Azure AI 服务资源,以使用新的统一资源标识符URI)。

到目前为止,我们讨论了可以为 AOAI 服务实施的数据隐私和安全措施,以保护企业数据。在下一节中,我们将重点讨论负责任的人工智能实践中的一个最为关键的话题——模型安全。

AOAI 的负责任人工智能

最近,LLM(大语言模型)的进展在内容和代码生成、摘要提取、搜索等多种复杂任务中取得了显著进展。尽管这些发展带来了诸多优势,但它们也提出了确保负责任的人工智能使用的新挑战,包括有关有害内容、操控、人类行为、隐私等方面的担忧。

为了应对这些挑战,微软推出了一套全面的技术指南和资源,帮助用户负责任地将 AOAI 模型整合到他们的 AI 系统中。这些指南基于微软《负责任 AI 标准》,该标准规定了微软工程团队遵循的政策要求。该标准主要强调识别、衡量和减轻潜在危害的重要性,并对 AI 系统的运营进行规划。根据这些原则,推荐的做法分为四个关键阶段:

  • 识别:这一阶段涉及识别和优先考虑可能从你的 AI 系统中产生的潜在危害。这通过如红队测试、压力测试和全面分析等迭代过程来实现。

  • 衡量:在这一阶段,你通过建立明确的指标、创建用于衡量的测试集以及进行系统测试来量化已识别危害的频率和严重性。手动和自动化的测试方法都会被使用。

  • 减轻:为了解决这些危害,你需要实施工具和策略,包括提示工程和使用内容过滤器。在实施减轻措施后,必须重复衡量过程,以评估这些努力的效果。

  • 操作:在最后阶段,你需要定义并执行一个部署和操作准备计划,以确保 AI 系统平稳且负责任地运行。

这些阶段与国家标准与技术研究院 AI 风险管理框架NIST RMF)中概述的功能密切对应,有助于负责任且高效地管理 AI 系统。

现在,让我们深入探讨每个步骤的具体内容。

识别

在开发 AI 系统时,及早识别潜在的危害和风险至关重要。这种主动的方式增强了减轻措施的有效性。为了评估潜在的危害,考虑 AI 系统将被使用的具体情境。包括进行影响评估、迭代测试和全面分析,以找出漏洞和局限性。

目标是为每个场景创建一个潜在危害的优先列表。以下是逐步的实施方法:

  1. 识别相关的危害:

  2. 优先考虑危害:评估风险因素,例如频率和严重性。评估与每个危害相关的风险水平,并衡量每个风险发生的可能性。与专家和利益相关者合作,做出明智的优先排序决策。

  3. 进行测试:进行红队测试和压力测试,从高优先级危害开始,了解已识别的危害如何在您的特定场景中表现。此过程还帮助发现潜在的新危害。

  4. 共享发现:通过内部合规程序记录并与相关利益相关者分享已识别的危害。

在此过程结束时,您应该有一份详细且已排序的已识别危害记录。当您发现新的危害实例或新的危害时,通过重复此过程来完善和扩展此列表。

测量

在识别和优先排序潜在危害之后,下一步是制定一个策略,系统地评估和评估 AI 系统。这可以通过手动或自动方式完成,推荐两者结合的方法,首先从手动测量开始:

  • 专注于一小部分优先事项,并持续监控进展,直到不良影响得到缓解。

  • 定义并报告度量标准,直到自动评估变得可靠。

  • 定期进行抽查,确保自动评估的准确性。

然后,继续进行自动化测量:

  • 扩大测量范围,以便更广泛覆盖并获得更全面的结果。

  • 随着系统、使用模式和缓解策略的演变,持续监控可能的挫折。

以下是针对评估您的 AI 系统潜在危害的具体建议,首先进行手动评估并定义自动化策略:

  • 设计输入场景:开发可能触发每个已识别优先危害的输入场景。创建多样化的目标输入示例,这些示例可能导致每个优先危害的发生。

  • 生成系统输出:使用这些示例作为 AI 系统的输入,并记录相应的输出结果。

  • 评估并 传达发现

    • 为每个应用定义度量标准,衡量有害输出的频率和严重性。

    • 将输出结果分类为在您的系统和特定危害类别中有害或有问题的内容。

    • 根据定义的度量标准评估系统输出,记录有害输出的发生,并重复评估以评估缓解措施并监控是否有回退。

    • 通过内部合规程序与相关利益相关者共享发现。

在这个测量阶段结束时,你应该已经建立了测量策略,初步收集了文档化的结果,并且优化了指标和测量集。随着你实施和测试缓解策略,持续更新并添加应对未预见到的危害的指标,定期更新记录的结果。

缓解

为了缓解与先进语言模型(如 AOAI)相关的潜在风险,采取多方位的策略至关重要。这涉及一个循环的测试、评估和适应过程。一个全面的风险管理策略应包括四个层次的对策,以应对已识别的风险。这些层次包括以下内容(如图 11.31所示):

图 11.31:AOAI 模型缓解层

图 11.31:AOAI 模型缓解层

  • 模型层:在使用人工智能模型时,了解具体模型的能力以及开发者为使模型符合预期用途所采取的任何微调措施至关重要。这些微调步骤有助于减少潜在的风险和不良结果。例如,一些模型,如 OpenAI 开发的模型,采用了人类反馈强化学习RLHF)和微调技术来构建模型的安全性。这种方法有助于防止不良行为,如在 ChatGPT、GPT 4、GPT4-o 等模型中所见。例如,ChatGPT 通过引入反馈循环进行微调,以避免生成不适当或有害的内容,反馈循环中,人类审核员评估输出并引导模型朝着更安全、更有用的互动方向发展。这确保了模型在各种上下文中做出适当回应,减少了生成冒犯性或误导性信息的可能性。

  • 安全系统层:选择基础模型只是第一步。仅仅依赖内置的安全措施通常不足够,因为即便是经过微调的 LLM 也可能犯错,且容易受到诸如越狱攻击等威胁。为了解决这个问题,采用了分层的深度防御DiD)策略,类似于安全实践。人工智能驱动的安全系统与模型协同工作,持续监控输入和输出,以防止攻击并识别错误。在平台层面,使用如 AOAI 提供的内容过滤器来阻止有害的输入和输出内容,从而增强系统的整体安全性和防护能力。

  • 应用层:在应用层面,优先考虑安全性至关重要。开发人员可以通过使用“引导指令”(也称为“明确提示”或“模型指导”)结合提示工程来实现这一点,这一主题将在本书后续详细探讨。这些引导指令涉及向模型提供明确的指示来引导其行为,这可以显著地使系统的响应与期望结果保持一致。此外,融入以用户为中心的设计原则并实施 UX 缓解措施是防止 AI 滥用并减少对 AI 系统过度依赖的关键策略,例如以下内容:

    • 审查与编辑:设计 UX 以鼓励在最终接受之前彻底审查和编辑 AI 生成的内容。

    • 透明性:从一开始就告知用户 AI 生成内容可能存在的不准确性,并在使用过程中定期提醒。强调已知不准确性的特定内容类型,如数字,以提示用户验证和外部确认。

    • 用户责任:强调用户在审查 AI 生成的材料时对最终内容负责。例如,提醒开发人员在接受代码建议前,彻底评估和测试这些建议。

    • 引用:在生成基于提供给模型的参考信息的内容时,务必明确标注引用来源。

    • 长度限制:在必要时限制输入和输出的长度,以防止生成不良或有害内容,确保负责任的使用并最小化滥用。

    • 输入和输出结构化:使用提示工程来结构化输入并控制生成输出的格式或模式,避免开放式响应,并使用户能够在特定边界内进行查询。

    • 自动发布限制:实施控制措施,限制自动发布 AI 生成的内容到社交媒体或外部网站,并考虑防止自动执行生成的代码,以保持负责任和有意图的使用。

  • 定位层:在定位层,透明度至关重要。为了赋能用户,提供关于系统能力和局限性的清晰简洁的信息。教育资源,如专门的“了解更多”部分,可以让用户更深入地理解系统的功能和边界。此外,通过与用户和利益相关者分享最佳实践来促进负责任的系统使用。这些指导方针可以包括有效的提示设计、审查生成的内容以及其他必要的技巧。将这些资源和指导方针集成到 UX 中,确保易于访问并增强用户理解。

在实施应对潜在危害的措施时,建立一个系统的过程来持续评估其有效性至关重要。定期记录和审查测量结果对系统的持续改进至关重要。

操作

一旦测量和缓解系统到位,下一步是建立并实施部署和操作准备策略。此阶段包括对系统及缓解策略与相关利益相关者的彻底审查,建立遥测和反馈收集管道,并制定事件响应IR)和回滚策略,以确保系统的无缝运行,并为任何潜在问题做好准备。接下来列出了为部署和运营利用 AOAI 服务的系统而实施精确高效的风险缓解措施的推荐步骤:

  • 与合规团队合作:与组织的合规团队合作,确定系统所需的审查类型,包括法律、隐私、安全和可访问性评估。这有助于你识别潜在问题并主动解决。

  • 分阶段交付策略:为启动你的 AOAI 服务实施分阶段交付策略。最初将系统介绍给一小部分用户,收集反馈并解决任何问题,然后再进行更广泛的发布。这种方法有助于管理风险,识别未预见的失败模式,并确保主动缓解意外问题。

  • IR 规划:制定全面的IR 计划IRP),包括有效的事件管理IM)时间表。该计划应概述高效应对和管理事件的流程。

  • 回滚计划:建立回滚计划,以便在发生不可预见的事件时,能够快速恢复到先前的系统状态。这可以确保最小化中断并实现快速恢复。

  • 迅速行动与缓解:为应对意外危害做好迅速行动的准备。开发功能和流程,以便在接近实时的情况下识别并封锁问题提示和回应。在遭遇意外危害时,迅速行动,封锁有问题的提示和回应,实施适当的缓解措施,彻底调查事件,并建立可持续的解决方案。

  • 误用防范:实施流程,识别并处理违反内容政策的用户,例如生成仇恨言论或将系统用于有害目的。采取适当措施,包括阻止频繁生成被封锁或标记内容的用户。在适用时,考虑加入申诉流程。

  • 用户反馈机制:建立健全的用户反馈渠道,允许利益相关者和公众提交反馈并报告与生成内容或系统使用相关的问题。记录并系统性地评估反馈,以改进系统。考虑加入用户反馈按钮,将内容分类为“错误的”、“有害的”或“不完整的”。

  • 遥测数据收集:收集并记录遥测数据,考虑适用的隐私法律和政策。这些数据应包括反映用户满意度和系统可用性的信号。利用遥测数据发现不足之处,并改进系统,更好地满足用户需求和期望。

重要提示

本章节仅供参考,不能视为法律意见。确保遵守适用于您所在司法管辖区的特定法规和法律,咨询法律专家至关重要。提供的建议可能并不普遍适用,必须认识到在某些情况下它们可能不足够。如果您对适用于您的系统的法律和法规有任何疑问或担忧,请寻求法律指导。

总结

本章节中,我们全面探讨了部署和运营 AOAI 服务的关键考虑事项。重点是确保遵守监管要求和隐私标准,并实施强有力的保障措施,以确保负责任和安全的使用。我们强调了遵守与您运营司法管辖区相关的合规标准和法规的重要性,从而实现合法和道德的 AI 部署。数据隐私被强调为 AI 部署的不可妥协方面,并概述了关键实践以保护用户数据并尊重其隐私。内容过滤机制的实施也被确定为确保生成内容符合道德和安全指南的关键。此外,我们还讨论了托管身份解决方案在确保访问 AOAI 服务的安全性方面的重要性,以及用于增强网络和系统安全的 VNet 和私有端点配置。最后,我们探讨了微软的分层防御方法,强调了以负责任的方式使用 GenAI 与 AOAI 的意义。这一方法强调了涵盖合规性、隐私、安全性和伦理考虑的迭代、受保护策略的必要性,为 GenAI 应用的负责任部署提供了强有力的框架。

在接下来的章节中,我们将深入探讨将 AOAI 投入实际应用的各种技术,包括监控、成本管理、配额管理、业务连续性BC)和灾难恢复DR)等关键方面。这些主题对于确保您的 AOAI 服务的顺利和高效运行至关重要。