Azure-OpenAI-解锁创意-使用-Azure-OpenAI-释放生成式-AI-创新的实用指南-一-

Azure OpenAI 解锁创意:使用 Azure OpenAI 释放生成式 AI 创新的实用指南(一)

原文:Azure OpenAI Essentials

译者:飞龙

协议:CC BY-NC-SA 4.0

Azure OpenAI 解锁创意:使用 Azure OpenAI 释放生成式 AI 创新的实用指南

https://github.com/OpenDocCN/freelearn-dl-zh/tree/master/docs/unlocking-creativity-with-azure-openai-a-practical-guide-to-/img/1f4103f75e57527f2610bfdcc490bc25_0_0.png

序言由 Marco Casalaina,Microsoft Azure AI 产品副总裁兼 AI 未来主义者

https://github.com/OpenDocCN/freelearn-dl-zh/tree/master/docs/unlocking-creativity-with-azure-openai-a-practical-guide-to-/img/1f4103f75e57527f2610bfdcc490bc25_1_0.png

  • 组合总监: Gebin George

  • 客户关系负责人: Deepesh Patel

  • 项目经理: Prajakta Naik

  • 内容工程师: Joseph Sunil

  • 技术编辑: Rahul Limbachiya

  • 文案编辑: Safis Editing

  • 校对员: Tanya D'ruz

  • 索引员: Hemangini Bari

  • 制作设计人员: Vijay Kamble

  • 营销协调员: Vignesh Raju

感谢全能者,在这段旅程中赐予我恩典、智慧力量。

感谢我亲爱的父母,故 Ashutosh Mukherjee 和 Pratima Mukherjee,感谢他们无尽的爱、坚定的支持和牺牲。你们一直是我的指路灯,成就了今天的我。

感谢我出色的妻子 Sujata,感谢她一如一日的爱、耐心和支持。她不仅是我生活的伴侣,更是让一切运行顺畅的人,即使当我的脑子被复杂的算法和无尽的想法占据时也是如此。没有她,我就就像一个没有适当训练数据的 AI——断开且不完整。你的耐心、爱和不断的鼓励改变了一切——Sujata。

感谢我两个漂亮的女儿,Adrija,她为我的生活带来了快乐、笑声和无限的奇心。她提醒我,最大的学习往往来自最意想不到的地方。感谢我的岳父母 Madhusudan Som 和 Tapati Som,他们的爱和鼓励,让我们的家庭变得更加强大。

感谢我的一生之交 Indranath Mitra、Avik Biswas 和 Biswajit Mondal,感谢他们无论发生什么始终如友谊和支持。

衷心感谢 Microsoft 医疗与生命科学技术专家社区以及指导过我的优秀领导者:Tyler Bryson、Patty Carrollo、Joyce Gottbetter、Austin Walsh、Carl Bender、Ian Morrison、Camille Whicker、Laura Robinson、Annita McDonald 和 Gene Buckley。你们的知识、激情和领导力激励我达到新的高度并突破极限。

这本书是我在沿途中收到的所有爱、支持和指导的成果。感谢每一位参与这段旅程的人。

— Amit Mukherjee

首先我想向我的父母 Krishna Priya Saladi 和 Rama Mohan Saladi 表达诚挚的谢意,感谢他们为我和妹妹提供最好的教育和生活条件所付出的牺牲。他们持续的支持、纠正我错误的指导以及他们带给我的灵感,对我的旅程至关重要。没有他们,我不会有今天的成就。我也想感谢我的妹妹 Yogitha Saladi,感谢她在所有挑战中始终支持我。感谢我的表亲和亲属的持续支持。特别感谢我的大学朋友 Praveen、Mount、Neha、Lokesh、Tara 和 Likhitha,感谢他们在无论顺境还是艰难的时刻一直在我身边并支持我。

我非常感激我的第一位导师,来自 Keka 的 Trinath Mallavarapu,他教会了我一个无价的教训:“即使是第一次做,也要做对。”这句建议塑造了我工作和生活的方式。我也向我的导师 Michael Stocker 表示最深的谢意,他的信任和相信让我在 UnternehmerT 的 DPS 期间获得了学习和成长的机会。我感谢 Thomas Zeller 在这段旅程中支持我。我非常感激 Grabon 的创始人 Ashok Reddy,感谢他带我进入公司并在各种情况下始终支持我。Grabon 为我提供了一个观察初创世界的独特视角,Ashok 对探索新想法的鼓励是无价的。

在微软,我首先想感谢我的经理 Pavani Anne,感谢她在职业生涯的这一新阶段做我的导师。从初创公司的背景转到微软这样的大型机构是一个巨大的飞跃,而 Pavani 的指导改变了一切。我也感谢我的经理 Amit Agarwal 和 Durga Prasad Rai 的持续支持。特别感谢我的领导 Subhendu Singh 和 Ajay Kumar S。感谢 Tajesh Singh、Prashant Kalalit 以及微软的所有同事每天给予我的灵感和鼓励。作为一个内向者,我经常感到被排除在外,直到感到舒适时才保持沉默。我将这本书献给那些让我感到包容、向我展示爱与信任并帮助我找到声音的人。特别感谢我的父母,他们的牺牲和坚定支持成就了今天的我。

感谢每一个参与这段旅程的人。

— Adithya Saladi

序言

在快速发展的人智能领域,将先进 AI 模型集成到实际应用中已成为创新的基石。作为 Azure AI 产品副总裁兼 AI 未来主义者,我亲眼目了 AI 技术在重塑行业、提高生产力和推动创造力新水平方面的变革力量。

这本书作为 Azure OpenAI 的全面指南,对于资深人士和领域初学者来说都是极其宝贵的资源。它严谨地涵盖了大语言模型(LLM)的基础概念、嵌入模型的复杂性以及 AI 在各个领域的实际应用。Amit 在简化复杂主题方面表现得出色,并以一种易于理解且深度信息丰富的方式进行了介绍。

这本书的一个亮点是其对现实应用的关注。从内容生成、客户支持到医疗和网络安全,AI 在解决复杂问题和创造新机会方面的潜力。对 Azure OpenAI 能力的深入探索(包括创新的“Azure OpenAI 处理数据”功能)凸显了企业如何利用 AI 从其专有数据中获取洞察,从而增强决策和运营效率。

书中深入探讨了函数调用(function calling)等高级主题,利用多模态模型处理需要文本和图像的任务。这些章节对于想要突破 AI 所能边界的开发者来说至关重要。

当我们站在 AI 新纪元的边缘时,准备好知识和工具以应对这一令人兴奋的前沿至关重要。这本书证明了作者的专业知识和对 AI 领域的奉献。对于任何想要理解并利用 Azure OpenAI 驱动创新并取得卓越成果的人来说,我相信这本书将赋予读者探索 AI 无限可能的能力,促进一个技术与人类创造力携手创造美好世界的未来。

Marco Casalaina

产品副总裁兼 AI 未来主义者,Azure AI

Microsoft

贡献者

关于作者

Amit Mukherjee 是微软医疗保健部门的生成式 AI(GenAI)技术专家,他利用 AI 增强患者护理并推动创新。他在机器学习(ML)和 AI 技术方面拥有深实的基础,设计从各种数据源中提取价值见解的 AI 系统。这使得医疗保健专业人员能够做出明智的、数据驱动的决策,从而改善患者疗。

他曾领导跨职能团队,针对各种医疗领域的诊断、治疗计划和患者参与开发定制的生成式 AI 解决方案。通过与利益相关者的紧密合作,他确保 AI 策略与组织目标一致,以实现有效且有意义实施。作为该领域的思想领袖,他处于新兴进展的前沿,致力于释放生成式 AI 在医疗保健领域的转型潜力。

Adithya Saladi 是一位拥有8 年以上经验的资深软件开发顾问,目前在微软 C+AI 组织的 Azure 可靠性团队担任软件工程师。他擅长利用 Azure 服务构建大规模、高质量的软件解决方案。他在与架构师和跨职能团队合作方面有着良好的记录,能够在紧迫的期限内交付创新的业务关键型解决方案。他丰富的经验涵盖了企业级应用和初创环境,使能够快速适应各种挑战。

除了技术专长外,Adithya 还热于指导初级开发者并积极为技术社区做出贡献。他还是 GreenOccasion 的创始人,这是一个非营利初创公司,专注于开发旨在减少排放并贡献可持续未来的技术解决方案。

关于评审员

Chalamayya Batchu 是一位卓越的企业级架构师,专攻 AI、ML 和数据策略。他擅长设计企业级 AI 架构,并制定策略利用云基础设施和先进技术从复杂数据集中提取可操作的见解。作为 CXO 的信赖顾问,他将分析策略与业务目标对齐,开发稳健的治理框架,并集成 NLP、GenAI 和 CV 等 AI 技术。他曾获得国际成就者奖等奖项,在 IEEE 和 Springer 出版过书籍,为 Manning 审阅过书籍,并在 SAS、SiliconIndia 和 TechBull 上发表过文章。他的领导力激励了数据驱动时代的创新。

Daniel J. Dean 博士 在机器学习、云端应用开发、云数据流水线开发和生成式 AI 解决方案开发方面拥有超过 15 年的经验。Daniel 在职业生涯中工作过微软和 IBM 等大公司,也工作过小型初创公司。Daniel 的职责包括分布式系统研究、云原生软件工程、快速解决方案原型设计和知识产权生成。Daniel 的论文发表在领先的计算机科学会议上,拥有三项专利,并担任多个计算机科学出版物行业赛道投稿的评审员。

Preetish Kakkar 是一位高级计算机图形工程师和 AI 爱好者,在高级渲染引擎、计算机视觉和 AI 驱动的创新方面拥有超过 15 年的经验。他擅长将 3D 图形与 AI 结合以增强 AR/VR/XR 体验,结合了物理渲染渲染、光线追踪和机器学习的尖端技术。他的贡献包括提升 Adobe 行业领先工具的视觉保真度和性能,他的专业知识跨越了图形、视觉和神经处理领域。作为《现代 Vulkan 菜谱指南》的作者以及领先期刊和书籍的评审员,Preetish 积极推动跨学科的进展。

前言 XV

  • 进一步阅读 15

| 识别 | 254 | | |

| | | 思维树 | 305 |

目录

  • 反思 314

  • 提示词泄露 328

  • 提示词工程与微调 318

  • 恶意软件传输 329

  • 优化 LLM 准确性 320

  • 数据窃取 329

  • 上下 LLM 优化 320

  • 提示词注入如何工作 330

  • 提示词优化策略 323

  • 提示词注入与越狱 330

  • 理解工具 324

  • 缓解策略 331

  • RAG(检索增强生成) 325

  • 挑战与持续风险 331

  • 微调 325

  • 结合 RAG 和微调 326

  • 总结 332

  • 生产环境中多高的准确性才足够? 326

  • 参考文献 332

索引 333

你可能喜欢的其他书籍 342

前言

在过去的十年里,我有机会参与了许多变革性技术的工作,这些技术重新定义了企业运营和创新的方式。其中,生成式人工智能(GenAI)作为一项突破性进展脱颖而出,能够以前所未有的速度重塑行业。围绕 GenAI 的热烈氛围显而易见,全球各机构都在竞相理解其潜力并对其进行有效实施。然而,对于许多人来说,从好奇到实施的旅程充满了复杂性和不确定性。

在微软的职业生涯中,我与各种团队合作(涵盖从小微企业到财富 500 强医疗保健公司),探索并部署 AI 驱动的解决方案。这些经历揭示了一个反复出现的主题:虽然 GenAI 的前景是巨大的,但在桥接概念理解与实际应用之间存在着巨大的知识鸿沟。组织往往在应对这一快速发展的领域时挣扎,寻求可操作的见解以将愿景变为现实。

本书是我们试图填补这一差距的尝试。它是 Azure OpenAI 的全面指南,一个融合基础知识与技术的领先平台。无论你是开发者、数据科学家还是决策者,本书都旨在帮助你理解 Azure OpenAI 的潜力,将其集成到你的工作流中并释放其全部能力。

在整本书中,我们将带你开启一段从生成式 AI 和大语言模型(LLMs)基础,到操作化、隐私、安全和提示词工程等高级主题的旅程。真实世界的示例和分步指南将引导你进入叙述,确保你不仅获得了理论知识,还获得了有效实施 Azure OpenAI 解决方案的实践技能。

该领域的独特方面之一是其快速演进。在编写这本书期间,我见证了每几周一次的新进展,这需要不断更新以反映最先进水平。尽管存在这些变化,GenAI 和 LLMs 的核心原理仍然至关重要,构成了下一波创新的基础。

书中使用的示例和案例利用了 Azure OpenAI,因其具备企业级能力并与 Azure 服务无缝集成。然而,这些概念和技术可以迁移到其他平台,确保无论你选择何种提供商都具有相关性。实现示例使用了 Python,提供了一种简单而强大的与 AI 模型交互的方式。

欢迎来到 Azure OpenAI 核心知识的探索之旅。本书旨在赋予你知识和信心,在你的项目中利用 GenAI 的力量。我希望在你进入这一变革性领域时,它既是你的灵感来源,也是一份实用的资源。

让我们一起构建未来!

本书目标读者

本书为专业人士和爱好者设计,无论其技术背景如何,都能利用 Azure OpenAI 的力量进行实际应用。它面向开发者、数据科学家、AI 工程师以及希望将 GenAI 集成到其工作流或业务策略中的决策者。虽然对编程概念(特别是 Python)有基本的了解是有益的,但本书包含了清晰的解释和实践示例,以支持该领域的新手。此外,业务领袖和非技术人员也能从中受益。

本书涵盖内容

第一章,大语言模型简介,介绍了 LLMs 的基础概念,探索了它们对日常生活的影响。本章涵盖了架构、生成内容以及集成 AI。

第二章,Azure OpenAI 基础,深入探讨 Azure OpenAI 的功能,探索如何使用 Azure OpenAI 和 Services 构建解决方案。本章涵盖了嵌入概念、模型类型以及如何部署它们。

第三章,Azure OpenAI 高级主题,涵盖了 Azure OpenAI 的高级功能,探索在解决复杂问题时的使用场景。本章涵盖了上下文窗口、函数调用以及 Batch API。

第四章,开发企业级文档解答解决方案,解释了如何使用 Azure OpenAI 和 Cognitive Search 查询非结构化文档。本章涵盖了嵌入模型。

第五章,构建呼叫中心分析解决方案,解释了如何使用 Azure OpenAI 和 Azure Communication Services 开发分析中心平台。本章涵盖了挑战、设计以及实施策略。

第六章,从结构化数据库查询,探索了如何使用自然语言查询结构化数据。本章涵盖了 SQL 以及创建用户友好的界面。

第七章,代码生成与文档,探索了 Azure OpenAI 如何促进创建和解释。本章专注于构建代码片段供开发者。

第八章,使用 Azure OpenAI 创建基础推荐系统,介绍了如何构建基于聊天机器人的电影或产品推荐系统。

第九章,文本转视频,揭示了如何使用 Azure OpenAI 和 Cognitive Services 将文本转换为视频。你将学习架构设计、从文本生成图像。

第十章,使用 OpenAI Assistant API 创建多模态代理框架,探索如何构建一个智能代理协作任务的系统,如图像生成和精炼。本章还涵盖了多代理框架,展示了它们在 GenAI 应用中的潜力。

第十一章,隐私与安全,重点在于通过稳健措施保护你的 Azure OpenAI 应用。主题包括符合 Azure OpenAI 标准、确保数据隐私、利用内容过滤以及实施托管身份。它深入探讨了虚拟网络、数据点、加密以及采用负责任 AI 实践以确保安全使用。

第十二章,Azure OpenAI 操作化,涵盖了如何有效部署、管理和扩展 Azure OpenAI 服务。它涵盖了服务配额和限制的关键实践、管理配额、配置吞吐单元以及实施处理增长负载的可扩展策略。

第十三章,高级提示词工程,研究了通过提示词工程优化 AI 响应的行为和质量。本章探索了创建有效提示词的元素和策略、提示词工程与微调的对比以及提高 LLM 准确性的技术。它还涉及了缓解提示词注入攻击和塑造 AI 输出的关键考量。

这些前提条件将确保您拥有必要的工具和环境,以跟进内容并有效地实施练习。

如果您正在使用本书的电子版,我们建议您亲自输入代码或从书的 GitHub 仓库访问代码(下一节将提供链接)。这将帮助您避免任何与复制粘贴代码相关的潜在错误。

下载示例代码文件

你可以从 GitHub https://github.com/PacktPublishing/Azure-OpenAI-Essentials 下载本书的示例代码文件。如果代码有更新,将在 GitHub 仓库中进行更新。

我们从丰富的书籍和视频目录中还提供了其他代码包,可以在 https://github.com/PacktPublishing/ 找到。欢迎去查看!

使用的规范

全书使用了多种文本规范。

文本中的代码

文本中的代码表示文本中的代码词、数据库表名、文件夹名、文件名、扩展名、路径名、虚拟 URL、用户输入和 Twitter 账号。例如:“每个消息对象由一个角色类型(系统、用户或助手)和内容组成。”

代码块设置如下:

} response = openai.ChatCompletion.create(
  engine="gpt-35-turbo",
  messages=
    {"role": "system", "content": "You are a helpful assistant\nthat helps people find information"}

当我们希望您注意代码块的某个特定部分时,相关行将加粗显示:

  • 2011 年世界杯世界杯的决赛在印度孟买的 Wankhede 体育场举行。

任何命令行输入或输出的写法如下:

pip install -r requirements.txt

加粗: 表示新术语、重要词汇或在屏幕上显示的词汇。例如,菜单或对话框中的单词将以加粗显示。示例:“Azure 门户将在新资源可用后通知您。转到资源以访问新创建的资源。”

提示或重要说明

显示如下。

与我们联系

我们欢迎读者的反馈。

一般反馈: 如果您对本书的任何方面有任何问题,请发送电子邮件至 customercare@packpub.com 并在邮件主题中注明书名。

勘误: 尽管我们尽力确保内容的准确性,但错误仍然会发生。如果您在书中发现错误,我们将不胜感激您向我们报告。请访问 www.packpub.com/support/errata 并填写表单。

盗版: 如果您在互联网上遇到任何形式的我们作品的非法复制版,我们将感谢您提供位置地址或网站名称。请通过 copyright@packt.com 联系我们并提供材料链接。

如果您对成为作者感兴趣:如果您在某个领域拥有专知识并且对编写或贡献书籍感兴趣,请访问 authors.packpub.com。

分享您的想法

在您读完《Azure OpenAI Essentials》,我们想听听您的想法。

大语言模型简介

对于人类来说,文本是一组词汇的组合。我们阅读句子,句子组成段落,段落构成文档的章节。但对于计算机来说,文本仅仅是一系列字母和符号。为了让计算机能够理解,我们可以使用所谓的循环网络来创建一个模型。该模型一次处理一个单词或一个字符,并在读完所有内容后给出答案。这个模型很好,但有时当它读到一段文本的末尾时,很难回想起该段文本开头的内容。这正是 Transformer 架构大放异彩的地方。Transformer 架构的关键创新在于使用了自注意力机制,这使其能够比之前的模型更有效地捕捉序列中不同部分之间的关系。

2017 年,Ashish Vaswani 和他的团队写了一篇名为注意力就是你所需要的的论文,引入了一种名为 Transformer 的新模型。该模型使用了注意力机制。与循环网络处理文本的老方法不同,注意力机制允许你一次查看整个句子或整个段落,而是一次只处理一个单词。这有助于 Transformer 根据增加的上下文更好地“理解”单词。如今,大多数大语言模型(LLMs)都是构建在 Transformer 之上的。

当你使用 Transformer 模型来理解文本时,必须将其拆分为单独的单词或标记(tokens)。这些标记随后被转换为数字,并映射到称为嵌入(embeddings)的特殊代码,这些嵌入就像存储标记语义含义的特殊地图。最后,Transformer 的编码器获取这些嵌入并将它们转换为表示。这种“表示”是一个捕捉了输入标记上下文含义的向量,允许模型更有效地理解和处理输入。简单来说,你可以将其构结为将所有碎片组合在一起以理解整个故事。

这里有一个文本字符串、其分词及其向量嵌入的示例。注意,分词可以将单词转换为子词。例如,单词“generative”可以被分词为“gener”和“ative”。

让我们来看输入文本:

生成式 AI 是一项由复杂算法和机器学习驱动的突破性技术,具有在各个领域独立创建内容的卓越能力。通过细致分析海量数据集并发现复杂的模式,它能生成文本作品、艺术创作以及许多反映人类智慧的输出。这种创新能力正在重塑各行各业,推动了语言生成、创意艺术和数据合成等领域前所未有的进步。

什么是大语言模型?

这里是分词后的文本:

['Gener', 'ative', ',', 'AI', ',', ' ', 'a', ',', 'Groundbreaking', ',', ' ', 'technology',
['fuelled', ',', ' ', 'by', ',', ' ', 'intricate', ',', ' ', 'algorithms', ',', ' ', 'and', ',', ' ', 'machine'],
['learning', ',', ' ', 'possesses', ',', ' ', 'the', ',', ' ', 'remarkable', ',', ' ', 'ability'],
['to', ',', ' ', 'independently', ',', ' ', 'craft', ',', ' ', 'content', ',', ' ', 'across', ',', ' ', 'diverse'],
['domains', ',', 'By', 'meticulously', ',', ' ', 'analyzing', ',', ' ', 'vast'],
['datasets', ',', ' ', 'and', ',', ' ', 'discern', ',', ' ', 'ing', ',', ' ', 'intricate', ',', ' ', 'patterns'],
['', ',', ' ', 'textual', ',', ' ', 'compositions', ',', ' ', 'artistic'],
['creations', ',', ' ', 'arts', ',', ' ', 'myriad', ',', ' ', 'other', ',', ' ', 'outputs'],
['that', ',', ' ', 'mirror', ',', ' ', 'human', ',', ' ', 'in', ',', ' ', 'entity', ',', ' ', 'This'],
['innovative', ',', ' ', 'capability', ',', ' ', 'is', ',', ' ', 'reshaping', ',', ' ', 'industries'],
['far', ',', ' ', 'and', ',', ' ', 'wide', ',', ' ', 'driving', ',', ' ', 'unprecedented'],
['advancements', ',', ' ', 'in', ',', ' ', 'fields', ',', ' ', 'such', ',', ' ', 'as', ',', ' ', 'language'],
['generation', ',', ' ', 'creative', ',', ' ', 'and', ',', ' ', 'and', ',', ' ', 'data'],
['synthesis']

现在,看嵌入:

[-0.0247799065783024, -0.01380225385737491, 0.014264720492064953,
-0.02029823826471297126, 0.0898031626496836, 0.0171310584992217033,
0.0422450006081428, 0.02088187656995296, -0.028950852396774292,
0.0418062725067139, 0.0201751936886948, 0.034369271248597025,
0.00537555034030074, -0.01920752003788948, 0.002707283245399543,0.0
081034330651166405, 0.0354079884867414, 0.01543007129907608,
]
[-0.028271631402176, -0.009549995884299278, 0.02203330025076866,
-0.015215701423585415, 0.02339498312336653, -0.0089673520999711666,
0.0176113824591111, 0.0111111111111111111111111111,
.0011111111111111, 0.0011111111111111, 0.0111111111111111,
]

https://github.com/OpenDocCN/freelearn-dl-zh/tree/master/docs/unlocking-creativity-with-azure-openai-a-practical-guide-to-/img/1f4103f75e57527f2610bfdcc490bc25_29_0.png

现在我们已经学习了大语言模型(LLM)背后的基本概念,让我们关注一些顶尖的行业案例。

LLM 示例

许多公司都开发了前沿的 LLM,包括 OpenAI(GPT-4)、Meta(Llama 3.1)、Anthropic(Claude)和 Google(Gemini)等。OpenAI 在 LLM 领域一直保持着主导地位。让我们来看看写作时所使用的模型:

  • 生成式预训练 Transformer(GPT): OpenAI 创建了各种 GPT 模型,包括 GPT1(11.7 亿参数)、GPT2(15 亿参数)、GPT-3(1750 亿参数)、GPT 3.5、GPT-4-turbo、GPT-4o 以及 GPT-4o mini。GPT-4o 是全球范围内最先进的 LLM 之一。这些模型从海量文本中学习学习并能够对许多主题和问题提供类人类的回答。它们还能记住对话的部分内容。

  • Anthropic: Anthropic 的模型是一系列先进的 LLM,旨在高效地处理复杂任务。最新的迭代版本 Claude 3 包含了 Opus、Sonnet 和 Haiku 等模型,每个模型都针对不同的性能需求定制。Opus 是最强大的,擅长复杂分析和高阶任务;而 Sonnet 平衡了速度和智能,Haiku 为轻量级操作提供最快的响应速度。这些模型的构建重点关注安全性、可靠性和伦理实践。

  • Llama 3.1: 一种前沿的 LLM,代表了 AI 研究的重大里程碑。凭借其先进的架构和巨大的规模,Llama 3.1 能够以前所未有的准确细微差别理解并生成类人类文本。这一强大的工具对各种应用具有深远影响,包括自然语言处理(NLP)、文本生成和对话 AI。

  • Llama 2: 由 Meta 开发的第二代 LLM。它是开源的,可以用于创建 ChatGPT 或 Google Bard 这样的聊天机器人。Llama 2 的训练数据比 Llama 1 多了 40%,以生成逻辑性且自然的回答。Llama 2 可供任何人用于研究或业务。

Meta 表示 Llama 2 理解的上下文是 Llama 1 的两倍。这使其成为更智能的语言模型,可以提供像人类一样的答案。

  • Gemini: Gemini 是由 Google DeepMind 开发的一系列先进多模态 LLM。于 2023 年 12 月 6 日发布,包含了 Gemini Ultra、Gemini Pro、Gemini Flash 和 Nano 等变体。旨在无缝地理解和跨不同类型的信息,包括文本、图像、音频、视频和代码。作为 OpenAI GPT-4 的竞争对手,Gemini 为 Google 的 AI 聊天机器人驱动,旨在提升创造力和效率。

  • PaLM 2: 最后,PaLM 2 是 Google 更新的 LLM。它擅长处理复杂任务,如代码和数学、分类和回答问题、语言翻译、精通多种语言以及创建类人类句子。它优于之前提到的模型(包括原始 PaLM)。Google 对创建和使用 AI 非常谨慎,PaLM 2 是这种方法的一部分。它经过了彻底的评估,可以检查潜在的问题偏见。PaLM 2 不仅孤立使用,还被用于其他高级模型,如 Med-PaLM 2 和 Sec-PaLM。它还负责 Google Google AI 功能和工具,如 Bard 和 PaLM API。

现代 LLM 的进化树(见图 1.2)说明了这些模型在近几年中是如何演变的,并突出了一些最著名的模型。关系密切的模型位于同一分支上。使用 Transformer 架构的模型用不同颜色表示:仅解码的在蓝色分支,仅编码的在粉色分支,同时进行编码和解码的模型在绿色分支上。模型在时间轴上的位置显示了它们发布的时间。开源模型用填充方框表示,而非开源模型用空方框表示。右下角的状图显示了来自不同公司和组织的模型数量:

https://github.com/OpenDocCN/freelearn-dl-zh/tree/master/docs/unlocking-creativity-with-azure-openai-a-practical-guide-to-/img/1f4103f75e57527f2610bfdcc490bc25_31_0.png

图 1.2:进化树(来源:https://arxiv.org/abs/2304.13712 )

在探索一些案例后,让我们讨论一下基础模型(foundation models)的概念及其优势。

基础模型的概念

近年来,LLM 作为基础模型引起了巨大的轰动。“基础模型”一词最初由斯坦福大学的一个团队引入。从本质上说,这些模型属于生成式 AI,因为它们能够生成文本。赋予这些模型实现多功能能力的是它们在海量数据上经过广泛训练,涵盖了 NLP 任务(见图 1.3):

https://github.com/OpenDocCN/freelearn-dl-zh/tree/master/docs/unlocking-creativity-with-azure-openai-a-practical-guide-to-/img/1f4103f75e57527f2610bfdcc490bc25_32_0.png

考虑一种场景,你向模型提出了一个分类任务。假设你给模型提供了一个句子,并接着问道:“这句话带有积极还是消面的情绪?”模型随后将施展它的魔力,通过生成的词来完成句子。它生成的下一个词将作为你分类问题的答案。根据它对句子情绪的感知判断,模型将回答“积极”或“消面”。这种方法利用了模型生成上下文相关文本的能力来解决特定的分类挑战。

即使在数据有限的情况下,基础模型也可以非常有效。通过称为提示(prompting)或提示工程的过程,零样本(zero-shot)、单样本(one-shot)和少样本学习(few-shot learning)等技术可以用于处理下游任务。虽然这些模型主要设计用于生成预测(特别是 NLP 任务),但它们提供了巨大的能力。通过添加少量的标注数据,我们可以调整这些模型以获得异常性能。这种转换是通过称为微调(fine-tuning)的过程实现的。

让我们谈谈一些优势:

  • 性能: 这些模型在海量内容上进行了训练,数据量通常达到 TB 级。在执行小型任务时,这些模型表现出的卓越性能超过了在少数数据点上训练的模型。

  • 生产力提升: LLM 可以极大地提高生产力。对于通常需要大量精力的任务,它们就像极其高效的人类。在客户服务中,LLM 可以快速回答常见问题,释放出人类员工处理更复杂的问题。在业务中,它们比人类更快地处理和组织数据。使用 LLM,公司可以节省时间和金钱。这让他们能够专注于更重要的任务。

然而,这些基础模型也面临着关键挑战和局限性:

  • 成本: 由于需要海量数据,这些模型的训练通常非常昂贵。这对于尝试训练自己基础模型的小型企业带来了挑战。此外,随着模型规模的增大(达到数十亿参数),进行推理的成本也会变得非常昂贵。

微软等云提供商提供了名为 Azure OpenAI 的服务。该服务允许企业按需使用这些模型,并根据实际使用付费。这类似于短时间租用一台强大的计算机,而不是购买一台。通过利用这种基于服务的能力,公司可以在模型训练和使用方面都节省费用,特别是考虑到这些模型所需的强大基于 GPU 的硬件。

总而言之,使用此类服务可以在不花费巨额资源和基础设施的情况下,利用先进模型的优势。

  • 可信度: 正如数据是这些模型的巨大优势一样,也有其反面:LLM 是在海量的互联网抓取数据上训练的,这些数据可能包含偏见、仇恨言论或毒性内容,从而损害了它们的可靠性。这将是一项艰巨的任务。此外,挑战在于甚至不知道数据包含哪些内容。对于许多开源项目,训练许多 LLM 所使用的数据并不明确,这使得评估人们对模型可信度和潜在偏见的担忧变得困难。LLM 训练数据的巨大规模使得人工标注员几乎无法彻底审查每一个数据点,这增加了产生无意后果的风险,例如延续有害偏见或生成毒性内容。

大型机构充分意识到这些技术所含的巨大可能性。OpenAI、微软、谷歌和 Anthropic 共同宣布成立了前沿模型论坛,这是一项全新的行业倡议,旨在确保前沿 AI 模型的安全和负责任的发展。这项新的协作努力将利用其成员公司的集体技术和运营流程,促进更广泛的 AI 领域的进步。其核心目标之一是推动技术评估和基准测试的发展。此外,该论坛将构建一个公开的解决方案库,以加强整个 AI 领域对最佳实践和标准的采纳。

  • 幻觉: 有时,LLM 可能会产生完全不准确的信息或答案。这就像你做了一个看起来真实的梦,但它并不是基于实际发生的事情。LLM 可能会生成听起来正确但并非完全真实或准确的文本。因此,虽然 LLM 非常智能,但它们有时会犯错或提供非真实的内容。

LLM 的应用通常需要人工监督,以确保输出是可信的。

然而,有一种名为“模型对齐(grounding the model)”的技术,旨在改善这种情况。对齐意味着将 LLM 的理解与真实世界的信息和上下文联系起来。这就像确保模型稳根于现实。在本书中,我们将更多讨论如何使用这种技术来防止模型编造事实,并仅根据给上下文提供答案。

  • 有限的上下文窗口: LLM 有有限的上下文窗口或 token 大小。上下文窗口或 token 大小可以看作模型一次处理的内存量。LLM 一次只能理解一定数量的信息。例如,ChatGPT(GPT-4)可以处理 128k 输入 token。这意味着如果你给它太多的阅读内容,它将无法处理并报错。因此,将输入保持在此限制范围内对于模型的良好运行至关重要。

在理解基础模型概念的基础上,让我们深入探讨 LLM 的一些实际用例。

探索 LLM 用例

由于 LLM 具有理解和生成类文本的能力,它们在各个领域和行业中都有广泛用用。让我们来看看一些:

内容生成: LLM 可以为博客、文章、营销材料和社交媒体帖子生成书面内容。它们可用于自动化内容创建并提供创意构思。

客户支持: LLM 可以对客户查询和支持工单提供自动回复,从而处理常见问题和事项,释放人工坐勤人员来管理复杂案例。

语言翻译: LLM 可用于翻译不同语言之间的文本,使全球范围内的通信变得更加容易且无障碍。

文本摘要: LLM 可以快速总结长文本,让人更容易掌握文章、报告和其他书面材料的重点。

聊天机器人和虚拟助手: LLM 可以驱动能够自然语言对话的聊天机器人和虚拟助手,帮助用户完成任务、查询和信息检索。

内容个性化: LLM 可以分析用户偏好和行为,在社交媒体和流媒体服务等平台上提供个性化的推荐、广告和内容投放。

数据输入和提取: LLM 可以从非结构化文本(如文档或电子邮件)中提取相关信息,并将其输入到结构化数据库或电子表中。

创意写作: LLM 可以通过生成故事构思、对话、角色描述甚至整个叙事来协助作家。

医疗聊天机器人: 由 LLM 驱动的聊天机器人可以回答健康相关问题,提供急救建议,并提供有关常见疾病的信息。

医学诊断: LLM 可以通过分析患者症状和医疗记录来协助诊断疾病,提供潜在的诊断方案和治疗建议。

心理健康支持: LLM 可以为寻求心理健康问题支持的个人提供共情式的回复和资源。

旅游和旅行规划: LLM 可以通过建议行程、推荐以及提供有关当地习俗和美食的信息来帮助旅行者。

食谱创作: LLM 可以根据食材和饮食偏好设计创新的食谱,提供新的烹饪体验。

网络安全分析: LLM 可以分析网络安全威胁,并建议用于保护数字系统和数据的策略。

时尚推荐: LLM 可以根据个人风格偏好和当前时尚趋势推荐服装和配饰搭配。

法律文件审查: LLM 可以审查法律文件、合同和案例历史,以识别相关信息、异常和潜在问题。

学术研究: LLM 可以通过提供学术论文摘要、帮助文献综述以及生成进一步研究的想法来协助研究人员。

财务分析: LLM 可以处理和分析财务数据,生成报告,并对市场趋势和投资机会提供见解。

语言学习: LLM 可以通过进行对话、提供解释和提供练习来帮助学习者练习并提高语言技能。

无障碍工具: LLM 可用于为视障人士创建音频描述、为视频生成字幕,并为有阅读困难的人将文本转换为语音。

虽然这些只是一些用例示例,但 LLM 无限的灵活性使得它们随着技术的发展,被应用到更多的场景中。

总结

在本章中,我们首先介绍了大语言模型(LLMs)以及它们如何受到 Transformer 网络的影响。然后,我们探索了组成 LLM 的各个部分。接下来,我们深入研究了由 OpenAI、Meta 和 Google 创建的一些顶级 LLM 模型,并讨论了这些模型是如何演变的。我们还涵盖了基础模型概念,包括它们的优势和局限性。最后,我们查看了 LLM 显示出潜力的各种业务应用。

在章节,我们的重点将放在 Azure OpenAI 服务。我们将学习如何访问此服务,包括 GPT-3.5、GPT-4、Embeddings 和 DALL-E 2 等模型。我们还将解释定价工作原理,讨论诸如按需付费和预留容量等选项。

延伸阅读

2 Azure OpenAI 基础知识

在上一章中,我们讨论了大语言模型(LLMs)、LLM 概念以及不同的企业级 LLM 示例。我们还讨论了基础模型概念,并探讨了 LLM 的不同用例。在本章中,我们将深入研究 Azure OpenAI (AOAI) 服务、不同模型类型、如何部署模型以及各种定价方面。

我们将在本章中学习以下章节:

  • 什么是 AOAI 服务?

  • AOAI 模型类型

  • 访问 AOAI 资源

  • 创建 AOAI 资源

  • 部署 AOAI 模型

  • 利用 AOAI 模型

  • 定价

在进入这些之前,让我们稍微更好地了解微软与 OpenAI 的合作伙伴关系。

微软对 OpenAI 投入了数十亿美元的投资,以确保他们能够开发先进的 AI 技术并与所有人共享其成果。这种合作伙伴关系建立在微软 2019 年和 2021 年之前的投资的基础上。这使得微软和 OpenAI 能够将他们创建的先进 AI 技术用于自己的业务。微软还投资了强大的超级计算机,帮助 OpenAI 进行其重要的研究。

微软与 OpenAI 建立了战略合作伙伴关系,在此过程中整合了他们先进的 LLM。我们在各种产品中使用 OpenAI,并创造创新的数字体验。微软有一项名为 AOAI 的服务,开发者可以在那里利用尖端模型的力量,结合微软强大的工具。微软是唯一为 OpenAI 提供云服务的公司,这意味着他们将处理 OpenAI 研究、产品和服务的所有计算工作,以构建复杂的 AI 应用。这种协作能够实现变革性解决方案的创造,开启了 AI 驱动开发的新可能。在下一节中,我们将深入探讨 AOAI 服务以及如何使用它。

什么是 AOAI 服务?

微软提供广泛的 AI 工具和解决方案,帮助处于 AI 旅程每个阶段的客户,无论团队的专业知识如何。无论你是 AI 新手还是有特定的用例,微软都有许多涵盖的方案。他们为初学者提供了易于使用的选项,同时也支持具有更高级需求的数据科学家。当你探索 AI 产品时,你可以自由地从高层 AI 服务开始,并深入 Azure Machine Learning 平台,以规模构建、训练、调优和部署深度学习模型。整个 Azure AI 栈如图所示:

https://github.com/OpenDocCN/freelearn-dl-zh/tree/master/docs/unlocking-creativity-with-azure-openai-a-practical-guide-to-/img/1f4103f75e57527f2610bfdcc490bc25_40_0.png

图 2.1 - Azure AI 栈

在顶层,你拥有用于特定应用的 AI 服务,例如认知搜索(Cognitive Search)、机器人服务(Bot Service)和文档智能(Document Intelligence)。还有特定领域的预训练模型,如视觉(Vision)、语音(Speech)、语言(Language)、决策(Decision)和 Azure OpenAI 服务。这些都是在 Azure Machine Learning 作为托管端点的基础上构建的。如果你在使用 AI 服务,你就不需要担心基础层。然而,如果你想访问基础层以获得控制权,你可以使用底层:Azure Machine Learning。它是一个托管的端到端机器学习平台,用于负责任且安全地规模化构建、训练、部署和运行机器学习模型。

AOAI 模型类型

AOAI 服务(图 2.1 中红色文本框标记)是一项新的 Azure 服务,为 OpenAI 强大的语言模型提供 REST API 访问,包括 GPT-4 Turbo、GPT-4o、GPT-4o mini、GPT-3.5 Turbo、Whisper、DALL-E 3 和 Embedding 模型。它们提供了安全性、私有网络、合规性、区域可用性和负责任 AI 等功能。

Azure OpenAI 基础

GPT-3.5:GPT-3.5 代表系列构建在 GPT 之上的模型。这些模型擅长理解和生成自然语言以及代码。在 GPT-3.5 模型中,最强大且成本效益的是 GPT-3.5 Turbo。它专门针对交互进行了微调,并在处理常规任务时表现良好。GPT-3.5 的最新版本还有两种口味:

  • gpt-3.5-turbo-1106:该模型支持最大 16385 个 token 窗口和 4096 个输出。

  • gpt-3.5-turbo-0125:该模型支持最大 16385 个 token 窗口和 4096 个输出。

  • gpt-3.5-turbo-instruct:该模型支持最大 4097 个 token 窗口。该模型经过微调。

GPT-4:这是最新的,并且能够解决复杂问题。作为一种高度优化的模型,GPT-4 最适合交互式聊天。GPT-4 类:

  • GPT-4 Turbo:该模型支持最大 128000 个 token 窗口和 4096 个输出。

  • GPT-4o:该模型支持最大 128000 个 token 窗口和 4096 个输出。

  • GPT-4o mini:该模型支持最大 128000 个 token 窗口和 16384 个输出。

这是一个可以采用 GPT-3.5 或 GPT-4 的交互示例。通常,你作为用户输入提示词(prompt),模型做出响应(model output)。这可以是连续的对话:

https://github.com/OpenDocCN/freelearn-dl-zh/tree/master/docs/unlocking-creativity-with-azure-openai-a-practical-guide-to-/img/1f4103f75e57527f2610bfdcc490bc25_42_0.png

图 2.2: 基础提示词和完成示例

除了提示词补全,你还需要理解一个关于令牌(tokens)的概念。当你向 GPT-3.5 或 GPT-4 发送提示词时,它通过嵌入(embedding)过程进行分词,在此过程中,单词或更常见的词片段会被转换为数值向量表示。使用数值令牌而不是完整的单词或句子来处理信息。这种设计允许 GPT 模型处理相对大量的文本。然而,GPT-3.5 和 GPT-4 对令牌都有限制(取决于你之前提到的所选的模型),该限制适用于输入提示词和生成的内容的总和。

为了确保你在令牌限制范围内,你可以估计提示词及结果生成内容所需的令牌数量。作为一个粗略的指南,在英语中,每四个字符通常对应一个令牌。因此,你可以通过将提示词的字符数与所需的响应长度相加,然后将总和除以四来计算所需的令牌。这种计算可以为你提供一个所需令牌数量的粗略估计,这对于必须考虑令牌限制的任务规划非常有价值。图 2.3 显示了给定句子的令牌计数示例:

https://github.com/OpenDocCN/freelearn-dl-zh/tree/master/docs/unlocking-creativity-with-azure-openai-a-practical-guide-to-/img/1f4103f75e57527f2610bfdcc490bc25_43_0.png

| 令牌 (Tokens) | 字符 (Characters) |

|---|---|

| 7 | 35 |

图 2.3:令牌计数器

在这个示例中,共有七个令牌。注意的是,"generative"由两个不同的令牌表示,而其余单词每个由一个令牌表示。

嵌入模型:嵌入是浮点数的向量列表。当我们衡量这些向量之间的距离时,它告诉我们它们有多相似或差异。如果距离很小,它们非常相似;如果距离很大,意味着它们差异很大。当你将原始文本输入嵌入模型时,它会为提供的文本生成一个向量表示列表:

Azure OpenAI 基础

https://github.com/OpenDocCN/freelearn-dl-zh/tree/master/docs/unlocking-creativity-with-azure-openai-a-practical-guide-to-/img/1f4103f75e57527f2610bfdcc490bc25_44_0.png

图 2.4:基础嵌入过程

实践中,你将一组文档单词作为输入提供嵌入模型,模型使用这些单词创建一个嵌入向量。该向量通常存储在向量数据库中,例如 Azure Cognitive Search 或 Azure Cosmos DB。随后,当用户提交查询时,它会通过相同的嵌入模型生成查询向量,并用于在向量数据库中搜索相似的向量。这种模式被称为检索增强生成(RAG)。

下面的图说明了这一过程:

https://github.com/OpenDocCN/freelearn-dl-zh/tree/master/docs/unlocking-creativity-with-azure-openai-a-practical-guide-to-/img/1f4103f75e57527f2610bfdcc490bc25_44_1.png

图 2.5:文档嵌入过程

在编写时,AOAI 服务提供四种嵌入模型:

text-embedding-ada-002(版本 1):该版本使用 GPT-2/GPT-3 分词器。它可以处理最多 2,046 个输入令牌,并提供 1,024 维的输出。

text-embedding-ada-002(版本 2):此版本使用 c100k_base 分词器。它支持大四倍的输入,最多 8,191 个令牌,并返回 1,536 维的输出。这是第二代嵌入模型。我们强烈建议使用 text-embedding-ada-002 版本2,因为它在能力和性能方面与 OpenAI 的 text-embedding-ada-002 模型平相当。该模型不仅更具成本效益,而且更简单高效。

AOAI 模型类型

text-embedding-3-small:新的 text-embedding-3-model 显著优于其前身 text-embedding-ada-002,多语言检索的基准分从 31.4% 提高到 44.0%,英语任务则从 61.0% 提高到 62.3%。此外,它的成本效益提高了五倍,每 1k 令牌的价格从 $0.0001 降至 $0.00002。虽然 text-embedding-ada-002 仍然可用,但由于其提高的效率和性能,推荐 text-embedding-3-small。新模型 text-embedding-3-large 提供了更大的容量,嵌入维度高达 3,072 维。

text-embedding-3-large:新的 text-embedding-3-large 是性能最好的嵌入模型,相比 text-embedding-ada-002 有巨大的改进。它在 MIRACL 基准测试中获得 54.9% 的平均分,在 MTEB 基准测试中获得 64.6%,分别高于之前的 31.4% 和 61.0%。text-embedding-3-large 的价格为每 1k 令牌 $0.00013,在所有其他嵌入模型中提供了最高性能,超越了 text-embedding-3 和 text-embedding-ada-002。

要创建一个生成式 AI 应用,你主要需要的密钥是之前提到的那些。需要注意的是,这些模型仅在截至 2021 年 9 月的大量数据集上进行过训练。因此,它们不具备该日期之后的任何知识或信息。

https://github.com/OpenDocCN/freelearn-dl-zh/tree/master/docs/unlocking-creativity-with-azure-openai-a-practical-guide-to-/img/1f4103f75e57527f2610bfdcc490bc25_48_0.png

图 2.8:创建 AOAI 资源

  1. 在 AOAI 创建页面上,在"基础"(Basics)选项卡的字段中提供以下详细信息:

| 字段 | 说明 |

| --- | --- |

| 订阅 (Subscriptions) | 用于接入 AOAI 服务而在应用程序中提到的 Azure 订阅。 |

| 资源组 (Resource Group) | 将包含 AOAI 资源的 Azure 资源组。您可以创建一个新组或使用现有的组。 |

| 区域 (Region) | 实例的地理位置。不同的位置可能会引入延迟,但不会影响资源的可用性。 |

| 名称 (Name) | 您的 AOAI 服务资源的描述性名称。 |

| 定价分层 (Pricing Tier) | 资源的定价分层。在编写时,AOAI 服务仅提供标准(Standard)层级。 |

表 2.1:AOAI 资源创建详情

  1. 现在,让我们通过"基础"选项卡中提供这些详细信息来创建 AOAI 资源:

创建 Azure OpenAI

https://github.com/OpenDocCN/freelearn-dl-zh/tree/master/docs/unlocking-creativity-with-azure-openai-a-practical-guide-to-/img/1f4103f75e57527f2610bfdcc490bc25_49_0.png

图 2.9:创建 AOAI 资源的基本信息

  1. 点击"下一步"。

Azure OpenAI 基础

  1. "网络"(Network)选项卡提供了三个安全选项。如果您在部署期间需要增强安全性,可以在网络中选择选项 2 或 3。此选择允许您配置 AOAI 以提高安全性,通过 Azure 虚拟网络集成和私有端点连接进行访问。在本书后续章节,我们将重点探讨选项 2 和 3。现在,请选择选项 1(包括互联网在内的所有网络都可以访问此资源)。

https://github.com/OpenDocCN/freelearn-dl-zh/tree/master/docs/unlocking-creativity-with-azure-openai-a-practical-guide-to-/img/1f4103f75e57527f2610bfdcc490bc25_50_0.png

图 2.10:用于配置 AOAI 资源的公共访问网络设置

  1. 点击"下一步"继续,并根据需要为资源配置任何标记(tags)。

  2. 点击"下一步"进入流程的最后一个阶段:审核 +提交(Review + submit)。

  3. 验证您的配置设置,然后点击"创建"启动过程。请耐心等待;此过程可能需要 2-3 分钟完成。

Azure 门户将在新资源可用后通知您。点击"转到资源"访问新创建的资源。

现在,我们已设置 AOAI 服务。在下一节中,我们将部署模型。

部署 AOAI 模型

在上一节中,您创建了一个 AOAI 资源。通过现在,您可以通过各种方式(例如 Azure AI Foundry、REST API 或 SDK)部署并利用您的模型。本节将引导您如何从 Azure AI Foundry 部署这些模型,并通过 Studio 和 Python SDK 访问它们:

  1. 在 Azure 门户( https://portal.azure.com/ )中登录您的 Azure 订阅。

  2. 在资源搜索栏中搜索 Azure OpenAI。找到您在上一节中创建的 AOAI 资源:

https://github.com/OpenDocCN/freelearn-dl-zh/tree/master/docs/unlocking-creativity-with-azure-openai-a-practical-guide-to-/img/1f4103f75e57527f2610bfdcc490bc25_51_0.png

  1. 点击正确的服务名称(如上一图中红色矩形所示)。

使用 Azure OpenAI 服务构建您自己的安全 Copilot 并生成 AI 应用

部署 OpenAI 模型并开始进行 API 调用。连接您的数据、调用和函数以生成个性化的智能响应。通过 REST API、Python SDK 或 Azure AI Foundry 门户中的 Web 界面部署服务。

了解更多

部署模型

设置部署对提供的模型或自定义模型进行 API 调用。当部署完成并准备就绪时,您的部署状态将变为“成功”(Succeeded)。

  1. 点击“Azure AI Foundry 门户”或“转到 Azure AI Foundry 门户”导航到 Azure Foundry:

https://github.com/OpenDocCN/freelearn-dl-zh/tree/master/docs/unlocking-creativity-with-azure-openai-a-practical-guide-to-/img/1f4103f75e57527f2610bfdcc490bc25_51_1.png

  1. 在“管理”(Management)部分中,选择“部署”(Deployments):

https://github.com/OpenDocCN/freelearn-dl-zh/tree/master/docs/unlocking-creativity-with-azure-openai-a-practical-guide-to-/img/1f4103f75e57527f2610bfdcc490bc25_52_0.png

  1. 选择模型并继续配置以下字段:

| 字段 | 说明 |

| --- | --- |

| 选择模型 (Select a model) | 从下拉列表中选择模型。模型可用性取决于区域差异。要查看可用模型列表,请参考模型摘要和区域可用性:https://learn.microsoft.com/en-us/ai-services/openai/concepts/models#summary-table-region-availability |

| 部署名称 (Deployment name) | 选择部署名称时要考虑。部署名称至关重要,因为它将在您的代码中使用客户端库和 REST API 调用模型。 |

| 高级选项(Advance Options)(可选):你有选项配置资源所需的高级设置,例如内容过滤、每分钟令牌数(TPM)等。 | 对于您的初始部署,保持高级选项不变。有关内容过滤和 TPM 的更多细节将在后续章节提供。 |

选择模型

gpt35-turbo

部署名称

gpt35-turbo

高级选项

https://github.com/OpenDocCN/freelearn-dl-zh/tree/master/docs/unlocking-creativity-with-azure-openai-a-practical-guide-to-/img/1f4103f75e57527f2610bfdcc490bc25_53_0.png

  1. 点击“创建”继续。

  2. “部署”表将显示与您创建的模型对应的条目,状态为“成功”(Succeeded):

模型部署

https://github.com/OpenDocCN/freelearn-dl-zh/tree/master/docs/unlocking-creativity-with-azure-openai-a-practical-guide-to-/img/5727f2610bfdcc490bc25_53_1.png

(可选):如果您可以访问 GPT-4,可以重复所有之前的步骤来部署 GPT-4 或基础模型。

等等,让我们重新阅读文本以修复流程:“现在您已成功使用 Azure AI Foundry 部署了模型,让我们在 Azure AI Foundry 和通过 Python SDK 探索这些模型。”

利用 AOAI 模型

为了有效使用模型,理解与模型相关的某些元素很重要。这些概念对于正确利用模型至关重要。GPT-3.5 Turbo 和 GPT-4 模型是针对对话界面优化的大语言模型(LLM)。它们在运行方式上与旧模型不同。这些模型是文本输入文本输出,意味着它们接受输入(提示词)并返回完成结果;虽然这种格式主要为多轮对话设计,也可以用于非聊天场景。在 OpenAI 中,与 GPT-3.5 Turbo 和 GPT-4 等模型交互有两种不同的选项:

  • 聊天完成 API(Chat Completion API): 聊天完成 API 是专门为与 GPT-3.5 Turbo 和 GPT-4 交互设计的 API,它是访问这些模型的推荐且首选的方法,并为与 LLM 交互提供了精简且优化的方法。为了构建它,你应该使用 messages 参数,它接受消息对象数组。当使用 API 与这些模型交互时,通常提供一个字典列表表示对话格式。列表中的每个字典应包含消息的角色和内容,使您能够与模型进行有意义的交流。基本聊天完成 API 的格式如下所示:
response = openai.ChatCompletion.create(
  engine="gpt35-turbo",
  messages=[
    {"role": "system", "content": "你是一个帮助人们寻找信息的有用助手"},
    {"role": "user", "content": "谁在 2011 年获得了 ICC 赛冠军?"},
    {"role": "assistant", "content": "印度在 2011 年获得了 ICC 冠军."},
    {"role": "user", "content": "决赛在哪里举行的?"},
    {"role": "assistant", "content": "2011 年 ICC 赛决赛在印度孟买的万科德球场举行的"}
  ]
)

与这些模型交互的主要输入是 messages 参数,它接受消息对象数组。每个消息对象由一个角色类型(system、user 或 assistant)和内容组成。对话可以短到单条消息,也可以是多次往返交流。让我们仔细查看这些不同的角色:

  • system:系统角色(也称为系统消息)放置在消息数组的开头。它充当模型的初始指令,用于引导模型的响应和交互。这些角色由开发者设置,并塑造模型处理各种任务和与用户通信的方式。在系统角色中,你可以灵活地提供不同类型的信息:

    • 交互引导: 系统角色定义了模型应该如何与用户交互。例如,模型可能有一个优先考虑提供帮助和相关信息的角色,或者一个保持中立不偏不立场的角色。

    • 行为约束: 该角色为模型应该做和不该做什么建立了边界。这可能包括避免某些主题、遵守隐私指南,或拒绝提供医疗或法律建议。

    • 性格特征: 你可以自定义助手的性格特征,使其更适合您的特定情况。

    • 响应风格: 系统角色可以影响响应的语气和风格。例如,模型可能会在专业背景下以正式方式回复,或在非正式交互中采用随意的语气。

    • 任务管理: 该角色有助于模型有效地处理特定类型的查询。例如,如果系统角色是为客户支持设计的,模型可能会针对故障排除和提供特定产品或服务的帮助进行优化。

    • 伦理和安全考虑: 系统角色通常包含确保响应符合伦理准则和安全协议的参数,防止生成有害内容。

    总之,系统角色有助于调整 LLM 的行为以更好地满足用户需求并符合预期的用例,无论是特定的详细指令还是基础指导。虽然系统角色是可选的,但通常建议至少包含一条基础消息,以获得最佳结果并有效引导助手的行为。

  • user:用户角色指的是用户在交互期间承担的功能或背景。它影响了用户如何提问以及他们从模型中寻求什么(例如信息、建议或创意帮助)。用户角色通过提供交互背景来影响模型的响应,并根据用户的需求和预期塑造答案的风格和细节。它还会影响模型如何适应以实现用户的目标,无论是出于目的、技术支持还是闲聊对话。用户角色有助于定制交互,使其更有效并更符合您的特定需求。

  • assistant:助手角色代表与用户聊天的模型。它用于将由模型编写的消息与用户编写的消息区分开来。助手角色还用于指示聊天中是由哪种模型在发言。例如,如果聊天记录中的最后一条消息是助手角色,那么模型将像继续与用户对话一样生成响应。

通常情况下,对话的结构是开头有一个系统消息(system message),随后是交替的用户(user)和助手(assistant)消息。系统消息在设定助手行为方面起着至关重要的作用。它可以用于自定义助手的个性,或提供关于在对话过程中如何响应的特定指令。用户消息用于向助手传递请求或信息。助手消息不仅提供回复,还可以用于提供您期望在对话过程中助手表现出的预期行为示例。这种结构化格式允许在受控的情况下进行有效的通信。

图 2.16 展示了此类对话的结构:

### 定义系统角色
role="system",
content="You are a technical support assistant for a software application called Techsupport Pro.\nYou can only provide help related to this software.\nKeep your answers concise and avoid technical jargon where possible.\nYour response should not be more than 3 points in bulleted form"

### 定义用户角色(输入)
role="user",
content="I'm having trouble saving my document in Techsupport Pro.\nI'm getting an error saying 'file could not be saved'.\nWhat should I do?"

### 将消息合并为对话
messages=[system_message, user_message]

### 使用消息调用 OpenAI API
response = client.chat.completions.create(
    messages=messages
)

### 提取助手的响应
assistant_message = response.choices[0].message.content

### 输出助手的响应
print(assistant_message)
  • 检查文件权限:确保您对尝试保存文档的目录具有写入权限。如果问题仍然存在,请尝试保存到其他位置。

  • 磁盘空间:确认您的驱动器上有足够的磁盘空间。磁盘空间不足可能会导致文件无法保存。

  • 软件更新:验证您正在使用最新版本的 Techsupport Pro。如果不是,请更新到最新版本,因为它可能包含对已知问题的修复,包括保存问题。

图 2.16:系统、用户和助手角色/消息的结构

第一个方框代表系统消息,它设定了您期望 LLM 响应的行为。第二个方框是用户消息,用户在此提问。最后一个方框是助手消息,它对用户的查询提供响应。

利用 AOAI 模型

  • 带有聊天标记语言(ChatML)的 Completion API: ChatML 采用与您用于其他 GPT-3 模型(如 davinci-002 或 babage-002)相同的 Completion API,但它使用了独特的基于标记的提示词格式。虽然 ChatML 提供了对专用聊天完成(Chat Completion)API 的更低级访问,但它带来了一些限制和考虑因素:

    • 输入验证: 使用 ChatML 时,必须执行额外的输入验证,以确保消息的格式和结构正确。

    • 模型兼容性: ChatML 仅兼容 GPT-3.5 Turbo 模型,不支持新的 GPT-4 模型。

    • 潜在的格式变化: ChatML 的底层格式可能会随着时间而变化。

因此,虽然 ChatML 提供了灵活性,但在使用 GPT-3.5 Turbo 模型时,意识到这些限制以及探索其他格式的可能性是非常关重要的。

现在您已经对聊天完成 API 及其结构有了基础理解,让我们探索如何从 Azure AI Foundry 和 Python SDK 使用模型。

Azure AI Foundry 体验

要利用 Azure AI Foundry 中的模型,请按照以下步骤操作:

  1. 在 Azure 门户 (https://portal.azure.com/) 中登录您的 Azure 订阅。

  2. 在资源搜索栏中搜索 Azure OpenAI。找到您在上一节中创建 AOAI 资源:

https://github.com/OpenDocCN/freelearn-dl-zh/tree/master/docs/unlocking-creativity-with-azure-openai-a-practical-guide-to-/img/1f4103f75e57527f2610bfdcc490bc25_57_0.png

图 2.17:查找之前创建的 AOAI 实例

  1. 点击上一图中红色框内亮的服务名称。

  2. 点击“Explore Azure AI portal”或“Go to Azure AI Foundry portal”进入 Azure AI Foundry:

https://github.com/OpenDocCN/freelearn-dl-zh/tree/master/docs/unlocking-creativity-with-azure-openai-a-practical-guide-to-/img/1f4103f75e57527f2610bfdcc490bc25_58_0.png

图 2.18:启动 Azure AI Foundry

https://github.com/OpenDocCN/freelearn-dl-zh/tree/master/docs/unlocking-creativity-with-azure-openai-a-practical-guide-to-/img/1f4103f75e57527f2610bfdcc490bc25_58_1.png

  1. 在操场(playground)中,选择:Chat

https://github.com/OpenDocCN/freelearn-dl-zh/tree/master/docs/unlocking-creativity-with-azure-openai-a-practical-guide-to-/img/1f4103f75e57527f2610bfdcc490bc25_58_2.png

图 2.19:使用 Azure AI Foundry 的聊天操场测试提示词

利用 AOAI 模型

在聊天操场中,您可以灵活提供根据特定业务需求定制的自定义系统消息。我们将深入探讨各种提示技术。

导航到 Configuration 中的 Parameters(参数)选项卡。选择默认设置:

https://github.com/OpenDocCN/freelearn-dl-zh/tree/master/docs/unlocking-creativity-with-azure-openai-a-practical-guide-to-/img/1f4103f75e57527f2610bfdcc490bc25_59_0.png

  • Max response(最大响应): 聊天完成中生成的最大标记数。

  • Temperature(温度): 在采样温度时,范围从 0 到 1,这是一项关键决策。选择较高的值(如 0.9)将引入更大的随机性,而选择较低的值(如 0.1)将增强其聚焦性。需要注意的是,设置为 0 不会使模型变成确定;相反,它会减少整体变异性。

  • Top P: 利用温度的替代方案是核采样(nucleus sampling),范围从 0 到 1,模型会考虑落在概率质量内的标记。在此背景下,将 Top P 设置为 0 意味着仅考虑最可能的标记。通常建议调整 Top P 参数或 Temperature 参数之一,但不要同时调整两者。

  • Stop sequence(停止序列): 这有助于在特定点结束模型的响应,并确保它不包含后续的用户查询。通过这种方式,您可以防止模型生成不必要的文本。您可以选择使用最多四种不同的停止序列。

  • Frequency penalty(频率惩罚): 该数值范围在 0 到 2 之间。它根据标记在文中先出现的次数按比例降低重复概率,从而减少响应中重复文本的几率。

  • Presence penalty(存在惩罚): 该数值范围在 0 到 2 之间。它最小化了重用文中已使用的任何标记的概率,从而增加了响应中引入新话题的几率。

利用 AOAI 模型

https://github.com/OpenDocCN/freelearn-dl-zh/tree/master/docs/unlocking-creativity-with-azure-openai-a-practical-guide-to-/img/1f4103f75e57527f2610bfdcc490bc25_61_0.png

图 2.21:描述代理与用户之间的对话交互

至此,你已经有效地利用 AOAI 模型进行了类 ChatGPT 风格的对话。在下一小节中,我们将讨论如何使用 Python SDK 使用相同的 GPT-3.5 Turbo 或 GPT-4 模型。

程序化体验

在本节中,我们将引导你完成使用 Python SDK 首次进行 AOAI 调用的过程。

  1. 在你的机器上安装 Python 3.7.1 或更高版本。或者,你也可以利用 Azure 机器学习笔记本(notebook)来获取 Python 环境。在示例中,我们使用了配合 Visual Studio Code 的 Anaconda。

  2. 通过运行 pip install openai 安装 OpenAI Python 客户端库。

Azure OpenAI 基础

  1. 要向 AOAI 服务发送请求,你需要以下输入项:

| 变量名 | 值 |

| :--- |--- |

| ENDPOINT | 你可以在 Azure 门户中检查 AOAI 资源时,在“密钥和节点”部分找到此值。 |

| API-KEY | 你可以在 Azure 门户中查看资源时,在“密钥和节点”部分找到此值。你可以使用 KEY 1 或 KEY 2。 |

| DEPLOYMENT-NAME | 此值将对应于“部署 AOAI 模型”部分模型部署过程中为部署指定的自定义名称。 |

要获取前两个值,请导航到 Azure 门户中的相应资源。你可以在“资源管理”部分下找到“密钥和节点”。确保你同时复制了终点和访问密钥;你进行 API 调用身份验证时都需要两者。你可以选择使用 KEY 1 或 KEY 2。两个密钥的存在允许在不中断服务的情况下进行安全的密钥轮换和重新生成,如下:

https://github.com/OpenDocCN/freelearn-dl-zh/tree/master/docs/unlocking-creativity-with-azure-openai-a-practical-guide-to-/img/1f4103f75e57527f2610bfdcc490bc25_62_0.png

图 2.22:检索 AOAI 密钥和终点信息

利用 AOAI 模型

  1. 在你偏好的 IDE 中,创建一个名为 quickstart.py 的 Python 文件并执行以下代码:
  • I. 导入必要的 Python 包并设置 AOAI 密钥和终点信息。确保你将部署名称的值更改为在创建部署时提供的自定义名称:
import os
import requests
import json
import openai
openai.api_key = "<ENTER YOUR API KEY>
openai.api_base = "<ENTER YOUR ENDPOINT>
openai.api_type = 'azure'
openai.api_version = '2023-08-01-preview' # 未来 API 版本可能会发生变化
deployment_name='gpt-35-turbo' # 输入你的部署名称。
  • II. 调用 AOAI Chat Completion API,并提供 AOAI 部署名称以及系统和用户消息详情:

发送聊天完成调用以生成答案

response = openai.ChatCompletion.create(
  engine="gpt-35-turbo", # 这是你的部署名称
  messages=[
  {"role": "system", "content": "你是一个帮助人们寻找信息的 AI 助手。"},
  {"role": "user", "content": "谁得了 2011 年 ICC 世界杯赛赛?"},
  {"role": "assistant", "content": "印度赢得了 2011 年 ICC 世界杯赛。"},
  {"role": "user", "content": "昨天的决赛比赛在哪里打的?"}
  ]
)

打印模型的响应

print(response['choices'][0]['message']['content'])

输出应该类似于以下内容:

2011 年 ICC 世界杯决赛赛在印度孟买的万肯德德体育场馆(Wankhede Stadium)举行。

注意事项

在生产环境中,建议使用安全方法存储和访问你的凭据,例如 Azure Key Vault。这可以确保你的敏感信息具有最高级别的安全保障。

至此,你已经了解了如何利用 AOAI GPT-3.5 和 GPT-4 模型。我们尚未讨论的是如何使用嵌入(embedding)模型:我们将在下一章中介绍这一点。在下一小节中,我们将讨论 AOAI 的定价。

定价

在本节中,我们将讨论各种 AOAI 定价方案,并帮助你根据需求选择最适合的计划。

AOAI 有两种不同的定价方案:

  • 按需计费(Pay-As-You-Go):在此定价模型下,根据提示(prompts)和完成(completions)消耗的每千个 token 进行计费。请注意,每个模型的提示和完成都有不同的定价。此计划更适用于开发和测试环境,以及 API 调用次数和处理的 token 数量巨大的特定生产工作负载。有关完整的定价表,请参阅 https://azure.microsoft.com/en-us/pricing/details/cognitive-services/openai-service/。需要注意的是,这些费用在未来可能会发生,因此建议检查提供的链接以获取最新的定价信息:

| 模型 | 上文窗口 | 提示(每 1,000 Tokens) | 完成(每 1,000 Tokens) |

|---|---|---|---|

| gpt-35-turbo | 4K | $0.015 | $0.002 |

| gpt-35-turbo | 16K | $0.02 | $0.006 |

| gpt-4 | 8K | $0.03 | $0.06 |

| gpt-4 | 32K | $0.06 | $0.12 |

| text-embedding-ada-002 | 8K | $0.0001 | $0.0002 |

(注:由于原文文本中表格部分存在大量重复和乱码,此处已根据逻辑进行了清理和对齐以保持格式整洁)

重要说明

需要注意的是,你无法像购买其他服务那样直接从 Azure 门户购买 PTU。要为你的订阅获取 PTU,必须联系微软账户代表,他们将帮助你获得订阅内 PTU 的批准。一旦获得批准,你就可以继续购买 PTU。PTU 的价格未来可能会发生变化。因此,建议始终咨询微软账户代表以获取最新的定价信息。

总结

本章深入探讨了 AOAI 服务。我们首先定义了它提供的 AOAI 服务类型。我们还引导你学习了访问此服务的步骤,从创建 AOAI 资源到部署模型,再到将其应用于实际场景。最后,我们阐明了定价结构,确保你清晰了解如何在 Azure 生态系统中利用这一强大的服务。掌握了这些知识,你已经完全准备好利用 AOAI 服务的能力来开展你的 AI 和机器学习项目。

展望下一章,我们的注意力将转向深入研究 AOAI 的高级主题。我们将探索嵌入(embeddings),并发现如何在 Azure Cognitive Search 服务的帮助下将这些嵌入存储在向量数据库中。此外,我们将深入研究模型落地(model grounding)的概念以及满足特定要求的微调(fine-tuning)的复杂性。

此外,我们将参与对一些最新功能的讨论,例如函数调用(function calling)、助手 API(assistant API)、微调和批量 API(Batch API)。这些高级主题将让你对 AOAI 的能力有更深入的理解,并能够充分利用其潜力。我们将强调 LangChain 和 Semantic Kernel 等 LLM 应用开发框架的重要性。这些框架在简化应用创建方面起着至关重要的作用。通过利用这些框架的能力,开发者可以简化开发流程,利用 LLM 的力量轻松构建创新且智能的应用程序。随着我们在 AI 和语言处理领域的不断进步,这些框架是充分挖掘 LLM 潜力以应用于各种场景的重要工具。

延伸阅读

如需了解更多关于本章涵盖的主题,请参考以下资源:

  • AOAI 服务简介 (https://learn.microsoft.com/en-us/training/modules/explore-azure-openai/)

  • AOAI:生成式 AI 模型及如何使用它们 (https://www.linkedin.com/learning/azure-openai-generative-ai-models-and-how-to-use-them)

Azure OpenAI 高级主题

在前面的章节中,我们涵盖了 Azure OpenAI (AOAI) 服务的基础知识,包括模型部署和各种定价结构。现在,我们的注意力将转向探索 AOAI 的高级主题。

在本章中,我们将深入研究以下高级 AOAI 主题:

  • AOAI 模型上下文窗口

  • AOAI 嵌入模型

  • Azure 向量数据库

  • AOAI 你的数据 (On Your Data)

  • AOAI 多模态模型

  • AOAI 函数调用

  • AOAI 助手 API

  • AOAI 微调

AOAI 模型上下文窗口

在大语言模型 (LLMs) 世界中,上下文窗口定义了模型一次可以处理的文本量,这影响了它生成和理解语言的方式。该窗口通过 token(整个单词或片段)的数量来衡量,直接影响模型在预测下一个 token 时所使用的信息量。简单来说,它决定了模型在形成预测或编写响应时考虑了多少上下文。

例如,GPT-3.5-Turbo (0125) 模型的上下文具有 16,385 个输入 token 和 4,096 个输出 token,而 GPT-4o 和 GPT-4o mini 模型具有更大的数字,分别为 128,000 个输入 token 和 16,384 个输出 token。有关 AOAI 模型上下文窗口的信息,请访问 https://learn.microsoft.com/en-us/azure/ai-services/openai/concepts/models?#gpt-4-and-gpt-4-models。

LLM 的趋势是向着更大的上下文窗口发展,这能够产生更详细、更连贯的输出。然而,这也是有代价的:更大的上下文窗口需要更多的计算能力和内存。在实践中,上下文窗口定义了模型在交互期间可以“记住”多少之前的对话。当对话超过上下文窗口时,模型会丢失对话的最早期部分,可能会影响其在长时间交互或复杂任务中的一致性。因此,在考虑构建利用 LLM 的应用程序时,上下文窗口的大小是一个关键因素。

虽然更大的上下文窗口让 LLM 能处理更多数据,但它们也带来了巨大的计算和财务成本。处理极长的上下文非常昂贵且速度极慢,这只在有限的情况下是可以接受的。例如,一个百万 token 的上下文窗口可能需要近一分钟才能产生一个包含数百万 token 的单个响应。

相比之下,检索增强生成 (RAG) 更高效,因为它只为每个查询获取最相关的信息,减少了模型需要处理的 token 数量。这种效率使得 RAG 成为更具成本效益的解决方案,特别是对于需要频繁或大量查询以及数据密集型任务的应用程序。我们将在后面的章节详细解释 RAG。

文本被分成 token 后,每个 token 会被转换为名为嵌入(embedding)的数值形式。嵌入是稠密向量表示,旨在捕捉 token 的含义。这些向量存在于高维空间中,向量之间的距离和方向可以代表它们所代表单词之间的语义和语法关系。

在下一节中,我们将讨论 AOAI 用于将 token 转换为嵌入向量的模型。

AOAI 嵌入模型

AOAI 有以下几种嵌入模型,每个模型都有特定的输入限制:

  • text-embedding-ada-002 (版本 2):8191 个输入 token,1536 个输出维度

  • text-embedding-3-small:8191 个输入 token,1536 个输出维度

  • text-embedding-3-large:8192 个输入 token,3072 个输出维度

文本被分成 token 后,每个 token 被转换为名为嵌入的数值形式。嵌入是稠密向量表示,旨在捕捉 token 的含义。这些向量存在于高维空间中,向量之间的距离和方向可以代表它们所代表单词之间的语义和语法关系。

在下一节中,我们将讨论 AOAI 用于将 token 转换为嵌入向量的模型。

from openai import AzureOpenAI

client = AzureOpenAI(
  api_key = os.getenv("AZURE_OPENAI_API_KEY"),
  api_version = "2024-04-preview",
  azure_endpoint = os.getenv("AZURE_OPENAI_ENDPOINT")
)

response = client.embeddings.create(
    input="INPUT>",
    model="text-embedding-3-small"
)
print(response.data[0].embedding)

(注:提供的 OCR 文本末尾有一些重复/碎片化。我已根据提供的内容重构了逻辑流。)

重要说明

需要注意的是,你无法像购买其他服务那样直接从 Azure 门户购买 PTU。要为你的订阅获取 PTU,必须联系微软账户代表,他们将帮助你获得订阅内 PTU 的批准。一旦获得批准,你就可以继续购买 PTU。PTU 的价格未来可能会发生变化。因此,建议始终咨询微软账户代表以获取最新的定价信息。

总结

本章深入探讨了 AOAI 服务。我们首先定义了它提供的 AOAI 服务类型。我们还引导你学习了访问此服务的步骤,从创建 AOAI 资源到部署模型,再到将其应用于实际场景。最后,我们阐明了定价结构,确保你清晰了解如何在 Azure 生态系统中利用这一强大的服务。掌握了这些知识,你已经完全准备好利用 AOAI 服务的能力来开展你的 AI 和机器学习项目。

展望下一章,我们的注意力将转向深入研究 AOAI 的高级主题。我们将探索嵌入(embeddings),并发现如何在 Azure Cognitive Search 服务的帮助下将这些嵌入存储在向量数据库中。此外,我们将深入研究模型落地(model grounding)的概念以及满足特定要求的微调(fine-tuning)的复杂性。

此外,我们将参与对一些最新功能的讨论,例如函数调用(function calling)、助手 API(assistant API)、微调和批量 API(Batch API)。这些高级主题将让你对 AOAI 的能力有更深入的理解,并能够充分利用其潜力。我们将强调 LangChain 和 Semantic Kernel 等 LLM 应用开发框架的重要性。这些框架在简化应用创建方面起着至关重要的作用。通过利用这些框架的能力,开发者可以简化开发流程,利用 LLM 的力量轻松构建创新且智能的应用程序。随着我们在 AI 和语言处理领域的不断进步,这些框架是充分挖掘 LLM 潜力以应用于各种场景的重要工具。

延伸阅读

如需了解更多关于本章涵盖的主题,请参考以下资源:

  • AOAI 服务简介 (https://learn.microsoft.com/en-us/training/modules/explore-azure-openai/)

  • AOAI:生成式 AI 模型及如何使用它们 (https://www.linkedin.com/learning/azure-openai-generative-ai-models-and-how-to-use-them)

Azure OpenAI 高级主题

在前面的章节,我们涵盖了 Azure OpenAI (AOAI) 服务的基础知识,包括模型部署和各种定价结构。现在,我们的注意力将转向探索 AOAI 的高级主题。

在本章中,我们将深入研究以下高级 AOAI 主题:

  • AOAI 模型上下文窗口

  • AOAI 嵌入模型

  • Azure 向量数据库

  • AOAI 你的数据 (On Your Data)

  • AOAI 多模态模型

  • AOAI 函数调用

  • AOAI 助手 API

  • AOAI 微调

AOAI 模型上下文窗口

在大语言模型 (LLMs) 世界中,上下文窗口定义了模型一次可以处理的文本量,这影响了它生成和理解语言的方式。该窗口通过 token(整个单词或片段)的数量来衡量,直接影响模型在预测下一个 token 时所使用的信息量。简单来说,它决定了模型在形成预测或编写响应时考虑了多少上下文。

例如,GPT-3.5-Turbo (0125) 模型的上下文具有 16,385 个输入 token 和 4,096 个输出 token,而 GPT-4o 和 GPT-4o mini 模型具有更大的数字,分别为 128,000 个输入 token 和 16,384 个输出 token。有关 AOAI 模型上下文窗口的信息,请访问 https://learn.microsoft.com/en-us/azure/ai-services/openai/concepts/models?#gpt-4-and-gpt-4-models。

LLM 的趋势是向着更大的上下文窗口发展,这能够产生更详细、更连贯的输出。然而,这也是有代价的:更大的上下文窗口需要更多的计算能力和内存。在实践中,上下文窗口定义了模型在交互期间可以“记住”多少之前的对话。当对话超过上下文窗口时,模型会丢失对话的最早期部分,可能会影响其在长时间交互或复杂任务中的一致性。因此,在考虑构建利用 LLM 的应用程序时,上下文窗口的大小是一个关键因素。

虽然更大的上下文窗口让 LLM 能处理更多数据,但它们也带来了巨大的计算和财务成本。处理极长的上下文非常昂贵且速度极慢,这只在有限的情况下是可以接受的。例如,一个百万 token 的上下文窗口可能需要近一分钟才能产生一个包含数百万 token 的单个响应。

相比之下,检索增强生成 (RAG) 更高效,因为它只为每个查询获取最相关的信息,减少了模型需要处理的 token 数量。这种效率使得 RAG 成为更具成本效益的解决方案,特别是对于需要频繁或大量查询以及数据密集型任务的应用程序。我们将在后面的章节详细解释 RAG。

文本被分成 token 后,每个 token 被转换为名为嵌入(embedding)的数值形式。嵌入是稠密向量表示,旨在捕捉 token 的含义。这些向量存在于高维空间中,向量之间的距离和方向可以代表它们所代表单词之间的语义和语法关系。

(注:提供的 OCR 文本末尾包含大量的重复/碎片化。我已清理了冗余部分并保留了核心内容。)

def normalize(x):
    x = np.array(x)
    if x.ndim == 1:
        norm = np.linalg.norm(x)
        if norm == 0:
            return x
        return x / norm
    else:
        norm = np.linalg.norm(x, 2, axis=1, keepdims=True)
        return np.where(norm == 0, x, x / norm)
response = client.embeddings.create(
    model="<DEPLOYMENT NAME>",
    input="<INPUT TEXT>",
    encoding_format="float"
)
cut_dim = response.data[0].embedding[:256]
norm_dim = normalize(cut_dim)
print(norm_dim)

动态调整维度允许了灵活的使用。例如,如果向量数据库支持高达 1,536 维的嵌入,开发者仍然可以通过维度 API 参数设置为 1536 来使用最佳模型 text-embedding-3-large。这会将嵌入从 3,072 维减少,通过牺牲一定的精度来换取更小的向量尺寸。引导我们在下一节中讨论 Azure AI Search 服务中的向量搜索功能。

Azure 向量数据库

在上一节中,我们探索了用于生成向量嵌入的 AOAI 嵌入模型。创建这些向量后,一个针对存储和管理它们优化的数据库至关重要。向量数据库与其他类型数据库的主要区别在于它处理高维数据的能力。向量数据库专门设计用于将数据存储为高维向量,这些向量是各种特征或属性的数学表示。每个向量包含多个维度,根据数据的复杂性和细节,从几十到几千不等。这些向量通常通过对文本、图像、音频和视频等原始数据应用转换或嵌入函数生成。此类数据库可以使用评估向量距离或相似性的向量搜索算法对嵌入进行索引和查询。为了确保检索相关信息,需要一种健壮的机制。常见的向量搜索算法包括层次导航小世界 (HNSW)、倒排文件 (IVF) 和 DiskANN 等。

Azure OpenAI 高级主题

向量数据库的主要优势在于能够进行快速且精确的相似性搜索和数据检索,与依赖精确匹配或预定义查询标准的传统数据库不同,向量数据库允许根据语义或语境含义识别最相似或最相关的数据。以下是一些实际应用:

向量数据库的应用场景

  • 搜索引擎:向量数据库通过启用高效的相似性搜索改变了搜索引擎。它们可以找到相似项,改进搜索检索并增强用户体验。

  • 图像检索:根据视觉内容和风格识别与给定图像相似的图像。

  • 文档搜索:考虑主题和情感等因素,定位与给定文档相似的文档。

  • 产品推荐:根据特征和评分发现与给定产品相似的产品。

  • 语义搜索:向量数据库增强了语义搜索能力,允许应用程序找到语境相关。这使得它们对于信息检索、聊天机器人和问答系统非常有价值。

  • 推荐系统:这些系统受益于向量数据库,根据用户偏好提供个性化的产品推荐或建议,从而提高推荐的准确性。

  • 医学和科学研究:在基因组学和化学等领域,向量数据库促进了基因组数据分析、化学化合物相似性的识别,并加速了科学发现。

要在向量数据库中执行相似性搜索和检索,需要一个封装了你所需信息或标准的查询向量。该查询可以源自与存储向量相同类型的数据(例如,使用图像查询图像数据库),也可以源自不同类型的数据(例如,使用文本查询图像数据库)。下一步是使用相似性度量来确定向量空间内向量之间的接近程度或距离。为此可以使用向量指标,例如余弦相似度、欧式距离、汉明距离和 Jaccard 指数。相似性搜索和检索过程的结果通常是一个向量列表,这些向量与查询向量具有最高的相似性。随后,你可以从原始源或索引中检索每个向量关联的数据。

Azure 向量数据库选项

Azure 为不同的用例提供了六种类型的向量数据库选项:

  • Azure AI Search:Azure AI Search 是一种具有强大搜索能力的工具。它利用 HNSW 算法进行向量搜索,并使用最佳匹配 25 (BM25) 算法进行全文搜索。此外,它还提供了一种混合搜索选项,合并了全文查询和向量查询的结果,每种查询都使用不同的排序方法(如 BM25 和 HNSW)。采用倒数排名融合 (RRF) 算法来整合这些结果,确保形成单一、连贯的结果集,突出显示搜索索引中最相关的匹配项。事实上,OpenAI 利用 Azure AI Search 来增强其 ChatGPT 应用的能力。通过集成 Azure AI Search,OpenAI 受益于向量搜索、全文搜索和混合搜索等高级搜索功能,这些功能结合了 BM25 和 HNSW 算法的优势。这种集成允许 ChatGPT 通过从搜索索引中高效检索和排序信息,提供更准确、更相关的响应。

然而,重要的是 Azure AI Search 并不会为你的内容生成向量嵌入;你需要自己提供这些嵌入。生成这些嵌入的一种可行方案是通过 AOAI 嵌入模型。

从架构角度来看,AI Search 服务充当存储你未索引数据的外部存储与向搜索索引发送查询并管理响应的客户端应用程序之间的中介。

https://github.com/OpenDocCN/freelearn-dl-zh/tree/master/docs/unlocking-creativity-with-azure-openai-a-practical-guide-to-/img/1f4103f0

AI Search 服务充当存储你未索引数据的外部存储器与向搜索索引发送查询并管理响应的客户端应用程序之间的中介。

https://github.com/OpenDocCN/freelearn-dl-zh/tree/master/docs/unlocking-creativity-with-azure-openai-a-practical-guide-to-/img/1f4103f0

AI Search 服务充当存储你未索引数据的外部存储器与向搜索索引发送查询并管理响应的客户端应用程序之间的中介。

https://github.com/OpenDocCN/freelearn-dl-zh/tree/master/docs/unlocking-creativity-with-azure-openai-a-practical-guide-to-/img/1f4103f0

AI Search 服务充当存储你未索引数据的外部存储器与向搜索索引发送查询并管理响应的客户端应用程序之间的中介。

https://github.com/OpenDocCN/freelearn-dl-zh/tree/master/docs/unlocking-creativity-with-azure-openai-a-practical-guide-to-/img/1f4103f0

AI Search 服务充当存储你未索引数据的外部存储器与向搜索索引发送查询并管理响应的客户端应用程序之间的中介。

https://github.com/OpenDocCN/freelearn-dl-zh/tree/master/docs/unlocking-creativity-with-azure-openai-a-practical-guide-to-/img/1f4103f0

pgvector

或直接在 PostgreSQL 中运行深度学习模型。pgvector 特别引人入胜之处在于它提供了熟悉的基于 SQL 的界面,镜像了传统的 PostgreSQL 操作,用于诸如创建向量列、定义带有向量列的表以及使用 L2 距离执行最近邻搜索等任务。无论你是在开发 AI 应用、创建推荐系统,还是处理高维数据,pgvector 都能在熟悉的数据库框架内简化向量管理,消除了对专有存储解决方案和海量向量数据库专业知识的需求。

  • Azure SQL: SQL Database 现在支持在数据库中直接进行向量操作,实现高效的向量相似性搜索。此功能结合全文搜索和 BM25 排名,可以开发出适用于各种应用程序的强大搜索引擎。执行向量操作有两种方法:原生选项和经典选项:

    • 原生选项 (Native option):利用 Azure SQL Database 新引入的向量函数(Vector Functions)。这些函数旨在直接在内执行向量操作,提供了一种简洁高效的方法。

    • 经典选项 (Classic option):使用传统的 T-SQL 进行向量操作,利用列存储索引来实现高性能。

这两种选项为实现向量搜索提供了稳健的解决方案,使 Azure SQL Database 成为高级搜索场景的通用功能工具。

微软最近宣布 SQL Server 2022 标志着数据库演进的重要一步,将其作为一种企业级向量数据库推出。此版本引入了内置的安全性和合规性,强调了其对支持企业级 AI 解决方案的关注。一个突出特性是原生向量存储和索引,它由 DiskANN 驱动,并利用磁盘存储在海量数据集上执行高性能搜索。此功能是语义搜索的基础,实现了高效的分块(chunking)和准确的数据检索——这是 AI 驱动洞察的关键特征。这一进展能够高效处理高维数据,使其适用于推荐系统、自然语言处理和图像搜索等 AI 工作负载。

  • Azure Managed Redis: Azure Managed Redis 由 Redis Enterprise 软件驱动,可以作为高效的向量数据库,用于嵌入向量和执行向量相似性搜索。企业层级的 RedisSearch 模块提供了全面的搜索能力,包括欧几里得、余弦相似度和内点积等多种距离度量,并支持使用 FLAT 索引的 KNN 和使用 HNSW 索引的 ANN。它允许以哈希或 JSON 格式存储向量,并支持 top-K 和范围查询,以在特定向量空间内查找项目。此外,Redis 通过高级功能增强了搜索功能,例如地理空间过滤、数值和文本过滤、前缀和模糊匹配、语音学匹配以及布尔查询。Redis 通常被认为是一种成本效益的解决方案,广泛用于缓存或会话存储,使其能够处理传统的缓存角色和

Azure OpenAI 进阶主题

大多数 Azure 向量数据库(如 AI Search、CosmosDB 和 Azure Managed Redis)已与 Semantic Kernel、LangChain 和 LlamaIndex 等 LLM 框架集成,以便于轻松创建向量并将其摄取到各自的服务中。这些集成简化了嵌入生成、存储和检索流程,能够高效处理向量数据并增强生成式 AI 应用的能力。

Azure 提供了一种无代码解决方案,用于创建向量嵌入并将其作为其原生功能的一部分自动摄取到 Azure AI Search 或 Cosmos DB 中。在下一节中,我们将作为 AOAI On Your Data(AOAI 你的数据)的一部分来探索这一能力。

AOAI On Your Data

各行业中的一个常见应用是利用生成式 AI 通过自身的企业数据创建个性化聊天机器人。传统,客户必须手动编写代码过程来从非结构化数据中提取文本、生成嵌入并将其存储在向量数据库中,这对于开发者来说既耗时又费力。然而,Azure OpenAI On Your Data 功能显著简化了这一工作流,允许开发者以极少或无需代码即可实现相同的结果。这意味着只需点击几次即可完成聊天机器人。

此功能在后台使用 RAG 技术运行,如图 3.2 所示。

https://github.com/OpenDocCN/freelearn-dl-zh/tree/master/docs/unlocking-creativity-with-azure-openai-a-practical-guide-to-/img/1f4103f75e57527f2610bfdcc490bc25_78_0.png

当你上传一组各种格式的文档时,这些文档会被分成更小的分块(chunks)。每个分块都会使用 AOAI 的嵌入模型转换为嵌入(例如 text-embedding-ada-002)。这些嵌入被存储在 AI 搜索数据库中,利用配置了语义搜索的 HNSW 索引。用户可以通过 GPT-4 输入查询进行聊天,这些查询也会使用相同的嵌入模型转换为嵌入。通过 ANN 技术在 HNSW 索引上进行相似性搜索,以找到最相关的向量文档。接下来,将检索到的上下文和原始用户查询提供给 GPT 模型,以对用户问题生成回复。

此外,Azure RBAC 确保了整个系统的安全访问和权限。整个过程是精简且用户友好的,允许你专注于利用洞察,而无需处理技术复杂性。

重要说明

确保在利用 On your Data 功能之前已设置好 AI Search 资源。要设置 Azure AI search,请参考 https://microsoft.com/en-us/azure/search/search-create-service-portal 提供的说明。

现在,让我们演示如何轻松地使用此功能,而无需编写任何代码:

  1. 登录 Azure AI Foundry 门户。

  2. 如果你尚未设置,请先进行设置。

  3. 选择分块大小(Chunk size)。分块是将文档划分为更小的片段以便进行高效搜索和检索,分块大小以 token 为单位衡量。

  4. 点击“下一步”。在后续屏幕上,选择验证类型。

  5. 索引所需可能会随文档的大小而增加。

  6. 选择要使用的部署选项,并如图 3.5 所示填写系统消息(System message)字段。然后点击“应用更改”。

设置 *

https://github.com/OpenDocCN/freelearn-dl-zh/tree/master/docs/unlocking-creativity-with-azure-openai-a-practical-guide-to-/img/1f4103f75e57527f2610bfdcc490bc25_82_0.png

https://github.com/OpenDocCN/freelearn-dl-zh/tree/master/docs/unlocking-creativity-with-azure-openai-a-practical-guide-to-/img/1f4103f75e57527f2610bfdcc490bc25_82_1.png

https://github.com/OpenDocCN/freelearn-dl-zh/tree/master/docs/unlocking-creativity-with-azure-openai-a-practical-guide-to-/img/1f4103f75e57527f2610bfdcc490bc25_82_2.png

图 3.5:您的数据(On Your Data)设置

  1. 现在你已经准备好从聊天操场(Chat playground)开始聊天了。

  2. 参考图 3.6 的示例问题。你可以根据提供的文档提问,以获得准确的答案。你可以点击引用项查看答案的来源处。

https://github.com/OpenDocCN/freelearn-dl-zh/tree/master/docs/unlocking-creativity-with-azure-openai-a-practical-guide-to-/img/1f4103f75e57527f2610bfdcc490bc25_83_0.png

图 3.6:带有引用的示例问题和答案

你已经观察到使用 AOAI 的“您的数据”功能,答案是如何基于你的数据的。如果你想开发 Web 应用程序并将其部署到生产环境,只需点击“部署为 Web 应用”并如图 3.7 所示填写应用服务详情。然后点击“部署”为用户创建一个 Web 。

Azure OpenAI 高级主题

聊天操场

https://github.com/OpenDocCN/freelearn-dl-zh/tree/master/docs/unlocking-creativity-with-azure-openai-a-practical-guide-to-/img/1f4103f75e57527f2610bfdcc490bc25_84_0.png

图 37:您的数据 Web 应用设置

部署后,你将获得应用程序的公共 URL,使用户能够能够与他们上传的文档进行交互,如下所示:

https://github.com/OpenDocCN/freelearn-dl-zh/tree/master/docs/unlocking-creativity-with-azure-openai-a-practical-guide-to-/img/1f4103f75e57527f2610bfdcc490bc25_85_0.png

Amit 住在哪个酒店?总费用是多少?

Amit 住在 Ameswell Hotel。他入住的总费用为 343.77 美元。

1 处引用 >

AI 生成的内容可能不准确

他住了几天?

根据检索到的文档,未指定 Amit 住在 Ameswell Hotel 的天数。

AI 生成的内容可能不准确

他是哪天办理入住和退房的?

Amit 于 2024 年 6 月 13 日入住 Ameswell Hotel,于 2024 年 6 月 14 日退房。

1 处引用 >

AI 生成的内容可能不准确

输入新问题...

图 3.8:Web 视图

这简化了流程,使你只需点击一下即可让终端用户可以使用你的聊天应用程序,而无需编写任何代码。这是快速部署和共享应用程序的高效方法。然而,需要注意的是,虽然此功能对于小型概念验证效果良好,但开发健壮的生产应用需要仔细考虑各种因素以提高准确性。这些策略包括分块、查询重写和设计自定义模板。这些能力在这方面受到一定限制,通常需要采用代码优先的方法来创建更复杂、定制的解决方案。

到目前为止,我们利用 AOAI 模型处理文本相关的场景。然而,在某些情况下需要图像理解。在下一节中,我们将探索 AOAI 的多模态能力,这种方法通过结合视觉数据分析,扩展了 AOAI 的适用范围。

AOAI 多模态模型

AOAI 多模态能力可以应用于各种现实场景,例如:

  • 图像描述:自动为图像生成描述性文本,这对于组织数字照片集或帮助视觉受障用户很有用。

  • 音频处理:需要用户与模型之间进行实时交互的低延迟对话用例,例如客户支持机器人、语音助手和实时翻译服务。

  • 视觉问答:回答有关图像的问题,可以增强互动教育工具或客户支持系统。

  • 内容审核:分析图像以检测不适当或有害内容,提高社交媒体平台的安全性。

  • 电子商务:根据图像提供产品描述,帮助分类并改善用户搜索体验。

  • 医疗健康:通过解释医学图像和提供初步报告协助医疗诊断。

这些案例展示了集成视觉和文本数据处理的灵活性。为了实现此类功能,AOAI 提供了一个具有内置多模态功能的 GPT-4 类模型。目前,AOAI 在 GPT-4 系列中提供了三个支持这些原生多模态能力的模型:

  • GPT4-Turbo

  • GPT4-o

  • GPT4-o-mini

现在,让我们从聊天操场测试 GPT4-o 的多模态能力:

  1. 登录 Azure Foundry 门户。

  2. 导航到操场聊天(Chat from Playgrounds)菜单。

  3. 向聊天上传一张图像并就它提问。或者,你也可以通过 SDK 将 base64 编码的图像作为输入提供给模型来实现。为了说明,我使用了图 3.9。

AOAI 多模态模型 65

https://github.com/OpenDocCN/freelearn-dl-zh/tree/master/docs/unlocking-creativity-with-azure-openai-a-practical-guide-to-/img/1f4103f75e57527f2610bfdcc490bc25_87_0.png

你可以提问如下问题:

“它的尺寸是多少?”

虽然 AOAI 的视觉功能非常多功能且适用于各种应用程序,但需要注意以下关键限制:

  • 医学图像:该模型并未设计用于处理医学图像。

  • 非英语文本:在处理非拉丁字母文本(如日语或韩语)时,性能可能会下降。

  • 小文本:为了提高可读性,需要放大图像中的小文本。

  • 空间推理:对于需要精确定位的任务可能存在困难。

  • 准确性:在某些情况下,模型可能会产生错误的描述。

  • 元数据:模型可能无法处理元数据。

  • 验证码:出于安全考虑,系统配置为阻止验证码。

了解这些限制有助于客户设定合理的预期。既然我们已经看到了 GPT4-o 的视觉功能及其限制,让我们了解图像成本。

图像 Token 费用

图像输入像文本输入一样按 token 计算。图像成本受两个因素影响:尺寸和细节级别。以下是详细细分:

  • 低细节:设置为低细节的图像费用为 85 token。

  • 高细节:对于高细节图像,过程更为复杂。首先,将图像缩放到适应 2048x2048 正方形,同时保持其宽高比。然后再次缩放,使其短边为 768 像素。组成图像的 512 像素网格的数量会被计算,每个网格花费 170 token。最后总是额外添加 85 token。

让我们看一些示例:

  • 高细节下的 1024x1024 图像:由于 1024 小于 2048,不需要初始缩放。图像被缩放到 768x768,因为短边是 1024。这需要四个 512 像素的网格。Token 费用计算如下:170 token/网格 * 4 网格 + 85 token = 765 token。

  • 高细节下的 2048x4096 图像:图像首先被缩放到 1024x2048 以适应 2048 正方形。短边仍为 1024,因此进一步缩放到 768x1536。这需要 6 个 512 像素的网格。Token 费用计算如下:170 token/网格 * 6 网格 + 85 token = 1105 token。

理解这种 token 成本结构可以帮助在处理图像输入时有效管理资源使用。

因此,我们探索了 AOAI 模型的自包含能力。然而,在某些企业级用例中,客户需要将 LLM 与外部系统或工具集成。这可以将自然语言查询转换为这些系统可执行的结构化输入。在下一节中,我们将讨论如何使用 AOAI 的函数调用(function calling)功能来实现这一功能。

AOAI 函数调用

AOAI 函数调用允许你将 GPT-4o 及其他 GPT 模型连接到外部工具。这对于增强 AI 助手的能力或在你的应用程序与模型之间创建无缝集成等任务非常有益。

此功能不会直接替你运行函数。相反,你在 API 调用中定义函数,模型将决定如何创建所需的参数。生成这些参数后,你可以使用它们在你的代码中执行函数。

函数调用对许多应用都有益处,例如:

  • 允许助手检索信息:AI 助手可能需要从内部系统(如 Azure Cosmos DB 或 Azure SQL)访问最新的客户数据,以回答用户关于最近订单的查询。

  • 使助手能够执行任务:AI 助手可以通过考虑用户偏好和日历可用性安排会议。

  • 辅助计算:数学导师助手可以根据需要进行计算。

  • 创建复杂的工作流:例如,数据提取过程可以收集原始文本,将其转换为结构化数据并存储在数据库中。

  • 更改应用程序的用户界面:函数调用可以根据用户操作更新 UI,例如在地图上显示图钉。

现在,让我们讨论 AOAI 函数调用的生命周期。

函数调用生命周期

函数调用有五个不同的阶段,如图 3.10所示:

  1. 你的代码通过带有 prompt(提示词)和 LLM 可以访问的函数的 API 调用启动过程。

  2. 模型评估是直接回复用户,还是需要调用一个或多个函数。

  3. API 回复你的应用程序,指定应该调用哪个函数以及必要的参数是什么。

  4. 你的应用程序使用提供的参数运行指定的函数。

  5. 你的应用程序将初始 prompt 和执行函数的结果传回 API 通信。

你的代码

LLM

https://github.com/OpenDocCN/freelearn-dl-zh/tree/master/docs/unlocking-creativity-with-azure-openai-a-practical-guide-to-/img/1f4103f75e57527f2610bfdcc490bc25_90_0.png

在使用带有函数功能的 OpenAI API 时,模型本身并不执行函数。相反,在步骤 3 中,模型为你的函数生成参数,你的应用程序可以使用这些参数。你的代码决定如何处理这些参数,通常是通过调用指定的函数。这确保了你的应用程序对执行过程保留完全控制权。

Chat Completions、Assistants 和 Batch API 都支持函数调用。本节重点介绍使用 Chat Completions API 进行函数调用。Assistant 和 Batch API 将在下一节介绍。

让我们开始吧。

步骤 1 – 定义函数

从指定你打算调用的函数开始。该函数应该是一个能够接受输入并提供输出的 Python 函数。函数的输入将由模型生成。

在本示例中,假设你希望模型执行代码库中的 get_weather 函数。该函数接受一个城市作为参数,从天气 API 获取天气信息。你的函数可能看起来如下:

def get_weather(city):
    base_url = "http://api.openweathermap.org/data/2.5/weather?"
    api_key = 'API-KEY'
    params = {
        'q': city,
        'appid': api_key,
        'units': 'metric' # 使用 'imperial' 华氏度
    }

    response = requests.get(base_url, params=params)

    if response.status_code == 200:
        data = response.json()
        weather_condition = response.json()["weather"][0]["description"]
        temperature = response.json()["main"]["temp"]
        return f"""Here is some information about the weather in {city}:\n
        The weather is: {weather_condition}.\n
        The temperature is: {temperature} Degrees Celsius.\n\n"""
    else:
        return {'error': response.json().get('message', 'Failed to retrieve data')}

图 3.11:get_weather 函数定义

步骤 2 – 为模型描述函数

现在我们已经确定了想要模型调用的函数,我们将编写一个函数定义。这将解释函数的作用、何时可能使用以及调用它需要哪些参数。

函数定义中的参数部分应使用 JSON Schema 进行列出。当模型生成函数调用时,它将引用此模式来相应地创建参数。

Azure OpenAI 高级主题

在这个示例中,它看起来像图 3.12。

{
  "name": "get weather",
  "description": "Set the weather information for a given city. Call this whenever you need to know the wetter information for a given location",
  "parameters": {
    "type": "object",
    "properties": {
      "city": {
        "type": "string",
        "description": "The city, e.g. Seattle"
      }
    },
    "required": ["city"],
    "additionalProperties": false
  }
}

图 3.12:作为模型“工具”的 JSON schema 定义

步骤 3 – 为模型提供函数定义

现在我们已经确定了想要模型调用的函数,我们将开发一个函数定义。这将解释函数完成了什么、何时可能被使用以及调用它需要哪些参数。

函数定义中的参数部分应使用 JSON Schema 进行列出。当模型生成函数调用时,它将引用此模式来相应地创建参数。

当你在请求中包含函数时,该函数的详情(如定义和参数)将成为系统消息的一部分,随后模型将其连同用户输入一起进行处理。这种集成使模型能够根据提示词上下文评估是否应该调用函数。

此过程确实会消耗 token,因为函数定义和参数会增加总的 token 计数。此外,采用提示词工程策略(例如保持简洁、排除不必要的细节以及关注提示词的核心部分)可以提高函数调用效率。

以下是优化函数调用效率的更多方法:

  • 为你的函数定义添加更多细节:包含具有意义描述的函数定义对于清晰和高效调用函数至关重要。在定义函数时,对每个参数的描述都应让模型和任何审查代码的人员轻松理解。以下是如何让函数更全面的说明。

  • 提供上下文系统消息:系统消息可以为模型的行为提供额外的上下文。例如,如果你有一个像 search_hotels 的函数,你可以设置如下系统消息:

{"role": "system", "content": "你是一个旨在帮助用户搜索酒店的 AI 助手。当用户请求帮助寻找酒店时,你应该调用 search_hotels 函数。"}

这会告知模型根据用户输入何时调用该函数。

  • 当用户输入不明确时指示模型进行提问:当用户输入不完整时,指示模型提问澄清性问题以避免做出假设。例如,在 search_hotels 中,如果用户请求缺少位置详情。在你的系统消息中包含如下指令,以引导模型:
{"role": "system", "content": "避免对函数值进行假设;相反,当用户请求不明确时,寻求澄清。"}
  • 错误处理:提示词工程的另一个方面是尽量减少函数调用中的错误。虽然模型经过训练,可以根据你定义的 schema 生成函数调用,但它们有时可能会创建与 schema 不符的调用,或尝试调用未包含在内的函数。

为了解决这个问题,你可以在系统消息中添加如下语句:

{"role": "system", "content": "仅使用向你提供的函数。"}

这有助于确保模型严格遵守你定义的函数。

现在你已经了解了如何调用 AOAI 函数,下一节将重点介绍 AOAI Assistants API,它为开发者简化了应用程序开发流程。

AOAI Assistants API

AOAI Assistants API 允许创建 AI 驱动的助手,这些助手可以直接集成到你的应用程序中。这些助手根据一组预定义的指令运行,并利用模型、工具和文件等各种能力与用户交互。目前,Assistants API 支持三种类型的工具:

  • 代码解释器 (Code Interpreter):这使助手能够在一个安全的多租户 Kubernetes 环境中编写并运行 Python 代码,从而处理用户对计算或脚本执行的需求。Kubernetes 沙箱需要超视器技术来隔离每个容器,提供独特的用户空间内核而非传统的内核。这种设置通过隔离环境增强了安全性,通过防止跨容器干扰降低了风险,并提高了灵活性。通过在安全的虚拟化环境中执行代码,助手可以动态处理复杂的计算、数据处理和文件处理。

由于支持多种格式(https://learn.microsoft.com/en-us/azure/ai-services/openai/how-to/code-interpreter?tabs=supported-file-types),该工具可以处理各种结构的文件,根据需要提取信息。代码解释器支持迭代式代码执行,使得助手在初始尝试失败时能够调整代码并重试执行,这对于复杂的编码和数学问题特别有用。常见用例包括从 CSV 文件中提取数据、创建图表和图形等结构化数据可视化,以及解决数学题。

  • 文件搜索 (File Search):AOAI 文件搜索工具允许助手通过访问和检索用户提供文档中的信息来增强基于文件的查询。它作为一个外部知识库,让助手能够搜索模型训练的数据,以包含属性内容或其他基于文档的信息。AOAI 的系统会自动执行分块(chunking)策略,并通过创建向量嵌入并将其存储在 Azure AI 管理的向量存储中进行索引。这使得基于向量和关键词的搜索成为可能,促进了更精确、上下文驱动的信息检索,并支持多种格式,详见 https://learn.microsoft.com/en-us/azure/ai-services/openai/how-to/file-search?tabs=python。通过将文档内容转换为向量嵌入,文件搜索通过搜索来理解上下文和含义,而不仅仅是匹配精确的关键词。这种能力对于诸如详细问答、摘要和数据提取等需要细致理解和快速检索的任务特别有用。该工具还非常多功能,可以处理各种文档格式,使其能够轻松集成到需要复杂文档交互的工作流中。

  • 函数调用 (Function calling):该工具允许助手调用应用程序内的特定函数,使其能够通过 API 接口执行任务或检索数据。我们之前详细介绍过函数调用,强调了它在增强助手交互能力方面的作用。

这些工具使得构建针对应用程序内特定用例定制的动态且响应迅速的 AI 助手变得更加容易。

现在,让我们讨论助手的流程流。

助手流程流 (Assistant process flow)

设置和运行 AI 助手作为财务机器人通常涉及四个关键步骤。以财务机器人为例,如图 3.15 所示,步骤如下:

https://github.com/OpenDocCN/freelearn-dl-zh/tree/master/docs/unlocking-creativity-with-azure-openai-a-practical-guide-to-/img/1f4103f75e57527f2610bfdcc490bc25_96_0.jpg

第 1 步 – 创建助手 (create Assistants)

助手(Assistant)是一个可以使用模型、指令和工具自定义的实体。要创建一个助手,需要指定模型、指令和工具。助手将根据这些内容进行响应。你还可以指定 tool_choice 参数来强制助手使用特定工具。

第 2 步 – 创建线程 (create a Thread)

线程(Thread)作为对话的记录。当用户发起对话时,会创建一个新线程。虽然线程可以存储 100,000 条消息,但系统通过截断旧消息来管理内存。

第 3 步 – 向线程添加消息 (add a message to the Thread)

对话期间的消息(来自用户或应用程序)都作为消息对象存储在线程中。在运行(Run)期间,你可以设置 max_prompt_tokens 和 max_completion_tokens。例如,如果 max_prompt_tokens 设置为 500,max_completion_tokens 设置为 1000,助手将会将提示词截断到 500 token 以内,并将输出限制在 1000 token。如果提示使用了 200 个 token,完成使用了 300 个 token,则下次完成将消耗 300 个 token,并剩余 700 个可用 token。

如果完成达到 max_completion_tokens 限制,运行将以未完成状态停止,并将包含在运行的 incomplete_details 字段中。

在使用文件搜索工具时,建议将 max_prompt_tokens 设置为不少于 20000。对于更广泛的对话或多次文件搜索交互,考虑将其增加到 50000 甚至直接移除以获得最佳结果。

第 4 步 – 创建运行 (create a Run)

在用户消息被添加到线程后,通过启动运行(Run)来处理对话。运行利用模型和工具让助手生成响应。助手的响应随后将作为新消息添加到线程中,继续对话流。

AOAI 助手 – 代码解释器 (code interpreter)

在本节中,我们将引导您完成在 Azure AI Foundry Portal 中设置助手的步骤,并演示如何使用代码解释器工具处理对 CSV 数据的查询。您也可以通过 API 方法实现相同的功能:

  1. 登录 AI Foundry Portal。

  2. 如果您尚未设置聊天模型,请进入共享资源(Shared resources)菜单中的部署(Deployments)部分。从那里,开始部署名为 GPT-4o 的新聊天模型。

  3. 从游场(Playgrounds)菜单导航到助手(Assistants),选择 GPT-4o 部署,并点击创建助手(Create an assistant)。

  4. 在设置(Setup)页面上,您将看到助手已创建。您可以为助手命名并编写自定义指令来清晰地定义其目标,如下:

https://github.com/OpenDocCN/freelearn-dl-zh/tree/master/docs/unlocking-creativity-with-azure-openai-a-practical-guide-to-/img/1f4103f75e57527f2610bfdcc490bc25_98_0.png

  1. 在工具(Tools)部分,使用代码解释器(Code Interpreter)并上传一个 CSV 进行查询。此处显示了片段:

| 订单 ID | 客户 ID | 产品类别 | 数量 | 价格 | 支付方式 | 运输方式 | 订单日期 | 发货日期 | 送货日期 |

|---|---|---|---|---|---|---|---|---|---|

| 00dc19a3-e5b6-482f-b22c-0c5e6a2b860 | CUST148 | 园艺 | 9 | 17.4 | 156.68 | 借记卡 | 隔日 | 已退 | 2023-02-20 22:00:00 | |

| 58b4a5d7-7774-4933-9999-99999999999 | CUST149 | 园艺 | 7 | 22.5 | 157.50 | 借记卡 | 隔日 | 已退 | 2023-02-20 22:00:00 | 2023-02-23 08:06:00 | |

| 36d0a140-77e3-4ae6-94f2-63152251990 | CUST216 | 运动 | 8 | 38.88 | 311.04 | 银行转账 | 隔日 | 已退 | 2023-02-19 23:00:00 | |

| 79f095f7-f5c4-4971-9676-76767676767 | CUST217 | 电子 | 5 | 45.0 | 225.00 | 借记卡 | 标准 | 已退 | 2023-02-19 23:00:00 | |

| a1b2c3d4-e5f6-4a5b-8c9d-e0f1a2b3c4d5 | CUST22 | 书籍 | 10 | 45.44 | 454.40 | 借记卡 | 标准 | 已发 | 2023-02-21 13:00:00 | 2023-02-23 03:30:00 | |

| d5e6f7a8-b9c0-4d1e-f2a3-d5e6f7a8b9c0 | CUST229 | 家用 | 2 | 24.7 | 49.40 | 礼品卡 | 标准 | 已达 | 2023-03-04 13:00:00 | 2023-03-06 03:06:00 | 2023-03-11 09:00:00 |

| 1b2c3d4-e5f6-47a8-b9c0-d1e2f3a4b5c6 | CUST231 | 玩具 | 4 | 50.0 | 200.00 | 借记卡 | 标准 | 已发 | 2023-02-22 10:00:00 | |

| e1f2a3b4-c5d6-47f8-a9b0-c1d2e3f4a5b6 | CUST232 | 书籍 | 6 | 36.05 | 216.30 | 借记卡 | 标准 | 已取消 | 2023-02-25 19:00:00 | |

| f9e8d7c6-b5a4-4321-8123-456789012345 | CUST233 | 电子 | 8 | 36.05 | 288.40 | 借记卡 | 快递 | 已取消 | 2023-02-25 19:00:00 | |

| a2b3c4d5-e6f7-48a9-b0c1-d2e3f4a5b6d7 | CUST234 | 园艺 | 5 | 26.28 | 131.40 | 借记卡 | 标准 | 已发 | 2023-10-20 15:00:00 | 2023-10-23 20:00:00 | |

| b3c4d5e6-f7a8-49b0-c1d2-e3f4a5b6d7 | CUST235 | 玩具 | 5 | 49.92 | 249.60 | 借记卡 | 标准 | 已退 | 2023-02-21 13:00:00 | 2023-02-23 08:06:00 | |

| c4d5e6f7-a8b9-40c1-d2e3-f4a5b6d7f9 | CUST236 | 园艺 | 3 | 72.60 | 217.80 | 借记卡 | 标准 | 已发 | 2023-02-25 19:00:00 | |

| d5e6f7a8-b9c0-41d2-e3f4-a5b6c7d89f0 | CUST237 | 玩具 | 7 | 37.65 | 263.55 | 借记卡 | 快递 | 已发 | 2023-02-25 19:00:00 | |

| e6f7a8b9-c0d1-42e3-f4a5-b6c7d89f0a1 | CUST238 | 园艺 | 6 | 26.28 | 157.68 | 借记卡 | 标准 | 已取消 | 2023-02-18 19:00:00 | |

| f7a8b9c0-d1e2-43f4-a5b6-c7d8e9f01b2 | CUST239 | 电子 | 2 | 49.21 | 98.22 | 借记卡 | 隔日 | 已发 | 2023-03-09 15:00:00 | 2023-03-10 03:06:00 | 2023-03-11 09:00:00 |

| a8b9c0d1-e2f3-44a5-b6c7-d8e9f0a12c3 | CUST240 | 美容 | 1 | 49.21 | 49.21 | 借记卡 | 隔日 | 已发 | 2023-02-26 10:00:00 | |

CSV 数据示例

以下表格展示了示例 CSV 文件中的部分数据记录:

| 字段 | 字段 | 字段 | 字段 | 字段 | 字段 | 字段 | 字段 | 字段 | 字段 | 字段 |

|---|---|---|---|---|---|---|---|---|---|---|

| b9c0d1e2-f3a4-45b6-c7d8-e9f0a1b23d4 | CUST241 | 园艺 | 3 | 102.00 | 306.00 | 借记卡 | 隔日 | 已发 | 2023-02-27 23:00:00 | | |

| c0d1e2f3-a4b5-46c7-d8e9-f0a1b2c34e5 | CUST242 | 电子 | 2 | 15.59 | 31.18 | 借记卡 | 隔日 | 已发 | 2023-03-11 23:00:00 | | |

图 3.17:示例 CSV 文件

数据分析与查询

  1. 一旦数据上传,你就可以开始提出相关查询。例如,你可以问:“目前为止有多少订单发货了?”或者,你也可以使用以下提示词:“创建一个以订单状态为 x 轴、数量为 y 轴的图表。”

对于此类查询,代码解释器将在托管沙箱环境中执行 Python 代码并为你提供结果,如下:

https://github.com/OpenDocCN/freelearn-dl-zh/tree/master/docs/unlocking-creativity-with-azure-openai-a-practical-guide-to-/img/1f4103f75e57527f2610bfdcc490bc25_99_0.png

图 3.18:代码解释器的输出

Azure OpenAI 高级主题

在下一节中,我们将介绍如何使用 SDK 方法将文件搜索(File Search)功能集成到助手。

AOAI 助手 – 文件搜索

使用 OpenAI SDK,你可以让助手搜索文档并根据需要提取特定的函数签名。文件搜索允许助手利用 SDK 对文档进行解析、分块和索引,以实现高效检索。你可以在应用程序中无缝配置这些工具,增强助手的检索和交互能力:

  1. 首先,我们需要创建一个将文件搜索作为其工具之一的新助手,如下:
assistant = client.beta.assistants.create(
  name="Healthcare assistant",
  instructions="你是一个乐于帮助的医疗助手。仅根据你在给定工具中搜索到的信息回答问题,\n始终遵循以下步骤进行响应:\n  1. 在回答问题之前搜索知识库。\n  2. 在回答问题之前搜索知识库。",
  tools=[{"type": "file_search"}]
)
  1. 使用文件搜索,你必须先将文件上传到向量存储。例如:
# 将文件上传到 API
file = client.files.create(
  file=open("medical_data.pdf", "rb"),
  purpose="assistants"
)

## 创建向量存储
vector_store = client.beta.vector_stores.create(
  name="Medical data store"
)

## 将文件添加到向量存储
client.beta.vector_stores.files.add_and_poll(
  vector_store_id=vector_store.id,
  file_ids=[file.id]
)
  1. 将向量存储关联到助手:
assistant = client.beta.assistants.update(
  assistant_id='as_123',
  tool_resources={"vector_store_ids": [vector_store.id]}
)

图 3.19:创建向量存储

  1. 配置助手后,你就可以创建一个线程并运行消息:
thread = client.beta.threads.create(
  messages=[
    {"role": "user", "content": "糖尿病的常见症状有哪些?"}
  ]
)

run = client.beta.threads.runs.create_and_poll(
  thread_id=thread.id,
  assistant_id=assistant.id
)

messages = client.beta.threads.messages.list(thread_id=thread.id)

图 3.20:关联向量存储

AOAI 批量 API (Batch API)

某些应用程序需要同步请求处理,即实时推理,这需要即时响应。然而,在许多情况下,响应是可以延迟的,或者速率限制限制了多个查询的处理速度。在这种情况下,批处理作业变得非常有用,特别是对于以下任务:

  • 大规模数据处理

  • 生成大量内容、大规模转换数据

  • 评估 LLM 模型并评估其综合性能

AOAI 批量 API 提供了一组易于使用的端点。这些端点允许您将多个请求打包到一个文件中,启动批处理作业异步处理这些请求,在任务运行期间检查批状态,最后在处理完成后检索合并的结果。

与传统的 PAUG 部署相比,批量 API 提供了以下优势:

  • 成本效益:与标准 PAUG 部署相比降低了 50% 的成本

  • 专用配额:使用独立的入队 Token 配额运行,与在线端点配额分开,确保在线工作负载不受影响;且批处理配额要大得多

  • 24 小时周转:每个批处理任务会在 24 小时内完成,通常能更快获得结果

提交批任务并检索结果涉及六个步骤。让我们详细介绍每个步骤:

1. 创建批处理部署

你首先需要为批处理创建一个单独的部署。要做到,请按照以下步骤操作:

I. 登录 Azure AI Foundry。

II. 导航到共享资源(Shared resources)下的“部署”(Deployments)。

III. 点击“部署模型”(Deploy model)并选择“部署基础模型”(Deploy base model)。

IV. 选择任何对话完成模型作为 gpt-4o-mini 并点击“确认”(Confirm)。

V. 在“部署名称”(Deployment name)下提供值,将“部署类型”(Deployment type)设置为“全局批量”(Global Batch),将“入队令牌”(Enqueued tokens)值调整为最大限制,并点击“部署”(Deploy)。

部署模型 gpt-4o-mini

部署名称 *

gpt-4o-mini-batch

部署类型

| 全局批量 (Global Batch) |

| --- |

| 全局标准 (Global Standard) |

| 数据区域标准 (Data Zone Standard) |

| 标准 (Standard) |

| 全局批量 (Global Batch) |

| 数据区域批量 (Data Zone Batch) |

| 全局托管型 (Global Provisioned-managed) |

| 数据区域托管型 (Data Zone Provisioned-managed) |

| 托管型 (Provisioned-managed) |

你的部署可使用 950M 入队令牌配额

入队令牌配额 (limit)

950M

当你创建此部署时,你所做的资源更改将贯穿整个 Azure Foundry。

内容过滤器 (Content filter)

DefaultV2

启用动态配额 (Enable dynamic quota)

已启用 (Enabled)

模型将部署到所选资源。已预选支持该模型的资源。

部署到所选资源

取消 (Cancel)

图 3.24:批部署

你也可以切换“启用动态配额”,这允许在有额外容量可用时利用额外的配额。

在完成上述步骤后,你的全局批量部署将被创建。该部署将随后用于运行批处理作业。

2. 批创建过程

批处理从一个 json 文件开始,每行指定单个 API 请求的详细信息。目前支持的端点是 /chat/completions(用于对话完成 API)。

在此输入文件中,每行 body 字段中的参数应与对应端点的参数匹配。每个请求必须包含一个唯一的 custom_id 值,这将有助于在处理完成后引用结果。文件中的模型名称应与你在上一步骤中创建的部署名称匹配。

以下是一个输入文件的示例(如下),包含三个请求。每个输入文件必须限制为针对单个模型的请求:

{"custom_id":"request-1","method":"POST","url":"/chat/completions","body":{"model":"gpt-4o-batch","messages":[{"role":"system","content":"You are a helpful medical AI assistant. Your job is to find the correct answer to provider questions."},{"role":"user","content":"Can you explain the symptoms of hypothyroidism?"}]}}
{"custom_id":"request-2","method":"POST","url":"/chat/completions","body":{"model":"gpt-4o-batch","messages":[{"role":"user","content":"What lifestyle changes are recommended for patients with hypothyroidism?"}]}}
{"custom_id":"request-3","method":"POST","url":"/chat/completions","body":{"model":"gpt-4o-batch","messages":[{"role":"system","content":"You are a helpful medical AI assistant. Your job is to find the correct answer to provider questions."},{"role":"user","content":"Can you explain the symptoms of hypothyroidism?"}]}}

图 3.25:批输入 json 文件

3. 上传批输入文件

准备输入文件后,你需要在启动批处理作业之前上传它。你可以通过编程方式或通过 Studio 界面上传文件。在本例中,我们使用 Python SDK 从本地驱动器上传文件。请参考图 3.26。

### Initialize the Azure OpenAI client
client = AzureOpenAI(
    azure_endpoint = '<AOAI ENDPOINT',
    api_key = '<API-KEY',
    api_version = "2024-07-01-preview"
)
### Upload a file with a purpose of "batch"
file = client.files.create(
    file=open("batch-sample.jsonl", "rb"),
    purpose="batch"
)
file_id = file.id
print(file.model_dump_json(indent=2))
{
  "id": "0a27a5cd4d94440789971497e6d80391",
  "bytes": 1041,
  "created_at": 173110416,
  "filename": "batch-sample.jsonl",
  "object": "file",
  "status": "pending"
}

图 3.26:文件上传

4. 提交批作业

上传输入文件后,你可以找到 File 对象来启动批处理。在本例中,文件 ID 为 0a27a5cd4d94440789971497e6d1。目前完成窗口固定为 24 小时。你还可以包含元数据,如图 27 所示。这将返回一个带有批 ID 和状态的批对象。你可以在 https://learn.microsoft.com/en-us/azure-services/openai/how-to-batch 查找详细信息。

### Submit a batch job with the file
batch_response = client.batches.create(
    input_file_id=file_id,
    endpoint="/chat/completions",
    completion_window="24h",
    metadata={
        "description": "Sample batch"
    }
)
### Save batch ID for later
batch_id = batch_response.id
print(batch_response.model_dump_json(indent=2))
{
  "id": "batch_91d0b296-7241-474a-b081-4d958abc",
  "completion_window": "24h",
  "created_at": 1721104599,
  "endpoint": "/chat/completions",
  "input_file_id": "file_0a27a5cd4d94440789971497e6d80391",
  "object": "batch",
  "status": "validating",
  "cancelled_at": null,
  "cancelling_at": null,
  "completed_at": null,
  "errors": null
}

图 3.27:批作业提交

5. 跟踪批状态

成功创建批作业后,你可以通过 Studio 或通过编程方式监控其进度。在检查状态时,建议每次状态调用之间至少等待 60 秒,如图 28 所示。

import time
import datetime

status = "validating"
while status not in ("completed", "failed", "canceled"):
    time.sleep(60)
    batch_response = client.batches.retrieve(batch_id)
    status = batch_response.status
    print(f"{datetime.datetime.now()} Batch: {batch_id}, Status: {status}")
    if batch_response.status == "failed":
        for error in batch_response.errors:
            print(f"{error.code} Message: {error.message}")
2024-11-08 22:28:56.04656 Batch: 91d0b296-7241-474a-b801-4de9e5a6bbc, Status: validating
2024-11-08 22:29:57.28649 Batch: 91d0b296-7241-474a-b801-4de9e5a6bbc, Status: validating
2024-11-08 22:30:57.78837 Batch: 91d0b296-7241-474a-b801-4de9e5a6bbc, Status: validating
2024-11-08 22:31:58.41926 Batch: 91d0b296-7241-474a-b801-4de9e5a6bbc, Status: in_progress
2024-11-08 22:32:58.69005 Batch: 91d0b296-7241-474a-b801-4de9e5a6bbc, Status: in_progress
2024-11-08 22:33:00.66410 Batch: 91d0b296-7241-474a-b801-4de9e5a6bbc, Status: finalizing
2024-11-08 22:36:01.34154 Batch: 91d0b296-7241-474a-b801-4de9e5a6bbc, Status: finalizing

图 3.28:批作业状态检查

给定的 Batch 对象的状态可以是表 3.1 所示的任何一种。

| 状态 | 描述 |

|---|---|

| validating (验证中) | 在批启动之前对输入文件进行验证 |

| failed (失败) | 输入文件未通过验证过程 |

| in_progress (进行中) | 输入文件验证通过,批处理正在运行 |

| finalizing (最终中) | 批处理已完成,结果已准备绪 |

| completed (已完成) | 批处理已完成,结果已就绪 |

| expired (过期) | 批处理未在 24 小时内完成 |

| cancelling (取消中) | 批处理正在取消过程中(可能需要 10 分钟) |

| cancelled (已取消) | 批处理已取消 |

表 3.1:批作业状态表

6. 获取结果

批处理完成后,你可以通过 Batch 对象中的 output_file_id 向 Files API 发起请求以下载输出。将其保存到机器上的文件,例如 batch_output.jsonl。输出的 .jsonl 文件将包含来自输入文件中每个成功请求的响应。任何失败的请求将对其错误详情包含在单独的文件中,可以通过批的 error_file_id 访问。

重要笔记

输出行的顺序可能与输入顺序不匹配。不要依赖序列,请使用每行输出中存在的 custom_id 字段将输入请求与其对应的结果相关起来。

import json

output_file_id = batch_response.output_file_id

if not output_file_id:
    output_file_id = batch_response.error_file_id

if output_file_id:
    file_response = client.files.content(output_file_id)
    raw_responses = file_response.strip().split('\n')

    for raw_response in raw_responses:
        json_response = json.loads(raw_response)
        formatted_json = json.dumps(json_response, indent=2)
        print(formatted_json)

图 39:检索输出文件

通过遵循概述的步骤,你可以手动地提交批处理。

虽然这些策略适用于演示目的,但如果 blob 存储账户中有数百万个文件,则需要一种自动化解决方案来高效地提交批处理并检索结果。对于此类情况,你可以使用以下加速器:

https://github.com/Azure-Samples/aoai-batch-api-accelerator

AOAI Batch API 有服务限制,可以在 https://learn.microsoft.com/en-us/azure-services/openai/how-to/batch?tabs=standard-input%2Cpython-key&pivots=programming-language-python#global-batch-limits 处找到。额度在 https://learn.microsoft.com/en-us/azure/ai-services/openai/how-to/batch?tabs=standard-input%2Cpython-key&pivots=programming-language-python#global-batch-quota 处概述。这些限制可以根据你的工作负载进行增加;如需请求增加,你需要联系微软。

你还可以使用 AOAI Batch API 批量处理图像。此功能适用于特定的多模态模型,目前只有 GPT-4o 支持在批请求中使用图像。图像可以通过 URL 或 base64 编码数据的形式提供。请注意,GPT-4 Turbo 目前不支持用于批处理的图像输入。

AOAI 批处理本质上是全球性的,这意味着数据处理可能发生在世界上任何地方。这可能会引起具有严格监管要求的行业的顾虑。然而,你可以为 AOAI Batch 选择一个数据区域,将数据处理限制在特定的地理区域。通过选择美国数据区域,处理将在美国的一个区域进行;通过选择欧盟数据区域,处理将在欧盟的一个区域进行。这确保了企业能够遵守数据合规性和监管要求。

现在我们已经涵盖了 AOAI Batch API,下一节将重点介绍微调,它允许你针对特定任务自定义你的模型。

AOAI 微调

微调允许你通过提供以下内容,最大限度地通过 Azure AI Foundry 或 API 可用模型的潜力:

  • 与基础提示相比,改进了响应质量

  • 具有在更大数据集上训练的能力,超越了模型上下文窗口的限制

  • 通过最小化提示长度来减少 token 使用

  • 低延迟请求具有更快的响应时间

AOAI 的文本生成模型在大量的文本数据语料上进行了预训练。为了有效率使用它们,用户在提示中包含指令和示例——这种方法被称为少样本学习(few-shot learning)。少样本学习通过在提示本身中显示少量示例来演示如何完成任务。

微调通过在比单个提示能容纳的多得多的示例上进行训练,增强了少样本方法,从而提高了更广泛任务的性能。在模型经过微调后,提示中通常需要更少的示例,这减少了 token 成本并进一步降低了响应延迟。

利用微调的理想情况

在评估微调是否是特定用例的合适方法时,理解基础概念是有益的:

  • 提示工程(Prompt engineering):这种技术涉及精确地为自然语言处理模型编写提示。通过仔细设计提示,用户可以提高相关性模型的准确性,提升整体性能。第 13 节深入探讨了各种提示技术。

  • RAG:RAG 通过将外部数据集成到提示中来增强 LLM 的有效性。通过从外部源检索相关信息,RAG 允许企业创建既具有成本效益又符合上下文的定制解决方案。

  • 微调(Fine-tuning):微调涉及通过在特定示例数据上重新训练来适应现有的 LLM,产生一个经过微调的自定义模型,以反映所提供示例集的细微差别和要求。

AOAI 微调是一个监督微调过程,而不是持续预训练或通过人类反馈进行强化学习(RLHF)。监督微调涉及在精心选择的数据集上重新训练预训练模型,以增强在特定任务上的性能。我们建议从提示工程、提示链(将任务分解为更小、易于管理的提示)以及利用函数调用(function calling)等技术开始以获得结果。

AOAI 使用低秩近似(LoRA)通过在对性能影响最小的情况下降低复杂度来高效微调模型。这种方法使用低维矩阵近似模型的原始高维矩阵。

为什么要微调模型?

当你需要模型产生特定的风格、语气或格式,或者所需的指令或数据复杂到无法放入提示中时,微调是合适的。以下是你可能尚未准备好微调的一些迹象:

  • 用例不明确:如果你无法阐述除“我想改进模型”之外的明确目的,微调可能不是正确的步骤。

  • 成本驱动动机:微调在允许缩短提示的情况下可以降低成本。然而,它涉及训练和托管的预付成本。请注意这些费用并参考 AOAI 定价页面了解更多关于微调的细节。

  • 领域知识需求:如果你的主要目标是引入模型范围之外的信息,请考虑使用 RAG。AOAI 的 RAG 功能(如基于嵌入的检索)可以根据你的数据和目标提供更灵活且通常更负担得起的解决方案。

你到为止尝试了什么?

微调是一项高级能力,通常不是处理生成式 AI 的步。熟悉 LLM 的基础知识并从提示工程和/或 RAG 开始是至关重要的。这些技术可以帮助你建立基准,这对于评估微调是否真的改进了你的模型至关重要。

没有微调的性能基准也可以作为一种保护:它有助于检测微调带来的任何负面影响。

当其他方法无效时你该怎么办?

识别提示词工程(prompt engineering)或检索增强生成(RAG)的局限性有助于明确是否有必要进行微调(fine-tuning)。问自己以下问题:

  • 基础模型在处理边界情况或异常时是否存在困难?

  • 它生成的格式是否一致,且你无法在上下文窗口放入足够的示例来引导它?

基础模型或提示词工程不足的示例可以指导你为微调收集正确的数据,并确定如何评估微调后模型的有效性。

让我们来看一个示例场景。假设某用户希望使用 GPT-4o-mini 将自然语言问题转换为非标准语言的查询。虽然他们在提示词中指定了返回 SQL,并使用 RAG 获取数据库架构(schema),但模型经常产生错误的语法,特别是在边界情况情况下。为了解决这个问题,他们收集了数千个问题及其对应数据库查询的示例(包括模型之前的失败案例),并使用这些数据对模型进行微调。最终微调后的模型结合他们工程化的提示词和检索设置,实现了实际应用所需的准确率。

以下是你已准备好进行微调的一些指标:

  • 记录过的以往尝试示例:你测试了各种提示词工程或 RAG 解决方案,并记录了具体的局限性。

  • 识别出的模型缺点:这些可能包括对边界情况的处理不一致、无法在上下文窗口内包含足够的样本提示(few-shot prompts),或延迟问题。

另一方面,以下是你可能需要在微调前等待的某些迹象:

  • 缺乏对模型局限性和所需数据的深度理解

  • 难以识别能够有效训练模型的合适数据

你将使用什么进行微调?

即使有强大的用例,微调的成功在很大程度上取决于你提供的数据质量。投入必要的时间和资源来收集高质量、经过人工筛选的数据至关重要。模型可能需要不同量的数据,但在大多数情况下,你需要提供大量经过精心挑选的示例以获得有意义的改进。

除了数据质量,数据的格式也同样重要。即使是高质量的数据也可能需要投入大量精力才能为微调进行适当的格式化。这可能涉及分配工程资源以确保数据结构正确。

你已准备好进行微调的一些指标包括以下:

  • 已确定的数据集:你已经选择了打算用于微调的数据集

  • 正确的格式:数据集的结构符合所选模型的相应格式

  • 筛选工作:已对数据集进行了某种程度的筛选,以确保数据质量

另一方面,以下是你可能尚未准备好进行微调的常见迹象:

  • 未确定数据集:你尚未选择用于微调的数据集

  • 格式错误:数据集的格式与你打算微调的模型的要求不符。

你将如何衡量微调后模型的质量?

衡量微调模型成功没有通用的方法,但拥有清晰、定义良好的指标至关重要。成功不应仅通过定性评估,还应通过量化指标评估。很好的方法是使用留存(holdout)验证数据集来客观地评估性能。此外,你可以通过进行用户验收测试或执行 A/B 测试来增强评估,将微调后的模型与基础模型进行比较,查看改进是否符合你的预期。

为了优化模型的上下文,你应该探索提示词工程和 RAG 等技术,由于 LLM 本身也应关注提示词工程,然后进行微调,如图 3.30 所示。

AOAI 微调

一旦你确定微调是适当的策略,就可以按照后续章节中详细说明的步骤有效地微调模型。

微调步骤

从层次来说,微调过程包括以下步骤:

  1. 准备并上传训练数据。

  2. 训练一个新的微调模型。

  3. 进行安全性评估。

  4. 进行模型性能评估。

  5. 部署微调后的模型。

让我们详细介绍每个步骤:

  1. 准备并上传训练数据:你的训练和验证数据集应包含展示所需行为的输入和输出。这些数据集必须格式化为 JSON Lines (JSONL) 文档。对于 gpt-3.5-turbo(所有版本)、gpt-4、gpt-4o 和 gpt-4o-mini 等模型,微调数据应遵循 Chat completions API 使用对话格式。以下是示例格式:
{"messages": [ {"role": "system", "content": "你是一个 Ontoso 客户支持代理,帮助客户解决与其 Ontoso 账户和服务相关的相关问题。你友好且简洁。你只对与 Ontoso 的查询提供事实性回答。"}, {"role": "user", "content": "我需要关于我的 Ontoso 账户的帮助。我忘记密码了。"}, {"role": "assistant", "content": "你好!我很乐意提供帮助。请提供你的注册邮箱地址,我将引导你重置密码。"}]}

{"messages": [ {"role": "system", "content": "你是一个 Ontoso 客户支持代理,帮助客户解决与其 Ontoso 账户和服务相关的相关问题。你友好且简洁。你只对与 Ontoso 的查询提供事实性回答。"}, {"role": "user", "content": "我需要关于我的 Ontoso 账户的帮助。我忘记密码了。"}, {"role": "assistant", "content": "你好!我很乐意提供帮助。请提供你的注册邮箱地址,我将引导你重置密码。"}]}

表 3.2:示例数据

除了 JSON 格式外,训练和验证文件必须以无 BOM 的 UTF-8 编码。此外,文件大小不能超过 512 MB。

你可以在单行中包含对话的多个回合。为了从微调中排除助手消息,你可以添加可选的键值对。目前,权重可以设置为 0 或 1。这里是另一个多轮示例:

{"messages": [{"role": "system", "content": "你是一个 CentOS 客户支持代理,友好且简洁,但带有讽刺语气。"}, {"role": "user", "content": "你们的工作时间是什么时候?"}, {"role": "assistant", "content": "我们的工作时间是周一至周五上午 9 点到下午 5 点。"}, "weight": 0}, {"role": "user", "content": "你可以讽刺一下吗"}, {"role": "assistant", "content": "我们在周一至周五上午 9 点到下午 5 点这种非常不寻的时间开放。真令人震惊。", "weight": 1}}, {"role": "system", "content": "你是一个 Azure 客户支持代理,友好且简洁,但带有讽刺语气。"}, {"role": "user", "content": "我如何重置密码?"}, {"role": "assistant", "content": "你可以点击登录页面上的密码链接来重置密码。", "weight": 0}, {"role": "user", "content": "你可以讽刺一下吗"}, {"role": "assistant", "content": "噢,你只需要点击密码链接。这是一个已经存在许多年的突破性功能。", "weight": 1}}

表 3.3:多轮训练数据

I. 开始之前,打开 Azure Foundry (https://oai.azure.com/) 并使用具有 AOAI 访问权限的凭据登录。

您选择了与您的账户相关的正确目录、Azure 订阅和 AOAI 资源。

II. 在 Azure AI Foundry 中,导航到左侧菜单中的工具(Tools)部分,然后选择微调(Fine-tuning)面板。在那里,点击微调模型(Fine-tune model)开始微调过程。

通过使用自己的数据进行训练来微调模型

通过在较小的、特定任务的数据集上训练预训练模型来优化其性能和准确性。这种方法所需的投资比每次调用微调(fine-per-call)更少。

<https://github.com/OpenDocCN/freelearn-dl-zh/tree/master/docs/unlocking-creativity-with-azure-openai-a-practical-guide-to-/img/1f4103f75e57527f2610bfdcc490bc25_117_0.png>

图 3.31:AOAI 微调向导

III. 创建自定义模型的第一步是选择基础模型。在基础模型(Base model)面板中,您可以从基础模型类型(Base model type)下拉菜单中选择基础模型。您的选择将同时影响所创建自定义模型的性能和成本。一旦选择了基础模型,点击“下一步”(Next)继续微调过程,如图 3.31 所示:

Azure OpenAI 高级主题

选择一个模型进行微调

某些模型可以在特定区域进行微调。了解更多关于微调的区域限制。

<https://github.com/OpenDocCN/freelearn-dl-zh/tree/master/docs/unlocking-creativity-with-azure-openai-a-practical-guide-to-/img/1f4103f75e57527f2610bfdcc490bc25_118_0.png>

图 3.32:选择要微调的基础模型

AOAI 支持增量微调,这意味着您可以对已经微调过的模型再次微调。这允许您通过在新的或更新的数据集上进一步训练来提高模型性能,增强其处理更特定任务或响应不断变化的需求。

IV. 如需继续,您可以根据特定的自定义需求从之前上传的数据集中选择或上传新的数据集。训练数据(Training Data)部分将显示所有可用数据集,允许您检查并在现有选项中进行选择,或上传新的数据用于训练。在示例中,我们演示了直接从本地驱动器上传新数据集的过程,如图 3.32所示。

对于处理大型数据文件,建议直接从 Azure Blob Storage 导入。通过多表单(multipart forms)上传大文件可能会导致不稳定性,因为这些上传依赖于原子请求,这意味着如果被中断,将无法恢复或重试。使用 Azure Blob Storage 进行此类传输可以确保更高的可靠性和容错能力,特别是在处理大型数据集时。

微调 gpt-4o

<https://github.com/OpenDocCN/freelearn-dl-zh/tree/master/docs/unlocking-creativity-with-azure-openai-a-practical-guide-to-/img/1f4103f75e57527f2610bfdcc490bc25_119_0.png>

图 3.33:训练数据上传

V. 在下一步中,您将找到为模型训练设置验证数据的选项。如果不需要验证数据,只需选择“下一步”直接进入高级配置设置。但是,如果您希望包含验证数据,可以从现有的数据集中选择,或者上传专门为此目的准备的验证数据集。

Azure OpenAI 高级主题

验证数据(Validation Data)部分显示所有可用的训练和验证数据集,提供了根据模型自定义所需的灵活性,即可以使用现有数据或根据需要添加新的验证数据。在示例中,我们演示了直接从本地驱动器上传新验证数据集的过程,如下所示:

<https://github.com/OpenDocCN/freelearn-dl-zh/tree/master/docs/unlocking-creativity-with-azure-openai-a-practical-guide-to-/img/1f4103f75e57527f2610bfdcc490bc25_120_0.png>

VI. 创建自定义模型向导允许您在任务参数(Task parameters)部分为训练微调后的模型配置各种参数。以下是可用参数的概述:

  • batch_size(整数):这指定了单次正向和反向传播过程中处理的训练示例数量。通常,对于大型数据集建议使用较大的批大小,因为它可以稳定训练过程。较大的批大小会减少模型参数更新的频率,导致更新的方差较低。

  • learning_rate_multiplier(数字):这是一个应用于预训练学习率的乘数(学习率因子),用于设置微调学习率。较大的值配合较大的批大小可以提高训练效率,但如果值过高,可能会有过拟合风险。尝试 0.02 到 0.2 之间的值以寻找最佳率通常是有效的。

  • n_epochs(整数):这指的是轮数(epochs),即对数据集的完整遍历次数,每个 epoch 代表从数据集中学习的一个完整周期。

  • seed(整数):它控制训练运行的可重复性。设置特定的种子值可以确保在假设相同作业参数的情况下,训练结果在多次运行之间保持一致。如果没有指定,将自动生成种子。

选择“默认”(Default)使用微调作业的默认值,或选择“自定义”(Custom)显示并编辑超参数值。当选择默认时,Microsoft 将根据您的训练数据通过算法确定正确的值,如下:

<https://github.com/OpenDocCN/freelearn-dl-zh/tree/master/docs/unlocking-creativity-with-azure-openai-a-practical-guide-to-/img/1f4103f75e57527f2610bfdcc490bc25_121_0.png>

图 3.35:超参数选择

如果您配置了高级选项,点击“下一步”查看您的选择并训练您的微调后模型。

  • VII. 在检查(Review)面板中,如果您已确认所有配置都是正确的,请点击“提交”(Submit)启动微调。提交后,您将被重定向到模型(Models)页面。

  • VIII. 模型页面提供了您的微调任务的概述。您可以监控过程状态并查看性能指标。一旦任务完成,您就可以部署您的微调后模型。

  • IX. 为了确保模型的安全和质量,Azure OpenAI 包含了评估步骤。这些步骤有助于在微调过程中识别并降低潜在风险。

  • X. 微调完成后,您可以使用不同的提示词(prompts)测试您的模型。这允许您在部署模型之前验证其是否符合您的要求。

Azure OpenAI 进阶主题

与数据评估类似,模型在微调过程中作为微调作业的一部分自动评估。服务仅记录最终的评估结果——即模型是否可以部署。如果由于在模型输出中检测到有害内容导致微调后的模型部署失败,你将不会收取训练会话的费用。

XII. 模型性能评估:微调作业完成后,AOAI 为每个作业提供一个名为 results.csv 的结果文件。该文件可帮助你分析自定义模型在训练和验证期间的性能。你可以在 Azure AI Foundry 中“模型”(Models)下的“结果文件 ID”(Result file id)处找到结果文件的 ID,从而从“数据”(Data files)窗格下载该文件。

results.csv 文件包含以下列,如表 3.5 所示:

| 列名 | 说明 |

| :--- | :--- |

| step | 训练步数,代表对批训练数据进行的一轮遍历(正向和反向传播)。 |

| train_loss | 训练批次的损失值,衡量模型误差的指标。 |

| train_mean_token_accuracy | 训练中预测正确的标记百分比。例如,如果批大小为 3 且数据包含内容 [[1, 2], [0, 5]],准确率可能为 0.83。 |

| valid_loss | 验证批次的损失值,与训练损失类似,但在验证数据上进行评估。 |

| validation_mean_token_accuracy | 验证批次中预测正确的标记百分比。 |

| full_valid_loss | 每个 epoch 结束时计算的总体验证损失。损失降低表示训练良好。 |

| full_valid_mean_token_accuracy | 每个 epoch 结束时验证的总体平均标记准确率。准确率上升表示训练有效。 |

表 3.5:模型训练与验证性能

在 Azure AI Foundry 中,你可以将来自 results.csv 的数据视觉化为图表。通过选择你已训练模型的链接,你可以查看两个关键图表:损失值(Loss)和标记准确率(Token accuracy)。如果你提供了验证数据,训练和验证数据集的结果将显示在同一张图表上,如下:

微调指标

https://github.com/OpenDocCN/freelearn-dl-zh/tree/master/docs/unlocking-creativity-with-azure-openai-a-practical-guide-to-/img/1f4103f75e57527f2610bfdcc490bc25_125_0.png

https://github.com/OpenDocCN/freelearn-dl-zh/tree/master/docs/unlocking-creativity-with-azure-openai-a-practical-guide-to-/img/1f4103f75e57527f2610bfdcc490bc25_125_1.png

图 3.37:微调指标

图中需要关注的点:

  • 损失值应随时间推移而降低,表明模型随着学习不断改进。

  • 准确率应该增加,显示模型在预测标记方面变得更好。

  • 如果你注意到训练数据和验证数据之间存在差异(即训练损失持续下降,而验证损失增加或处于平台期),这可能是过拟合的迹象。在这种情况下,你可能希望执行以下操作:

    • 使用较少的 epoch 训练模型

    • 使用较小的学习率倍数,以防止模型过拟拟合训练数据

在微调模型时,还有其他几个考虑因素以确保最佳性能:

  • 缺失系统消息(system message):在微调以及使用微调后的模型期间,提供一致的系统消息至关重要。如果系统消息发生变化,模型产生的结果可能与你微调时预期的不符。因此,你部署时使用的系统消息应与训练过程中使用的匹配,以保持一致性。

  • 数据不足:虽然微调流水线运行的最少数据为 10 个示例,但建议使用数百或数千个数据点来教导新模型。数据点过少存在过拟合的风险,即模型会记住特定示例而不是泛化模式。这可能导致在应用于真实的未见数据时性能不佳。为了获得最佳结果,目标是准备一个包含数百或数千个多样化数据点集。

  • 数据质量:训练数据的质量直接影响微调后模型的质量。策划不当或有偏差的数据集会导致模型学习不准确的模式。例如,如果你只用一种场景(例如退货)训练机器人,它将难以处理其他情况。此外,如果训练数据包含错误或误导性信息,模型将学习到错误或偏见的回答。始终确保你的数据集具有多样性、准确性,并代表你期望它处理的任务。

  1. 部署微调后的模型:一旦微调作业成功,你就可以使用 Azure AI Foundry 中的“模型”(Models)窗格部署你的自定义模型。部署对于使微调后的模型能够在完成任务中使用是必要的。要部署模型,请选择自定义模型并点击“部署”(Deploy),如下所示:

通过在你的数据上进行训练来微调模型:

https://github.com/OpenDocCN/freelearn-dl-zh/tree/master/docs/unlocking-creativity-with-azure-openai-a-practical-guide-to-/img/1f4103f75e57527f2610bfdcc490bc25_126_0.png

图 38:微调后模型的部署

当你打开“部署模型”(Deploy model)对话框时,你需要为自定义模型输入一个部署名称。输入名称后,点击“部署”以启动微调后模型的部署过程。你可以在 Azure AI Foundry 的“部署”(Deployments)窗格中跟踪部署进度。

AOAI 微调还支持将你的自定义模型部署到与训练地不同的区域。然而,存在一些局限性:

  • 目标区域必须支持微调

  • 部署的账户必须具有访问权限

重要说明:一旦你部署了模型,如果它保持闲置状态 15 天,将会被自动删除。请注意,闲置部署的删除不会影响底层模型,模型可以随时重新部署。

一旦你的自定义模型完成部署,就可以像使用其他部署的模型一样使用它。你可以通过 Foundry 中的 Playground(Playgrounds)对你的新部署进行实验。相同的参数(如 temperature 和 max_tokens)可以应用于你的自定义模型,就像与其他模型一样:

  • 对于微调后的 babbage-002 和 davinci-002 模型,你将使用 Complet 聊天场和 Completions API

  • 对于微调后的 gpt-4 模型,你将使用 Chat 聊天场和 Chat Completion API

这些工具允许你对微调模型进行的定制进行交互和测试。

总结

在本章中,我们关注了 AOAI,它提供了一套全面的工具和服务,旨在增强 AI 模型的能力和集成。这些功能的核心是 AOAI 上下文窗口(context window),它定义了模型一次处理的信息量。我们了解到它对于在复杂任务中保持连性和理解至关重要。我们了解到 AOAI 嵌入模型有助于将文本转换为数值向量,实现更好的语义理解和相似性搜索。这些嵌入可以使用 Azure 数据库进行高效存储和查询,数据库对处理高维数据进行了优化,从而提升了 AI 应用的性能。我们还讨论了 RAG 模式,概述了其分步骤的过程。此外,我们了解到 AOAI 使用数据(On Your Data)允许组织创建原型并在其私有数据集上利用这些模型,确保 AI 解决方案符合特定的业务需求。

学习了 AOAI 调优后,用户可以自定义预训练模型,以更好地适应特定任务或领域,从而提高在专业应用中的性能和准确性。正如我们在本章中学到的,这些工具共同提供了一个强大且灵活的平台,用于开发满足多样化业务需求的高级 AI 解决方案。

在接下来的章节中,我们将关注生成式 AI 应用的实际示例,并辅以编程练习,帮助你轻松地构建这些应用程序。通过实操实现,你将全面理解如何将生成式 AI 技术应用于现实用例。主题将包括各种场景,例如基于文档的问答和呼叫中心分析、查询结构化数据、使用 AOAI 生成代码、创建推荐系统、生成文本到视频的内容,以及使用 Assistant API 构建多模态多代理系统。每个示例将包含逐步指导和代码段,以支持你将这些功能集成到你的项目中。

第 2 部分:Azure OpenAI 的实际应用:真实世界用例

在第二部分中,我们将从基础概念过渡到实践实现,探索实际用例,以展示 Azure OpenAI 在解决现实世界挑战方面的变革潜力。每一章都介绍了一个不同的应用,对问题背景、技术架构和逐步解决方案的开发提供了深入的见解。从创建企业级文档问答系统到构建多模态多代理框架,本节为读者提供了利用 Azure OpenAI 实现多样化且影响应用的知识和工具。

此部分包含以下章节:

  • 第 4 章:开发企业级文档问答解决方案

  • 第 5 章:构建呼叫中心分析解决方案

  • 第 6 章:从结构化数据库进行查询

  • 第 7 章:代码生成与文档编制

  • 第 8 章:使用 Azure OpenAI 创建基础推荐解决方案

  • 第 9 章:将文本转换为视频

  • 第 10 章:使用 Azure OpenAI Assistant API 创建多模态多代理框架

4 开发企业级文档问答解决方案

在上一章中,我们深入研究了扩展我们对语言模型理解的高级主题。我们熟悉了如嵌入(embedding)等概念,它涉及将单词或短语转换为数值形式以供语言模型处理,并将嵌入存储在 Azure Cognitive Search 中用于相关性搜索。此外,我们探索了模型上下文窗口(Model Context Window),它决定了语言模型在生成预测时考虑的上下文量。我们还发现了诸如 Azure OpenAI On Your Data 这样的功能,它允许自定义聊天、微调和 OpenAI 函数调用,从而在语言模型内部执行特定函数。该章进一步介绍了 OpenAI 插件,为增强语言模型的功能提供了扩展选项。最后,我们还被引入了 LangChain 和 Semantic Kernel,这是一种用于大语言模型的应用开发框架。

本章涵盖了以下主题:

  • 使用非结构化文档的企业级用例

  • 架构设计

  • 使用 Azure OpenAI 和 Azure Cognitive Search 索引开发问答解决方案

在深入研究非结构化文档的企业级用例之前,让我们先解决许多人面临的一个共同挑战:在海量文档中寻找特定信息。每个主题或项目通常伴随着大量的文档,这些文档由各种来源慷慨提供。这些文档掌握着成功的关键,但它们可能让人眼目缭乱且毫无无章。

当需要寻找特定信息时,任务可能会变得艰巨。人们一页一页、一个文档一个文档地翻找,寻找关键信息。这个过程可能是非常耗时且令人沮丧的。

然而,并非希望。想象有一种可以简化这一过程的解决方案,让你更轻松、更快速地找到所需的信息。今天,我们将探索使用 Azure OpenAI 的这种改变规则的解决方案,旨在高效地解决这些问题。

企业拥有大量的非结构化文档,这些文档包含了回答特定问题的丰富知识。这种挑战对企业来说并不陌生;它是各行业组织面临的困境。让我们进入一个真实世界的场景来感受这种情况的严重性。

假设你是一家蓬勃旅游公司的老板,专门为冒险爱好者打造旅行体验。多年来,你的公司一直在为旅行者策划独特的行程,导致积累了大量的非结构化文档。

在这个数字宝库中,你会发现一系列材料:详细的行程、旅游指南、客户评价、预订记录,以及与世界各地目的地酒店、航空公司和当地旅游运营商之间的海量通信。这些文档封装了丰富的信息,从旅行者的偏好到隐藏的宝藏,再到打造难忘旅程的物流细节。

现在,让我们聚焦于一个特定场景。一位忠实的客户曾体验过你提供的几次精彩冒险,他们现在向你提出了一个特殊请求。他们寻求一次精心规划的旅行,以满足他们的特定兴趣:在原始风光中徒步、通过镜头捕捉野生动物,并沉浸在真实的文化体验中。他们的要求非常明确——他们想要一份详细的行程,将这些独特元素无缝地织入一段难忘的旅程。

当你和你的团队开始这项任务时,挑战变得显而易见。手动筛选数千份非结构化文档以发现相关的旅游目的地、住宿选择、旅游活动和物流细节的过程,不仅耗时,而且面临着遗漏关键细节的风险。这种艰辛的努力可能会持续数周,即使如此,结果可能也不像你所希望的那样精确。

旅游公司面临的困境并非孤例。企业也挣扎于类似的情况,他们收集了大量的非结构化文档,每份文档都掌握着开启卓越体验的关键。在本章中,我们将看到如何使用 Azure OpenAI 和 Azure Cognitive Search 索引来解决这一问题。

技术要求

为了跟随本章的实际练习,请访问源码:https://github.com/PacktPublishing/Azure-OpenAI-Essentials/main/Chapter4.ipynb。

在你的本地机器上安装以下工具以开始工作:

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

  • Azure 开发者 CLI - https://learn.microsoft.com/en-us/azure/developer/azure-cli/install-azd?tabs=winget-windows%2Cmac%2C-linux&pivots=os-windows

  • 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://learn.microsoft.com/en-in/legal/cognitive-services/openai/limited-access)

  • Azure OpenAI 连接和模型信息:

    • OpenAI API 密钥

    • OpenAI 嵌入模型名称

    • OpenAI API 版本

架构设计

为了构建此系统,我们需要以下服务:

  • Azure Cognitive Search

  • Azure OpenAI Service

我们的主要目标是将非结构化数据转换为嵌入,并存储在向量数据库中。当用户提交查询时,系统利用 Azure OpenAI 嵌入进行处理。随后,在向量数据库上执行向量搜索以检索前 K 个段落。这些选定的段落将被发送到 Azure OpenAI 回答提示词中,由其提取答案并交付给用户。

以下是使用 Azure OpenAI 的问答解决方案简单架构图:

https://github.com/OpenDocCN/freelearn-dl-zh/tree/master/docs/unlocking-creativity-with-azure-openai-a-practical-guide-to-/img/1f4103f75e57527f2610bfdcc490bc25_134_0.png

在前面的图中,我们将 Azure OpenAI 服务的嵌入(embeddings)发送到向量数据库,用户提出的问题会被发送到这些嵌入,并从中提取结果。现在,我们将使用此设计为我们的问题开发一个解决方案。

使用 Azure OpenAI 和 Azure Cognitive Search 索引开发问答解决方案

现在我们已经熟悉了创建此解决方案所需的架构元素,让我们在 Azure 门户中开始这些组件的实现。如之前提到的,拥有活跃的 Azure 账户是构建此应用程序的前提。

Azure 订阅前提条件

以下前提条件已在第 2 章中建立,可以复用:

  • Azure 订阅

  • Azure OpenAI 资源

  • 已部署的 Azure OpenAI 模型

创建以下工具(排除第 2 章中已建立的工具)。

使用 Azure OpenAI 和 Azure Cognitive Search 索引开发问答解决方案

我们已经设置了 Azure OpenAI 及其部署,下一步是在与建立 Azure OpenAI 相同的资源组内创建 Azure Cognitive Search:

  1. 访问顶部导航栏中的搜索框并搜索 Azure Cognitive Search,如图所示:

https://github.com/OpenDocCN/freelearn-dl-zh/tree/master/docs/unlocking-creativity-with-azure-openai-a-practical-guide-to-/img/1f4103f75e57527f2610bfdcc490bc25_135_0.png

当你访问 Azure OpenAI 服务页面时,你将看到一个“创建”(Create)选项,如下所示:

https://github.com/OpenDocCN/freelearn-dl-zh/tree/master/docs/unlocking-creativity-with-azure-openai-a-practical-guide-to-/img/1f4103f75e57527f2610bfdcc490bc25_135_1.png

  1. 点击“创建”选项后,将出现一个表单,类似于图 4.4。选择资源组(Resource Group)——在我的情况下,我选择了之前创建的 azure-openaiai-rg。在本节的最后一步中,选择定价层级;我选择了 Standard S0。这是完成步骤 1 后的显示方式:

https://github.com/OpenDocCN/freelearn-dl-zh/tree/master/docs/unlocking-creativity-with-azure-openai-a-practical-guide-to-/img/1f4103f75e57527f2610bfdcc490bc25_135_2.png

  1. 完成步骤 2 后,点击“下一步”(Next)按钮进入后续步骤,在此处你可以根据所选层级查看定价详情。你可以保持默认设置不变并点击“下一步”按钮继续:

https://github.com/OpenDocCN/freelearn-dl-zh/tree/master/docs/unlocking-creativity-with-azure-openai-a-practical-guide-to-/img/1f4103f75e57527f2610bfdcc490bc25_136_0.png

  1. 点击“下一步”后,你将被重定向到网络(Networking)选项卡,其中端点连接性默认设置为“公共”(Public)。请保持为公共并点击“下一步”继续:

https://github.com/OpenDocCN/freelearn-dl-zh/tree/master/docs/unlocking-creativity-with-azure-openai-a-practical-guide-to-/img/1f4103f75e57527f2610bfdcc490bc25_136_1.png

  1. 点击“下一步”按钮后,你将进入“标签”(Tags)步骤。你可以暂时忽略此部分。标签是键值对,允许你对资源进行分类,并通过对多个搜索和资源组应用相同的标签来方便统一计单。你可以在“标签”步骤找到类似的细节。点击“下一步”继续,然后进入“查看并创建”(Review + create)步骤。

在这里将显示你在之前步骤中选择的详情。检查所有信息并点击创建(Create)按钮:

https://github.com/OpenDocCN/freelearn-dl-zh/tree/master/docs/unlocking-creativity-with-azure-openai-a-practical-guide-to-/img/1f4103f75e57527f2610bfdcc490bc25_137_0.png

图 4.7:Azure Cognitive Search 标签

创建 Azure Cognitive Search 实例

创建 Cognitive Search 可能需要几分钟时间。一旦搜索部署完成,你可以访问资源页面,其显示如下:

https://github.com/OpenDocCN/freelearn-dl-zh/tree/master/docs/unlocking-creativity-with-azure-openai-a-practical-guide-to-/img/1f4103f75e57527f2610bfdcc490bc25_137_1.png

图 4.8:Azure Cognitive Search 概述

创建索引并添加文档

要创建一个用于向量搜索的索引并向向量存储添加文档,请点击“添加索引”(Add index)链接。或者你也可以从“索引”(Indexes)选项卡创建:

https://github.com/OpenDocCN/freelearn-dl-zh/tree/master/docs/unlocking-creativity-with-azure-openai-a-practical-guide-to-/img/1f4103f75e57527f2610bfdcc490bc25_138_0.png

图 4.9:Azure Cognitive Search 索引创建

当你点击“添加索引”选项时,将出现一个表单,如图 4.10 所示。为你的发布填写必要的字段,包括索引名称(Index name):

https://github.com/OpenDocCN/freelearn-dl-zh/tree/master/docs/unlocking-creativity-with-azure-openai-a-practical-guide-to-/img/1f4103f75e57527f2610bfdcc490bc25_138_1.png

图 4.10:Azure Cognitive Search 索引创建

使用 Azure OpenAI 和 Azure Cognitive Search 索引开发问答解决方案

点击创建,将花费几分钟来创建索引。你可以验证其创建情况。

https://github.com/OpenDocCN/freelearn-dl-zh/tree/master/docs/unlocking-creativity-with-azure-openai-a-practical-guide-to-/img/1f4103f75e57527f2610bfdcc490bc25_139_0.png

图 4.9:Azure OpenAI

环境变量配置

以下环境变量需要在 .env 文件中配置:

OPENAI_DEPLOYMENT_NAME = "gpt-35-turbo"
OPENAI_DEPLOYMENT_VERSION = "2023-07-01-preview"
OPENAI_MODEL_NAME = "gpt-35-turbo"
OPENAI_EMBEDDING_DEPLOYMENT_NAME = "text-embedding-ada-002"
OPENAI_EMBEDDING_MODEL_NAME = "text-embedding-ada-002"
OPENAI_EMBEDDING_DEPLOYMENT_VERSION = "2023-07-01-preview"
OPENAI_VERSION = "2023-03-15-preview"
LOCATION = "westeport"
OPENAI_API_VERSION = "2023-07-01-preview"
VECTOR_STORE_ADDRESS = "(cognitive-search-url)"
VECTOR_STORE_PASSWORD = "(cognitive-search-adminekey)"
OPENAI_SIMILARITY_DEPLOYMENT_NAME = "text-embedding-ada-002"
SERPER_API_KEY = '(serper_api_key)'
AZURE_COGNITIVE_SEARCH_SERVICE_NAME = "(cognitive-search-servicename)"
AZURE_COGNITIVE_SEARCH_INDEX_NAME = "{index-name}"
AZURE_COGNITIVE_SEARCH_API_KEY = "{cognitive-search-key}"

我们已经提供了一个 .env 文件,需要在其中填充连接字符串详情。请按照以下步骤进行设置:

  • 步骤 I:调整 OPENAI_API_BASE 和 OPENAI_DEPLOYMENT_ENDPOINT 的值以匹配您的 Azure OpenAI 资源名称。例如,如果您将 Azure OpenAI 命名为 oai-documents-qna,则 OPENAI_API_BASE 的值应设置为 https://oi-documents-qna.azure.com/。

  • 步骤 II:更新 OPENAI_API_KEY 的值为在 Azure OpenAI 资源“密钥”(Keys)部分找到的访问密钥。

  • 步骤 III:修改 AZURE_COGNITIVE_SEARCH_SERVICE_NAME 和 AZURE_SEARCH_INDEX_KEY 的值以匹配您的 Azure Search 资源详情,这些详情可以从 Azure Cognitive Search 获取。

通过完成这些配置,您将拥有资源所需的连接字符串。

测试连接性

我们现在将如下测试与 Azure OpenAI 的连接性:

# 使用 model 引擎测试 OpenAI 的连接性
llm = AzureOpenAI(engine=OPENAI_MODEL_NAME, temperature=0)
print('tell me about yourself')

语言模型(称为 llm)正在使用 AzureOpenAI 类初始化,并指定指定的引擎(假设为 OpenAI 模型)OPENAI_MODEL_NAME 以及设置为 0 的温度参数,该参数控制着模型响应的随机性。它使用初始化的模型对“tell me about yourself”输入提示生成响应,并通过生成该响应来测试 OpenAI 语言模型的连接性和功能。

使用 AzureOpenAI 和 Azure Cognitive Search 索引开发问答解决方案

这是输出内容:

WARNING! engine 不是默认参数。
engine 已传递到 model_kwargs。
请确认 engine 是否为您的意图。

我是一个 AI 数字助手,旨在协助并与用户交流。我不断学习并提高我的能力,以提供有用且准确的回答。我没有物理形态或情感,但我被设定为友好且易于交流。我的目的是让任务变得更简单,并为与我交互的人提供信息。您有什么具体的想知道的吗?

图 4.2:连接输出

posted @ 2026-09-25 20:40  绝不原创的飞龙  阅读(15)  评论(0)    收藏  举报