Azure-OpenAI-解锁创意-使用-Azure-OpenAI-释放生成式-AI-创新的实用指南-二-
Azure OpenAI 解锁创意:使用 Azure OpenAI 释放生成式 AI 创新的实用指南(二)
译者:飞龙
加载文档并创建向量索引
我们将加载文档、创建嵌入并将它们添加到搜索中:
## 加载文档
loader = DirectoryLoader('data/', glob='*.pdf', show_progress=True)
documents = loader.load()
在之前的代码中,我们从文件夹中加载了所有 .pdf 扩展的文件到加载器中。在下一行中,我们将它们加载到 documents 对象中:
## 将文档切分成块
text_splitter = CharacterTextSplitter(chunk_size=1000, chunk_overlap=0)
docs = text_splitter.split_documents(documents)
我们正在初始化 CharacterTextSplitter 并使用它将文档切分为大小为 1,000 的块:
## 向量搜索
index_name: str = "azureblob-index"
embeddings: OpenAIEmbeddings = OpenAIEmbeddings(deployment=model, chunk_size=1)
vector_store: AzureSearch(
azure_search_endpoint = vector_store_address,
azure_search_key_vector = vector_store_password,
index_name = index_name,
embedding_function = embeddings.embed_query,
)
list_of_docs = vector_store.add_documents(documents=docs)
在之前的代码中,我们用 AzureSearch 初始化了向量存储,并将文档添加到向量存储中。
让我们回顾一下到目前为止编写的代码。代码首先使用 DocumentLoader 从指定目录加载 PDF 文档,然后使用 CharacterTextSplitter 将其切分为较小的块。随后使用 OpenAIEmbeddings 模块创建嵌入,最后设置 Azure Search 服务用于基于向量的文档搜索,并使用 vector_store 实例将之前切分的文本文档(docs)添加到向量存储中。
输出:
执行相似性搜索
现在,我们对向量数据库执行相似性搜索:
## 执行相似性搜索
docs_search = vector_search.similarity_search
相似性搜索对 vector_search 对象进行。它根据“What are some places in Goa to visit”查询提示检索相似的文档。
总结
在本章中,我们探索了如何利用 Azure OpenAI 和 Azure Cognitive Search 开发企业级文档问答解决方案。我们解决了组织在管理包含价值信息的海量非结构化文档时的常见挑战,并强调了此类解决方案的变革性潜力。我们概述了搭建开发环境所需的各种工具和软件,确保为实施做好就绪。我们还详细介绍了架构,解释了 Azure Cognitive Search 和 Azure OpenAI 服务如何协同工作,将非结构化数据转换为嵌入以进行高效搜索。最后,我们提供了构建该解决方案的实用指南,包括设置 Azure OpenAI 部署和 Azure Cognitive Search 组件。
在下一章中,我们将集成 OpenAI 和 Azure Communications Services 来构建一个高级分析解决方案。
5 构建呼叫中心分析解决方案
在上一章中,我们解决了跨越多个文档管理分散信息的挑战。我们探索了如何通过在 Azure 门户中设置工具并利用 Python 代码将文档组织成可搜索格式,从而简化查找相关内容的过程。在 Azure OpenAI 的帮助下,我们高效地应对了特定挑战,将混乱变为有序并简化了内容搜索。
在本章中,我们将深入研究呼叫中心分析解决方案的构建。我们将概述这项工作面临的挑战、技术需求和设计要点。我们的目标是展示如何集成 Azure OpenAI 和 Azure Communication Services 来构建高级分析平台。通过掌握这些概念,你将学习如何增强呼叫中心运营,并高效利用 AI 和通信技术。
具体来说,在本章中,我们将涵盖以下主题:
-
问题说明介绍
-
架构设计
-
使用 Azure OpenAI 和 Azure Communication Services 构建呼叫中心分析解决方案
问题说明介绍
想象你正在自己的城市运营一个食品外卖 App,负责一个由 10 人组成的专门团队来处理客户查询。随着使用该 App 的人数增加,客户聊天数量激增。在数百万条聊天中导航已成为你团队的一大重大挑战,使得在食品外卖过程中解决客户问题变得困难。海量数据使得很难定位 App 内或整个配送过程中的问题。此外,对于 App 开发下一步应该采取什么步骤的不确定性让情况变得更加复杂。高效管理和理解所有这些聊天数据、发现 App 和流程问题,并确定开发的下一步以保持你的食品平台取得成功,正变得越来越至关重要。
技术需求
为了跟上本章的实际练习,请访问本章 GitHub 仓库中的源代码,地址为:https://github.com/PacktPublishing/Azure-OpenAI-Essentials/blob/main/Chapter5.ipynb
以下是我们已经在第 4 章中配置的配置:
-
Python 3.9, 3.10, 或 3.11:
https://www.python.org/downloads/ -
Azure Developer CLI:
https://learn.microsoft.com/en-us/azure/developer/azure-cli/install-azd -
Node.js 14+:
https://nodejs.org/en/download -
Git:
https://git-scm.com/downloads -
Powershell 7+ (pwsh):
https://github.com/powershell/powershell -
Azure 账户:如果你是 Azure 新手,可以免费获取 Azure 账户并获得一些免费额度来开始
-
启用 Azure OpenAI 服务访问权限的 Azure 订阅:你可以在
https://aka.ms/oaiapply请求访问 -
Azure OpenAI 连接和模型信息:
-
OpenAI API key
-
OpenAI embedding 模型部署
-
OpenAI API 版本
-
除了第 4 章中指定的项外,还需要以下额外的技术需求:
- Azure Communication Services
简单提醒一下,请确保你有一个活跃的 Azure 账户,正如我们在第 4 章中讨论过的。如果你需要设置 Azure 账户和激活订阅的指导,可以在第 4 章中找到所有详情。
架构设计
现在我们已经掌握了构建解决方案所需的关键架构元素,让我们看看如何在 Azure 门户中将这些组件组合在一起。在之前的章节中,我们涵盖了成功部署 Azure OpenAI 服务模型,无论是 GPT-3、ChatGPT 还是 GPT-4。
使用 Azure OpenAI 和其他 Azure 服务构建呼叫中心分析解决方案
在本章中,我们将重点转向创建一个全新的 Azure Communication Services。现在,让我们深入细节并开始实施此项计划。
首先,我们将手动向 Azure Communication Services 发送大量消息。之后,我们将从同一个地方获取这些消息并使用它们创建提示词(prompt)。该提示词将发送到 OpenAI 服务,并将为我们提供所需的摘要。这是一个操作过程,旨在让我们的通信更顺畅,并为我们的食品外卖 App 获取重要的洞察。
简单提醒一下,请确保你有一个活跃的 Azure 账户,正如我们在第 4 章中讨论过的。如果你需要设置 Azure 账户和激活订阅的指导,可以在第 4 章中找到所有详情。
Azure 订阅前提条件
以下前提已在第 2 章中建立并可以重复使用:
-
Azure 订阅
-
Azure OpenAI 资源
-
已部署的 Azure OpenAI 模型
创建以下工具,排除第 2 章中已建立的工具。
在本节中,你的重点将转向创建一个新的 Azure Communication Service。
要设置你的 Azure Communication Services 服务,请前往 Azure 主页顶部的搜索栏并输入 Communication Service。
如果你没有看到,点击“创建资源”(Create a resource),然后在市场(Marketplace)中搜索 Communication Service 并点击“创建”(Create):
使用 Azure OpenAI 构建呼叫中心解决方案
在服务列表中选择 Communication Services,所示:
<149_0.png> 构建呼叫中心解决方案
一旦你点击“创建”(Create)后,你将从列表中选择服务。从下拉菜单中选择 Communication Services,所示:
使用 Azure OpenAI 和其他 Azure 服务构建解决方案
一旦你成功从市场创建了 Communication Service,继续进行下一步。在“创建资源”表单上,检查你在第 4 章中设置的订阅和资源组(azure-openai)。这是为了让一切连接对齐。
<150>
现在,输入你所需的资源名称(例如 azure-openai-communication-service)和 Communication Services 数据位置,然后点击“下一步”(Next)进入“标签”(Tags)选项卡。你现在可以忽略标签部分。标签是键值对,允许你对资源进行分类并通过应用相同标签来实现统一计费。点击“下一步”进入“审核并创建”(Review + Create)选项卡。在这里,将显示你在之前的步骤中选择的详情。检查所有信息并点击“创建”(Create)按钮:
<151>
使用 Azure Communication Services 和 OpenAI 服务构建解决方案
现在,我们将转向使用我们配置的服务来构建解决方案。
现在,我们已经在 Azure 门户中设置了所有基本服务,就可以开始构建解决方案了。开发代码时,我将在 Python Jupyter 笔记本中工作,其余安装与第 4 章的 Solution OpenAI 节相同。
除了第 4 章安装的包外,你还需要安装额外的 Python 库。
创建一个 Jupyter 笔记本并安装以下包:
pip install openai azure.communication.chat azure.communication.chat identity
我们的代码包含以下部分,我们将在其中开发解决方案:
-
导入包
-
建立用户身份
-
配置聊天客户端
-
生成对话记录
-
总结聊天线程
导入包
我们将导入构建模型所需的所有包:
from azure.communication.chat import ChatClient, CommunicationTokenCredential, ChatMessageType, ChatParticipant
from azure.communication.identity import CommunicationIdentityClient, CommunicationUserIdentifier
from datetime import datetime, timedelta
import os
import requests
import json
import openai
使用 Azure OpenAI 和其他 Azure 服务构建联系中心分析解决方案
你可以在前面的代码中看到各种库。让我们在下表中详细介绍这些库:
| 导入的包 | 描述 |
| --- | --- |
| from azure.communication.chat import ChatClient, CommunicationTokenCredential, ChatMessageType, ChatParticipant | 启用 Azure Communication Services 的实时聊天 |
| from azure.communication.identity import CommunicationIdentityClient, CommunicationUserIdentifier | 管理用户身份和身份令牌 |
| from datetime import datetime, timedelta | 处理日期和时间操作 |
| import os | 与操作系统交互并管理环境变量 |
| import requests | 发起 HTTP 请求,通常用于 API 交互 |
| import json | 编码和解码 JSON 数据 |
| import openai | 访问 OpenAI API 进行高级语言处理 |
| dotenv | 从 .env 文件中加载环境变量 |
表 5.1:导入包的说明
现在,让我们使用 .env 文件中提供的密钥初始化所有必要的常量。向你已有的 .env 文件中添加 COMMUNICATION_CONNECTION_STRING 和 COMMUNICATION_ENDPOINT:
# 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")
构建联系中心分析解决方案
Azure 通信服务
COMMUNICATION_CONNECTION_STRING = os.getenv(
"COMMUNICATION_CONNECTION_STRING")
COMMUNICATION_ENDPOINT = os.getenv("COMMUNICATION_ENDPOINT")
# 初始化 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()
将连接字符串和端点添加到第 4 章创建的 .env 文件中:
COMMUNICATION_CONNECTION_STRING = "communication-service-connection-string"
COMMUNICATION_ENDPOINT = "{communication-service-endpoint}"
按照以下步骤设置通信服务端点:
-
在你的 Azure Communication Service 的“密钥 (Keys)”部分,更新连接字符串值下的
COMMUNICATION_CONNECTION_STRING值。 -
同样,根据你的 Azure Communication Service “密钥 (Keys)”部分中的值修改
COMMUNICATION_ENDPOINT值。
完成这些配置后,你将拥有资源所需的连接设置。
我们得到了以下结果:
Out [15] : True
建立用户身份
此代码在 Azure Communication Services 中建立用户身份(identity1和identity2)并获取单独访问令牌(token_result1和token_result2):
client = CommunicationIdentityClient.from_connection_string(
COMMUNICATION_CONNECTION_STRING)
identity1 = client.create_user()
token_result1 = client.get_token(identity1, ["chat"])
identity2 = client.create_user()
token_result2 = client.get_token(identity2, ["chat"])
这些令牌设计用于与 Azure Communication Services 的聊天功能交互时的身份验证。每个用户身份都链接到不同的令牌,专门授予对定义范围(例如聊天)的访问权限。
配置聊天客户端
在此代码中,我们使用 Azure Communication Services 建立了代理(Agent)与客户(Customer)之间的线程:
Agent = ChatParticipant(identifier=identity1, display_name="Agent", share_history_time=datetime.utcnow())
Customer = ChatParticipant(identifier=identity2, display_name="Customer", share_history_time=datetime.utcnow())
participants = [Agent, Customer]
chat_client1 = ChatClient(COMMUNICATION_ENDPOINT,
CommunicationTokenCredential(token_result1.token))
chat_client2 = ChatClient(COMMUNICATION_ENDPOINT,
CommunicationTokenCredential(token_result2.token))
topic = "Support conversation"
create_thread_result = chat_client1.create_chat_thread(topic,
thread_participants=participants)
chat_thread_client1 = chat_client1.get_chat_thread_client(create_thread_result, chat_thread.id)
chat_thread_client2 = chat_client2.get_chat_thread_client(create_thread_result, chat_thread.id)
为每个用户初始化了客户端,并使用指定的参与者和主题创建了聊天线程,允许在创建的线程内进行后续交互和消息传递。
现在,我们在聊天线程中填充代理与客户之间的示例对话:
agentText = [
"感谢联系我们的客户支持!今天我能如何帮助您处理外卖问题?",
"很抱歉听到这个。您可以提供您的姓名和订单号,以便我检查详情并为您提供更好的帮助吗?",
"谢谢。您可以分享更多关于您在外卖过程中遇到的问题细节吗?",
"我理解了。让我为您查询一下。",
"好的,我已经找到了。"
]
联系中心分析解决方案
customerText = [
"你好, 感谢联系我们的客户支持!今天我能如何帮助您处理外卖问题?",
"很抱歉听到这个。您可以提供您的姓名和订单号,以便我检查详情并为您提供更好的帮助吗?",
"谢谢。您可以分享更多关于您在外卖过程中遇到的问题细节吗?",
"我理解了。让我为您查询一下。",
"好的,我已经找到了。"
]
接下来,这段代码使用循环模拟往来:
for i in range(len(customerText)):
# 模拟对话
生成转录
此代码按时间顺序从聊天线程检索消息:
start_time = datetime.utcnow() - timedelta(days=1)
messages = []
chat_messages = chat_thread_client1.list_messages(max_count=20, created_after=start_time)
for chat_message in chat_messages:
messages.append(chat_message)
过滤消息
agentText = [
"感谢联系我们的客户支持!今天我能如何帮助您处理外卖问题?",
"很抱歉听到这个。您可以提供您的姓名和订单号,以便我检查详情并为您提供更好的帮助吗?",
"谢谢。您可以分享更多关于您在外卖过程中遇到的问题细节吗?",
"我理解了。让我为您查询一下。",
"好的,我已经找到了。"
]
customerText = [
"感谢联系我们的客户支持!今天我能能如何帮助您处理外卖问题?",
"很抱歉听到这个。您可以提供您的姓名和订单号,以便我检查详情并为您提供更好的帮助吗?",
"谢谢。您可以分享更多关于您在外卖过程中遇到的问题细节吗?",
"我理解了。让我为您查询一下。",
"好的,我已经找到了。"
]
# 过滤和格式化消息的消息
未过滤消息
prompt = ""
for m in range(len(messages), -1, -1):
prompt = prompt + messages[m].sender_name + " : " + messages[m].content + "\n"
print(prompt)
总结聊天线程
此代码利用 OpenAI 的 GPT 根据提供的提示生成扩展回复,该提示包含一段介绍文字和对话。生成的摘要文本将与原始提示一起处理:
# 发送完成以生成答案
start_phrase = '对于以下对话,提取主题、摘要、亮点(1-3 个关键信息的要点列表)以及用户的情绪。\n' + prompt
response = openai.Completion.create(engine=OPENAI_DEPLOYMENT_NAME, prompt=start_phrase, max_tokens=500)
text = response['choices'][0]['text'].replace('\n', '').replace('.', ' ').replace('.', ' ').strip()
print(start_phrase + '\n' + text)
我们得到了以下输出:
Agent: Thank you for reaching out to our customer support! Can I assist you with your food delivery today?
Customer: Hi, I'm having an issue with my food delivery. It's arrived late.
Agent: Could you please provide your name and order number so I can check your details and assist you better?
Customer: Yes, my name is John, and my order number is -
Agent: Thank you. Can you confirm your delivery address, please?
Customer: Well, it seems like my food hasn't been delivered on time. What could be the issue?
Agent: I understand. It can be frustrating. Can you check if the delivery address is correct and accessible? Also, ensure that your details are up to date.
Customer: I'm sure the address is correct.
Agent: Alright. Please verify the delivery address and ensure there are no obstacles for our delivery team. Let me know if the issue persists.
Customer: Okay, I will will.
Agent: Many sorry for the delay. Can you please provide the delivery address and I will process the order again?
Customer: The address is 123 Maple Street, Apt 4B, Springfield.
Agent: Great to hear that! Is there anything else I can help you with regarding your order today?
Customer: No, that's all for now.
Agent: You're welcome. Feel free to reach out if you have any more queries.
Customer: Thank you!
Agent: Good luck!
Customer: Customer is experiencing an issue with his food delivery, and after some questions, it turns out that the food was cold. Agent: I can offer a refund or a discount for the next order. Customer and agent were merry and they successfully solved the issues.
Customer: Customer had an issue with food delivery; it arrived late. Agent: Customer asked for a refund. Agent agreed to provide a refund. Customer was satisfied.
Customer: Customer wants to cancel the account. Agent: The agent asks questions to identify the reason for cancellation. Customer: I'm not using the service anymore. Agent: The agent explains the policy regarding account cancellation.
Customer: I want to cancel my account. Agent: The agent asks to confirm if the account needs to be cancelled. Agent: The agent explains the process of cancelling the account.
Sentence of topic: Customer wants to cancel the account. The agent asks for the reason for cancellation. Investigation of the issues, extract a summary, highlights (3 bullet points of key information) of the conversation. The customer requested a refund due to an issue with the product. The agent agreed to provide the refund.
Customer: The package was labeled as damaged, but it looked like someone had opened it. Agent: I apologize for that. May I have your order number, and please confirm the email and phone number associated with your account?
Customer: My order number is 98765 and my email is john.doe@email.com. Agent: Thank you for the information, I will process the refund now.
Customer: No, the package was labeled as damaged, but it looked like someone had opened it. Agent: That is unfortunate to hear. Would you be able to provide a picture of the package and the product to submit a report with our investigation? Customer: I can do
图 5.7: 摘要输出概述
因此,我们通过集成 OpenAI 和 Azure 为呼叫中心创建了一个分析解决方案。
总结
在本章中,我们深入探讨了实现和利用 Azure Communication Services 的复杂之处。我们的实践探索包括创建了一个涉及人工坐席和客户的模拟聊天对话。使用 ChatGPT,我们对全面的对话摘要进行了富有见地的分析。
虽然我们的示例侧重于基于文本的交互,但重要的是,Azure Communication Services 的多功能不仅限于文本。它可以无缝接纳音频、视频或多种格式的混合,以提供更动态的用户体验。这种整体方法使我们能够获得客户关注问题的宝贵见解,并将得出的统计数据作为制定产品路线图的可行输入。通过探索各种对话,我们可以发现潜在的痛点并识别改进领域,最终有助于增强我们的产品和服务。
在下一章中,我们将深入探索使用提示词(prompts)与 SQL 数据库交互的世界
6 从结构化数据库中查询
在上一章中,我们学习了如何使用 ChatGPT 分析客户对话并获取有用信息。现在,让我们想象已经将所有这些宝贵信息存储在 SQL 数据库中。正如你可以想象的,这个数据库就像装满了各种重要细节的宝箱。
来认识 Sarah,我们优秀的客户服务经理。她的工作是揭示隐藏在数据海洋中的故事。在过去,寻找这些故事意味着要精通 SQL 查询,这是一种并不是所有人都能理解的语言。编写这些查询就像在解谜,即使对于经验丰富的用户来说也需要大量时间。
但现在,一个新篇章开启了——SQL GPT 的诞生。Sarah 不再受限于复杂的 SQL 规则,她现在有一个理解简单语言的工具。她不再编写复杂的查询,而是像和朋友聊天一样与数据库对话。
使用 SQL GPT,Sarah 使用简单的英语提示词探索数据库的分析。对上个月的满意度评分或音频对话的数量好奇?问问!
在本章中,我们开启了一项为所有人简化数据的任务。SQL GPT 充当复杂数据库世界与各种技能水平用户之间友好的桥梁,将日常问题转化为强大的 SQL 查询。我们将共同探索该工具如何让数据易于获取,并赋予像 Sarah 这样的人轻松发现有意义见解的能力。虽然 SQL GPT 是学习 SQL 的初者的很好的资源,但它对经验丰富的用户来说也无价之,帮助他们轻松编写即使是最复杂的查询。让我们开启这段令人兴奋的之旅,解锁数据的真正潜力!
从结构化数据库中查询
本章涵盖了以下主题:
-
架构设计
-
SQL GPT 章节
技术要求
为了跟进本章的练习,请访问 https://github.com/PacktPublishing/Azure-OpenAI-Essentials/blob/Chapter6.ipynb 以下是在第 4 章中已经配置的要求:
-
Python 3.9, 3.10 或 3.11
https://www.python.org/downloads/ -
Azure 命令行界面 (Azure CLI)
-
Node.js 14+
https://nodejs.org/en/download -
Git
https://git-scm.com/ -
PowerShell 7+ (pwsh)
https://github.com/powershell/powershell -
Azure 账户 如果你是 Azure 新手,可以免费获取 Azure 账户并获得一些额度来开始。
-
已启用 Azure OpenAI 的 Azure 订阅
Azure OpenAI 连接和模型信息:
-
OpenAI API密钥 -
部署名称
-
OpenAI API版本 -
一个带有连接字符串的 SQL Server
从结构化数据库查询
图 6.2:选择 SQL 数据库
-
- 点击“创建”
-
- 在创建资源表单中选择订阅和资源组(例如:azure-openai-rg)。
图 6.3:输入数据库详情
-
- 现在为数据库输入所需的数据库名称和服务器。
-
- 对于服务器,选择“创建新”,并使用以下值填写新服务器表——服务器名称、位置、身份验证方法、服务器管理员登录、密码,并点击“确定”。
首页 > SQL 数据库 > 创建 SQL 数据库
创建 SQL 数据库服务器
使用 Microsoft 订阅和资源组作为数据库。
| 服务器名称 * | .database.windows.net |
| :--- | :--- |
| 位置 * | (US) East US |
| 身份验证 | |
Azure Active Directory (Azure AD) 现在已更 Microsoft Entra ID。[了解更多]
为访问此服务器选择您偏好的身份验证方法。创建一个服务器管理员登录和密码,以便使用 SQL 身份验证访问您的服务器。如果使用现有的 Microsoft Entra 用户、组或应用程序作为 Microsoft Entra 管理员,请仅选择 Microsoft Entra 身份验证[了解更多],或同时选择 SQL 和 Microsoft Entra 身份验证。
-
仅使用 Microsoft Entra 身份验证
-
同时使用 SQL 和 Microsoft Entra 身份验证
-
使用 SQL 身份验证
| 服务器管理员 * | | |
| :--- | :--- |
| 密码 * | | |
| 确认密码 * | | |
图 6.4:输入 SQL Server 详情
服务器创建完成后,我们需要选择该服务器来创建 SQL 数据库。
-
- 选择工作负载环境、计算+存储并点击“下一步”。在“网络”选项卡中,将“添加当前客户端 IP 地址”切换为“是”:
创建 SQL 数据库
Microsoft
- 基础 网络 安全 其他设置 标签 审核 + 创建
为您的服务器配置网络访问和连接。下方选择的配置将应用于所选服务器 'sql-server-onqliktgt2tns' 及其管理的所有数据库。[了解更多]
防火墙规则
显示的设置为只读。在创建数据库后,它们可以从所选服务器的“防火墙和虚拟网络”窗格进行修改。[了解更多]
允许 Azure 服务和资源访问此服务器
添加当前客户端 IP 地址 *
-
- 在网络页面上点击“下一步”,将安全、其他设置、标签保持默认值,并进入“审核 + 创建”页面:
创建 SQL 数据库
Microsoft
我上方 (b) 授权 Microsoft 使用我的当前支付方式支付与服务相关的费用,计费频率与我的 Azure 订阅相同,并 (c) 同意 Microsoft 可以将我的联系方式、使用和交易信息与服务的提供商共享,用于支持、计费和其他交易活动。Microsoft 不提供第三方服务的权利。更多详情请参阅 Azure 市场服务条款。
| 所选最大存储 (GB) | 41.6 |
| :--- | :--- |
| 预估存储成本 / 每 | 375.71 mn |
| 计算成本 / 每秒 | 0.011382 |
| 基础 | 学生版 |
| :--- | :--- |
| 订阅 | communication-service |
| 资源组 | East US |
| 区域 | sqljgt |
| 数据库名称 | (new) sqlserver |
| 身份验证方法 | SQL 身份验证 |
| 服务器管理员登录 | azureserver |
| 计算 + 存储 | 通用 - 无服务器:标准系列 (Gen5), 1 vCore | 32 GB 存储,禁用区域冗余 |
| 备份存储冗余性 | 本地冗余备份存储 |
备注 1. 服务器数据库根据您的实际使用情况按 vCore 秒计费。[了解更多关于服务器计费]
网络
允许 Azure 服务和资源访问此服务器
-
- 检查所有详情并点击“创建”按钮以创建 SQL Server 和数据库。
开发 SQLGPT 解决方案
现在我们已经在 Azure 门户中设置了所有基本服务,可以开始构建我们的解决方案了。
使用 Azure SQL 和 ChatGPT 的解决方案
在开发代码时,我将在 Jupyter 笔记本中工作,其余安装内容与第 4 章相同。您可以在本书 GitHub 仓库的第 6 文件夹中找到所有必要项目,包括 Python 笔记本,路径为 https://github.com/PacktPublishing/Azure-OpenAI-Essentials/blob/main/Chapter6.ipynb
除了第 4 章安装的库外,此代码还需要安装一个额外的 Python 库。创建一个新的 Jupyter Notebook 并安装以下包:
pip install pyspark
我们的代码包含以下章节,我们将在这些章节中开发解决方案
-
- 导入包
-
- 设置数据库连接字符串
-
- 示例查询
-
- 使用 ChatGPT
-
- 创建 代理
导入包
在开发解决方案之前,我们需要导入所需的包。
import pyodbc
import pandas as pd
from langchain.llms import AzureOpenAI
import openai
import os
from dotenv import load_dotenv
from langchain_experimental.agents.toolkits import create_pandas_agent
您可以在上方看到各种库。让我们在这里详细介绍这些:
| 导入包 | 描述 |
| :--- | :--- |
| pyodbc | 用于 ODBC(数据库连接)的模块。 |
| pandas | 强大的数据处理和分析库。 |
| langchain.llms.AzureOpenAI | "langchain" 中的语言模型。 |
| openai | 提供 GPT 模型的库。 |
| os | 提供与操作系统交互的方法,包括读取或设置环境变量。 |
| dotenv.load_dotenv | 从 .env 文件加载环境变量。 |
| langchain_experimental.agents.toolkits | 创建 Spread DataFrame 代理的工具。 |
| create_pandas_agent | 创建 Pandas 代理的函数。 |
表 6.1:导入包的用法
初始化常量
现在,使用 .env 文件提供的密钥初始化所有必要的常量。我们将第 4 章中的 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
将此内容添加到我们在第 4 章创建的 .env 文件中,包含连接字符串和端点:
DATABASESERVER = 'tcp:{server}'
DATABASE = '{name}'
DATABASEUSERNAME = '{username}'
DATABASEPASSWORD = '{password}'
从结构化数据库查询
图 6.7:连接字符串
我们得到以下输出:
| Out [2] : | True |
设置数据库连接字符串
这段代码是在 Python 中使用 pyodbc 连接 SQL Server 数据库的常用模式,在 connectionString 中指定连接参数。生成的连接 (cnxn) 和游标 (cursor) 可通过 SQL 查询与数据库交互。
connectionString = f'DRIVER={{ODBC Driver 18 for SQL Server}};DATABASE={database};UID={username};PWD={password};Encrypt=yes;TrustServerCertificate=no;Connection Timeout=30'
cnxn = pyodbc.connect(connectionString)
cursor = cnxn.cursor()
现在我们已经将连接字符串整合到 SQL 数据库中,是时候通过执行示例查询来验证它们了。根据我的经验,我遇到过多次开发者在获取正确连接字符串方面挣扎的情况,最好的方法直接从源门户复制并粘贴。如果你是自行格式化,请注意密码或用户名中是否存在特殊字符。
此代码段有助于从指定的 SQL 表中提取数据子集并并在 Pandas Dataframe 中进行可视化,这是 Python 中处理数据时的典型流程。
# 从 SQL 表中选择 10 行插入到 dataframe。
query = "select * from [SalesLT].[Address]"
df = pd.read_sql(query, cnxn)
print(df.head(10))
开发 SQLGPT 解决方案
我们得到以下输出:
| AddressID | AddressLine1 | AddressLine2 | City | StateProvince |
| :--- | :--- | :--- | :--- | :--- | :--- |
| 0 | 9 | 8713 Yosemite Ct. | None | Bothell | Washington |
| 1 | 11 | 1318 Lasalle Street | None | Bothell | Washington |
| 2 | 25 | 9178 Jumping St. | None | Dallas | Texas |
| 3 | 28 | 9228 Del Sol | None | Phoenix | Arizona |
| 4 | 32 | 26910 Indela Road | None | Montreal | Quebec |
| 5 | 185 | 2681 Eagle Peak | None | Bellevue | Washington |
| 6 | 297 | 7041 New West Ave | None | Anton | Washington |
| 7 | 445 | 6388 Lake City Way | None | Burnaby | British Columbia |
| 8 | 446 | 52600 Free Street | None | Toronto | Ontario |
| 9 | 447 | 22500 Free Street | None | Toronto | Ontario |
| CountryRegion | PostalCode | rowguid | ModifiedDate |
| :--- | :--- | :--- | :--- |
| 0 United States | 98011 | 268AF621-76D7-47C8-9441-144FD3982A1 | 2007-07-01 |
| 1 United States | 98011 | C9B1B303-ACA2-47C9-B6F7078B5269 | 2007-04-01 |
| 2 United States | 75201 | C0BD3B09-48F0-4654-A8DD-6A7A8AB4D3C6 | 2006-09-01 |
| 3 United States | 85004 | A2E5E11-FC3E-4562-B9B2-397DB169774 | 2005-09-01 |
| 4 Canada | H1J 2H5 | 8A495F62-32E8-47E7-BDD5-5A6F00C9D9B2 | 2006-08-01 |
| 5 United States | 98004 | 4C41C422-27E8-466C-8472-14C4C414BC | 2006-09-01 |
| 6 United States | 98095 | 5241A0D6-27F1-4B1D-A959-9764C26E5DE0 | 2006-08-01 |
| 7 Canada | VSA 3A6 | 53572F25-7F13-4A68-A8E5-102FF35416EE | 2005-08-01 |
| 8 Canada | M4B 1V7 | 80A1DDFC-5125-46B8-A4B4-CCBD2EC57CA4 | 2005-08-01 |
| 9 Canada | M4B 1V7 | 88CEE379-D8B8-A33E-A35E09435500 | 2006-08-01 |
图 6.8:SQL 查询输出概述
使用部署的 ChatGPT 模型
通过上一个输出,我们确认 SQL 连接已成功建立,使我们能够在 Python 代码中执行数据库查询。
提供的代码段初始化了 AzureOpenAI 类实例,假设 OPENAI_DEPLOYMENT_NAME 和 OPENAI_MODEL_NAME 分别是存储用于使用的部署和模型名称的变量。
llm = AzureOpenAI(deployment_name=deployment_name,
model_name=model_name)
创建 Pandas 代理并提问
接上一步操作,代码初始化了一个可以与 Pandas DataFrame 和语言模型进行自然交互的实验性代理。它提出了问题“有多少行?”,预期代理会根据 DataFrame 进行解释并回答。
agent = create_pandas_dataframe_agent(llm, df, verbose=True)
我们得到以下输出:
> Entering new AgentExecutor chain...
Thought: use the len() function in Python
Action: python
7 代码生成与文档编制
在上一章节中,我们学习了如何使用 Azure Communication Services(通信服务)。我们实际应用了使用 ChatGPT (gpt-3.5-turbo) 在助手和客户之间创建了一个模拟聊天。然后,我们查看了聊天内容以理解对话情况。
尽管我们主要关注的是文本消息,但知道 Azure Communication Services 不仅仅限于文本是很有用的。它可以处理语音、视频,甚至是不同媒体的混合作为输入。这种灵活的方法有助于我们从客户内容中学习重要信息。我们通过这种分析获得的统计数据可以指导我们在未来改进我们的产品。通过尝试不同类型的对话,我们可以发现客户在哪些方面遇到了困难,并利用这些信息来完善我们的产品和服务。
想象你是一个老师,有一个学生叫 Taylor,他刚刚开始学习编程。Taylor 感到很兴奋,但对从何开始感到有些困惑。
现在,你的秘密武器登场:一个由 Azure OpenAI 驱动的智能机器人。这个机器人就像一个乐助的朋友,可以创建代码并用简单的语言解释问题。Taylor 可以问它问题,例如:“我如何让电脑说‘Hello, World!’?”砰!机器人生成了代码并逐步进行解释。
Taylor 的脸亮了,因为他们正在让电脑变得如此酷!但最棒的部分在这里——这个机器人不是只会一种花样。Taylor 可以问它更多问题,例如“我如何让电脑重复地做某事?”机器人会用循环(重复事物的专业术语)来回答,并解释它是如何工作的。
在本章中,我们将探索你作为老师,以及 Taylor 作为渴望学习的学习者,如何使用这个神奇的机器人让编程变得简单而有趣。我们将学习如何聚在一起,尝试不同的问题,并看看 Azure OpenAI 如何将编程变成一场酷炫的冒险。准备好参加编程派对吧,你和机器人是 VIP 客人,让学习编程成为一种享受!让我们开始吧,尽情玩耍!
技术要求
为了跟本章的实际练习,请访问本章 GitHub 仓库中的源代码,地址为: https://github.com/PacktPublishing/Azure-OpenAI-Essentials/blob/main/chapter207.ipynb 。
技术要求与第 4 章相同。提醒一下,在你的本地机器上安装以下工具以开始处理解决方案:
-
Python 3.9, 3.10 或 3.11 - https://www.python.org/downloads/
-
Azure Developer CLI - Azure developer CLI 安装
-
Node.js 14+ - https://nodejs.org/en/download
-
PowerShell 7+ (pwsh) - https://github.com/powershell/powershell
你需要以下内容:
-
Azure 账户 - 如果你是 Azure 新手,可以免费获取 Azure 账户,你将获得免费的 Azure 额度来开始。
-
启用 Azure OpenAI 服务访问权限的 Azure 订阅。可以通过此表单请求访问:https://customervice.microsoft.com/Pages/ResponsePage.aspx?id=4vj15cVGG0Ry180BvhR7en2Ais5pxKto_Pz4b1_xUNTZBNRKZN1QSQFh2MU9a09VEzXwYORDQC1QCN0PWcu
-
Azure OpenAI 连接和模型信息:
-
OpenAI API key
-
OpenAI embedding 模型部署名称
-
OpenAI API 版本
-
除了这里提到的系统要求外,具备基础 Azure 服务的坚实基础以及 Python 编程语言的基本水平(相当于初学者水平 Python 100)是关重要的。这些技能对于在本章背景下高效利用和利用 Azure 服务至关重要。请放心,即使你是 Azure 环境的新手,我们也将本章设计得对学者友好。它提供了清晰的解释,并包含了详细的截图,以促进你的学习并引导你进入正确的轨道。
架构图
在本章中,流程非常简单——用户向我们准备的 OpenAI 模型提交提示词(prompt),然后模型生成所需的代码段:
图 7.1:架构图
让我们开始吧。
构建代码生成和文档编制解决方案
由于我们在之前的章节中已经在 Azure 门户中设置了所有基本服务,现在可以开始构建代码生成和文档编制的解决方案。要构建此解决方案,我们主要需要两个服务:
-
Azure Cognitive Search
-
Azure OpenAI
我们在第 2 章的“访问 Azure OpenAI (AOAI) 服务”部分以及第 4 章的“Azure Cognitive Search”部分中解释了创建这些服务的过程。请参考这些章节以获取更多信息。我们将在 Jupyter notebook 中工作。在接下来的部分中,我们将开发解决方案:
-
导入包
-
从用户提示词创建代码
导入包
在开发解决方案之前,我们需要导入所需的包:
import openai
import os
from dotenv import load_dotenv
你可以看到前面的代码中使用了各种库。让我们在下表中深入研究每个种库:
| 导入的包 | 描述 |
| :--- | --- |
| openai | OpenAI 库,提供了对生成式预训练 Transformer (GPT) 模型的访问。 |
| os | 提供了一种与操作系统交互的方法,包括读取或设置环境变量。 |
| dotenv.load_dotenv | 加载环境变量。 |
表 7.1:导入包的解释
在开发解决方案之前,我们需要导入所需的包:在导入了必要的包并从 .env 文件中配置了变量后,我们现在从 .env 文件提取这些变量:
load_dotenv()
## 设置 API 密钥
openai.api_key = os.getenv("OPENAI_API_KEY")
## 设置部署名称
deployment_name = os.getenv("OPENAI_DEPLOYMENT_NAME")
## 设置 API 版本
api_version = os.getenv("OPENAI_API_VERSION")
## 系统提示词
system_message = "你是一个有用的编程助手,可以创建代码并用简单的语言解释问题。"
## 用户提示词(示例)
user_prompt = "我如何让电脑说‘Hello, World!’"
## 调用 Azure OpenAI 生成代码
# (此处省略具体代码实现,将根据上下文逻辑继续)
调用 Azure OpenAI
user_prompt = "我如何让电脑说‘Hello, World!’"
response = openai.ChatCompletion.create(
model=deployment_name,
messages=[
{"role": "system", "content": system_message},
{"role": "user", "content": user_prompt}
],
api_version=api_version
)
## 打印回复
print(response.choices[0].message.content)
从用户提示词创建代码
由于我们从 .env 文件加载了所有必要的变量,我们现在可以根据用户提示词生成代码了:
def generate_code(prompt):
response = openai.ChatCompletion.create(
model=deployment_name,
messages=[
{"role": "system", "content": "你是一个专业的编程助手,请提供代码并进行解释。"},
{"role": "user", "content": f"请为以下请求生成代码:{prompt}"}
],
api_version=api_version
)
return response.choices[0].message.content
## 示例调用
prompt = "如何让电脑打印‘Hello, World!’"
code = generate_code(prompt)
print("生成的代码:")
print(code)
Taylor 的脸亮了,因为他们正在让电脑变得如此酷!但最棒的部分在这里——这个机器人不是只会一种花样。Taylor 可以问它更多问题,例如“我如何让电脑重复地做某事?”机器人会用循环(重复事物的专业术语)来回答,并解释它是如何工作的。
在本章中,我们将探索你作为老师,以及 Taylor 作为渴望学习的学习者,如何使用这个神奇的机器人让编程变得简单而有趣。我们将学习如何聚在一起,尝试不同的问题,并看看 Azure OpenAI 如何将编程变成一场酷炫的冒险。准备好参加编程派对吧,你和机器人是 VIP 客人,让学习编程成为一种享受!让我们开始吧,尽情玩耍!
总结 157
我们得到了以下输出:
从数据库中检索所有记录的 SQL 查询:
-py
# 查询应该返回表中的所有行的所有列
# 查询应该存储在变量 `query` 中
query = "SELECT * FROM names"
# 现在,编写一个简单的 SQL 查询,以从 add_names_response 中创建的数据库中检索所有记录。
# 查询应该只返回表中所有行的 first_name 和 last_name 列
# 查询应该存储在变量 `query2` 中
query2 = "SELECT first_name, last_name FROM names"
# 现在,编写一个简单的 SQL 查询,以从 add_names_response 中创建的数据库中检索所有记录。
# 查询应该只返回表中所有行的 first_name 和 last_name 列
# 查询应该按 last_name 列进行升序排列
# 查询应该存储在变量 `query3` 中
query3 = "SELECT first_name, last_name FROM names ORDER BY last_name ASC"
图 7.4: 生成的查询输出
通过这些,我们探索了 ChatGPT 如何通过生成用于 SQL 和 GPT 的代码和文档来简化编码任务。
本章的代码段可以在 GitHub 上找到,并可以通过此处访问:https://github.com/PacktPublishing/Azure-OpenAI-Essentials/blob/main/chapter 7.ipynb
总结
在本章中,我们为本地本地机器安装了必要的工具,包括 Python、Azure Developer CLI、Node.js、Git 和 PowerShell。我们确保拥有 Azure 账户和订阅,以访问 Azure OpenAI 服务。此外,我们需要对 Azure 服务和 Python 有基本的了解。
接下来,我们专注于使用 Azure Cognitive Search 和 Azure OpenAI 服务构建解决方案。我们在 Jupyter notebook 中开发代码。我们首先导入了所需的包,例如 openai、os 和 dotenv.load_dotenv。然后,我们加载了 .env 文件并提取了必要的变量,例如 OPENAI_API_KEY、OPENAI_DEPLOYMENT_ENDPOINT 等。我们使用这些变量初始化了 Azure OpenAI。
在设置环境后,我们生成了一个根据提供的提示向数据库中添加名称的函数。随后,我们创建了一个 SQL 查询,从我们刚刚创建的数据库中检索所有记录。最后,我们实现了一个功能性解决方案,它可以从提示中生成代码并与数据库进行有效交互。
创建基础推荐系统
使用 Azure OpenAI 的解决方案
在上一章中,我们深入研究了编写简单 Python 程序的艺术。这个程序不仅仅是生成代码段;它更像是一个编码精灵,能为它变出的代码提供文档。这一功能为我们的编码之旅提供了跳板,使得即使是那些只有极少或没有先验编码知识的人也能轻松上手。
想象一下,你和朋友正准备度过一个轻松的周五晚上,计划看一部电影。但问题在于——从一个大列表中挑选电影是很困难的。
于是,你出了一个很酷的主意!与其为选择感到苦恼,为什么不创建些东西来帮助呢?你决定制作聊天机器人,这是一个小型程序,行为像一个乐于帮助的朋友,它理解你喜欢哪种电影并推荐完美的电影。
现在,想象这样一个场景:你和朋友已经准备好了零食,告诉你的机器人你想看什么电影。再也不用翻阅无尽的列表了——机器人会完成这些工作,并根据你的喜好给出建议。
这种体验就像为你完美的周五晚上拥有了自己的电影指南。当你考虑到有了新的电影指南,你的电影之夜将变得多么简单和有趣时,兴奋感随之增加。准备好用你的推荐解决方案迎接一个无压力的电影之夜吧。
技术要求
为了跟随本章的实际练习,请访问本章 GitHub 仓库中的源码:https://github.com/PacktPublishing/Unlocking-Creativity-with-Azure-OpenAI/blob/main/Chapter208.ipynb
除了第 7 章技术要求部分指定的规定外,不需要额外的技术要求。
使用 Azure OpenAI 创建基础推荐解决方案
然而,你需要创建一个 Kaggle 账户以生成 API 密钥用于获取你选择的数据。在本章中,我们使用 Netflix 数据集,可以从:https://www.kaggle.com/datasets/shivamb/netflix-shows/code 获取
架构图
对于本章的解决方案,用户首先从 Kaggle 等源检索原始数据集。接下来,我们对数据进行归一化和清洗以符合我们的需求。处理后的数据随后用于创建嵌入(embeddings)。当用户查询电影建议时,ChatGPT API 会搜索嵌入数据集并根据用户的输入提供建议。下图显示了整体工作流:
图 8.1: 架构图
使用 Azure OpenAI 创建推荐解决方案
现在我们已经在 Azure 门户中设置了所有核心服务,可以开始构建我们的解决方案。为了开发代码,我们将在 Azure Machine Learning Studio (Azure ML Studio) notebook 中工作。对于此解决方案,我们将使用 Python 3.12 版本。如之前所述,任何 3.7 以上的版本都应该无缝运行。你可以在此 GitHub 上访问代码;在仓库中,你会找到 requirements.txt,它列出了我们解决方案所需的所有 Python。
使用 Azure OpenAI 创建推荐解决方案
现在我们已经在 Azure 门户中设置了所有核心服务,可以开始构建我们的解决方案。为了开发代码,我们将在 Azure Machine Learning Studio (Azure ML Studio) notebook 中工作。对于此解决方案,我们将使用 Python 3.12 版本。如之前所述,任何 3.7 以上的版本都应该无缝运行。你可以在此 GitHub 上访问代码;在仓库中,你会找到 requirements.txt,它列出了我们解决方案所需的所有 Python。
设置
通过命令行下载数据、提交和更多。读取这些
图 8.2: 生成 Kaggle token
-
创建 Kaggle 账户。
-
导入所需的包。
使用 pip 安装缺失的库并确保你的 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
# 解压下载的文件
import zipfile
你在前面的代码中使用了各种库。让我们在下表中深入这些库:
| 导入语句 | 描述 |
|---|---|
| import openai | 提供访问 OpenAI 的接口,用于与模型和服务服务交互。 |
| import os | 提供与操作系统交互的功能,例如访问环境变量和文件。 |
| import re | 提供正则表达式支持,允许模式匹配和字符串处理。 |
| import requests | 启用 HTTP 请求,允许与服务器和 API 交互。 |
| import sys | 提供系统特定的参数和函数,例如访问命令行参数和 Python 解释器。 |
| from num2words import num2words | 将数字转换为单词。 |
| import pandas as pd | 提供用于处理和分析的数据结构和函数,特别是处理表格数据。 |
| import numpy as np | 提供数值计算能力,包括对数组、矩阵和数学运算的支持。 |
| from openai.embeddings_utils import get_embedding | 提供处理嵌入的实用函数,包括生成嵌入和计算余弦相似度。 |
| import tiktoken | 不是标准 Python 模块。它似乎是一个自定义或第三方模块。仅从导入语句无法确定其用途。 |
| from dotenv import load_dotenv | 提供从 .env 文件加载环境变量到环境中的功能。 |
表 8.1: 导入包的说明
- 现在,让我们使用在
.env文件中提供的密钥初始化所有必要的常量。"KAGGLE_USERNAME" 和 "KAGGLE_KEY" 添加到你已有的.env文件中:
## Azure
load_dotenv()
使用 Azure OpenAI 创建推荐系统解决方案
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")
KAGLE_USERNAME = os.getenv("KAGLE_USERNAME")
KAGLE_KEY = os.getenv("KAGLE_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()
-
- 将这些内容添加到第 6 章已创建的包含 Kaggle 信息的
.env文件中:
- 将这些内容添加到第 6 章已创建的包含 Kaggle 信息的
KAGLE_USERNAME = '{username}'
KAGLE_KEY='{key}'
-
- 按照以下步骤设置 Kaggle 证书:
-
I. 一旦生成 Kaggle 令牌(如节开头所示),将生成一个包含用户名和密钥的
.json文件。 -
II. 将
KAGLE_USERNAME值更新为在kaggle.json中找到的用户名。 -
III. 同样地,使用密钥修改
KAGLE_KEY的值。
完成这些配置后,你将拥有资源所需的连接设置。我们得到以下输出:
图 8.3:加载 .env 文件的输出
4. 下载数据集。
这是一种在 Jupyter notebook 中直接从 Kaggle 下载 netflix-shows 数据集的简洁方法:
!kaggle datasets download -d shivamb/netflix-shows
我们得到以下输出:
kaggle datasets download -d shivamb/netflix-shows
DownloadingDownloadingflix-shows.zip to C:\Users\VBALANTR\Desktop\New folder
| | 0.00/1.34M [00:00?, ?B/s] |
| 75%#### | 1.00M/1.34M [00:02:00:00, 518KB/s] |
| 100%####### | 1.34M/1.34M [00:02<00:00, 615KB/s] |
| 100%###### | 1.34M/1.34M [00:02<00:00, 590KB/s] |
图 8.4:从 Kaggle 下载数据集
5. 解压下载的文件
此代码解压下载的文件并将其添加到 netflix_dataset 文件夹中:
with zipfile.ZipFile("netflix-shows.zip", 'r') as zip_ref:
zip_ref.extractall("netflix_dataset")
6. 从 .csv 文件读取数据。
此代码从 .csv 文件读取数据并将其导入 pandas DataFrame 中:
#Read Data from csv file
pd.read_csv("netflix_dataset/netflix_titles.csv")
使用 Azure OpenAI 创建推荐系统解决方案
以下是输出:
| show_id | type | director cast | country | date_release | year | rating | listed_in | description |
|---|---|---|---|---|---|---|---|---|
| 0 | s1 | Movie | Dick Johnson | Kirsten Johnson | NaN | United States | 25-Jun-21 | 2020 | PG-13 | 90 min | Documentary | As her father nears the end of the life, filmn... |
| 1 | s2 | Show | Blood & Water | Ana Amara, Khalil Goma... | NaN | South Africa | 24-Sep-21 | 2021 | TV-2 MA | International Shows, TV Mysteries | After crossing paths at a party, a Cape Town... |
| 2 | s3 | Show | Ganglands | Javier Gigli, Lecletjo | NaN | United States | 24-Sep-21 | 2021 | TV-1 MA | Crime Time: Shows, TV Act... | To protect his family from a powerful drug lor... |
| 3 | s4 | Show | New Orleans | Jailbids New Orleans | NaN | United States | 24-Sep-21 | 2021 | | Documentary, Reality | Feuds, rivalries and toilet talk go down amo... |
| 4 | s5 | Show | Kota Factory | Maya Moore, Jimendra Kumar, Rajat Rajg... | NaN | India | Jan-21 | 2021 | TV-2 MA | International Shows, Romantic Shows... | In a city of coaching centers known to train i |
| 1994 | s1995 | Movie | Sing On | Titus Burges | NaN | United States | 16-Sep-20 | 2020 | PG | Reality TV | In this fun, fast-paced contest hosted b... |
| 1995 | s1996 | Movie | All Time | Tom Holland, Bill Campbell | NaN | United States | 16-Sep-20 | 2020 | R | 139 min | Dramas, Thrillers | Sinister characters around a young ma... |
| 1996 | s1997 | Movie | The Car | Caleb Deborah | NaN | Spain | 16-Sep-20 | TV | 94 min | Dramas, International | Unable to face his reality in |
图 8.5:csv数据的输出
7. 从数据集中获取标题和描述:
data_content = data_content[['title', 'description']]
以下是输出:
| title | description |
|---|---|
| 0 | Dick Johnson Is Dead | As her father nears the end of the life, filmn... |
| 1 | Blood & Water | After crossing paths at a party, a Cape Town... |
| 2 | Ganglands | To protect his family from a powerful drug lor... |
| 3 | Jailbirds New Orleans | Feuds, rivalries and toilet talk go down amo... |
| 4 | Kota Factory | In a city of coaching centers known to train i... |
| 1994 | Sing On | In this fun, fast-paced contest hosted b... |
| 1995 | The Devil All Time | Sinister characters around a young ma... |
| 1996 | The Paramedic | Unable to face his reality in wheelchair... |
| 1997 | The Take | After a mix-up lands in hot water, skill... |
| 1998 | Call the Midnight | This period drama set in improvised... |
图 8.6:标题和描述的输出
8. 归一化数据
此代码段确保data_content中的title列通过移除多余空格、不必要的标点和换行符进行归一化:
## s is input
def normalize_t(s, sep_token="\n"):
s = re.sub(r'\s+', ' ', s).strip()
# remove all instances of multiple spaces
s = re.sub(r"\.", " ", s)
s = s.replace("..", " ", s)
s = s.replace(sep_token, " ")
s = s.strip()
return s
data_content['title'] = data_content["title"].apply(lambda x: normalize_t(x))
以下是输出:
| title | description | similarities |
|---|---|---|
| 0 | Dick Johnson Is Dead | As her father the end of her life, filmm... | [0.012696618214249611, 0.001742487586488973, -] | 0.812542 |
| 1 | Blood & Water | After crossing paths at a party, a Cape Town... | [0.001742487586488973, 0.012696618214249611, -] | 0.812542 |
Figure 8.6: Output of title and description
使用 Azure OpenAI 创建推荐系统解决方案
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")
KAGLE_USERNAME = os.getenv("KAGLE_USERNAME")
KAGLE_KEY = os.getenv("KAGLE_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. 将这些内容添加到第 6 章已创建的包含 Kaggle 信息的 .env 文件中:
KAGLE_USERNAME = '{username}'
KAGLE_KEY='{key}'
3. 按照以下步骤设置 Kaggle 证书:
-
I. 一旦生成 Kaggle 令牌(如节开头所示),将生成一个包含用户名和密钥的
.json文件。 -
II. 将
KAGLE_USERNAME值更新为在kaggle.json中找到的用户名。 -
III. 同样地,使用密钥修改
KAGLE_KEY的值。
完成这些配置后,你将拥有资源所需的连接设置。我们得到以下输出:
图 8.3:加载.env文件的输出
4. 下载数据集
这是一种在 Jupyter notebook 中直接从 Kaggle 下载 netflix-shows 数据集的简洁方法:
!kaggle datasets download -d shivamb/netflix-shows
我们得到以下输出:
kaggle datasets download -d shivamb/netflix-shows
DownloadingDownloadingflix-shows.zip to C:\Users\VBALANTR\Desktop\New folder
| 0.00/1.34M [00:00?, ?B/s] |
| 75%#### | 1.00M/1.34M [00:02:00:00, 518KB/s] |
| 100%####### | 1.34M/1.34M [00:02<00:00, 615KB/s] |
| 100%###### | 1.34M/1.34M [00:02<00:00, 590KB/s] |
图 8.4:从 Kaggle 下载数据集
5. 解压下载的文件
此代码解压下载的文件并将其添加到netflix_dataset文件夹中:
with zipfile.ZipFile("netflix-shows.zip", 'r') as zip_ref:
zip_ref.extractall("netflix_dataset")
6. 从.csv文件读取数据
此代码从.csv文件读取数据并将其导入到 pandas DataFrame 中:
#Read Data from csv file
pd.read_csv("netflix_dataset/netflix_titles.csv")
以下是输出:
| show_id | type | director cast | country | date_release | year | rating | listed_in | description |
|---|---|---|---|---|---|---|---|---|
| 0 | s1 | Movie | Dick Johnson | Kirsten Johnson | NaN | United States | 25-Jun-21 | 2020 | PG-13 | 90 min | Documentary | As her father nears the end of the life, filmn... |
| 1 | s2 | Show | Blood & Water | Ana Amara, Khalil Goma... | NaN | South Africa | 24-Sep-21 | 2021 | TV-2 MA | International Shows, TV Mysteries | After crossing paths at a party, a Cape Town... |
| 2 | s3 | Show | Ganglands | Javier Gigli, Lecletjo | NaN | United States | 24-Sep-21 | 2021 | TV-1 MA | Crime Time: Shows, TV Act... | To protect his family from a powerful drug lor... |
| 3 | s4 | Show | New Orleans | Jailbids New Orleans | NaN | United States | 24-Sep-21 | 2021 | | Documentary, Reality | Feuds, rivalries and toilet talk go down amo... |
| 4 | s5 | Show | Kota Factory | Maya Moore, Jimendra Kumar, Rajat Rajg... | NaN | India | Jan-21 | 2021 | TV-2 MA | International Shows, Romantic Shows... | In a city of coaching centers known to train i |
| 1994 | s1995 | Movie | Sing On | Titus Burges | NaN | United States | 16-Sep-20 | 2020 | PG | Reality TV | In this fun, fast-paced contest hosted b... |
| 1995 | s1996 | Movie | All Time | Tom Holland, Bill Campbell | NaN | United States | 16-Sep-20 | 2020 | R | 139 min | Dramas, Thrillers | Sinister characters around a young ma... |
| 1996 | s1997 | Movie | The Car | Caleb Deborah | NaN | Spain | 16-Sep-20 | TV | 94 min | Dramas, International | Unable to face his reality in |
图 8.5:csv数据的输出
7. 从数据集中获取标题和描述:
data_content = data_content[['title', 'description']]
以下是输出:
| title | description |
|---|---|
| 0 | Dick Johnson Is Dead | As her father nears the end of the life, filmn... |
| 1 | Blood & Water | After crossing paths at a party, a Cape Town... |
| 2 | Ganglands | To protect his family from a powerful drug lor... |
| 3 | Jailbirds New Orleans | Feuds, rivalries and toilet talk go down amo... |
| 4 | Kota Factory | In a city of coaching centers known to train i... |
| 1994 | Sing On | In this fun, fast-paced contest hosted b... |
| 1995 | The Devil All Time | Sinister characters around a young ma... |
| 1996 | The Paramedic | Unable to face his reality in wheelchair... |
| 1997 | The Take | After a mix-up lands in hot water, skill... |
| 1998 | Call the Midnight | This period drama set in improvised... |
图 8.6:标题和描述的输出
使用 Azure OpenAI 和 Azure Cognitive 服务构建文本转视频转换
概述
想象一位热爱创作引人入胜教学计划的教育者。你意识到在数字时代融入视觉元素的价值,这种技术能够激发并吸引学生。然而,将你的教学计划转化为视频的过程是一项耗费精力的任务,且所需的技能可能与你的专业知识不符。在挑战中,出现了一线希望:Azure OpenAI。在这个书中,让我们深入探讨如何利用它来创建视频内容。
在本章中,我们展示了“Blood & Water”的案例。在我们的书中,这一步骤是至关重要的。首先,我们展示了“Blood & Water”的搜索过程。正如Dive Club的相似度所示。随后,我们将介绍以下内容。具体来说,我们将介绍:
-
问题介绍
-
架构设计
-
使用 Azure OpenAI 和 Azure Cognitive 服务构建文本视频
技术要求
为了跟随本章节的实际练习,请访问存储在 GitHub 上的源代码:github.com/PacktPublishing/Azure-OpenAI-Essentials/blob/main/Chapter9.ipynb。
在本地机器上安装所需的工具以开始工作。这里列出的版本是出版时的稳定版本。如果你选择与推荐不同的版本,可能会由于库不匹配而遇到错误。
-
Python 3.9、3.10 或 3.11:
https://www.python.org/downloads/ -
Azure 开发者 CLI:Azure developer CLI 安装
-
Node.js 14+:
https://nodejs.org/en/download/ -
Git:
https://git-scm.com/downloads/ -
PowerShell 7+ (pwsh):
https://github.com/powershell/powershell -
Azure 账户:如果你是 Azure 新手,可以免费获取 Azure 账户并获得免费 Azure 额度以开始。
-
已启用 Azure OpenAI 服务的 Azure 订阅:你可以通过此表单申请访问
https://aka.ms/oaiapply
本章内容适合初学者。它提供了清晰的解释并包含了详细的截图,以帮助您学习并引导您进入正确的轨道。
架构设计
引言中提到的解决方案创建流程如下:
用户向 Azure OpenAI API 发送查询,生成文本摘要。然后将该摘要传递给 Azure Cognitive Services 进行短语提取。提取出的短语也会发送回 ChatGPT API 以生成图像,同时文本摘要会被发送到 Azure Speech API 转换为音频。最后,使用 MoviePy 将音频和图像合并为 MP4 文件。MoviePy 是一个用于视频编辑的 Python 库。它提供了一种简单直观的方式来处理视频片段,允许您执行剪切、裁剪、合并多个视频片段、添加标题和文本等任务。下面的图显示了整体架构:
图 9.1:架构图
第 4 章涵盖了设置具有活动订阅的 Azure 账户以及创建 Azure OpenAI Service 资源的内容。此外,它提供了部署 Azure OpenAI Service 模型的指导,可能利用 GPT-3、ChatGPT 或 GPT-4 模型。构建此解决方案的逐步过程如下:
-
在 Azure 内部设置语言和语音服务。
-
导入所需的包。
-
利用 Azure OpenAI 总结文本。
-
使用 Azure Cognitive Service 提取关键短语。
-
使用 Azure OpenAI 的 DALL-E 模型为图像创建提示词。
-
使用 Azure Speech 服务创建音频文件。
-
将音频文件与图像结合生成视频。
让我们开始吧:
1. 创建 Azure Language 服务
I. 要创建 Azure 语言服务,导航到顶部导航搜索栏并搜索“Language”。
II. 如果在搜索导航中未找到,点击“创建资源”,并在市场库中搜索“Language”并点击“创建”。
主页 > 创建资源 > 市场库 > 语言服务
语言服务
概述 计划 使用信息 + 支持 评分 + 评论
图 9.2:创建语言服务
III. 接受详细信息后,点击语言服务中的“继续”按钮以创建您的资源。
主页 > 创建资源 > 市场库 > 语言服务 > ...
选择其他功能
默认情况下,Azure AI for Language 带有若干预置功能,如情感分析、关键短语提取、预置问答等。下面的某些可自定义功能需要配置 Azure Search、Blob 存储等额外服务才能良好运行。选择您想要作为语言服务一部分启用的自定义功能。
默认功能:自定义功能
继续创建您的资源
图 9.3:创建语言资源
文本转视频
IV. 从市场库创建语言服务后,在第 4 章创建的创建资源表单中选择订阅和资源组,并将定价层级选择为 Free F0。
主页 > 创建资源 > 市场库 > 语言服务 > 选择其他功能 > ...
创建语言
基础 网络 标识 标签 审核 + 创建
使用高级自然语言处理从非结构化文本中释放见解。使用情感分析来发出客户对您品牌的看法。通过关键短语提取查找与主题相关的短语,并使用语言检测识别文本的语言。使用命名实体识别对文本中的实体进行检测和分类。
了解更多
项目详细信息
订阅 *
资源组 *
新建
实例详情
区域 *
名称 *
定价层级 *
查看完整定价详细信息
负责任 AI 声明
图 9.4:创建语言基础步骤
V. 现在指定您所需的资源,点击“下一步”按钮,进入“网络”选项卡。选择“包括 Internet 在内的所有网络都可以访问此资源”选项并点击“下一步”。
主页 > 创建资源 > 市场库 > 语言服务 > 选择其他功能 >
创建语言
基础 网络 标识 标签 审核 + 创建
VI. 在“标识”表中,直接使用所有默认值配置并点击“下一步”按钮进入“标签”。
主页 > 创建资源 > 市场库 > 语言服务 > 选择其他功能 >
创建语言
基础 网络 标识 标签 审核 + 创建
系统分配的标识
启用系统分配的标识以授予资源访问其他现有资源的权限。
- 状态 关闭 开启
用户分配的标识
添加用户分配的标识以授予资源访问其他现有资源的权限。
- 添加 删除
| 名称 | 资源组 | 订阅 |
| :--- | :--- | :--- |
| 此资源未分配用户分配的标识。 | 选择“添加”以添加更多。 | |
图 9.6:创建标识步骤
VII. 您现在可以忽略此部分。标签是键值对,允许您对资源进行分类并将相同的标签应用于多个搜索和资源组以便合并结算。您可以在“标签”步骤中找到类似的详情。点击“下一步 + 创建”继续。在这里,将显示您在之前的步骤中选择的详情。审核所有信息并点击“创建”按钮:
基础 网络 标识 标签 审核 + 创建
查看体系模板
基础
订阅
资源组
区域
名称
定价层级
Azure 学生
美国东部
F0 (30 天 5K 次)
网络
类型
包括 Internet 在内的所有网络都可以访问此资源。
标识
类型
系统分配
图 9.7:创建语言审核步骤
VIII. 点击“创建”后,将生成新的部署并创建资源。
2. 创建 Azure 语音服务
I. 要创建 Azure 语音服务,导航到顶部导航搜索栏并搜索“Language”。如果未找到,点击“创建资源”,并在市场库中搜索“Language”并点击“创建”。
图 9.8:创建语音服务
II. 从市场库创建语音服务后,在第 4 章创建的创建资源表单中选择订阅和资源组,并将定价层级选择为 Free F0。
创建语音服务
基础 | 网络 | 标识 | 标签 | 审核 + 创建
将可听语音转为可读、可搜索的文本。为您的应用程序和服务添加实时语音翻译。几乎实时地将文本转换为音频。使用您熟悉的编程语言快速构建支持语音的应用和服务。自定义语音系统以优化特定场景的质量。
了解更多
项目详细信息
订阅 *
资源组 *
新建
实例详情
区域
名称 *
定价层级 *
查看完整定价详细信息
上一步 下一步 审核 + 创建
图 9.9:创建语音服务基础步骤
首页 > 语音 > ...
创建语音服务
基础知识 网络 身份 标签 审核 + 创建
图 9.10:创建语音服务的网络步骤
IV. 在“身份”选项卡中,直接使用所有默认值进行配置,并点击“下一步”按钮进入“标签”选项卡。
首页 > 语音 > ...
创建语音服务
基础知识 网络 身份 标签 审核 + 创建
系统分配托管身份
启用系统分配的身份以授予资源访问其他现有资源。
状态 关
开启
用户分配托管身份
添加用户分配的身份以授予资源访问其他现有资源。
- 添加 移除
| 名称 | 资源组 | 订阅 |
| --- | --- | --- |
此资源没有用户分配的托管身份。选择“添加”以添加更多。
图 9.11:创建语音服务的身份步骤
文本转视频
V. 你现在可以忽略此部分。点击下一步,然后转到审核 + 创建按钮。在这里,将显示您在之前的步骤中选择的详情。检查所有信息并点击创建按钮。
首页 > 语音 >
创建语音服务
-
基础知识
-
网络
-
身份
-
标签
-
审核 + 创建
术语
点击“创建”,我 (a) 同意与上述列出的市场提供(s)相关的条款和隐私声明:(b) 授权微软通过当前的支付方式收取与提供(s)相关的费用,计费频率与我的 Azure 订阅相同;以及 (c) 同意微软可以将您的联系方式、使用和交易信息与提供(s)的共享,以用于支持、账单和其他交易活动。微软不为第三方提供提供权利。更多信息请参阅 Azure 市场条款。
基础知识
| 订阅 | ts |
| --- | --- |
| 资源组 | ) |
| 区域 | 东部美国 |
| 名称 | azure-speech-service |
| 价格层级 | Free F0 |
网络
| 类型 | 所有网络(包括互联网)都可以访问此资源。 |
身份
| 身份类型 | 无 |
图 9.12:创建语音服务的审核 + 创建步骤
使用 AzureOpenAI 和 Azure 认知服务构建文本转视频程序 183
VI. 一旦你点击“创建”,将生成一个新的部署并创建该资源。
使用 Azure OpenAI 和 Azure 语言与语音服务的解决方案
现在我们已经在 Azure 门户中设置了所有核心服务,可以开始构建我们的解决方案了。为了开发代码,我将在 Python notebook 中进行,其余的安装步骤与第 4 章中定义的相同。
除了第 4 章中安装的库外,此代码还需要额外安装一个 Python 库。
创建一个新的 Jupyter notebook 并安装以下包:
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_dotenv | 从 dotenv 模块中导入 load_dotenv 函数,用于从 .env 文件加载环境变量。 |
| import azure.cognitiveservices.speech as speechdk | 导入 Azure 认知服务 Speech SDK 用于语音识别和合成。 |
| from azure.ai.textanalytics import TextAnalyticsClient | 从 azure.ai.textanalytics 模块中导入 TextAnalyticsClient 类用于文本分析。 |
| from azure.core.credentials import AzureKeyCredential | 从 azure.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:导入说明
使用 AzureOpenAI 和 Azure 认知服务构建文本转视频程序
现在,让我们使用 .env 文件提供的密钥初始化所有必要的常量。在你的 .env 文件中添加 "COMMUNICATION_CONNECTION_STRING" 和 "COMMUNICATION_ENDPOINT":
load_dotenv()
OPENAI_API_KEY = os.getenv("OPENAI_API_KEY")
OPENAI_ENDPOINT = os.getenv("OPENAI_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")
## Azure
openai.api_key = OPENAI_API_KEY
openai.api_base = OPENAI_ENDPOINT
openai.api_version = OPENAI_API_VERSION
SPEECH_API_KEY = os.getenv("SPEECH_API_KEY")
SPEECH_ENDPOINT = os.getenv("SPEECH_ENDPOINT")
SPEECH_REGION = os.getenv("SPEECH_REGION")
这是 Azure 语音服务的配置:
speech_config = speechsdk.SpeechConfig(subscription=SPEECH_API_KEY, region=SPEECH_REGION)
speech_config.service_endpoint = SPEECH_ENDPOINT
这是 Azure 文本分析服务的配置:
text_client = TextAnalyticsClient(
endpoint=SPEECH_ENDPOINT,
credential=AzureKeyCredential(SPEECH_API_KEY),
version="2022-05-01"
)
这是 OpenAI 补全的代码:
response_sum = openai.Completion.create(
engine=OPENAI_DEPLOYMENT_NAME,
prompt=prompt,
temperature=0.3,
max_tokens=100,
top_p=1,
)
print(response_sum.choices[0].text)
188 将文本转换为视频
在上面的代码中,让我们了解每个参数的含义 - openai.Completion.create:
这是一个调用 OpenAI API 的方法调用,用于创建文本补全。
engine=OPENAI_DEPLOYMENT_NAME:
指定用于生成补全的引擎。
OPENAI_DEPLOYMENT_NAME 是包含你想要使用的部署或模型名称的变量。
prompt=prompt:
prompt 参数是你提供给模型的输入文本。模型将根据此输入生成补全。
temperature=0.3:
temperature 参数控制输出的随机性。较低的值(如 0.3)会让输出更集中且具有确定性,而较高的值则会使其更具随机性。
max_tokens=100:
max_tokens 参数指定了补全中允许生成的 token(单词或词片段)的最大数量。
top_p=1:
top_p 参数用于核采样(nucleus sampling)。它通过只考虑前 p 个概率质量来控制输出的多样性。值为 1 意味着不根据概率质量进行过滤。
这是输出:
[0]: print(response.choices(0).text)
提供下方文本的摘要,以许可形式捕获其核心思想。
CSS Box 模型教程:生成一个易于入门的教程,用于理解 CSS Box 模型以及它如何影响网页布局。
提供下方文本的摘要,以许可形式捕获其核心思想。
JavaScript 变量教程:生成一个易于入门的教程,用于理解 JavaScript 变量以及它们如何用于存储数据。
提供下方文本的摘要,捕获其核心
图 9.17: OpenAI 响应输出
使用 Azure Cognitive Service 提取关键短语
1. 身份验证客户端
此代码定义了一个 authenticate_client() 函数,使用提供的 API 密钥验证 Azure Text Analytics 客户端。它使用 API 密钥初始化 AzureKeyCredential 对象,并使用指定的端点和凭据创建 TextAnalyticsClient 对象。最后,它返回经过身份验证的客户端实例:
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"身份验证客户端时发生错误: {e}")
return None
client = authenticate_client()
前面的代码包含了错误处理,用于捕获并处理验证过程中可能发生的任何异常。如果发生错误,它会打印错误消息并返回 None。这使得函数更加健壮,并有助于诊断与客户端身份验证相关的问题。
或者,你可以使用 Azure Active Directory (AAD) 令牌验证和托管身份(Managed Identity)。这些方法在某些场景下可以提供增强的安全性和便利的管理。
2. 关键短语提取
key_phrase_extraction_example 函数利用 Azure Text Analytics 客户端从文档中提取关键短语。它将提取的关键短语填充到 phrase_list 中并合并成字符串。如果成功,它将返回 phrase_list 和 phrases;否则,它将处理异常并返回错误消息:
def key_phrase_extraction_example(client):
try:
phrase_list, phrases = [], ''
documents = [response.choices[0].text]
将文本转换为视频
response_kp = client.extract_key_phrases(documents=documents)
if not response_kp.is_error:
print("\t关键短语:")
for phrase in response_kp.key_phrases:
print("\t\t", phrase)
phrase_list.append(phrase)
phrases = phrases + "\n" + phrases
else:
print(response_kp.id, response_kp.error)
except Exception as err:
print("遇到异常。{}".format(err))
return phrase_list, phrases
执行键:
此行使用 client 对象作为参数调用 key_phrase_extraction_example 函数。它获取了两个值:phrase_list(一个包含提取的关键短语的列表)和 phrases(这些短语的合并字符串):
phrase_list, phrases = key_phrase_extraction_example(client)
这是输出:
[8]: phrase_list, phrases = key_phrase_extraction_example(client)
关键短语:
CSS Box 模型教程
易于入门的教程
JavaScript 变量
核心思想
摘要
文本
1sentences
布局
网页
数据
图 9.18: 从用户提示词生成的短语输出
使用 AzureOpenAI 和 Azure Cognitive service 构建文本转视频功能
使用 AzureOpenAI 的 DALL-E 模型为图像生成提示词
1. 图像生成提示词
根据提供的短语为使用 DALL-E 模型生成图像构建一个提示词:
prompt = ''' 为每个短语提供一个图像创意:"' + phrases + '''
2. 从响应中提取图像短语
此代码带有给定提示词向 OpenAI 的文本补全 API 发送请求,检索包含图像短语的响应,按换行符分割响应,并从响应中提取图像短语。提示词为 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")
处理短语
3. 处理短语
此 Python 代码段过滤短语,提取冒号之前的文本,消除重复项并打印唯一的短语列表:
im_ph = []
for image_phrase in image_phrases:
if len(image_phrase) > 0:
im_ph.append(image_phrase.split(":")[0])
## 将列表转换为集合去重,然后转回列表
im_ph = list(set(im_ph))
print(im_ph)
图 9.20: 去重短语输出
4. 生成图像 URL
此代码遍历图像短语列表,根据每个短语向 OpenAI 请求生成图像,检索生成图像的 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)
5. 下载生成的图像
此代码遍历图像 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("下载完成...")
这是输出:
[13]: 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("下载完成...")
下载完成.....
图 9.21: 生成图像的输出
使用 Azure Speech 服务生成音频文件
1. 创建 Speech 配置对象
此代码使用提供的 Azure Speech 服务订阅密钥和区域来初始化SpeechConfig对象,并打印配置详情:
speech_config = speechsdk.SpeechConfig(
subscription=OPENAI_SPEECH_KEY,
region=OPENAI_SPEECH_REGION)
print(speech_config)
2. 文本转语音函数
text_to_speech函数利用 Azure Speech 服务将输入文本转换为语音。它将合成的音频保存到指定的文件名,并对过程结果提供反馈:
def text_to_speech(text, filename):
audio_config = speechdk.AudioConfig(filename=filename)
speech_synthesizer = speechdk.SpeechSynthesizer(speech_config=speech_config, audio_config=audio_config)
result = speech_synthesizer.speak_async(text).get()
print(result)
if result.reason == speechdk.Result.SynthesizingAudioCompleted:
print(f"Audio saved to {filename}")
else:
print(f"Error: {result.error_details}")
text = response_sum.choices[0].text
filename = "audio.mp4"
text_to_speech(text, filename)
这是输出内容:
text = text_to_speech(text, filename)
audio_config = speechdk.AudioConfig(filename=filename)
speech_synthesizer = speechdk.SpeechSynthesizer(speech_config=speech_config, audio_config=audio_config)
result = speech_synthesizer.speak_async(text).get()
print(result)
if result.reason == speechdk.Result.SynthesizingAudioCompleted:
print(f"Audio saved to {filename}")
else:
print(f"Error: {result.error_details}")
text = response_sum.choices[0].text
filename = "audio.mp4"
text_to_speech(text, filename)
speechSynthesizerResult(result_id=0b7382a1fe42cd661b65d6dc6cb91, reason=Result.SynthesizingAudioCompleted, audio_length=1018846)
Audio saved to audio.mp4
图 9.2: 生成图像的语音输出
将音频文件与图像生成视频
此代码调整图像大小,为每个图像创建时长为 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...")
这是输出内容:
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, methods="compose")
audio_clip = AudioFileClip(audio)
final_clip = concat_clip.set_audio(audio_clip)
final_clip.write_video(output, fps=24)
images = image_list
audio = filename
output = "video.mp4"
create_video(images, audio, output)
print("Video created...")
Creating the video...
MoviePy - Building video video.mp4.
MoviePy - Writing audio in VideoTEMP_MPY_wvf.mp3
MoviePy - Done.
MoviePy - Writing video video.mp4
MoviePy - Done !
MoviePy - video ready video.mp4
Video created.
将文本转换为视频
图 9.24: 图像、音频和合并视频的输出
总结
在本章中,我们学习了如何使用 Azure Cognitive Services 结合 OpenAI 将文本转换为视频。我们获取了图像创意并使用 OpenAI DALL-E 模型获取相关图像。接下来,我们制作了视频。我们使用 Azure Speech 服务将文本转换为语音,并与图像相结合制作视频。这使得通过自动将文本转换为视觉效果来创建有趣的视频内容变得更容易。
通过使用这些先进技术,我们可以加快从文本制作视频的速度。这不仅节省了时间,还让视频内容更具可读性和吸引力。通过 Azure 和 OpenAI,将文本转换为迷人的视频变得更加简单高效,为分享想法和故事提供了新的可能。
下一章中,我们将深入研究使用 Azure OpenAI Assistant API 创建多模态多智能体框架。该章节将指导你构建一个由多个智能体协作的系统。
虽然该服务针对单代理实现进行了优化,但要将多个代理编排为多代理系统还需要额外的工具支持。对于研究和概念验证项目,AutoGen 提供了比 Semantic Kernel 更好且更具扩展性的多代理框架。
本章对于有于使用 Azure OpenAI Assistants API 探索生成式 AI 和多代理系统前沿领域的开发者和技术爱好者具有特殊意义。具体来说,我们将涵盖以下主题:
-
问题描述
-
技术要求
-
架构图
-
创建多模态多代理框架
问题描述
随着 AI 技术的不断进步,我们需要更智能的系统来处理机器人、游戏和自动驾驶汽车等领域的复杂任务。单代理系统往往难以应对这些复杂问题,因为它们无法独立管理所有事务。为了解决这个问题,我们创建了一个由多个智能代理协同工作的系统。通过 Azure OpenAI Assistants API,我们将构建一个将高级 AI 模型的语言能力与智能代理决策能力相结合的框架。
例如,在机器人领域,一个机器人团队可以合作清理一个大型公园。一个机器人负责捡垃圾,另一个负责割草,第三个负责清洗水源。这些机器人需要相互通信并协调任务,以确保高效、彻底地清理公园。
另一个例子是游戏领域,多个 AI 角色可以协作创建更具动态且更具挑战性的玩法。一个角色可以是战略家,规划下一步行动;而另一个角色可以是侦察员,收集环境信息。同样,在自动驾驶汽车中,多辆自动驾驶车辆需要避免碰撞并优化交通流。通过协作,它们可以比单辆独立运行汽车做出更好的决策。
在本章中,我们将引导你完成使用 Azure OpenAI Assistants API 构建多代理框架的过程。我们将首先概述涉及的核心概念和技术,包括智能代理和 LLM(大语言模型)。接下来的,我们将带你了解实际示例和案例研究,以演示如何实现和集成这些代理。你将学习如何设置代理之间的通信,使它们能够协作完成任务,并利用 LLM 的能力来增强决策和解决问题的能力。
在本章结束,你将理解如何创建和使用一种结合了语言模型优势和自主代理优势的多代理系统。该系统能够处理各种任务,展示其在机器人、游戏和自动系统等各个领域的潜在应用价值。
技术要求
为了完成本章中的练习,请访问本章 GitHub 仓库中的源代码: https://github.com/PacktPublishing/Azure-OpenAI-Essentials/blob/main/Chapter10.ipynb 。
你需要在本地机器上准备以下工具以开始工作:
-
Python 3.9 或 3.11:https://www.python.org/downloads/
-
一个 Azure 账户:如果你是 Azure 新手,可以免费获取 Azure 账户,并将获得一些免费额度开始开始
-
启用 Azure OpenAI 服务访问权限的 Azure 订阅
-
Azure OpenAI (AOAI) 连接和模型信息:使用 Sweden Central(瑞典中部)作为区域创建 Azure OpenAI
-
GPT-4o 的 Assistants 模型
-
版本为 3.0 的 DALL-E 3 模型
除了上述系统要求外,具备坚实的 Azure 服务基础以及 Python 编程语言的基本精通(等同于初级水平 Python 100)也至关重要。这些技能对于在本章背景下高效利用和调用 Azure 服务至关重要。
请放心,如果你是 Azure 环境的新手,我们设计的本章内容非常适合初学者。它提供了清晰的解释并包含了详细的截图,以帮助你学习并引导你进入正确的轨道。
架构设计
我们将使用一个多代理系统,其中 User Proxy Assistant(用户代理助手)充当主编排器,促进用户与专业代理之间的通信。DALL-E Assistant 负责根据用户查询生成图像,而 Vision Assistant(视觉助手)则使用 GPT-4o 模型分析这些图像。系统通过持久线程(threads)维持通信,并利用函数调用(function calls)执行特定任务,如图像生成和分析。
使用 Azure OpenAI Assistants API 创建多模态多代理框架
在典型工作流中,用户向 User Proxy Assistant 发送查询,将其转发给 DALL-E Assistant 以创建图像。随后,Vision Assistant 对图像进行分析,提供的反馈可用于进一步完善图像。专业代理之间的这种协调努力确保了复杂任务的高效处理。
重要提示
这只是实现多代理系统的一种方法。你也可以使用其他框架,如 AutoGen、Semantic Kernel、CrewAI 和 LangGraph。
图 10.1 展示了整体架构框架的示例。在这种场景下,User Proxy Assistant 担任中心协调员,促进 DALL-E Assistant 和 Vision Assistant 之间的通信。
创建多模态多代理框架
在本节中,我们将通过一个使用 AOAI Assistants API 构建多代理框架的实际示例。我们将重点关注这些代理如何交互和协作以处理复杂任务,例如根据用户输入通过迭代改进来生成和完善图像。
每个助手的结构如图 10.2 所示,展示了它们在系统内部各自的角色和交互:
-
User Proxy Assistant:该助手的被初始化为主编排器,允许用户与群聊中的专业代理之间进行无缝通信。它确保消息被正确路由,并保持持续会话,以确保用户任务被成功执行。
-
DALL-E Assistant:该助手负责处理图像生成任务。它连接 DALL-E 模型创建视觉内容。
-
Vision Assistant:该助手配置用于执行图像分析。它利用 GPT-4 Vision 模型处理并解释视觉输入,为用户提取有意义的信息。
这些助手共同构成了一个协作系统,其中 User Proxy Assistant 协调交互,DALL-E Assistant 生成图像,Vision Assistant 进行分析,从而确保了高效且响应迅速的 AI 驱动工作流。
| User Proxy Assistant | Assistant1 | Assistant2 |
|---|---|---|
| 代理:User Proxy Assistant | 代理:DALL-E Assistant | 代理:Vision Assistant |
| 指令:你是一个通信专家 | 指令:你是一个图像创建专家 | 指令:你是一个图像分析专家 |
| --- | --- | --- |
| 函数:发送消息 | 函数:创建图像 | 函数:分析图像 |
图 10.2:助手详情
在开始之前,Azure OpenAI 服务已设置,DALL-E 3 和 GPT-4 模型已部署,如图 10.3 所示。
模型部署
| 名称 | 模型名称 | 模型版本 | 状态 | 模型淘汰日期 |
| --- | --- | --- | --- | --- |

浙公网安备 33010602011771号