亚马逊-BedRock-生成式人工智能-全-
亚马逊 BedRock 生成式人工智能(全)
原文:
zh.annas-archive.org/md5/135d60e8e373a747ba1020367cf7a0bb译者:飞龙
前言
生成式 AI 自从 ChatGPT 发布以来就成为了人们关注的焦点。全球各地的人们对其潜力感到惊叹,各行业也在寻求利用生成式 AI 进行创新和解决商业问题的方法。
2023 年 4 月,亚马逊正式宣布其新的生成式 AI 服务 Amazon Bedrock,该服务简化了生成式 AI 应用的构建和扩展,无需管理基础设施。
本书带你踏上使用 Amazon Bedrock 的生成式 AI 之旅,并赋予你以无缝的方式加速多个生成式 AI 用例的开发和集成。你将探索提示工程、检索增强、微调生成模型以及使用代理编排任务等技术。本书的后半部分涵盖了如何在 Amazon Bedrock 中有效地监控和确保安全和隐私。本书从中级到高级主题逐步展开,并投入了大量努力,使其易于跟随,并辅以实际示例。
在本书结束时,你将深刻理解如何使用 Amazon Bedrock 构建和扩展生成式 AI 应用,并了解几个架构模式和安全性最佳实践,这些将帮助你解决多个商业问题,并能够在你的组织中进行创新。
本书面向的对象
本书面向的是通用应用工程师、解决方案工程师和架构师、技术经理、机器学习(ML)倡导者、数据工程师和数据科学家,他们希望在自己的组织中创新或使用生成式 AI 解决商业用例。你应具备 AWS API 和 ML 核心 AWS 服务的基本理解。
本书涵盖的内容
第一章,探索 Amazon Bedrock,介绍了 Amazon Bedrock,从探索生成式 AI 的格局开始,介绍 Amazon Bedrock 提供的基座模型,选择正确模型的指南,额外的生成式 AI 功能,以及潜在的应用场景。
第二章,访问和使用 Amazon Bedrock 中的模型,提供了访问和使用 Amazon Bedrock 及其功能的不同方法,涵盖了不同的接口、核心 API、代码片段,Bedrock 与 LangChain 的集成以构建定制管道,多模型链以及关于 Amazon Bedrock 的称为 PartyRock 的游乐场的见解。
第三章,有效模型使用的提示工程,探讨了提示工程的艺术,其各种技术和构建有效提示以利用 Amazon Bedrock 上生成式 AI 模型力量的最佳实践。它使你对提示工程原则有全面的了解,从而能够设计出能够从 Bedrock 模型中获得预期结果的提示。
第四章, 定制模型以提升性能,提供了使用 Amazon Bedrock 定制基础模型的全面指南,以增强其在特定领域应用中的性能。它涵盖了模型定制的理由,数据准备技术,创建定制模型的过程,结果分析以及成功模型定制的最佳实践。
第五章, 利用 RAG 的力量,探讨了检索增强生成(RAG)方法,该方法通过结合外部数据源来缓解幻觉问题,从而增强语言模型。它深入探讨了 RAG 与 Amazon Bedrock 的集成,包括知识库的实现,并提供了使用 RAG API 和实际场景的动手示例。此外,本章还涵盖了实现 RAG 的替代方法,例如使用 LangChain 编排和其他生成 AI 系统,并讨论了在 RAG 背景下使用 Amazon Bedrock 的当前限制和未来研究方向。
第六章, 使用 Amazon Bedrock 生成和总结文本,深入探讨了架构模式,你将学习如何利用 Amazon Bedrock 的能力生成高质量的文本内容并总结长文档,并探讨了各种实际应用场景。
第七章, 构建问答系统和对话界面,涵盖了在小型和大型文档上进行问答的架构模式,对话记忆,嵌入,提示工程技术和上下文感知技术,以构建智能和吸引人的聊天机器人和问答系统。
第八章, 使用 Amazon Bedrock 提取实体和生成代码,探讨了实体提取在各个领域的应用,提供了使用 Amazon Bedrock 实现它的见解,并研究了代码生成背后的生成 AI 原理和方法,使开发者能够简化工作流程并提高生产力。
第九章, 使用 Amazon Bedrock 生成和转换图像,深入探讨了使用 Amazon Bedrock 上可用的生成 AI 模型进行图像生成的世界。它探讨了图像生成的实际应用,Amazon Bedrock 内可用的多模态模型,多模态系统的设计模式,以及 Amazon Bedrock 提供的伦理考虑和安全保障。
第十章, 使用 Amazon Bedrock 开发智能代理,为您提供了对代理、其优势以及如何利用 LangChain 等工具构建和部署针对 Amazon Bedrock 定制的代理的全面理解,使您能够在实际工业用例中利用生成式 AI 的力量。
第十一章, 使用 Amazon Bedrock 评估和监控模型,提供了如何有效地评估和监控 Amazon Bedrock 的生成式 AI 模型的指导。它涵盖了自动和人工评估方法、用于模型评估的开源工具,以及利用 CloudWatch、CloudTrail 和 EventBridge 等服务进行实时监控、审计和自动化生成式 AI 生命周期的自动化。
第十二章, 在 Amazon Bedrock 中确保安全和隐私,探讨了 Amazon Bedrock 实施的强大安全和隐私措施,确保您的数据得到保护,并使负责任的 AI 实践成为可能。它涵盖了数据本地化、隔离、加密、通过 AWS 身份和访问管理(IAM)进行访问控制,以及实施内容过滤的护栏和防止滥用,以及与安全负责任的 AI 政策保持一致。
为了充分利用本书
您需要具备基本的 Python 和 AWS 知识。对生成式 AI 和 ML 工作流程的基本理解将是一个优势。
| 本书涵盖的软件/硬件 | 操作系统要求 |
|---|---|
| Python | 基于 Linux 的操作系统 |
| Amazon Web Services | |
| 基于 Jupyter 的笔记本,例如 Amazon SageMaker |
本书要求您拥有访问Amazon Web Services(AWS)账户的权限。如果您还没有,可以访问aws.amazon.com/getting-started/并创建一个 AWS 账户。
其次,您需要在创建账户后安装和配置 AWS 命令行界面(CLI)(aws.amazon.com/cli/),这将用于从您的本地机器访问 Amazon Bedrock 基础模型。
第三,由于我们将要执行的多数代码单元都是基于 Python 的,因此需要设置 AWS Python SDK(Boto3)(docs.aws.amazon.com/bedrock/latest/APIReference/welcome.html)。您可以通过以下方式执行 Python 设置:在本地机器上安装它,使用 AWS Cloud9,利用 AWS Lambda,或利用 Amazon SageMaker。
如果您正在使用本书的数字版,我们建议您亲自输入代码或从本书的 GitHub 仓库(下一节中提供链接)获取代码。这样做将帮助您避免与代码复制和粘贴相关的任何潜在错误。
下载示例代码文件
您可以从 GitHub 下载本书的示例代码文件github.com/PacktPublishing/Generative-AI-with-Amazon-Bedrock。如果代码有更新,它将在 GitHub 仓库中更新。
我们还有其他来自我们丰富的图书和视频目录的代码包可供在github.com/PacktPublishing/获取。查看它们!
使用的约定
本书使用了多种文本约定。
文本中的代码:表示文本中的代码单词、数据库表名、文件夹名、文件名、文件扩展名、路径名、虚拟 URL、用户输入和 Twitter/X 用户名。以下是一个示例:“您可以在ChunkingConfiguration对象中指定分块策略。”
代码块设置如下:
#import the main packages and libraries
import os
import boto3
import botocore
当我们希望您注意代码块中的特定部分时,相关的行或项目将以粗体显示:
Entity Types: Company, Product, Location
任何命令行输入或输出都应如下编写:
[Person: Michael Jordan], [Organization: Chicago Bulls], [Location: NBA]
粗体:表示新术语、重要单词或屏幕上看到的单词。例如,菜单或对话框中的单词会以粗体显示。以下是一个示例:“在模型选项卡中,您可以选择创建 微调作业。”
小贴士或重要提示
它看起来像这样。
联系我们
我们始终欢迎读者的反馈。
一般反馈:如果您对本书的任何方面有疑问,请通过 customercare@packtpub.com 给我们发邮件,并在邮件主题中提及书名。
勘误:尽管我们已经尽最大努力确保内容的准确性,但错误仍然可能发生。如果您在这本书中发现了错误,我们将不胜感激,如果您能向我们报告,我们将不胜感激。请访问www.packtpub.com/support/errata并填写表格。
盗版:如果您在互联网上以任何形式发现我们作品的非法副本,我们将不胜感激,如果您能提供位置地址或网站名称,我们将不胜感激。请通过 copyright@packt.com 与我们联系,并提供材料的链接。
如果您有兴趣成为作者:如果您在某个领域有专业知识,并且您有兴趣撰写或为书籍做出贡献,请访问authors.packtpub.com。
分享您的想法
一旦您阅读了《使用 Amazon Bedrock 的生成式 AI》,我们很乐意听听您的想法!请点击此处直接进入此书的亚马逊评论页面并分享您的反馈。
您的评论对我们和科技社区都非常重要,它将帮助我们确保我们提供高质量的内容。
下载本书的免费 PDF 副本
感谢您购买这本书!
您喜欢在路上阅读,但又无法携带您的印刷书籍到处走吗?
您的电子书购买是否与您选择的设备不兼容?
别担心,现在每购买一本 Packt 书籍,您都可以免费获得该书的 DRM 免费 PDF 版本。
在任何地方、任何设备上阅读。从您最喜欢的技术书籍中搜索、复制和粘贴代码到您的应用程序中。
福利远不止于此,您还可以获得独家折扣、时事通讯和每日免费内容的专属访问权限
按照以下简单步骤获取福利:
- 扫描下面的二维码或访问以下链接

packt.link/free-ebook/9781803247281
-
提交您的购买证明
-
就这些!我们将直接将您的免费 PDF 和其他福利发送到您的邮箱
第一部分:Amazon Bedrock 基础
本部分建立了有效利用 Amazon Bedrock 的基本原则和实践。我们首先探索 Amazon Bedrock 提供的系列基础模型,提供对其功能和最佳用例的见解。接着,本书进入提示工程的高级技术,这是最大化大型语言模型潜力的关键技能。我们探讨了模型定制的策略,使用户能够根据其特定需求和领域定制这些工具。我们还考察了RAG的实施,这是一种通过整合外部知识源显著提升模型性能的尖端方法。
本部分包含以下章节:
-
第一章, 探索 Amazon Bedrock
-
第二章, 在 Amazon Bedrock 中访问和使用模型
-
第三章, 有效使用模型的工程提示
-
第四章, 定制模型以提升性能
-
第五章, 利用 RAG 的力量
第一章:探索亚马逊 Bedrock
全球各地的人们都对生成式 AI 的潜力感到惊讶,全球各地的行业都在寻求通过生成式 AI 在组织中进行创新和解决业务用例。
本章将向您介绍一个名为亚马逊 Bedrock的强大生成式 AI 服务。我们将首先提供一个生成式 AI 领域的概述。然后,我们将探讨行业在生成式 AI 方面面临的挑战以及亚马逊 Bedrock 如何有效地解决这些挑战。接下来,我们将探索亚马逊 Bedrock 目前提供的各种基础模型(FMs),并帮助您评估哪种模型适用于特定场景。此外,我们还将介绍亚马逊在基础模型之外的一些附加生成式 AI 功能。到本章结束时,您将对亚马逊 Bedrock 的生成式 AI 服务、模型选择标准以及亚马逊提供的更广泛的生成式 AI 功能有一个扎实的理解。
本章将涵盖以下主题:
-
理解生成式 AI 领域
-
什么是 FMs?
-
什么是亚马逊 Bedrock?
-
亚马逊 Bedrock 中的 FMs
-
评估和选择合适的 FM
-
亚马逊的生成式 AI 功能
-
使用亚马逊 Bedrock 的生成式 AI 用例
理解生成式 AI 领域
自 ChatGPT 问世以来,全球各地的组织都在探索大量生成式 AI 可以为他们解决的问题。他们建立了多个创新团队和数据科学家团队来构建和探索各种用例,包括总结长文档、从文档中提取信息以及执行情感分析以衡量对产品或服务的满意或不满意程度。如果您在机器学习(ML)或自然语言处理(NLP)领域工作,您可能熟悉语言模型的工作方式——通过理解文档中单词之间的关系。这些语言模型的主要目标是预测句子中的下一个可能的单词。
如果你观察句子 John loves to eat,一个自然语言模型正在尝试预测序列中的下一个单词或标记。在这里,下一个可能的单词似乎是 ice-cream,概率为 9.4%,如图 1.1所示:

图 1.1 – 句子序列预测
语言模型可以通过将每个单词转换为数值向量,也称为嵌入,来实现这一点。在向量空间中,相似的单词会彼此靠近,而不相似的单词在空间上会彼此远离。例如,单词 phone 会与单词 eat 相距甚远,因为这两个单词的语义意义不同。
早期的自然语言处理技术,如词袋模型和词频-逆文档频率(TF-IDF)评分以及n-gram分析,在语言建模任务中存在一些局限性。基于频率确定单词重要性的 TF-IDF 没有考虑句子中的语义上下文。表示相邻单词或字符的 n-gram 对于词汇表外的术语泛化效果不佳。为了推进语言建模,需要一种以捕捉单词的语义意义和单词之间关系的方式来表示单词。
在神经网络中,一种名为Word2Vec的词嵌入模型能够从大量文本语料库中学习关联。然而,Word2Vec 模型在处理词汇表外的单词时表现不佳。自 2010 年代以来,研究人员一直在尝试更先进的序列建模技术来解决这一局限性,例如循环神经网络(RNNs)和长短期记忆(LSTM)网络。这些模型具有记忆单元,允许它们在预测下一个单词时考虑句子中先前单词的上下文。与 Word2Vec 等模型相比,RNNs 和 LSTMs 可以捕捉更长的依赖关系。虽然这些模型在建模词序列方面非常强大,但它们在计算和内存消耗上更高,这意味着它们根据模型接收到的数据量可以保持有限的范围。因此,当提供包含多页文档时,这些模型无法很好地表现。
在 2017 年,谷歌和多伦多大学的学者们发表了一篇名为 Attention Is All You Need (arxiv.org/abs/1706.03762) 的论文。这篇论文介绍了 transformer 架构,它基于自注意力机制,而不是之前模型中使用的循环或卷积层。这种自注意力机制允许模型同时学习输入中所有单词(或一组标记)之间的上下文关系。它是通过计算每个单词相对于序列中其他单词的重要性来实现的。这种注意力被应用于推导出用于下游任务(如语言建模或机器翻译)的上下文表示。transformer 架构的一个主要优点是它能够对长序列的单词进行并行计算。这使得 transformer 能够比之前的循环模型更有效地应用于更长的文本和文档。
基于 Transformer 架构的语言模型展现出最先进(SOTA)和接近人类水平的性能。自从 Transformer 架构出现以来,已经开发了各种模型。这一突破为现代大型语言模型(LLMs),包括双向编码器表示的 Transformer(BERT)、生成式预训练语言模型(GPT)、文本到文本迁移 Transformer(T5)、BLOOM和Anthropic Claude铺平了道路。
现在,让我们深入了解一些正在推动生成式 AI 领域发生重大变化的 LLMs。
什么是 FM?
目前大多数生成式 AI 模型都由基于 Transformer 的架构驱动。一般来说,这些生成式 AI 模型,也广泛被称为 FM,使用 Transformer 是因为它们能够一次处理一个或整个序列的文本,使用自注意力。FM 在数百万或数十亿参数的大量数据上训练,使它们能够理解上下文中词语之间的关系,以预测后续序列。虽然基于 Transformer 架构的模型目前在领域内占据主导地位,但并非所有 FM 都依赖于这种架构。一些模型使用替代技术构建,例如生成对抗网络(GANs)或变分自编码器。
GANs 利用两个相互竞争的神经网络。第一个网络被称为生成器,其任务是生成模仿真实数据的合成样本。例如,生成器可以生成新的图像、文本或音频剪辑。第二个网络被称为判别器。其作用是分析示例,包括真实和合成的,以分类哪些是真实的,哪些是人工生成的。
通过这种对抗过程,生成器学会产生越来越令人信服的伪造品,可以欺骗判别器。同时,判别器在检测揭示合成样本的微妙异常方面变得更好。它们的竞争目标推动两个网络不断改进。一个 GAN 的例子可以在thispersondoesnotexist.com/找到。通过不断刷新页面,用户会看到一系列新颖的人类面孔。然而,它们都不是真实的——所有这些都是由一个在大量真实人类图像数据库上训练的 GAN 生成的合成肖像。该网站展示了 GAN 如何在许多领域合成高度逼真的输出。
变分自编码器是更易于训练的生成式 AI 算法,它也利用两个神经网络——一个编码器和一个解码器。编码器通过将其映射到低维潜在空间来学习数据中的模式,而解码器使用这些潜在空间中的模式来生成逼真的样本。
虽然这些 FMs(基于 Transformer、GAN 或变分自编码器)是在大量数据集上训练的,这使得它们与其他传统机器学习模型(如逻辑回归、支持向量机(SVM)、决策树等)不同。斯坦福大学人类中心化人工智能研究团队提出了“基础模型”这一术语,以区分它们与其他机器学习模型。传统的机器学习模型是在标记数据上训练的,并且只能执行狭窄定义的任务。例如,将有一个用于文本生成的模型,另一个用于摘要的模型,等等。
与之相反,FMs(基础模型)通过在包含数百万或数十亿参数的巨大数据集上进行训练,通过分析单词和句子之间的关系来学习语言中的模式。由于它们拥有庞大的预训练数据集,FMs 往往能够很好地泛化并理解上下文意义,这使得它们能够解决各种用例,例如文本生成、摘要、实体提取、图像生成等。它们的预训练使它们能够作为许多不同应用的极高适应性起点。图 1.2突出了传统机器学习模型和 FMs 之间的一些差异:

图 1.2 – 传统机器学习模型与 FMs
尽管有各种 FMs 可用,但组织在采用这些模型进行大规模部署时面临几个挑战:
-
没有单一模型解决方案:没有单一模型是针对所有任务进行优化的,而且随着新技术的进步,模型也在不断改进。为了应对多个用例,组织可能需要组装几个相互协作的模型。这可能会耗费大量时间和资源。
-
安全问题:安全和隐私是主要关注点,因为组织希望保护他们的数据和宝贵的知识产权,他们还希望控制这些模型如何共享和使用他们的数据。
-
时间和资源管理:对于文档摘要和虚拟助手等应用,需要特定的模型配置。这包括定义任务、授权访问内部数据源,以及为模型开发执行操作的 API。这需要一个多步骤的过程和复杂的编码。
-
缺乏无缝集成:能够无缝集成到现有应用中非常重要,以避免管理大型计算基础设施或承担高昂的成本。组织希望模型在幕后工作,无需任何重负载或费用。
解决这些技术、运营、安全和隐私挑战是组织成功采用和部署 FMs 的企业规模的关键。
这些正是亚马逊 Bedrock 旨在解决的问题。
什么是亚马逊 Bedrock?
Amazon Bedrock 是一项完全托管的服务,通过单个 API 提供各种高性能 FM 的选择。完全托管意味着用户无需担心创建、部署和运营后端基础设施,因为这一切都由 Amazon 负责。因此,您可以在应用程序或代码内部使用单个 API 调用 Bedrock 上的模型,该 API 包含您的提示。Amazon Bedrock 的一个关键优势是它提供了来自 Amazon 和顶级 AI 公司(如 Anthropic、AI21 Labs、Cohere、Meta、Stability AI 和 Mistral)的广泛选择。
一旦你定义了你的用例,下一步就是选择一个 FM。Amazon Bedrock 提供了一个沙盒体验(一个用于快速实验的 Web 界面),你可以在这里尝试不同的模型和提示。此外,还有一些技术和适用性标准你需要采用,以选择最适合你用例的模型。我们将在接下来的章节中学习如何评估 LLM。
一旦你评估并确定了适用于你的用例的 FM,重点就转向增强其预测能力。Amazon Bedrock 提供以下关键能力来优化模型性能:
-
告诉我巧克力蛋糕的做法或可以详细提示,包含多个示例,具体取决于你试图解决的问题的使用场景。凭借其沙盒体验,Amazon Bedrock 允许你通过快速实验有效地设计和制定提示。我们将讨论这些技术以及提示工程的一些实际方面,详见 第三章。 -
易于微调:Amazon Bedrock 允许你使用你的数据集轻松定制 FM。这个过程称为微调模型,涉及使用你的领域数据集进一步训练模型,以提高特定领域任务的准确性。微调可以直接从 Amazon Bedrock 控制台或通过 API 进行,并通过提供你的数据集在 Amazon 简单存储服务(Amazon S3)存储桶中完成。我们将在 第四章 中详细讨论微调 Amazon Bedrock FM。
-
原生支持 RAG:检索增强生成(RAG)是一种强大的技术,可以从语言模型外部获取数据,例如从内部知识库或外部来源,以提供针对特定领域用例的准确响应。当需要超出模型提供的上下文的大型文档时,这种技术非常有用。Amazon Bedrock 提供原生支持 RAG,因此您可以连接您的数据源以进行检索增强。我们将在 第五章 中更详细地讨论 RAG。
此外,亚马逊 Bedrock 还提供了额外的功能,例如构建智能代理来代表您协调和执行多项任务的能力。代理可以调用各种内部和外部数据源,连接到应用程序,并在多个步骤中运行复杂任务。我们将在第十章中深入探讨构建智能代理。
安全性、隐私性和可观察性是亚马逊 Bedrock 的一些关键功能。您在调用 FM 时提供的数据,包括提示和上下文,不会用于保留任何 FM。此外,所有 AWS 安全性和治理功能,包括数据加密、IAM 身份验证和权限策略、VPC 配置等,都适用于亚马逊 Bedrock。因此,您可以在静态和传输中加密您的数据。您可以告诉亚马逊 Bedrock 使用虚拟私有云(VPC),这样 AWS 托管系统组件之间的流量就不会通过互联网。此外,通过身份和访问管理(IAM),您可以提供对某些资源或用户的访问权限。此外,指标、日志和 API 调用被推送到 AWS CloudWatch 和 AWS CloudTrail,这样您就可以了解并监控亚马逊 Bedrock 模型的用法。本书的第三部分将涵盖模型评估、监控、安全、隐私以及确保安全和负责任的 AI 实践。
目前,让我们看看亚马逊 Bedrock 提供的不同 FM。
亚马逊 Bedrock 中的 FM
通过亚马逊 Bedrock,您可以使用亚马逊和领先 AI 公司(即 AI21、Anthropic、Command、Stability AI 和 Meta)提供的六种 FM,如图图 1**.3所示。亚马逊 Bedrock 可能会在未来添加更多 FM 的访问权限:

图 1.3 – 亚马逊 Bedrock 上可用的 FM
现在,让我们详细讨论这些模型中的每一个。
亚马逊泰坦 FM
亚马逊泰坦 FM代表一套由 AWS 通过在大量数据集上进行广泛预训练开发的强大、多用途模型,赋予它们在多个领域广泛适用的能力。此 FM 支持生成文本、问答、摘要、RAG、个性化、图像生成等多种用例。一个简单的例子就是生成文章/博客或撰写电子邮件。
目前在亚马逊 Bedrock 上可用的亚马逊泰坦模型有三种:泰坦文本生成、泰坦图像生成和泰坦嵌入。
泰坦文本生成
泰坦文本生成是一个为生成文本、摘要等用例设计的 LLM。假设约翰需要给他的电话运营商的客户支持团队写一封电子邮件,要求他们修复他一直面临的开账问题。我们可以向泰坦文本生成模型提供提示。响应将与主题一起生成,如图图 1**.4所示:

图 1.4 – Titan Text G1-Express 模型生成的响应
在撰写本文时,Titan 文本生成器提供三种不同的版本 – Titan Text G1 Lite、Titan Text G1 Express 和 Titan Text G1 Premier。主要区别在于 Lite 是一个更经济实惠且规模较小的模型,支持高达 4,000 个标记,Express 是一个更大的模型,支持高达 8,000 个标记,专为复杂用例设计,而 Premier 是 Titan 最先进的模型,支持高达 32k 个标记,旨在提供卓越的性能。
Titan 图像生成器
生成一张瑞士阿尔卑斯山滑雪兔子的图像。一旦生成图像,我们就可以创建单个图像的变体,甚至编辑图像,如 图 1.5 所示:

图 1.5 – Titan 图像生成器和其配置
在 第九章 中,我们将学习更多关于图像生成的工作原理,并深入了解各种用例。
Titan Embeddings
Titan Embeddings 模型的主要功能是将文本(或图像)转换为数值向量。这些向量以数学方式表示单词,使得相似的单词具有相似的向量。您可以将这些嵌入存储在如 OpenSearch、Aurora pgvector、Amazon Kendra 或 Pinecone 等向量数据库中,这些数据库将用于比较文本之间的关系。
在撰写本文时,Titan 嵌入模型提供两种变体 – Titan Text Embeddings 和 Titan Multimodal Embeddings。主要区别在于 Titan Text Embeddings 将文本转换为嵌入,这使得模型非常适合用于 RAG 和聚类等用例,而 Titan Multimodal Embeddings 可以将文本和图像的组合转换为嵌入,这使得它在图像搜索和提供推荐等用例中非常适用。
虽然 Titan Text Embeddings 支持高达 8,000 个标记和超过 25 种语言,但 Titan Multimodal Embeddings 可以支持高达 128 个标记,最大图像大小为 25 MB。在这里,英语是唯一支持的语言。
在下一章中,我们将学习如何调用这些模型及其输入配置参数。现在,让我们了解 Amazon Bedrock 提供的一些其他 FM。
AI21 Labs – Jurassic-2
AI21 Labs 已构建了多个 FM 和特定任务的模型。然而,在撰写本文时,Amazon Bedrock 提供了对 Jamba-Instruct、Jurassic 2 – Ultra 和 Jurassic 2 – Mid FM 的访问。
Jamba-Instruct 只支持英语,而 Jurassic-2 模型支持多种语言和用例,如高级文本生成、理解、开放式书籍问答、摘要等。
Jamba-Instruct 支持上下文标记长度为 256K,而 Jurassic-2 Ultra 和 Jurassic-2 Mid 都支持上下文标记长度为 8,192。
例如,提示“给我一些在家种植蔬菜的建议”。输出结果如图 1.6 所示:

图 1.6 – 激活 Jurassic-2 模型
Anthropic Claude
Anthropic 致力于安全负责任的 AI,并提供一系列 Claude 模型。这些模型支持问答、移除 个人身份信息(PII)、内容生成、角色扮演对话等多种用例。使用 Anthropic Claude 的一大好处是它能够处理更长的文本序列作为提示。截至目前,Claude 的最大上下文窗口为 200,000 个标记,它可以理解和回应更广泛的提示。这种更大的上下文允许 Claude 进行更深入的讨论,理解更长的叙述或文档,并生成更连贯的多段回应。
Amazon Bedrock 目前提供访问 Anthropic Claude 语言模型五个版本的权限:
-
Anthropic Claude 3.5 Sonnet:这设定了行业新的智能标准,在各种基准测试中优于其前辈和其他顶级 AI 模型。Claude 3.5 Sonnet 在视觉处理、内容生成、客户支持、数据分析、编码等领域表现出色。令人印象深刻的是,它在保持比之前 Anthropic 模型 80% 更高效成本的同时,实现了这种增强的性能,使其成为寻求在较低价格点获得先进 AI 功能企业的理想选择。以下链接突出了基准测试以及与其他模型在不同任务上的比较:https://aws.amazon.com/blogs/aws/anthropics-claude-3-5-sonnet-model-now-available-in-amazon-bedrock-the-most-intelligent-claude-model-yet/
-
Anthropic Claude 3:该模型有三个变体 – Claude 3 Opus、Claude 3 Sonnet 和 Claude 3 Haiku。它们是 Amazon Bedrock 上最近和最先进的 Anthropic 模型系列。所有这些模型都具有多模态功能,可以感知和分析图像(jpeg、png),以及其他文件类型,如 .csv、.doc、.docx、.html、.md、.pdf、.txt、.xls、.xlsx、.gif 以及文本输入,上下文窗口为 200K:
-
Claude 3 Opus:这是 Anthropic 到目前为止最强大的模型,拥有 1750 亿个参数。Opus 具有先进的少样本学习能力,只需少量示例即可快速适应各种任务。
-
Claude 3 Sonnet:一个拥有 600 亿个参数的多模态 AI 模型,Sonnet 具有强大的少样本学习能力。其参数高效的架构允许它处理复杂输入,如长文档,同时比 Opus 更具计算效率。
-
Claude 3 Haiku:在 70 亿参数下,Haiku 是 Anthropic 最紧凑和轻量级的模型。它针对效率进行了优化,提供了与其大小相匹配的高性能。其低计算需求使其推理非常快速。
-
-
Anthropic Claude 2.1 和 Claude 2:它们也是 Anthropic Claude 家族的先进补充。它们提供了高性能的推理能力和高精度,同时幻觉率较低。它们在对话、创意写作、信息、角色扮演、摘要等用例上表现良好。在上下文长度方面,Claude 2.1 支持高达200,000个标记,而 Claude 2 支持高达100,000个标记。
-
Anthropic Claude 1.3:这是一个较早的版本,具有当时 LLM 的典型功能。它在涉及事实回应、摘要和基本问答的任务上表现出色。在上下文长度方面,Claude 1.3 支持高达100,000个标记。
-
Anthropic Claude Instant 1.2:与其它 Claude 模型相比,这提供了一个更快、更经济的选项。Claude Instant 模型的延迟大大降低,但性能受到影响。然而,Claude Instant 仍然在许多常见的 NLP 应用中表现出强大的语言技能,这些应用不需要最高水平的推理或细微的回应,并且当速度或成本比绝对最高性能更重要时。在上下文长度方面,Claude Instant 1.2 支持高达100,000个标记。
我们将在下一章中通过一些示例来展示如何利用 Anthropic Claude 与 Bedrock 结合使用。
Cohere
Amazon Bedrock 提供了来自 Cohere 的多个模型:Command、Command R+、Command R、Command Light模型、Embed English和Embed Multilingual。Cohere Command,经过 520 亿参数训练,是一个适用于更复杂语言理解的 LLM。Command Light,具有 60 亿参数,既经济又快速,对于那些需要为应用提供更轻量级模型的用户来说是一个好选择。Command R+,在 1040 亿参数上训练,是 Cohere 在撰写本书时的最强大模型,并设计用于具有 128K 标记上下文窗口大小的任务。Command R,在 350 亿参数上训练,也是为具有 128K 标记上下文窗口大小的任务设计的。
Cohere Embed 提供了一系列经过训练以生成高质量嵌入的模型,这些嵌入我们已经知道是文本文档在向量空间中的数值格式表示。Cohere 提供Embed English,它仅针对英语文本进行训练,以及Embed Multilingual,可以处理多种(超过 100 种)语言。嵌入模型支持的最大标记长度为 512。这些嵌入模型为下游应用开辟了广泛的应用范围,例如语义搜索以查找相关文档、RAG、文本聚类、分类等。
注意以下图示,它突出了在 Amazon Bedrock 文本游乐场中使用 Cohere Command 模型对对话进行摘要的文本生成示例:

图 1.7 – 在 Amazon Bedrock 文本游乐场中的 Cohere Command 文本生成示例
Meta Llama 2 和 Llama 3
Meta 在其Llama 2和Llama 3系列下提供了几个预训练的 LLM,用于聊天机器人应用。其基础 Llama2 模型在超过 2000 万亿个公开在线数据源上进行预训练,此时它通过超过 100 万个人类标注示例进行微调。
通过 Amazon Bedrock,已经提供了四种 Llama2 变体:Llama 2 Chat 13B、Llama 2 Chat 70B、Llama 2 13B和Llama 2 70B。13B 模型包含 130 亿参数,其训练过程耗时 368,640 个 GPU 小时。Llama 13B 模型的一个关键优势是能够处理任意长度的输入序列,这使得它非常适合需要分析长文档或网页的任务。更大的 70B 模型变体包含 700 亿参数,其训练过程耗时 1,720,320 个 GPU 小时。70B 模型可用于多任务学习,这意味着它非常适合同时执行多个任务,如图像分类、语音识别和 NLP。与 13B 模型相比,它在多个任务上表现出改进的性能,这可能是由于其相对较大的规模和更高的计算资源。
除了 Llama2 之外,Meta 的 Llama 3 系列变体也已在 Amazon Bedrock 上提供,具体包括Llama 3 8B Instruct和Llama 3 70B Instruct。Llama 3 8B Instruct 模型针对计算资源有限的场景进行了优化,非常适合边缘设备和应用。它在文本摘要、文本分类、语言翻译和情感分析等任务中表现出色。Llama 3 70B Instruct 模型针对内容创作、对话式人工智能系统、语言理解和企业解决方案进行了定制。它在精确文本摘要、细微文本分类、复杂的情感分析和推理、语言建模、对话系统、代码生成和遵循复杂指令等领域表现出色。
对于希望利用这些模型的开发者,Meta 创建了一个名为llama-recipes的开源 GitHub 仓库(github.com/facebookresearch/llama-recipes/tree/main),其中包含将 Llama2 模型集成到聊天机器人和虚拟助手中的示例代码和示例。这为研究人员和实践者提供了一个起点,以便他们可以尝试 Llama2 并将其适应自己的对话式人工智能应用。
图 1**.8 展示了在 Amazon Bedrock 文本游乐场中使用 Meta Llama 2 Chat 13 B 模型进行实体提取的示例:

图 1.8 – 在 Amazon Bedrock 文本游乐场中使用 Llama 2 Chat 13B 模型进行实体提取
Mistral AI
Mistral AI 致力于构建计算高效、值得信赖且强大的 AI 模型。这些模型目前在 Amazon Bedrock 上提供四种变体 – Mistral 7B Instruct、Mixtral 8X7B Instruct、Mistral Large 和 Mistral Small:
-
Mistral 7B 指令:这是一个为教学任务设计的 70 亿参数稠密 Transformer 语言模型。它提供了性能和效率之间的诱人平衡,尽管其相对紧凑的尺寸,但仍然提供了适用于广泛用例的强大功能。Mistral 7B 指令支持处理英语自然语言和代码输入,具有扩展的 32,000 令牌上下文窗口容量。尽管比大型模型更有限,但 Mistral 7B 指令提供了针对教学应用的高质量语言理解、生成和任务执行,同时降低了计算成本。
-
Mixtral 8X7B:这是一个 70 亿参数稀疏混合专家语言模型,采用高度参数高效的架构。尽管其总体尺寸相对紧凑,但它为任何给定输入利用了 120 亿个活跃参数,与类似规模的稠密模型(如 Mistral 7B)相比,提供了更强的语言理解和生成能力。这种稀疏模型支持处理多种自然语言以及编码语言,满足广泛的跨语言和编程用例。此外,Mixtral 8X7B 保持扩展的上下文窗口为 32,000 令牌,使其能够有效地在长输入中建模长距离依赖关系。
-
Mistral 大型:它能够进行复杂推理、分析、文本生成和代码生成,并在处理英语、法语、意大利语、德语和西班牙语的复杂多语言任务方面表现出色。Mistral 大型支持最大上下文窗口为 32,000 令牌,使其能够处理长文本输入,同时在语言理解、内容创作和需要高级多语言能力的编码应用上提供最先进的性能。
-
Mistral 小型:这是一个为效率和成本效益而设计的先进语言模型。它擅长快速且经济高效地处理高容量、低延迟的语言任务。凭借其专业能力,Mistral 小型无缝地解决编码挑战,并在包括英语、法语、德语、西班牙语和意大利语在内的多种语言中流畅运行。Mistral 小型支持最大上下文窗口为 32,000 令牌。
图 1.9 展示了在 Amazon Bedrock 文本沙盒中使用 Mistral Large 模型的推理场景:

图 1.9 – Amazon Bedrock 文本沙盒中的 Mistral Large
Stability AI – 稳定扩散
稳定扩散是由 Stability AI 开发的,用于使用在大数据集上训练的扩散模型生成高度逼真图像。稳定扩散背后的核心技术称为潜在扩散,它涉及使用正向扩散过程在数据上逐渐添加噪声,以及反向扩散过程逐渐去除噪声并重建原始数据。在图像生成的案例中,这允许模型根据用户提供的文本或图像提示生成新的图像。
Amazon Bedrock 提供了 Stability AI 的 SDXL 0.8 和 SDXL 1.0 稳定扩散模型。稳定扩散模型旨在根据提供的文本或图像提示生成高度逼真的图像。SDXL 1.0 特别引人注目,因为其模型规模庞大。其基础模型包含超过 3.5 亿 个参数,而其集成管道使用两个模型,总参数量达到 6.6 亿。通过聚合多个模型的结果,集成方法可以生成更高品质的图像。
通过 Amazon Bedrock,开发者可以利用稳定扩散进行各种图像生成任务。这包括从文本描述生成图像(文本到图像)、基于现有图像生成新图像(图像到图像),以及填充缺失区域(修复)或扩展现有图像(扩展)。我们将在第九章中详细探讨这些内容。
让我们通过以下提示在 Amazon Bedrock 文本沙盒中运行一个简单的稳定扩散模型示例:a dog wearing sunglasses, riding a bike on mars。

图 1.10 – 使用稳定扩散模型生成图像
自动创建视觉内容的能力在广告、媒体和娱乐以及游戏等众多行业中都有广泛应用。在第九章中,我们将探讨稳定扩散在底层的工作原理。我们还将讨论在您的应用程序中利用图像生成模型的最佳实践和架构模式。
评估和选择合适的 FM
现在我们已经了解了在 Amazon Bedrock 中可用的不同类型的 FM,我们如何确定哪一个最适合我们的特定项目需求?本节将帮助您学习如何评估模型与您的用例的匹配度。
第一步是明确界定你试图解决的问题或你想要构建的用例。尽可能具体地描述输入、输出、涉及的任务以及其他任何要求。有了明确定义的用例,你可以研究哪些模型已经证明了与你的需求相关的功能。根据功能在最初就缩小选项范围将简化评估过程。
一旦你确定了一些潜在的候选模型,下一步就是检查它们在标准化基准和用例中的表现。Amazon Bedrock 提供了一种评估 FM 的能力,也称为模型评估作业。通过模型评估作业,用户可以选择使用自动模型评估或通过人工劳动力进行评估。我们将在接下来的章节中更详细地介绍 Amazon Bedrock 的模型评估。
此外,目前存在几个排行榜和基准,可以帮助进行这种评估,例如以下这些:
-
斯坦福 Helm 排行榜(针对大型语言模型)
-
HuggingFace 的开源排行榜
-
GLUE (
gluebenchmark.com/) -
SuperGLUE (
super.gluebenchmark.com/) -
MMLU (
paperswithcode.com/sota/multi-task-language-understanding-on-mmlu) -
BIG-bench (
github.com/google/BIG-bench)
检查每个模型在你相关用例的任务中的排名,可以提供一个对其能力的客观衡量。
除了基准性能外,还需要检查每个模型的每查询成本、处理延迟、是否需要微调的训练参数以及任何其他非功能性需求。正确的模型不仅需要实现你的技术目标,还需要符合你的成本和时间限制。
没有实际操作测试的评估是不完整的。利用 Amazon Bedrock 的文本游乐场或Amazon Partyrock来尝试在样本提示、文本生成任务或其他代表你预期用例的示例交互中测试候选者。有关 Amazon Bedrock 的文本游乐场和 Amazon Partyrock 的更多详细信息将在下一章中介绍。这种模型评估机制允许对生成语言质量、保持上下文的能力、响应的可解释性以及与每个模型交互的整体感觉等进行更定性的评估。
通过彻底研究能力、性能和需求,以及测试多个选项,你将能够为选择最适合你项目需求的 FM 做好准备。正确的选择将有助于确保项目的成功。
亚马逊的生成式 AI 能力
本书主要关注 Amazon Bedrock,但我们想突出亚马逊提供的其他一些生成式 AI 功能,这些功能正在企业中被用于加速开发者生产力、更快地进行创新以及轻松解决他们的用例。
Amazon SageMaker
Amazon SageMaker 是亚马逊的全托管机器学习平台,用于大规模构建、训练和部署机器学习模型。SageMaker 最强大的功能之一是 SageMaker Jumpstart,它提供了一系列预训练的开源 FM,这些 FM 已经准备好部署和使用。
SageMaker Jumpstart 中可用的 FM 示例包括 FLAN-T5 XL,这是 T5 转换器模型的微调 XL 版本,针对自然语言理解进行了优化。此外,Meta Llama2、AI21 Jurassic-2 Ultra 和 Stable Diffusion 模型等额外模型也可在 SageMaker Jumpstart 中找到。
除了直接部署这些预训练的 FM 之外,SageMaker Jumpstart 还提供了用于针对特定用例定制和微调选定模型的工具。例如,用户可以通过调整文本提示来执行提示工程,以更好地控制模型响应。一些模型还支持通过问答任务增强推理能力,以改善 LLM 的常识推理能力。微调功能允许您将语言模型适应特定领域的数据集。
这使得工程师和研究人员可以直接从 Jumpstart 利用这些生成式 AI 模型的力量,从而无需深入的专业知识即可构建新颖的应用程序。SageMaker 平台处理了部署、扩展和管理 ML 模型的所有繁重工作。当您在 SageMaker Studio UI 中打开 SageMaker Jumpstart 时,您将看到不同模型提供商提供的模型。这可以在图 1.11中看到:

图 1.11 – SageMaker Jumpstart
您可以根据您的用例选择要工作的模型,并将其直接部署到 SageMaker 端点,或者您可以使用自定义数据集对模型进行微调。图 1.12显示了 HuggingFace 在 SageMaker Jumpstart 上提供的几个开源模型,展示了在 SageMaker 中通过搜索栏或过滤器选项搜索适合特定任务的模型选择的简单性:

图 1.12 – SageMaker Jumpstart HuggingFace 模型
Amazon Q
Amazon Q 是一个基于 Amazon Bedrock 构建的生成式 AI 助手,旨在提高各个领域的生产力和加速决策制定。它可以帮助用户在从软件开发到数据分析再到决策制定的众多任务中。
这里是 Amazon Q 的关键功能概述。
Amazon Q for Business
Amazon Q for Business是一个企业级、由生成式 AI 驱动的助手,旨在简化组织内的运营并提高生产力。如果您有必要的权限,可以使用此工具访问和交互公司的数据存储库,简化任务并加速问题解决过程。以下是 Amazon Q for Business 的一些关键特性:
-
全面的数据集成:Amazon Q for Business 可以无缝连接到 40 多个流行的企业数据源,包括 Amazon S3、Microsoft 365 和 Salesforce。它确保基于现有的用户权限和凭证安全访问内容,利用单点登录提供无缝体验。
-
智能查询处理:您可以用自然语言提问,Amazon Q for Business 将跨所有连接的数据源进行搜索,逻辑地总结相关信息,分析趋势,并参与交互式对话。这使用户能够获得准确和全面的答案,消除了耗时的人工数据搜索需求。
-
可定制和安全的:组织可以通过配置管理护栏、文档丰富化和相关性调整来定制 Amazon Q for Business 以满足其特定需求。这确保了响应与公司指南保持一致,同时保持强大的安全和访问控制。
-
任务自动化:Amazon Q for Business 允许用户通过简单的自然语言提示来简化日常任务,例如员工入职请求或费用报告。此外,用户可以创建和共享任务自动化应用程序,进一步提高效率和生产力。
您可以像图 1.13所示的那样,只需几步即可设置 Amazon Q for Business 应用程序。

图 1.13 – 设置 Amazon Q for Business
想要了解更多关于设置 Amazon Q for Business 应用程序的详细信息,您可以查看以下链接:docs.aws.amazon.com/amazonq/latest/qbusiness-ug/getting-started.html

图 1.14 – 自定义 Amazon Q for Business 的网页体验
一旦设置好应用,用户就可以像图 1.14所示的那样自定义 Q 商业应用的网页体验。
现在我们来看一下 Amazon Q for QuickSight 的另一个产品。
Amazon Q for QuickSight
Amazon Q for QuickSight是为商业用户和分析人员设计的,旨在更有效地从数据中提取洞察。它利用生成式 AI 的能力来简化数据分析可视化的流程。以下是 Amazon Q for QuickSight 的一些关键特性:
-
直观的故事讲述:使用 Amazon Q for QuickSight,业务用户可以通过使用简单的自然语言提示从他们的数据中创建引人注目的叙事。这些故事可以包括视觉元素、图像和文本,使传达洞察和协调利益相关者更容易。
-
执行摘要:Amazon Q for QuickSight 可以自动生成执行摘要,突出显示来自您的仪表板的最重要趋势和统计数据。此功能通过提供关键洞察的快速快照来节省时间,消除了浏览多个视觉元素的需求。
-
自然语言问答:业务用户可以使用自然语言查询自信地回答有关其数据的问题。Amazon Q 可以理解模糊或一般性的问题,提供不同的观点,并通过叙事摘要提供上下文。
-
加速仪表板构建:分析师可以通过使用自然语言描述所需的可视化来显著减少构建仪表板所需的时间。Amazon Q 可以解释这些提示并在几秒钟内生成相应的视觉元素。
Amazon Q for Developer
Amazon Q for Developer 简化了 AWS 上的软件开发生命周期。以下是 Amazon Q for Developers 的一些关键功能:
-
直观的开发辅助:在 IDE 中,Amazon Q 可以提供实时代码建议,生成新的代码片段,并提供软件开发最佳实践的指导。这加速了编码过程并提高了生产力。
-
代码转换:Amazon Q 可以通过自动转换和优化您的代码到最新的语言版本和框架,帮助您升级和现代化您的遗留代码库。此功能确保您的应用程序保持最新和安全。
-
故障排除和维护:Amazon Q 可以帮助您诊断和解决 AWS 应用程序中的错误、bug 和问题。它还可以帮助您更有效地理解和管理工作负载,最小化在复杂控制台中导航的需求。
-
成本优化:通过分析您的 AWS 成本数据,Amazon Q 可以提供有关您的云支出模式的宝贵见解,帮助您识别节省成本的机会,并优化您的云基础设施以实现更好的成本效率。
图 1**.15 和 图 1**.16 展示了 Amazon Q Developer 的一个示例,用于帮助软件工程师或开发者提高生产力。

图 1.15 – Amazon Q Developer

图 1.16 – Amazon Q Developer Lambda 函数
使用 Amazon Q,开发者可以简化他们的工作流程,从规划和发展到测试、部署和维护,最终使他们能够更快、更有信心地交付高质量的应用程序。
Amazon Bedrock 上的生成式 AI 用例
自从生成 AI 的出现以来,众多组织已经从这种变革性技术的潜在应用中受益,以实现其商业目标。这些组织包括埃森哲、阿迪达斯、Intuit 和 Salesforce,它们已经成功开发了原型,甚至已经使用 Amazon Bedrock 部署了生产就绪的生成 AI 系统。在各个行业中,我们已经看到了许多令人信服的 Amazon Bedrock 生成 AI 用例。让我们更详细地了解一些这些行业:
-
金融: 在金融服务领域,组织一直在研究诸如对大量法律文件进行分类和分类、为客户选择最佳融资和投资计划、提供复杂金融文件的见解和简化摘要以及问答,以及检测伪造签名和篡改发票等欺诈活动等用例。此外,组织正在利用 Amazon Bedrock 来理解市场趋势和客户行为,帮助进行明智的决策过程。
-
医疗保健: 医疗保健行业在开发 Amazon Bedrock 的生成 AI 应用方面投入了大量资金。在撰写本文时,已宣布 AWS HealthScribe,它由 Amazon Bedrock 驱动(
aws.amazon.com/healthscribe/)。这些应用涵盖了广泛的使用案例,例如自动化医疗索赔和裁决流程,从健康文件和医学研究论文中提取有价值的见解,以及生成患者-医生互动的摘要。通过利用 Amazon Bedrock,医疗保健提供者旨在提升患者护理并推动该领域的创新。 -
媒体和娱乐: 在媒体和娱乐行业,组织正在积极探索 Amazon Bedrock 的多样化应用。这包括在体育和广播中生成叙事和剧情,为故事讲述创建字幕、图像和动画,以及为电视节目、电影和其他形式的娱乐提供个性化推荐。通过利用 Amazon Bedrock 生成 AI 的能力,媒体和娱乐公司旨在提升用户体验,创造引人入胜的内容,并保持竞争优势。
这只是众多行业中正在研究的众多用例中的几个例子。在后续章节中,我们将了解通过 Amazon Bedrock 构建行业特定用例的架构模式。
摘要
在本章中,我们探讨了生成式 AI 领域的各个方面:从理解语言模型和开发各种自然语言处理(NLP)技术到当前最先进的(SOTA)Transformer 模型的发明。然后,我们讨论了在规模上构建生成式 AI 应用时遇到的工业挑战,以及亚马逊 Bedrock 如何无缝地解决这些挑战。
此外,我们探讨了亚马逊 Bedrock 提供的各种功能模块(FMs),并提供了如何利用各种框架和工具来评估和选择适合您用例的正确 FMs 的见解。我们还研究了亚马逊提供的其他生成式 AI 能力,包括亚马逊 SageMaker 和亚马逊 Q。我们通过揭示亚马逊 Bedrock 在金融服务、医疗保健和媒体娱乐领域的几个生成式 AI 用例来结束本章。
在下一章中,我们将发现几种访问亚马逊 Bedrock 的技术,并通过无服务器服务深入了解各种 API。此外,我们将学习一种实际的方法来调用 Bedrock FMs,这些 FM 可以集成到企业级应用中。
第二章:访问和利用 Amazon Bedrock 中的模型
本章提供了一本实用的指南,用于访问 Amazon Bedrock 并揭示其生成式 AI 功能。我们将从介绍调用 Bedrock 模型的不同接口开始,包括控制台游乐场、命令行界面(CLI)和软件开发工具包(SDK)。然后,我们将揭示一些核心的 Bedrock API,以及您可以在您的环境中运行的代码片段。最后,我们将展示如何在 LangChain Python 框架中利用 Bedrock 来构建定制化的管道,这些管道将连接多个模型,并深入了解 PartyRock,这是 Amazon Bedrock 的一个强大游乐场。
在本章结束时,您将能够通过利用 Amazon Bedrock 提供的 SOTA FM 来运行和执行应用程序,随着您对每个可用的 FM 的深入了解以及如何利用它们来满足您的需求,您还将能够加速您在构建新的生成式 AI 应用程序方面的创造性思维。随着我们深入构建 PartyRock 中的酷炫应用程序,并学习如何将 Amazon Bedrock 集成到不同的用例中,您将能够做到这一点。
本章将涵盖以下关键主题:
-
访问 Amazon Bedrock
-
使用 Amazon Bedrock API
-
Amazon Bedrock 集成点
技术要求
对于本章,您需要访问一个 Amazon Web Services(AWS)账户。如果您还没有,您可以去 aws.amazon.com/getting-started/ 创建一个。
完成此操作后,您需要安装和配置 AWS CLI (aws.amazon.com/cli/),因为您需要它从您的本地机器访问 Amazon Bedrock FM。由于我们将执行的多数代码块都是基于 Python 的,因此设置 AWS Python SDK(Boto3)(docs.aws.amazon.com/bedrock/latest/APIReference/welcome.html) 将是有益的。您可以通过在本地机器上安装 Python、使用 AWS Cloud9、利用 AWS Lambda 或利用 Amazon SageMaker 来设置 Python。
注意
调用和定制 Amazon Bedrock 的 FM 将产生相关费用。请参阅 aws.amazon.com/bedrock/pricing/ 了解更多信息。
访问 Amazon Bedrock
当构建生成式 AI 应用程序时,您将面临令人眼花缭乱的选项。您应该使用哪个 FM?您将如何确保安全和隐私?您是否有支持大规模部署的基础设施?这就是 Amazon Bedrock 的作用。
如您所知,Amazon Bedrock 提供了访问来自该领域领先 AI 公司的 SOTA FM 的选择,包括 AI21 Labs、Anthropic、Cohere、Meta、Stability AI、Amazon 和 Mistral。通过单个 API,您可以访问跨文本、嵌入和图像等模态的尖端生成式 AI。您可以根据需要混合匹配模型以找到最佳匹配。Bedrock 在幕后处理供应、可扩展性和治理。因此,您可以选择最适合您需求的最佳模型,并简单地调用 Bedrock 无服务器 API 将这些模型插入到您的应用程序中。
因此,让我们跳转到 AWS 控制台,看看 Amazon Bedrock 的实际应用。
当您通过访问 https://console.aws.amazon.com/ 并在搜索栏中选择 Bedrock 来在 AWS 控制台中打开 Amazon Bedrock 时,您可以探索不同的 FM,以及一些学习工具,如图 图 2.1 所示:

图 2.1 – Amazon Bedrock – 概览
Amazon Bedrock 通过其沙盒界面为用户提供实验各种模型的灵活性。用户可以通过访问 Amazon Bedrock 登录页面并点击 示例 来打开沙盒环境,从 AWS 控制台中访问 Bedrock 沙盒。
注意
在撰写此书时,用户将需要首先通过导航到 Bedrock 控制台左侧面板中的 模型访问 链接来启用对模型的访问(如图 图 2.2 所示)。一旦您到达 模型访问 页面视图,您可以通过点击 管理模型访问,选择您想要用于用例的基本模型列表,然后点击 保存更改。用户将立即获得对这些模型的访问权限。用户还可以查看相邻基本模型的 EULA 协议,以查看其服务条款。
在沙盒中,您可以探索 Bedrock 中可用的不同生成式 AI 模型示例。这允许您在不配置资源或编写任何代码的情况下测试和交互这些模型。总的来说,沙盒为用户提供了一种方便的方式来尝试 Bedrock 生成模型的特性。图 2.2 描述了 Amazon Bedrock 控制台中的一些可用功能:

图 2.2 – Amazon Bedrock 的功能
在游乐场内,您可以选择基于文本、聊天和图像的示例进行探索。这使您能够在方便的沙盒环境中亲手实验最新的生成式 AI 模型。从对话聊天机器人到文本和图像生成,选项的广泛性让您能够亲身体验各种 AI 功能。通过提供易于访问的入口点,新兴的生成式 AI 对用户来说变得更加具体和易于理解。现在,让我们更详细地了解每个部分。
Chat 游乐场
Amazon Bedrock 为您提供了访问聊天模型的方式,您可以在Chat 游乐场中进行实验。
Chat 游乐场是一个实验性界面,允许您测试通过 Amazon Bedrock 可用的对话式 AI 模型。您可以输入示例提示并查看由所选模型生成的响应。还会显示使用指标以评估模型的表现。还有一个比较模式,可以并排对比最多三个不同模型的输出。
如以下图所示,用户可以选择他们想要使用的模型(图 2.3):

图 2.3 – 选择模型
此后,用户可以在聊天框中输入查询(图 2.4):

图 2.4 – 在 Chat 游乐场中查询聊天模型
运行查询会从所选模型中获取信息。这允许您评估准确性、响应长度、延迟以及适用性等因素。选择最佳模型取决于权衡这些因素与个人需求。
在调用 FM 时,您将看到修改推理参数的选项,这样您就可以以某种方式影响模型的响应。虽然一些推理参数在 LLM 中是通用的,但图像模型有一组用户可以调整的独立参数。
让我们看看这些常见参数中的一些。
LLM 推理参数
温度、Top P、Top K、响应长度、停止序列和最大标记数是我们将在本节中详细了解的推理参数。图 2.5 显示了它们在 Amazon Bedrock Chat 游乐场屏幕上;它们可以在配置窗口中找到:

图 2.5 – 常见 LLM 推理参数
让我们更仔细地看看:
-
温度:此参数控制输出中的随机程度。较低的温度会导致更确定性的输出,倾向于最可能的选项。另一方面,较高的温度会促进随机性,导致更广泛和多样化的创意输出。例如,在问答任务中,较低的温度确保了更事实性和简洁的回答,而如果你的用例涉及生成创意和多样化的输出,如创意写作或广告生成,那么增加温度值可能是有益的。
-
Top K 和 Top P:可以使用如 Top K 和 Top P 这样的采样技术来增强输出的连贯性和意义感。Top K 限制选项数量为指定数量,确保在随机性和连贯性之间保持平衡。另一方面,Top P 限制了预测概率低于指定阈值的预测,防止选择高度不可能的选项。这些技术有助于在生成连贯文本和保持一定程度的随机性之间取得平衡,使文本生成过程对读者来说更加自然和吸引人。
使用这些参数可以平衡新颖性和流畅性。例如,可以将 Top K 设置为 70,Top P 设置为 0.8。这允许通过 Top P 设置使用一些不常见但仍然相关的单词,而 Top K 则保持对更常见单词的关注。结果是文本相当流畅,偶尔会混入一些新颖的单词。您可以通过对 Top K 和 Top P 使用不同的值来实验,以实现特定生成 AI 应用所需的创新性与流畅性之间的平衡。可以从大约 50 到 100 的 Top K 值和大约 0.7 到 0.9 的 Top P 值作为合理的初始设置开始。最佳值取决于模型大小、数据集和用例等因素。
-
bedrock,模型将在生成的文本中遇到单词 bedrock 时立即停止生成输出。 -
用 100 个单词写一句话。
图像模型推理参数
在使用 FM 进行图像生成时,几个关键参数会影响推理过程。例如,在稳定扩散模型的情况下,模型接收一个文本提示和一个随机噪声向量来生成图像。模型的几个配置设置可以影响最终生成的图像,如图 图 2.6 所示。6*:

图 2.6 – 图像模型推理参数
让我们更仔细地看看这些参数:
-
提示强度:这控制了随机程度。降低 提示强度 值会生成更随机的图像,而增加它则会生成更准确提示的表示。
-
生成步骤:与 提示强度 类似,增加 生成步骤 值会生成更复杂和详细的图像,而减少它则会生成更简单的图像。
-
种子:种子参数控制随机数生成器的初始状态,这会影响生成图像的整体随机性。需要注意的是,这些参数的精确值可能因具体用例和图像保真度与随机性之间的期望权衡而异。
要详细了解这些参数,请查看 Stable Diffusion 文档:platform.stability.ai/docs/api-reference#tag/Image-to-Image。
如果你正在使用 Amazon Titan Image Generator,你可以使用各种参数。你可以找到完整的列表在 docs.aws.amazon.com/bedrock/latest/userguide/model-parameters-titan-image.html。
文本游乐场
文本游乐场为评估 Amazon Bedrock 中的生成文本模型提供了类似的功能。你可以输入文本提示,所选模型将在此基础上扩展或继续作为更长的生成文本段落,反映该提示。模型扩展的文本显示在游乐场的界面上。
然而,文本游乐场不管理对话上下文。本质上,它从放置在文本游乐场窗口中的文本末尾生成一系列最可能的标记。在文本游乐场中展示的行为是聊天行为的基本构建块,当在多个回合中串联起来时,它可以创建聊天体验。
因此,类似于Chat 游乐场,用户也可以导航到文本游乐场,选择另一个模型(例如,如图 2.7所示,Anthropic Claude 3 Sonnet),更新推理配置,并提示模型为他们的用例生成响应:

图 2.7 – 在文本游乐场中添加提示
图像游乐场
在图像游乐场中,你可以尝试两种不同的图像模型:Amazon Titan Image Generator 和 Stability AI 的 Stable Diffusion。如果你对这些听起来很陌生,请参阅第一章中同名的子章节。这些模型通过文本或图像生成图像,并执行修复、图像编辑等操作。让我们看看一个例子:

图 2.8 – 在图像游乐场中添加提示
如图 2.8 所示,当我们提供“高质量、复杂细致、超现实主义猫摄影、体积光照、全角色、4k、宇航服”作为提示时,模型会根据提供的文本生成图像。在配置中,您还可以选择提供否定提示值,告诉模型它不应该生成的内容。此外,您还可以提供参考图像值,模型将使用该图像作为生成图像的参考。在第九章中,我们将探讨如何使用 Amazon Bedrock 进行图像生成和编辑。
基于 API 的方法
使用统一的推理 API 的一大好处是,它允许您通过相同的界面轻松地尝试来自不同提供商的不同模型。即使新模型版本发布,您也可以通过最小的代码更改在您的端进行替换。
单一 API 抽象层充当绝缘层,保护您的应用程序代码免受底层模型实现细节的影响。这使您摆脱了供应商锁定,并赋予您采用最新模型的灵活性。有了这种一致的 API 来屏蔽这种复杂性,您可以专注于产品创新,而不是工程物流。
Amazon Bedrock 提供了一组可以直接访问和利用的 API,通过 AWS CLI 或 AWS SDK。
AWS CLI
list-foundation-models API:
$ aws bedrock list-foundation-models
同样,要调用模型(例如,Mistral 7B Instruct 模型),您可以调用 bedrock-runtime 的 invoke-model API。在撰写本文时,用户必须从控制台请求模型访问权限。一旦在系统中获得授权,就可以使用以下代码调用相应的模型:
$ aws bedrock-runtime invoke-model \
--model-id mistral.mistral-7b-instruct-v0:2 \
--body "{\"prompt\":\"<s>[INST]100 words tweet on MLOps with
Amazon SageMaker [/INST]\", \"max_tokens\":200, \"temperature\":0.5}" \
--cli-binary-format raw-in-base64-out \
output.txt
在 invoke-model API 调用的 body 参数中,我们可以看到它是以特定格式编写的("{\"prompt\":\"<s>[INST]text [/INST]\"})。在调用模型时,不同的模型可能需要不同的提示结构。如果您在 AWS 控制台中搜索 Amazon Bedrock,可以查看发送给模型的实际 API 请求。按照以下步骤查看 API 请求:
-
通过导航到
console.aws.amazon.com/并在搜索栏中选择Bedrock,在 AWS 控制台中打开 Amazon Bedrock。 -
在入门下选择提供商。
-
选择您选择的任何提供商和模型。
-
滚动到模型部分并展开API 请求。
在图 2.9 中,您可以看到来自 Mistral 7B Instruct 模型的 API 请求的 JSON 格式。在 API 请求的 body 参数中,我们可以看到模型需要的提示格式,以及推理参数:

图 2.9 – Mistral 7B Instruct API 请求
这使得用户输入的格式化和传递到底层 AI 系统的过程具有透明度。总的来说,沙盒允许用户不仅测试提示,还可以检查生成 AI 响应所发出的 API 请求。
AWS SDK
AWS 为 JavaScript、Python、Java 等多种编程语言提供了 SDK。这些 SDK 提供了包装库,使得将 Bedrock API 调用集成到您的代码中变得容易。使用针对您选择的编程语言量身定制的 SDK 通常是有益的。查阅您选择语言的 SDK 文档可以提供有用的代码示例、使用指南和其他资源,以确保集成过程顺利进行(docs.aws.amazon.com/bedrock/latest/APIReference/welcome.html)。
您可以通过 AWS SDK 从本地机器调用这些 Bedrock API,或者使用 AWS 服务,如 AWS Lambda、Amazon SageMaker Studio 笔记本、AWS Cloud9 等。使用 Python 的 AWS SDK(Boto3),您可以调用 Bedrock API 来构建 ML 工作流程。让我们看看 Amazon Bedrock 提供的 API 及其在 Python 的 AWS SDK(Boto3)中的使用示例。
到目前为止,我们已经探索了通过 Amazon Bedrock 提供的 FM 系列,通过实验各种提示和调整推理配置来产生期望的输出。我们直接通过 Amazon Bedrock 沙盒使用模型,并检查了利用 AWS CLI 和各种 SDK 来程序化调用 FM。
在建立这个工作知识的基础之后,我们将深入调查 Amazon Bedrock 的 API。下一节将帮助我们利用这些 API 在自定义生成 AI 应用中发挥 FM 的力量,同时为开发者提供更多控制和定制。我们将规划一个端到端的工作流程——从初始化客户端到生成输出——这将使您能够构建由工业级 FM 驱动的强大、可靠的生成应用。
使用 Amazon Bedrock API
与其他 AWS 服务一样,Amazon Bedrock 提供了几个 API。这些 API 可以放置在控制平面 API 下,用于管理、训练和部署 FM,以及在运行平面 API 下进行调用或推理请求。一些常见的控制平面 Bedrock API 包括ListFoundationModels、GetFoundationModels和CreateModelCustomizationJob。另一方面,运行平面 API 有两个 API:InvokeModel和InvokeModelWithResponseStream。
此外,还有与 Amazon Bedrock 的代理相关的单独 API,我们将在第十章中更详细地介绍。
您可以在 docs.aws.amazon.com/bedrock/latest/APIReference/ 找到 Amazon Bedrock 支持的所有 API 调用完整列表,包括您可以执行的所有数据类型和操作。让我们看看一些常用的 Bedrock API 调用。
ListFoundationModels
要利用 Bedrock 的生成能力,第一步是发现哪些 FM 通过该服务可用。ListFoundationModels API 获取有关基础模型的元数据,包括使用该模型生成内容所需的唯一模型 ID。
以下 Python 代码示例演示了如何调用 ListFoundationModels API 来列出可用的基础模型:
import boto3
bedrock_client = boto3.client(service_name='bedrock')
bedrock_client.list_foundation_models()
让我们考虑一些目前通过 Amazon Bedrock 提供的基础模型及其相应的模型 ID。您使用模型 ID 作为一种方式来指示基础模型,当用户打算使用 InvokeModel (docs.aws.amazon.com/bedrock/latest/APIReference/API_runtime_InvokeModel.html) 或 InvokeModelWithResponseStream (docs.aws.amazon.com/bedrock/latest/APIReference/API_runtime_InvokeModelWithResponseStream.html) 调用利用任何现有模型时。有了这些信息,就可以选择所需的模型并使用其 ID 调用其他 Bedrock 操作,例如 InvokeModel,以生成满足您应用程序需求的内容。
GetFoundationModel
通过 Amazon Bedrock,开发者可以通过 GetFoundationModel API 调用来访问最先进的生成式 AI 模型。此操作检索有关指定基础模型的详细信息。例如,要返回 Meta 的 Llama 3 70B Instruct 模型的详细信息,您可以在 Python 中运行以下代码:
import boto3
bedrock_client = boto3.client(service_name='bedrock')
bedrock_client.get_foundation_model(modelIdentifier='meta.llama3-70b-instruct-v1:0')
InvokeModel
InvokeModel API 简化了机器学习模型的部署。只需几步 API 调用,您就可以安全地将训练好的模型部署到 AWS 基础设施上。这消除了管理复杂部署流程的需求,让您能够专注于 AI 应用程序的核心。
您可以使用请求体中提供的输入调用指定的 Bedrock 模型进行推理。InvokeModel API 允许您为各种模型类型运行推理,包括文本、嵌入和图像模型。这使用户能够通过将数据传递到模型并接收所需输出,利用通过 Amazon Bedrock 提供的预训练模型生成预测和洞察。
这里是一个将文本发送到 Meta 的 Llama 3 70 B 模型的 API 请求示例。推理参数取决于您将要使用的模型。
import boto3
import json
model_id = 'meta.llama3-70b-instruct-v1:0' # change this to use a different version from the model provider
prompt_data = "What is the significance of the number 42?"
# Following the request syntax of invoke_model, you can create request body with the below prompt and respective inference parameters.
payload = json.dumps({
'prompt': prompt_data,
'max_gen_len': 512,
'top_p': 0.5,
'temperature': 0.5,
})
bedrock_runtime = boto3.client(
service_name='bedrock-runtime',
region_name='us-east-1'
)
response = bedrock_runtime.invoke_model(
body=payload,
modelId=model_id,
accept='application/json',
contentType='application/json'
)
response_body = json.loads(response.get('body').read())
print(response_body.get('generation'))
如前述代码块所示,InvokeModel 操作允许您对模型进行推理。modelId 字段指定了要使用的模型。获取 modelId 的过程取决于模型类型。通过利用 InvokeModel 操作并指定适当的 modelId 值,用户可以利用大量生成式 AI 模型的力量来获取相关的见解。
如果您正在使用 Anthropic Claude 模型,您可以使用 Messages API 创建会话式界面来管理用户与模型之间的聊天。以下是一个可以向 Anthropic Claude Sonnet 3 模型发送的 API 请求示例:
import boto3
import json
bedrock_client = boto3.client('bedrock-runtime',region_name='us-east-1')
prompt = """
Task: Compose an email to customer support team.
Output:
"""
messages = [{ "role":'user', "content":[{'type':'text','text': prompt}]}]
max_tokens=512
top_p=1
temp=0.5
system = "You are an AI Assistant"
body=json.dumps(
{
"anthropic_version": "bedrock-2023-05-31",
"max_tokens": max_tokens,
"messages": messages,
"temperature": temp,
"top_p": top_p,
"system": system
}
)
modelId = "anthropic.claude-3-sonnet-20240229-v1:0"
accept = "application/json"
contentType = "application/json"
response = bedrock_client.invoke_model(body=body, modelId=modelId, accept=accept, contentType=contentType)
response_body = json.loads(response.get('body').read())
print(response_body)
API 通过接受一系列交替包含 用户 和 助手 角色的消息来管理对话的来回流动。要了解更多关于 Messages API 的信息,您可以查看文档:docs.anthropic.com/claude/reference/messages_post。
Amazon Bedrock 还允许您精确配置模型所需的吞吐量,以提供对应用程序的响应性能。使用 Provisioned Throughput,您可以选择模型所需的计算能力以满足您的工作负载需求和延迟要求。因此,对于 Amazon 和第三方基础模型,以及定制模型,用户在运行推理之前可以购买 Provisioned Throughput。此功能确保您获得模型所需的保证吞吐量,以实现最佳成本和性能。有关 Provisioned Throughput 的更多详细信息,请参阅此处:docs.aws.amazon.com/bedrock/latest/userguide/prov-throughput.html。
InvokeModelWithResponseStream
通过 Amazon Bedrock 可用的此流式推理方法允许 FM 生成按需的长篇连贯内容。而不是等待生成完成,应用程序可以流式传输结果。这允许您以更快的块发送来自模型的响应,而不是等待完整的响应。
使用流式处理进行推理时,您可以直接调用 Amazon Bedrock 提供的 InvokeModelWithResponseStream 操作。这将使用给定的输入在模型上运行推理,并以流的形式逐步返回生成的内容。
让我们看看 Claude V2 模型如何生成一篇关于量子计算的 500 字博客。
注意
以下代码片段在 Jupyter Notebook 环境中运行时有效。Jupyter Notebook 提供了额外的功能初始化,使得此代码能够正确运行。如果在没有 Jupyter 环境的终端中直接运行此片段,可能会导致错误。为了获得最佳结果,请在 Jupyter Notebook 中而不是在终端中直接运行此代码。
from IPython.display import clear_output, display, display_markdown, Markdown
import boto3, json
brt = boto3.client(service_name='bedrock-runtime', region_name='us-east-1'
)
payload = json.dumps({
'prompt': '\n\nHuman: write a blog on quantum computing in 500 words.\n\nAssistant:',
'max_tokens_to_sample': 4096
})
response = brt.invoke_model_with_response_stream(
modelId='anthropic.claude-v2',
body=payload,
accept='application/json',
contentType='application/json'
)
streaming = response.get('body')
output = []
if streaming:
for event in streaming:
chunk = event.get('chunk')
if chunk:
chunk_object = json.loads(chunk.get('bytes').decode())
text = chunk_object['completion']
clear_output(wait=True)
output.append(text)
display_markdown(Markdown(''.join(output)))
这将连续打印出由模型产生的生成的博客文本。这种基于流的处理方法允许在 Claude V2 编写博客内容时实时显示输出。因此,流式推理为大型生成式模型解锁了新的实时和交互式用例。
在本节中,我们探讨了 Amazon Bedrock 的关键 API,所有这些 API 都允许我们构建生成式 AI 应用程序。我们回顾了如何列出通过 Amazon Bedrock 可用的 FM,并详细说明了如何调用这些模型以生成定制输出。接下来,我们将揭示 Amazon Bedrock 如何与 LangChain 集成以编排和解决复杂用例。通过利用 Bedrock 的 API 和 LangChain 的编排,开发者可以构建复杂的生成式解决方案。
Converse API
Amazon Bedrock 的 Converse API 提供了一种标准化的方法来与通过 Amazon Bedrock 可用的 LLM 进行交互。它促进了用户和生成式 AI 模型之间的回合制通信,并确保支持函数(称为 函数调用)的模型具有一致的工具定义。
Converse API 的重要性在于其能够简化集成过程。之前,使用 InvokeModel API 需要适应来自不同模型提供者的各种 JSON 请求和响应结构。通过 Converse API,实现了对所有 Amazon Bedrock 上的 LLM 的请求和响应格式的统一,简化了开发并确保了一致的交互协议。
让我们通过一个使用 Converse API 进行文本生成场景的示例来了解其用法,该示例利用了 Anthropic Claude 3 Sonnet 模型。请确保您有调用 Converse API 所需的权限,因为您需要 bedrock:InvokeModel 操作的权限。
# Install the latest version for boto3 to leverage Converse API. We start with uninstalling the previous version
%pip install boto3==1.34.131
# Import the respective libraries
import boto3
import botocore
import os
import json
import sys
#Ensure you have the latest version of boto3 to invoke Converse API
print(boto3.__version__)
#Create client side Amazon Bedrock connection with Boto3 library
region = os.environ.get("AWS_REGION")
bedrock_client = boto3.client(service_name='bedrock-runtime',region_name=region)
model_id = "anthropic.claude-3-sonnet-20240229-v1:0"
# Inference parameters
top_k = 100
temp = 0.3
# inference model request fields
model_fields = {"top_k": top_k}
# Base inference parameters
inference_configuration = {"temperature": temp}
# Setup the system prompts and messages to send to the model.
system_prompts = [{"text": "You are an expert stylist that recommends different attire for the user based on the occasion."}]
message_1 = {
"role": "user",
"content": [{"text": "Give me top 3 trending style and attire recommendations for my son's graduation party"}]
}
messages = []
# Start the conversation with the 1st message.
messages.append(message_1)
# Send the message.
response = bedrock_client.converse(
modelId=model_id,
messages=messages,
system=system_prompts,
inferenceConfig=inference_configuration,
additionalModelRequestFields=model_fields
)
# Add the response message to the conversation.
output_message = response['output']['message']
print(output_message['content'][0]['text'])
请注意,将模型 ID 切换到 Amazon Bedrock 上可用的其他文本生成 FM,允许它使用 Converse API 运行。上面的代码示例以及其他 Converse API 示例已添加到 GitHub 仓库中,供读者在自己的账户中进行实验。
Converse API 还可以处理文档和图像。例如,您可以在消息中发送图像或文档,并使用 Converse API 让模型描述其内容。有关 Converse API 支持的模型和模型功能的更多详细信息,请访问 docs.aws.amazon.com/bedrock/latest/userguide/conversation-inference.html#conversation-inference-call
同样,ConverseStream API 使得向特定的 Amazon Bedrock 模型发送消息并接收连续流中的响应变得容易。它提供了一个统一的界面,该界面适用于 Amazon Bedrock 支持的所有基础模型进行消息传递。
要使用ConverseStream API,您可以使用Converse API 来调用它。请注意,您需要bedrock:InvokeModelWithResponseStream操作权限才能使用ConverseStream。
# Send the message.
model_response = bedrock_client.converse_stream(
modelId=model_id,
messages=messages,
system=system_prompts,
inferenceConfig=inference_config,
additionalModelRequestFields=additional_model_fields
)
# # Add the response message to the conversation.
stream = model_response.get('stream')
if stream:
for event in stream:
if 'contentBlockDelta' in event:
print(event['contentBlockDelta']['delta']['text'], end="")
当您运行上述代码示例时,它将流式传输响应输出。有关ConverseStream的更多信息,请参阅docs.aws.amazon.com/bedrock/latest/APIReference/API_runtime_ConverseStream.html的文档。
Amazon Bedrock 集成点
当构建端到端生成式 AI 应用时,架构师必须遵循 AWS Well-Architected Framework 支柱中概述的安全、性能、成本优化和延迟降低的最佳实践。这些实践帮助开发者权衡在 AWS 上创建端到端系统时的不同选择和优化。有关 AWS Well-Architected Framework 的更多信息,请参阅docs.aws.amazon.com/wellarchitected/latest/framework/welcome.html。
许多希望构建聊天机器人、虚拟助手或摘要系统等对话界面的客户将 Amazon Bedrock 的无服务器 API 与其他服务集成。有用的集成点包括 LangChain 和 AWS Step Functions 等编排框架,这些框架可以通过 AWS Lambda 调用 Amazon Bedrock 模型。
随着客户采用 LLMOps 方法来优化企业应用中 LLMs 的构建、扩展和部署,这些集成工具和框架越来越被广泛采用。无服务器 API、编排层和 Lambda 函数创建了一个强大且可扩展的管道,用于提供性能优异且成本效益高的生成式 AI 服务。
Amazon Bedrock 与 LangChain 集成
现在,让我们通过介绍 LangChain 与 Amazon Bedrock 的集成,将我们对 Amazon Bedrock 和生成式 AI 应用的理解提升到新的水平!
LangChain 是一个革命性的框架,它赋予开发者构建高级语言模型和生成类似人类文本的能力。通过连接各种组件,您可以创建以前难以想象的高级用例。例如,如果您在金融服务行业工作,您可以创建一个应用程序,该应用程序可以提供见解、简化摘要和复杂金融文件的问答,通过使用 LangChain 框架,您可以抽象 API 的复杂性。通过将 Bedrock 和 LangChain 结合在一起,开发者可以同时获得两者的最佳之处。需要 AI 助手、搜索引擎或内容生成器?使用 Bedrock 启动一个强大的模型,然后使用 LangChain 的模板和管道来制作完美的提示并处理输出。这种模块化方法允许极大的灵活性,根据您的需求变化而适应。通过通过 LangChain 创建自定义提示模板,您可以在每次运行时传递不同的输入变量。这允许您生成针对特定用例的内容,无论是响应客户反馈还是制作个性化的营销信息。
开始使用非常简单!LangChain 的 Bedrock API 组件提供了一个简单的方法,在 LangChain 管道内调用 Bedrock API。只需几行代码就可以启动一个请求,将您的输入传递给强大的模型,并返回结果。从那时起,您的应用程序就拥有了一个强大、可扩展的 AI 后端,随时可用。
以下代码片段展示了您如何轻松利用 LangChain 与 Amazon Bedrock。
注意
在运行以下代码之前,请确保您已安装 LangChain 包的最新版本。如果没有,请运行旁边提供的包安装单元格,以在您的环境中安装 LangChain。或者,您可以从pypi.org/project/langchain/下载该包。
# Installing LangChain
!pip install langchain
#import the respective libraries and packages
import os
import sys
import json
import boto3
import botocore
# You need to specify LLM for LangChain Bedrock class, and can pass arguments for inference.
from langchain.llms.bedrock import Bedrock
#Create boto3 client for Amazon Bedrock-runtime
bedrock_client = boto3.client(service_name="bedrock-runtime", region_name='us-east-1')
#Provide the respective model ID of the FM you want to use
modelId="amazon.titan-tg1-large"
#Pass the Model ID and respective arguments to the LangChain Bedrock Class
llm = Bedrock(
model_id=modelId,
model_kwargs={
"maxTokenCount": 4096,
"stopSequences": [],
"temperature": 0,
"topP": 1,
},
client=bedrock_client,
)
#Provide Sample prompt data
prompt_data = "Tell me about LangChain"
#Invoke the LLM
response = llm(prompt_data)
print(response)
如前述代码片段所示,用户可以通过利用 LangChain Bedrock 类的 LLM 轻松调用特定模型,并传递相应的 FM 推理参数来使用简单的提示。
创建 LangChain 自定义提示模板
通过为提示创建模板,您可以在每次运行时向其传递不同的输入变量。这在您需要生成具有不同输入变量的内容时很有用,这些输入变量可能来自数据库:
#import the respective libraries and packages
import os
import sys
import boto3
import json
import botocore
# You need to specify LLM for LangChain Bedrock class, and can pass arguments for inference.
from langchain_aws import BedrockLLM
#Create boto3 client for Amazon Bedrock-runtime
bedrock_client = boto3.client(service_name="bedrock-runtime", region_name='us-east-1')
from langchain.prompts import PromptTemplate
# Create a prompt template that has multiple input variables
multi_var_prompt = PromptTemplate(
input_variables=["leasingAgent", "tenantName", "feedbackFromTenant"],
template="""
<s>[INST] Write an email from the Leasing Agent {leasingAgent} to {tenantName} in response to the following feedback that was received from the customer:
<customer_feedback>
{feedbackFromTenant}
</customer_feedback> [/INST]\
"""
)
# Pass in values to the input variables
prompt_data = multi_var_prompt.format(leasingAgent="Jane",
tenantName="Isabella",
feedbackFromTenant="""Hi Jane,
I have been living in this apartment for 2 years now, and I wanted to appreciate how lucky I am to be living here. I have hardly faced any issues in my apartment, but when any issue occurs, administration staff is always there to fix the problem, and are very polite. They also run multiple events throughout the year for all the tenants which helps us socialize. The best part of the apartment is it's location and it is very much affordable.
""")
#Provide the respective model ID of the FM you want to use
modelId = 'mistral.mistral-large-2402-v1:0' # change this to use a different version from the model provider
#Pass the Model ID and respective parameters to the Langchain Bedrock Class
llm = BedrockLLM(
model_id=modelId,
model_kwargs={
"max_tokens": 4096,
"temperature": 0.5,
"top_p": 0.5,
"top_k":50,
},
client=bedrock_client,
)
现在,我们可以使用提示模板调用 Bedrock,以查看精心挑选的响应:
response = llm(prompt_data)
email = response[response.index('\n')+1:]
print(email)
这种集成展示了 LangChain 框架如何促进复杂基于语言的任务的创建。在这个例子中,Bedrock API 充当 LangChain 组件和底层语言模型之间的桥梁。
因此,通过集成 LangChain 和 Amazon Bedrock,开发者可以利用 LangChain 的高级功能,如提示模板、管道和与其他 AI 服务的编排能力,来创建动态和自适应的应用程序。
PartyRock
现在我们已经讨论了如何使用不同的技术访问和探索 Amazon Bedrock 以用于您的应用程序,让我们看看另一个有趣的功能。Amazon 还通过PartyRock(Amazon Bedrock 的强大游乐场)为实验者和爱好者提供了一个快速构建和部署有趣且直观的应用程序的机制。在 PartyRock 中,您可以创建多个应用程序并实验 Amazon Bedrock。例如,您可以为您的 5 岁孩子创建一个优化的派对计划和预算工具。
在图 2.10中,我们创建了一个示例应用程序,可以根据用户在应用程序中输入的年份列出不同的格莱美获奖者。用户只需简单地点击提供的链接,并在左侧面板中输入特定的年份(或每行中的年份)。输入特定的年份或几个年份后,系统将在右侧面板中生成格莱美获奖者。您可以在partyrock.aws/u/shikharkwtra/jAJQre8A0/Grammy-Celebrity-Namer查看该应用程序。

图 2.10 – PartyRock 示例 – 格莱美名人命名器
PartyRock 为构建者提供了访问来自 Amazon Bedrock 的 FMs 的权限,以学习提示工程和生成式 AI 的基础知识。鼓励用户使用 PartyRock 构建一些酷炫的应用程序,并进一步了解 Amazon Bedrock。只需简单地导航到partyrock.aws/,点击Build your own app,就可以开始你的生成式 AI 应用开发者之旅在 PartyRock 上!
摘要
在进入下一章之前,让我们快速回顾一下本章所涵盖的内容。首先,我们探讨了如何通过 AWS 控制台访问 Amazon Bedrock。利用 Bedrock 控制台,我们查询了文本、聊天和图像游乐场API,并实验了各种推理参数以分析它们对模型输出的影响。除了通过 Bedrock 控制台与模型交互之外,我们还研究了通过 AWS CLI 和 AWS SDK 访问 FMs 的方法。
通过利用 CLI 和 SDK,我们能够揭示一些底层的 Bedrock API,这些 API 可以用来列出可用的 FMs,检索它们的详细信息,并调用它们。我们通过查看 Amazon Bedrock 的一些集成点来结束这一章,包括流行的 LangChain 框架,并对 PartyRock 进行了简要概述,它是在 Amazon Bedrock 中测试提示和构建有趣应用程序的强大游乐场。
现在我们对 Amazon Bedrock 有了良好的概念理解,并且能够访问各种 Bedrock 模型,在下一章中,我们将探讨一些在使用 Amazon Bedrock 时可以实施的有效提示工程技巧。
第三章:设计有效模型使用的提示
本章从对提示工程及其重要性的概述开始。我们将探讨各种提示工程技巧,以及如何在 Amazon Bedrock 上对任何模型进行提示时应用这些技巧,主要关注设计和分析有效的提示技巧,以从 Bedrock 模型中获得期望的结果。本章还涉及与提示工程相关的一些最佳实践。
到本章结束时,您将清楚地理解提示工程的实践方面,并能够在遵循最佳实践的同时,制作出有效的提示,从而从 Amazon Bedrock 上可用的模型中获得期望的结果。
在本章中,我们将涵盖以下主要内容:
-
什么是提示工程?
-
解锁提示工程技巧
-
设计用于 Amazon Bedrock 模型的提示
-
理解提示工程的最佳实践
技术要求
要完成本章,您需要能够访问AWS控制台,以便您可以在 Amazon Bedrock 游乐场中导航以执行提示工程技巧。访问控制台的网页如下:console.aws.amazon.com/.
其次,您需要拥有正确的权限,以便使用Amazon Bedrock APIs或Bedrock Python SDK从您的本地机器调用 Amazon Bedrock 模型,以便执行提示。了解更多信息,请访问docs.aws.amazon.com/bedrock/latest/userguide/security-iam.html.
什么是提示工程?
由于我们一直在讨论 Amazon Bedrock 模型及其调用方法,因此我们需要深入了解提示工程。本质上,就像某个孩子可以向他们的父母询问任何和所有问题一样,我们也可以向 LLM 提出任何问题!然而,为了获得最佳和最精确的输出,我们必须训练自己以正确的方式向模型提出正确的问题。
随着大型语言模型(LLMs)的日益流行,用户正积极努力改进他们向模型提问的方式,以期获得期望的回应。例如,我们可以简单地询问一个 LLM 诸如“谁是第一个登上月球的人?”或“木星有多少颗卫星?”等问题。基于这些问题,语言模型可以基于其训练数据(即 LLM 的知识)对用户的查询给出事实性的回答,或者提供不充分/错误的回答。
用户在没有事实核查的情况下得到的错误回答,我们称之为幻觉。通常情况下,如果用户提出一个模糊的问题或一个模型尚未训练过的特别复杂的数学问题,它将确定一个可能或不可能符合事实的概率性答案。这种情况也可能出现在大型视觉模型中,例如文本到图像模型,其中模型最终提供了一个不希望得到的图像作为提示响应。
因此,我们如何向模型提问以及我们如何有效地描述我们的问题,成为模型生成期望输出的关键因素。
在正确地提示模型的同时避免提示语中的任何歧义,这是有效提示工程的精髓。这不再仅适用于技术社区!
即使是技术背景各异的人也可以使用大型语言模型(LLMs)来完成各种任务。根据用户提示,模型可以提供关于创业的基本建议,或者通过详细、信息丰富的对话,提供关于网站创建的基本见解。
有效的提示工程技巧为用户获得期望的响应铺平了道路。此外,一些公司已经开始为研究人员和能够编写或采用有效提示工程以使模型执行负责任行为的人提供高薪工作,从而提高公司执行其职能/任务的速度。
本章将解释如何将有效的提示工程技巧应用于大型语言模型(LLMs)。但首先,让我们深入了解提示语的结构和一些关注有效提示技巧的关键思想。
提示语的组成部分
你如何编写提示语在引导模型行为中起着至关重要的作用。提示语包含几个关键元素。让我们通过一个例子来理解这些元素(图 3**.1):

图 3.1 – 提示语的组成部分
让我们更仔细地看看前图中突出显示的术语:
-
指令:通过指令,你向模型提供一个清晰、简洁的描述或指令,说明它应该如何执行任务,无论是总结文本、翻译语言、创作音乐还是其他任何事情。在前面的图中,你可以看到我们要求模型扮演量子计算专家的角色,并详细、通俗易懂地回答用户的问题,并提供例子。
-
上下文:上下文是指你提供给模型以增强其性能的相关背景信息。这可以包括任何相关数据、过去的经验或特定领域的知识。在前面的图中,在上下文方面,我们说明了模型最近完成了博士学位,并被邀请参加一个访谈节目,该节目用通俗易懂的方式解释复杂话题。这为模型提供了相关的知识。
-
什么是量子计算?。如前图所示,输入到模型的问题为你能提供你对量子机器学习的看法吗?。 -
Quantum Ninja,如前图所示,以便模型理解其输出应采用此布局,或者它可以是特定格式,如文本、JSON、音频剪辑等。特殊的语法如 /endoftext/> 表示输入的结束和模型输出的开始。这种特殊语法可能因模型而异。
虽然提示不需要包含所有四个元素,但它们的格式取决于任务。让我们考察几个示例提示:
示例 1: SQL 查询

图 3.2 – SQL 查询提示
如图 3**.2所示,我们向 Titan Text G1 – Premier 模型指定了以下提示元素:
-
您正在查询以下模式的数据库:Customers(id, name, age) 和 Orders(id, cust_id, product, amount)。 -
列出所有下过超过 1 个订单的客户及其总订单金额。 -
SQL 查询:
这个提示提供了清晰的指示、相关的模式上下文、一个示例输入和输出指示符,以生成合适的 SQL 查询。
示例 2: 食谱生成
这里是另一个例子(图 3**.3):

图 3.3 – 食谱提示
让我们更仔细地看看:
-
烤三文鱼是一种健康的周日晚餐选择,与烤土豆或米饭搭配完美。新鲜的莳萝增添了香料的味道。 -
三文鱼鱼片、莳萝、柠檬、盐、胡椒、橄榄油。 -
<|endoftext|>。
前面的提示为模型提供了食谱的标题、介绍性背景、作为输入数据的成分,以及<|endoftext|>作为输出指示符,表示食谱步骤应该开始的地方。
提示工程应用
现在我们已经了解了如何与模型沟通,让我们学习一些提示工程技巧,这些技巧可以帮助我们从模型中获得更好的响应。
然而,首先,我们需要理解,对于任何特定的用例,最佳的提示工程方法高度依赖于手头的任务以及它所训练的数据。
Bedrock 上的模型擅长以下任务:
-
分类:LLMs 在文本分类方面表现出色,这是一种监督学习技术,用于将文本分配到类别中。例如,情感分析涉及判断输入段落是否传达积极或消极情绪。一些通过 Amazon Bedrock 提供的 LLMs,如 Amazon Titan 模型,还可以识别有毒、无害或基于事实的内容。它们对上下文的深入理解有助于判断细微的语言线索。
-
问答:由于在预训练期间摄入了数百亿个单词,这些模型拥有庞大的参数,因此它们可以在没有外部上下文的情况下准确回答问题。当提供相关文档时,它们通过推理额外的上下文进一步提高了性能。
-
摘要:这些模型将长文本压缩成简洁的摘要,保留关键细节,并学习区分显著点。添加此类提示有助于快速分析文档。
-
文本生成:给定简短的提示,模型可以生成原创的连贯文本。它们的流畅性和语义一致性允许合成故事、诗歌、剧本等。
-
代码生成:对于编程需求的文本描述,模型可以在 SQL 和 Python 等语言中生成可执行代码。例如,提示可以要求生成文本到 SQL 或 Python 代码,从而实现概述的计算目标。
-
数学推理:模型在处理以文本形式提供的数学问题时表现出才能。这包括数值计算、逻辑推理和几何推理。它们还可以通过逐步解释来进一步证明解决方案的正确性。
在 Amazon Bedrock 上,LLMs 能够掌握的自然语言任务范围展示了它们的通用性。它们的适应性保证了应用领域的进一步扩展。
既然我们已经了解了提示工程在现实世界中的应用,让我们尝试解锁一些最常见的提示工程技巧。
解锁提示工程技巧
提示工程领域是一个活跃的研究和创新领域,新技术和模式频繁出现,这得益于对提高模型性能和生成更自然的人类似响应的追求。在本节中,我们将探讨一些最常见的模式。
零样本提示
零样本指的是 LLMs(大型语言模型)对未经过显式训练的提示生成合理响应的能力。它完全依赖于描述性提示来指定所需的输出,如图图 3.4所示:

图 3.4 – 零样本提示
例如,一个用于获取诗歌的零样本提示可以是写一首关于 季节变化 的押韵诗,共 4 节。
这种方法的主要优势在于它更容易操作;在输入中无需提供示例即可进行即时创作。然而,如果没有具体的示例作为依据,输出质量可能会有所不同。
少样本提示
少样本提示或少样本学习建立在零样本能力的基础上。如图 3.5 所示,在指令/问题之上,你可以提供一些示例来建立概念或场景,此时模型可以开始生成合理的后续内容:

图 3.5 – 少样本提示
例如,在展示两三个关于预约医生简短对话的示例之后,LLMs 可以生成一个预约对话,而无需数千个示例。与零样本相比,关键优势在于少样本示例有助于缩小上下文范围并约束生成过程,使输出更加精确。
让我们看看一些少样本提示的示例。以下是我们可以在上一小节中用于诗歌创作任务的两个输入,我们可以将这些输入作为示例提供给模型。
玫瑰是红的,紫罗兰是蓝的,春天带来 新的生命。
夏日阳光明媚,漫长的白天充满 光明。
现在请你写一首关于秋天落叶的押韵诗 叶子变化。
通过分析这些示例,LLMs 可以学习关于季节的四行押韵诗的规律。然后,它可以遵循模板生成一首秋天的诗。在少样本提示中平衡创造性和指导性是关键。
这里有一些少样本提示的附加示例:www.promptingguide.ai/techniques/fewshot。
思维链提示
思维链(CoT)提示旨在从语言模型中激发推理链。它涉及向 LLM 提供一个提示,其中包含一个推理链或思维流程,供模型遵循(图 3**.6)。

图 3.6 – 思维链提示
一个提示可能从背景信息开始,陈述一个假设或问题,提供推理步骤,并以一个需要扩展的结论结束。然后,模型试图在其生成的文本中连贯地继续推理链:
这是一个 CoT 提示的示例:
回收利用对环境有益,因为它减少了送往垃圾填埋场的废物。垃圾填埋场产生甲烷,这是一种强效的温室气体。它们还占据了大量的空间。通过回收利用材料,回收减少了垃圾填埋场的贡献。总之,回收通过减少垃圾填埋场的甲烷和空间需求,有助于对抗气候变化。回收的主要环境效益是...
这种提示风格引导 LLM 跟随提供的推理链,并进一步阐述结论陈述。生成的文本可能会更详细地讨论由于回收增加而减少的甲烷排放和土地利用。因此,进一步链接鼓励逐步的逻辑思考,重点关注最终目标,而不是开放式、蜿蜒曲折的文本。
让我们看看一些 CoT 提示的示例及其响应:
示例 1:
写一个关于教授探索神秘文物的故事
Dr. Jones entered the temple, brushing cobwebs out of her face. In the center of the room sat a small stone box...
当她打开盒子时,一束光芒出现,照亮了墙上的符号
Squinting in the sudden brightness, Dr. Jones sees the symbols represent a long-lost ancient language. She reaches towards the box and feels an energy pulling at her fingertips...
示例 2:
可再生能源的优缺点是什么?
Some pros of renewable energies are...
您遗漏了一个主要的可再生能源来源。在比较优缺点时,请包括地热能。
Some pros of renewable energies like solar, wind, geothermal and hydroelectric power are low pollution...
在这种方法中,人类可以通过在需要引导、细化或扩展模型响应时插入额外的提示来引导和塑造整体叙事或分析。它允许基于人类提供的初始主题或方向进行更对话式的流程。
CoT 提示的更多示例可在 www.promptingguide.ai/techniques/cot 找到。
ReAct 提示
推理和行动(ReAct)提示是从在论文 ReAct: Synergizing Reasoning and Acting in Language Models 中介绍的 ReAct 框架中派生出来的 (arxiv.org/abs/2210.03629):

图 3.7 – ReAct 提示
此框架生成各种推理轨迹。然后,基于这些轨迹,它执行相关操作。通过推理和行动的过程,您还可以允许应用程序访问组织的内部数据存储和 API,或来自各种工具、网站、网络搜索等外部来源,如图 图 3**.7 所示。这个过程生成推理轨迹并执行操作是迭代的,直到 LLM 找到用户提示的答案。
我们将在 第十章 中更详细地讨论 ReAct 提示。现在,让我们为从模型中得出全面响应创建一个 ReAct-SQL 工具。
为 AnyCompany 提供一份更新的财务总结报告
助手回复:
思考: 用户正在请求 AnyCompany 的财务信息。为了回答这个问题,我需要做以下事情:
-
查询数据库以找到 AnyCompany 的财务记录
-
撰写获取的财务信息的摘要
因此,我需要使用 sql_db_query 工具。
动作: sql_db_query
动作输入: SELECT * FROM financial_db WHERE company = '``AnyCompany';
[(260B, 55B, 321B, 2.2T)]
答案:
AnyCompany has demonstrated strong financial performance with revenue of $260 billion. With net income of $55 billion, AnyCompany has a 21% net profit margin, indicating it is highly profitable. AnyCompany also has a considerable asset base of $321 billion, providing the company with significant financial resources. With a market capitalization of $2.2 trillion, AnyCompany is the most valuable public company, suggesting investors are confident in AnyCompany continued growth and profitability. Overall, AnyCompany's finances appear very healthy.
与先前的提示模式形式类似,新的提示工程技术和模式正在兴起。更多关于提示工程的信息可以在www.promptingguide.ai/techniques的提示工程指南中找到。
在本节中,我们揭示了在构建适用于各种用例的生成式 AI 应用领域中被利用的几个提示工程技术。接下来,我们将致力于设计 Amazon Bedrock FM 的提示。
设计 Amazon Bedrock 模型的提示
在本节中,我们将介绍通过 Amazon Bedrock 提供的某些模型的提示指导。我们将从 Anthropic Claude 模型开始,并详细介绍该模型的提示指导。大部分关于提示指导的学习都可以从 Claude 模型中继承。此外,为了在简洁和详细之间取得平衡,我们将重点关注 Amazon Titan、AI21 Labs 和 Stability AI Stable Diffusion 的模型。这将总结我们的提示指导和与调用 Amazon Bedrock 模型相关的提示建议。
激活 Anthropic Claude 3
在提示 Anthropic Claude 3 模型时,以下是一些需要注意的事项:
-
你是一位资深的儿童图书作家或你是一位商业专家。想象你是一位幼儿园老师,需要向孩子们解释天空中的彩虹。:

图 3.8 – Anthropic Claude 3 Haiku – 简单提示
没有分配角色/人物时,答案可能难以理解,如图 3.8 所示。
在添加角色/人物之后,你可以看到输出响应与图 3.10 中孩子的复杂程度更相符。9:

图 3.9 – Anthropic Claude 3 Haiku – 分配角色人物
温度参数可以设置得更高,生成的输出可能会有所不同,如这里所示。然而,后面的清晰指令提供了更直接的输出,没有任何额外的上下文,这正是用户所期望的:

图 3.10 – 提供清晰直接的指令
-
少样本提示示例:提供一些常见场景的示例(如“少样本提示”部分所述),有助于提高模型的整体性能,并生成格式正确的简洁响应。
-
<tag>内容</tag>,可以在提示和输出响应中提供明确的结构。我们可以提供额外的背景和澄清,向 Claude 说明可以找到一些信息在标签中,以便用于生成输出。这样,Claude 就能理解如何构建输出响应,通过从标签中提取关键相关信息。还建议将输入数据与指令分开,以生成更结构化的提示,以便模型更容易、更高效地处理。
这里是一个标签的示例:

图 3.11 – XML 标签
如图 3.11所示,我们提供了一个<email>标签,这使得模型生成了更结构化的输出响应。
- 响应限制器和定义输出格式:Anthropic Claude 模型(尤其是 100K 和 200K 令牌长度的模型)能够提供全面和详尽的响应。用户可以通过在提示中明确声明单词限制或字符计数来限制响应长度,从而提供更简洁、更相关的输出。让我们看一个例子:

图 3.12 – 响应限制器
在图 3.12中,我们将响应限制器设置为 100 个单词作为提示的一部分。此外,指定所需的输出格式——无论是列表、JSON、段落、Markdown 等——可以导致更高效、更精确的输出,正如用户所期望的,这有助于从健谈的模型中消除任何无关的冗词。
如果您不知道答案,请以以下格式回答——我真诚地道歉,我不知道答案可以帮助避免健谈的 Claude 模型产生任何形式的幻觉。还可以添加主题的护栏,以便 Claude 不会对不想要的输入做出响应。这一概念也将在第十二章中讨论。
指导 Mistral 模型
与其他模型类似,当与 Mistral 模型一起工作时,精心设计提示对于获得高质量和相关的输出至关重要。在设计 Mistral 模型的提示时,以下是一些需要记住的关键点:
-
明确定义您希望通过提示让模型完成的任务或目标。您是在寻找文本分类、摘要、个性化还是其他内容?
-
在陈述核心提示之前,提供相关的背景、示例或背景信息,以使模型更好地理解提示。背景有助于模型更好地理解提示。
-
使用清晰的格式和分隔符,如
#、###或<<< >>>来分隔提示的不同部分,例如指令、示例和主要查询。这增强了提示的结构。 -
当可能时,通过在少量样本学习风格中提供示例来展示期望的输出。展示示例有助于引导模型朝向预期的格式。
-
指定模型应扮演的角色,例如客户服务代表或技术作家。定义一个角色可以使回答更加定制化。
-
对于开放式生成,通过数字目标(如单词计数或句子/段落数量)提供关于所需输出长度和结构的明确指令。
-
生成输出时,请要求模型包含置信度分数或评估,以衡量其确定性水平。
-
考虑将多个 Mistral 模型按顺序串联,其中一个模型的输出作为下一个模型的输入,以增强功能。
-
通过评估测试和迭代提示设计,以找到最佳的提示策略。
图 3.13显示了在亚马逊 Bedrock 游乐场中调用 Mixtral 8x7B Instruct 模型。
请注意,<s> 和 </s> 标记用于表示 [INST] 和 [/INST] 字符串,告诉模型它们之间的内容构成模型应遵守的指令:

图 3.13 – 指示 Mixtral 8x7B Instruct 模型
关键在于仔细构建带有清晰上下文、示例、指令和格式的提示,以引导 Mistral 模型生成符合您需求的高质量、定制化输出。
亚马逊泰坦文本模型的提示指导
如我们在第一章中学习到的,亚马逊泰坦文本模型非常适合多种用例:
-
对话和角色扮演系统
-
文本摘要和问答
-
机器翻译
-
元数据提取和分析
-
RAG(将在第五章中详细说明)
-
代码生成方法
-
文本和内容生成
当使用模型生成文本输出时,通常建议提供关于所需输出长度和结构的明确指令以获得最佳结果。以下是针对泰坦文本模型的额外提示:
-
将提示集中在简洁、有针对性的问题上,以默认方式获得针对性的答案。
-
系统在处理单个句子或简短段落时表现最佳。
-
对于较长的输入,将指令放在末尾以引导高质量的响应。
-
在提示中添加明确的指令可以产生更定制的成果。
-
在提示中指定 AI 应生成的确切单词数、句子数、项目符号或段落数。提供数值范围(例如,100-200 个单词)也可以很好地工作。这给模型一个明确的目标。
-
避免使用模糊的指令,如“保持简短”或“简要总结”。这些指令容易被 AI 解释。精确的数字可以消除歧义。
-
单词计数本身可能不足以充分指导输出长度,因为句子长度可能会有所不同。指定句子/段落数量可以提供更稳健的控制。
-
如果模型似乎无法为提示生成高质量的响应,请编程使其默认显示消息,例如“不确定答案”,而不是尝试强制生成较差的响应。以下是一个此类提示的示例:“告诉我关于量子计算的信息。如果你对问题不确定,请回答‘不确定答案’或‘我不知道’。”
-
当相关时,在提问之前为 AI 提供上下文段落以供参考。这提供了知识,以便做出有根据的响应。
-
测试不同的输出长度指令,以找到适合您用例的简洁性和充分细节之间的平衡。在数字上偏向更多具体性。
如果您想查看 Titan 模型中的示例提示和响应,可以回到第一章中的Amazon Titan FMs部分。
AI21 Labs – 指示模型
AI21 Labs 的模型在英语以外的语言中表现良好,例如西班牙语、法语、德语、葡萄牙语、意大利语和荷兰语。该模型在文本摘要、文本生成和问答任务中都很熟练。在本节中,我们将介绍一些与通过 Amazon Bedrock 提供的 AI21 模型相关的关键概念:
-
输出长度:为了从 AI12 模型生成期望的响应,建议指定输出长度——即段落、条目等的数量或其近似值——而不是使用单词/字符。
-
提供简短而详细的任务描述:制定清晰、详细的任务描述以减少歧义。AI21 模型擅长遵循精确的指令,即使是复杂的任务。
-
不超过 x 个陈述。始终建议直接和肯定地陈述要求。 -
指令:标题以澄清提示。使用换行符分隔提示部分以突出不同的部分并提高可读性。 -
评估多种提示模式:尝试零样本学习和少量样本学习。为您的用例选择一个理想的方法。例如,如本章中展示的零样本和少量样本示例所示,根据考虑的用例,您可能从提供零个示例并确定响应开始,同时比较在提供一定示例以引导输出后模型生成的响应。在某些情况下,如果模型可以生成期望的响应,可能不需要提供大量示例。
图 3**.14展示了来自 Amazon Bedrock 中 AI21 Jurassic-2 Ultra 的产品描述摘要示例:

图 3.14 – 提示 AI21 Jurassic-2 Ultra 模型
更多关于使用 AI21 模型进行提示工程和设计的详细信息,以及示例,可以在docs.ai21.com/docs/prompt-engineering找到。
提示 Meta Llama 模型
与任何其他大型语言模型 (LLM) 一样,有效的提示对于充分利用 Llama 模型至关重要。由于以下内容是任何 LLM 的标准提示指南,我们将在此处介绍一些最佳实践:
-
清晰性和具体性:
-
确保您的提示清晰、简洁且无歧义。
-
提供足够的信息和细节,以引导模型生成所需输出。
-
使用精确的语言,避免含糊或开放式陈述。
-
-
结构和格式:
-
合理组织您的提示,并以与所需输出格式一致的方式构建它们。
-
利用格式化元素,如项目符号、编号列表或标题,以增强可读性和理解性。
-
考虑提供示例或模板来说明预期输出格式。
-
-
任务构建:
-
将提示构建为模型需要遵循的具体任务或指令。
-
明确指定所需操作,例如总结、生成或分析。
-
提供有关预期用例或受众的背景信息。
-
-
迭代优化:
-
提示是一个迭代过程,您可能需要根据模型的响应来优化您的提示。
-
分析输出并确定改进或澄清的领域。
-
结合反馈并根据需要调整提示,以引导模型获得更好的结果。
-
-
微调和定制:
-
探索在特定领域数据或示例上微调 Llama 模型的可能性。
-
通过在提示中包含特定指令或约束来定制模型的行为和输出。
-
利用诸如使用少量示例或演示进行提示等技巧来提高性能。
-
-
伦理和安全考虑:
-
注意模型可能产生的潜在偏见或有害输出。
-
包含明确的指令或过滤器以减轻风险并确保模型的响应符合伦理和安全指南。
-
监控和评估模型的输出,以查找任何令人担忧或不适当的内容。
-
Llama 模型也考虑特殊类型的标记。对于 Llama 3,以下标记被使用:
-
<|begin_of_text|>标记代表 BOS 标记。 -
<|eot_id|>标记表示当前回合或消息的结束。 -
<|start_header_id|>{role}<|end_header_id|>标记包围特定消息的角色,可以是 system、user 或 assistant。 -
<|end_of_text|>标记等同于 EOS 标记。生成此标记后,Llama 3 将停止生成任何进一步的标记。
有关提示格式的更多详细信息,请访问 llama.meta.com/docs/model-cards-and-prompt-formats:

图 3.15 – 激活 Llama2 Chat 70B 模型
如 图 3.15 所示,Llama 2 Chat 70B 模型正在 Amazon Bedrock Playground 中被调用。
[INST] 和 [/INST] 字符串告诉模型,它们之间的内容构成了模型应遵守的指令。
如果您想了解调用各种模型的不同示例和模板,包括任何添加到亚马逊 Bedrock 的新模型,请访问docs.aws.amazon.com/bedrock/latest/userguide/prompt-templates-and-examples.html。
Stability AI – 稳定扩散的提示指南
稳定扩散模型(包括亚马逊泰坦图像模型)在图像生成用例中越来越受欢迎。以下是在使用 Stability AI 的稳定扩散进行图像生成时制定有效提示的关键提示:
-
“一张猫的相片”或“一个机器人的插图”。更具体通常会产生更好的结果。
-
in impressionist style或a cartoon drawing of。风格有助于引导输出。 -
cat:1.5, sitting:1.2, couch:1. 较高的权重使元素更加突出。 -
-通过排除不需要的元素来提高质量。例如,如果您提供“赛车在赛道上”作为提示,并给出“红色汽车”作为负面提示,它将排除图像输出中的红色汽车,如图图 3.16所示:

图 3.16 – 负面提示示例
-
详细具体:使用更多描述性和独特的词语,而不是通用术语,可以产生更定制的结果。
-
--ar、--v和--n分别控制长宽比、生动性和细节级别。调整它们以细化输出。 -
提供额外的描述性细节始终有助于模型表现得更好。以下是一些此类方面的示例:
-
指定介质(绘画、绘图、CGI 等)
-
定义使用的颜色。
-
描述光照和阴影
-
如果模仿某种风格,请包含艺术家姓名。
-
如果您正在复制特定图像,请提及网站。
-
添加任何其他描述性评论或形容词。
-
如需打印或数字使用,请指定所需的分辨率。
-
让我们来看一个例子。
“印度老战士首领的肖像照片,部落豹纹妆容,正面轮廓,直视镜头,严肃的眼神,50mm 肖像摄影,硬边照明摄影–beta –ar 2:3 –beta`
SDXL 1.0 的输出响应:

图 3.17 – SDXL 1.0 的图像生成输出
当使用相同的输入提示时,Titan Image Generator G1 模型的输出响应如下:

图 3.18 – Titan Image Generator 的图像生成输出
提供此级别的详细信息和上下文将有助于生成更准确、符合您愿景的图像。通过迭代调整提示以细化结果。
你可能想知道为什么相同的提示在两个模型中产生了不同的输出。原因在于 SDXL 是在与 Titan Image Generator 不同的数据集上训练的,因此这些模型产生的输出会有所不同。可以这样想:SDXL 和 Titan 是两个人,他们为了考试从不同的书中学习。在考试中,当被问到相同的问题时,他们会有不同的观点,他们的答案将基于他们所读的书籍。
如果你正在你的环境中尝试这些提示,你也可能注意到另一件事。你环境中看到的输出图像可能与这里展示的不同,即使你提供了相同的提示。这是因为增加了随机性程度。这些模型将根据推理参数(如提示强度和种子)生成输出。我们将在第九章中详细讨论这些参数。然而,简而言之,提示强度控制着模型输出受提示影响的程度,而种子是一种随机化输出图像的方法。
现在你已经对 Amazon Bedrock 提供的 FMs 提示指导有了很好的理解,在下一节中,我们将尝试总结一些关键原则和技术,这些原则和技术在处理各种用例时的提示工程中必须遵循。
理解提示工程的最佳实践
总结来说,在构建提示时,你必须遵守以下关键原则:
-
可再生能源有哪些应用场景?列出 5 个关键点。 -
语言强调:使用简单流畅的语言和连贯的句子有助于构建更好的提示,避免使用孤立的短语。
-
进入模型的思维模式:构建提示以引导其朝向有益的行为。把它想象成一个人,他拥有所有正确的答案,但只对正确表述的问题有答案。
-
用 500 字总结本章内容.* 提供示例响应:在提示中添加一些示例响应,以期望的输出来细化响应——例如,用一段话(1000 字符)总结本章:[新研究表明区域 X 的活动减少导致功能障碍。]。用括号包围示例响应表示模型在以用户设定的指南和期望的格式进行响应时遵守了规定。* 添加约束:通过格式、附加信息包含、长度等对提示响应进行约束,可以导致更可控的输出。* 平衡正确细节的多少:细节太少无法充分引导模型,而过于冗长则限制了创造性发挥。将提示提炼为简洁的精华:-
复杂任务处理:
-
在处理复杂任务时,FMs 可能会产生幻觉。建议将复杂任务分解为子任务,甚至考虑将复杂任务拆分为多个提示。
-
通过使用关键词来要求模型逐步思考或提供逻辑推理,以构建输出,从而提供强调。在复杂任务中,为输入提供一些关键示例。
-
-
重复清洗、泡沫、再重复:迭代地分解并尝试不同的提示,以优化模型响应以符合你的目标。在测试和实验的同时继续调整,以达到预期的结果。
-
持续评估:在处理不同的用例和复杂场景时,迭代地审查模型的响应以提供所需的质量是必不可少的。
-
提示解锁了生成 AI 的能力,但需要深思熟虑才能正确构建。了解你的目标模型的优势和局限性,仔细迭代提示措辞,并欣赏这些系统不断演变的本质。明智地使用提示,享受 AI 蓬勃发展的创造力的果实!
在构建处理复杂目标的正确提示时,会出现复杂性。但做得好的话,提示就像万能钥匙一样解锁 AI,打开通往令人叹为观止的新生成能力的大门。提示包含了潜力;我们的角色是通过深思熟虑的提示来塑造和引导它。
摘要
在本章中,我们学习了几个提示工程技巧,以更深入地理解提示模式,并在考虑这些提示模式的例子时发现了见解。然后,我们深入探讨了 Amazon Bedrock 模型为 Anthropic Claude、AI21 Labs、Amazon Titan 和 Stability AI 的 Stable Diffusion 提供的提示指导。
最后,我们在查看适用于各种用例的 Amazon Bedrock 模型的同时,总结了提示指导的实用方法。通过各种示例,我们学习了如何构建最有效的提示。
到目前为止,你应该对提示工程的重要性有了很好的理解。此外,你应该能够分析在构建生成 AI 应用的情况下,涉及提示工程的多种提示技术和最佳实践。
在下一章中,我们将学习如何使用微调和持续预训练技术来定制模型。我们将深入了解微调的工作原理,查看各种 API,分析结果,并在我们的微调模型上进行推理。
第四章:定制模型以提升性能
当通用模型无法满足你特定领域用例的满意结果时,定制 FM 就变得至关重要。本章将深入探讨定制 FM 的过程,同时使用微调和持续预训练等技术来提升其性能。我们将首先检查定制基础 FM 的理由,并探讨微调的机制。随后,我们将深入研究数据准备技术,以确保我们的数据格式适当,以便使用 AWS 控制台和 API 创建自定义模型。我们将了解模型定制中的各种组件以及你可以从应用程序中调用的不同定制 API。
此外,我们将分析模型的行为并执行推理。最后,我们将通过讨论定制 Bedrock 模型的指南和最佳实践来结束本章。
在本章结束时,你将能够理解为特定领域用例定制模型的重要性和过程。
本章将涵盖以下关键主题:
-
为什么定制 FM 很重要?
-
理解模型定制
-
准备数据
-
创建自定义模型
-
分析结果
-
指南和最佳实践
技术要求
对于本章,你需要访问一个 AWS 账户。如果你没有,你可以访问 aws.amazon.com/getting-started/ 并创建一个 AWS 账户。
一旦你有了 AWS 账户,你需要安装和配置 AWS CLI (aws.amazon.com/cli/),以便从你的本地机器访问 Amazon Bedrock FM。此外,你还需要设置 AWS Python SDK (Boto3),因为我们将执行的多数代码单元格都需要它 (docs.aws.amazon.com/bedrock/latest/APIReference/welcome.html)。你可以通过在你的本地机器上安装 Python、使用 AWS Cloud9、利用 AWS Lambda 或利用 Amazon SageMaker 来设置 Python。
注意
使用和定制 Amazon Bedrock 的 FM 将会产生费用。请参阅 aws.amazon.com/bedrock/pricing/ 了解更多信息。
为什么定制 FM 很重要?
在上一章中,我们探讨了几个提示工程技术来提高模型性能。正如我们在 第一章 (如图 4**.1 所示)中看到的那样,这些 FM 在海量数据(GBs、TBs 或 PBs)上训练,拥有数百万到数十亿个参数,这使得它们能够理解上下文中词语之间的关系,以预测后续序列:

图 4.1 – 训练 FM
那么,为什么我们需要定制这些模型呢?
这是一个合理的问题,因为许多用例可以直接通过使用提示工程和 RAG 技术来解决(我们将在第五章中介绍)。然而,考虑一种情况,你需要模型遵守特定的写作风格、输出格式或特定领域的术语。例如,你可能需要模型准确地分析财务收益报告或医疗记录。在这种情况下,预训练模型可能没有接触到所需的写作风格或专业词汇,尽管提示工程或 RAG 的实施是有效的,但它们的性能仍然受限。
为了弥合这一差距并增强模型在特定领域的语言理解和生成能力,定制变得至关重要。通过在特定领域数据上微调预训练模型或调整它们以适应所需的写作风格或输出格式,你可以调整其性能以满足你的独特需求,确保更准确和相关的响应:

图 4.2 – 生成式 AI 性能技术
如果你查看 图 4**.2 中显示的生成式 AI 性能技术谱系,以改进 FM 的性能,它从提示工程到从头开始训练模型。对于特定领域的数据,提示工程技术可能提供较低的准确性,但它们涉及较少的努力且成本效益高。如果你有一个简单的任务且不需要新的特定领域数据集,提示工程是一个更好的选择。如果你想了解提示工程是如何工作的,请回到第三章。
在谱系中,随着复杂度、成本和准确性的略微增加,接下来是 RAG 技术。这种技术从语言模型外部获取数据,例如从内部知识库或外部来源。当你拥有大量不适合模型上下文长度的文档语料库时,这是一个特别有用的技术。我们将在第五章中更详细地讨论 RAG。
在谱系的进一步位置,定制模型本质上需要更多的时间和成本。然而,它为你的特定用例提供了更高的准确性。
在 Amazon Bedrock 中有两种定制技术:微调和持续预训练。
在微调中,模型使用带标签的数据集进行训练——这是一种监督学习方法。您提供的带标签数据集将针对您的特定用例。无论您在医疗保健、金融还是任何其他领域工作,您都可以微调您的模型,使其成为该特定领域的专家。例如,在医疗保健领域,模型可以针对医学专业进行微调,使其能够以更高的准确性理解和解释医疗记录。同样,一个财务分析模型可以针对特定领域的财务分析进行微调,使其能够识别出传统算法可能错过的金融数据中的模式和趋势。
要使用您自己的数据微调模型,您需要拥有足够数量的与您想要执行的任务相关的高质量数据。这些数据应该是标记和注释的,以便为模型提供训练所需的必要信息。如图4.3所示,我们可以使用这个标记数据集来微调基础 FM,然后生成一个定制模型。然后,您可以使用这个定制模型生成针对您特定领域和用例的响应:

图 4.3 – 微调
例如,假设您在医疗行业工作,并希望总结两位医生讨论患者医疗报告的对话,提取需要放入医疗表格的信息,也许还可以用通俗易懂的语言来撰写。
在这种情况下,基础 FM 可能没有在特定领域的数据集上进行训练。因此,这是一个示例场景,当我们进行微调时,我们将向模型提供标记示例,说明提示和响应应该如何呈现。
在持续预训练中,我们适应新的领域或训练模型学习不熟悉领域的术语。这涉及到向 FM 提供额外的连续训练,同时利用大量未标记数据。当我们说未标记数据时,意味着没有目标标签,模型将从提供的文本中学习模式。这与微调形成对比,微调涉及使用较小量的标记数据。图 4.4突出了持续预训练和微调所需的标记数据与未标记数据之间的差异:

图 4.4 – 未标记数据与标记数据
持续预训练的例子可能包括训练模型学习金融行业的术语,以便它能够理解财务报告,或者通过提供大量来自书籍的信息来训练模型学习量子物理学,这样它将能够以更高的准确性评估/预测与弦理论相关的标记。假设两位物理学家正在讨论弦理论,我们将这个对话作为上下文传递给基础 FM(如图4.5所示):

图 4.5 – 量子物理学家对话和问题
可能的情况是,我们在这里使用的基 FM 对量子物理不熟悉——也就是说,基 FM 尚未在涉及量子物理的数据集上训练过。
因此,当我们向模型提出诸如“E8 x E8 对称群是什么?”这样的问题时,模型会幻想并无法解释这个概念,因为它不了解弦理论。
通过持续的预训练,我们通过向基础 FM 提供大量未标记数据集来在未知领域训练模型。例如,我们可以在准备数据部分所述的期望格式上训练关于量子计算的书本模型,从而创建一个自定义模型(如图图 4**.6所示):

图 4.6 – 持续的预训练
持续的预训练带来了一定的挑战。由于我们正在训练整个模型,权重和偏差需要大量的计算资源和多样化的未标记文本数据。
当您决定是否使用自定义模型而不是其他方法,如提示工程和 RAG 时,有几个因素会发挥作用。这些包括您正在处理的任务、数据的可用性、计算资源和成本。以下是一些指导方针,以帮助您做出明智的决定:
-
复杂度级别:当您有复杂任务且需要模型理解复杂细节时,创建自定义模型特别有用。
-
专业数据:在创建自定义模型时,拥有足够数量的专业数据将带来显著的结果。在开始训练过程之前,请确保您的数据是干净的(无错误、不一致和重复),并且已经准备好(格式化、转换并分成适当的子集)。
-
计算资源和成本:当您创建自定义模型时,您需要购买预留吞吐量,这为您提供了部署模型的专用容量。请确保您根据模型类型和承诺条款审查价格。我们将在本章的分析结果部分详细讨论预留吞吐量。
此外,创建自定义模型使您能够更好地控制模型如何响应。您可以精确地根据您的需求进行定制,使其适合需要精细定制的任务,例如以特定的语气、方言或包容性语言进行响应。
在我们开始我们的第一个模型定制工作之前,让我们了解一些模型定制的关键概念。
理解模型定制
微调和持续预训练背后的原理来自广泛的概念迁移学习,正如其名称所暗示的,它涉及将从一个问题获得的知识转移到其他通常相关但不同的问题上。这种做法在机器学习(ML)领域被广泛采用,以提高模型在新任务或领域上的性能。
模型定制是一个五步过程:
-
确定你的用例和数据:确定用例/任务以及它是如何解决你组织业务目标的,这是一个关键步骤。你是想总结法律文件,对医疗报告进行问答,还是做其他事情?一旦确定了用例,你必须收集足够的相关数据集,以便你可以用于模型定制。数据集应包含模型可以从中学习复杂细节的示例。记住,你的定制模型在特定任务用例上的表现取决于你为训练提供的训练数据集的质量。
-
准备数据集:一旦收集了数据集,你必须对其进行清理和预处理。对于微调,你需要有JSON 行(JSONL)格式的标记示例。对于持续预训练,你需要有 JSONL 格式的未标记示例。我们将在准备数据部分更详细地讨论这一点。
-
选择基础预训练模型:一旦准备好的数据集,你必须选择一个现有的基础预训练模型,你希望对其进行微调。你可以查看模型提供者的网站来了解模型属性。如果它适合你的用例,尝试提示工程技术来检查哪个模型最接近你想要的结果,并使用 Amazon Bedrock 中的模型评估或模型排行榜来评估 FM:
-
模型评估:Bedrock 提供了两种不同的评估方法:自动评估和人工评估。自动评估使用预定义的指标,如准确率、鲁棒性和毒性筛选,而人工评估则可以定义自定义指标,如友好性、风格遵循或与品牌声音的一致性。我们将在第十一章中对模型评估进行更详细的讨论。
-
模型排行榜:有多个排行榜可以根据模型在各项任务上的性能进行排名,例如文本生成、摘要、情感分析等。其中一些最受欢迎的排行榜包括通用语言理解评估(GLUE)、SuperGLUE、HELM 和 HuggingFace 的 OpenLLM。
请注意,虽然通过排行榜了解 FM 的性能是好的,但对于实际应用场景,你必须谨慎,不要仅仅依赖排行榜,因为它们可能缺乏反映现实世界复杂性的鲁棒性。
-
-
配置并启动微调作业:一旦你确定了基础 FM 并且数据集准备就绪,你可以通过指定超参数、数据集的输入和输出 S3 路径以及存储指标,以及网络和安全设置来配置微调作业。我们将在“创建自定义模型”部分更详细地讨论这一点。
-
评估和迭代:一旦模型准备就绪,你可以根据模型存储的指标和日志来评估和分析它。为此,你可以留出一个验证集,它提供了你创建的自定义模型的性能指标。我们将在“分析结果”部分更详细地讨论这一点。
当我们定制模型时,Amazon Bedrock 会创建一个基础 FM 的副本,我们实际上是在更新其模型权重。权重是人工神经网络(ANNs)中的关键组件,它们附着在输入(或特征)上。这些权重定义了哪些特征在预测输出和提升特定任务方面是重要的。图 4.7 展示了一个简化的 ANN 架构,其中这些输入及其权重通过求和和激活函数(两者均在模型算法中定义)进行处理,以获得输出(Y)。

图 4.7 – 简化的人工神经网络
想要深入了解人工神经网络(ANNs),网上有大量的教程和课程可供选择,它们提供了关于神经网络概念、架构和训练技术的深入解释和示例。此外,像《神经网络与深度学习,迈克尔·尼尔森, Determination Press》和《深度学习,伊恩·古德费洛,约书亚·本吉奥,阿隆·库维尔,MIT Press》这样的教科书经典之作,提供了全面的理论和数学基础。
当我们执行模型定制(微调或继续预训练)时,我们会更新模型权重。在更新模型权重时,可能会出现一个常见问题,称为灾难性遗忘。这是当模型由于权重修改开始忘记它最初训练的一些信息时,这可能导致在更通用的任务上性能下降。一般来说,这可能是由于训练数据过拟合,这意味着模型对训练数据提供了准确的响应,但不能很好地泛化,并在新信息上提供较差的性能。此外,定制模型可能成本高昂且资源密集,这需要大量的内存使用。
为了克服这些挑战,论文《Parameter-Efficient Transfer Learning for NLP》(arxiv.org/pdf/1902.00751)中引入了一种称为参数高效微调(PEFT)的技术。
注意,在撰写本文时,Bedrock 不支持 PEFT。然而,了解 PEFT 技术是有益的。
PEFT
在 PEFT 中,你不需要微调所有模型参数,这可能会非常耗时、资源密集且成本高昂。相反,它冻结了模型的大部分权重,而你只需要训练其中的一小部分。这使得它内存和计算效率高,更不容易发生灾难性遗忘,并且存储在硬件上的成本更低。
在微调 LLM 时,各种技术可以减少可训练参数的数量以提高效率。我们可以将这些 PEFT 方法分为三个主要类别:
-
选择性方法:这些方法在微调过程中仅更新原始 LLM 的某些组件或层。这允许你专注于模型中最相关的部分。然而,与全量微调相比,它可能导致性能次优。
-
重新参数化方法:这些方法引入低秩矩阵以压缩原始权重。例如,大型语言模型的低秩适应(LoRA)。这减少了参数数量,同时仍然修改了整个模型。权衡是训练期间内存使用增加。
-
加性方法:这些方法保持 LLM 的原始权重不变,并为特定任务的适应添加新的可训练层。例如,适配器这样的加性方法会在 transformer 架构的编码器或解码器组件内部添加可训练层。
选择 PEFT 方法时,需要在参数和内存效率与模型质量、训练速度和成本之间进行权衡。选择性更新模型的一部分提供了这种权衡的一端,而适配器和提示则牺牲了一些架构变化以最大化参数效率。
有了这些,我们已经从非常高的层次上涵盖了 PEFT 及其技术。然而,如果你对它感兴趣并想了解更多,请访问github.com/huggingface/peft。此外,使用大型语言模型进行生成式 AI课程提供了关于 PEFT 方法的深入信息:www.deeplearning.ai/courses/generative-ai-with-llms/。
超参数调整
除了 PEFT 这样的微调技术之外,超参数调整在确保模型保留其预训练知识方面也起着重要作用。超参数是控制模型训练过程的配置设置,就像可以调整和微调的旋钮一样。模型有多种超参数,包括学习率、训练轮数、批量大小、beta、gamma 等。每个模型可能需要通过实验找到不同的最佳超参数值集,以实现最佳性能和准确性。
学习率超参数控制模型适应任务的速度。它还控制模型参数在训练过程中的每次迭代中调整的程度。它决定了模型参数根据计算出的梯度(代表最小化损失函数所需变化的方向和幅度)更新的步长。
让我们考虑一个可能有助于你可视化学习率的类比。
想象一下,你正在尝试在一个多山的景观中找到最低点,但你被蒙上了眼睛。你只能感觉到你站立的斜坡的陡峭程度(梯度)并相应地迈步。学习率决定了这些步子应该有多大或有多小:
-
如果学习率太高,你可能会超出最低点,最终到达山的另一边,不断超出,永远不会收敛到最优解
-
如果学习率太低,你可能会迈出很小的步子,卡在高原上,或者以痛苦缓慢的速度向最低点前进
理想的学习率允许你采取合理大小的步骤,逐渐接近最低点(最优模型参数集),而不会超出或陷入停滞。
在实践中,找到最佳学习率通常是一个实验和调整的问题。不同的模型和数据集可能需要不同的学习率才能有效地收敛。
现在我们已经理解了微调背后的概念,让我们通过准备数据开始定制过程。
准备数据
我们已经看到为什么定制模型对于提高其准确性和性能很重要。我们还看到,持续预训练是一种无监督学习方法,需要未标记的数据,而微调是一种监督学习方法,需要标记的数据。
我们提供给模型的数据类型可以改变模型响应的方式。如果数据有偏差或具有高度相关的特征,你可能无法从训练过的定制模型中获得正确的响应。这对于你正在训练的任何机器学习模型都是正确的,因此提供高质量的数据至关重要。虽然我不会在本书中涵盖数据处理和特征工程的概念,但我想要强调它们的重要性。如果你希望了解更多关于这些概念的信息,你可以通过任何机器学习课程和书籍来学习,例如 Aurélien Géron 的《动手机器学习:基于 Scikit-Learn、Keras 和 TensorFlow》和 Alice Zheng 与 Amanda Casari 的《机器学习特征工程》。
你需要用于持续预训练和微调的数据集应采用 JSONL 格式。以下文档解释了 JSONL 格式是什么,其要求,示例,以及验证器:jsonlines.org/。
现在,让我们看看我们可以用于这两种方法的准备数据技术。
持续预训练期望数据以{"input": "<raw_text>"}格式提供,而微调期望数据以{"prompt": "<prompt text>", "completion": "<expected generated text>"}格式提供。
这里有一些示例:
-
{"input": "EBITDA stands for Earnings Before Interest, Tax, Depreciation and Amortization"} -
{"prompt": "What's EBITDA?", "completion": "Earnings Before Interest, Tax, Depreciation and Amortization"}
如果您的数据集包含图像,则可以使用 Titan Image Generator 作为基础模型微调文本到图像或图像到嵌入模型。截至写作时,持续预训练仅支持文本到文本模型,不支持图像生成模型。
对于图像数据,微调期望数据以{"image-ref": "s3://path/file1.png", "caption": "caption text"}格式提供。
准备好数据后,您必须将其拆分为训练集和验证集,并将其存储在 Amazon S3 桶中。完成此操作后,您可以创建定制模型。
创建定制模型
要通过 AWS 控制台创建定制模型,请转到 Amazon Bedrock 控制台页面上的定制模型(console.aws.amazon.com/bedrock/home)。图 4.8显示了定制模型页面的外观。它提供了有关定制过程的信息,以及两个标签页模型和训练作业:

图 4.8 – Bedrock 控制台 – 定制模型
在模型标签页下的定制模型中,您可以选择创建微调作业或创建持续预训练作业。选择这两个选项中的任何一个时,您可以在训练作业标签页下查看作业的详细信息,包括其状态。
模型定制组件
模型定制的主体组件(微调或持续预训练)包括源模型、超参数和输入数据,如图 4.8所示。这些输入用于创建训练作业,该作业将输出定制的模型及其指标和日志:

图 4.9 – 定制作业组件
让我们了解更多关于这些内容:
- 源模型:任何定制作业的关键组件是选择您希望定制的源模型。您可以在“创建微调作业”和“创建持续预训练作业”页面上的“模型详情”部分找到所有支持模型的列表,如图图 4.10所示:

图 4.10 – 为定制作业选择模型
-
超参数:除了源模型外,您还可以指定一组超参数。这些参数就像外部旋钮,用于控制模型的训练方式。这些参数与推理参数不同,推理参数是在推理过程中设置的。
-
输入数据:用于训练模型的数据集以 JSONL 格式存在,并已准备并存储在 Amazon S3 存储桶中。
-
训练作业:输入(源模型、超参数和输入数据)用于创建训练作业。还有其他配置细节,例如 VPC 设置,您可以使用它来安全地控制对 Amazon S3 存储桶中数据的访问,IAM 服务角色,它提供对 Bedrock 的访问权限以写入 S3 存储桶,以及模型加密,您可以使用 KMS 密钥加密静态的定制模型。我们将在 第十二章 中介绍 Amazon Bedrock 的安全和隐私。
-
定制模型:一旦训练过程完成,定制模型将存储在 AWS Bedrock 服务团队拥有的 AWS 账户中。
-
在 S3 输出路径内的
step_wise_training_metrics.csv和validation_metrics.csv文件。我们将在 分析结果 部分学习如何评估和分析结果。
现在,让我们看看我们可以使用的 API 调用来创建一个定制模型。
APIs
Amazon Bedrock 提供了多个 API,允许您创建、监控和停止定制作业。本节将探讨其中一些关键 API:CreateModelCustomizationJob、ListModelCustomizationJob、GetModelCustomizationJob 和 StopModelCustomizationJob。
让我们更深入地了解每个 API 调用:
-
customizationType设置为FINE_TUNING或CONTINUED_PRE_TRAINING,baseModelIdentifier为您希望使用的源模型,相关的超参数,以及输入数据(训练和验证数据集)。以下是在 Python SDK(Boto3)中使用作业的示例:import boto3import jsonllm = boto3.client(service_name='bedrock')# Setting customization typecustomizationType = "FINE_TUNING"# Creating customization jobllm.create_model_customization_job(jobName="fine-tuning-job",customModelName="fine-tuned model",roleArn="arn:aws:iam::arn-for-MyBedrockModelCustomizationRole",baseModelIdentifier="arn:aws:bedrock:us-east-1::foundation-model/foundation-model-id",hyperParameters={"epochCount": "1","batchSize": "1","learningRate": "0.007","learningRateWarmupSteps": "0"},trainingDataConfig={"s3Uri": "s3://bucket/path/to/train.jsonl"},validationDataConfig={"validators": [{"s3Uri": "s3://bucket/folder/validation-file.jsonl"}]},outputDataConfig={"s3Uri": "s3://bucket/folder/outputdataconfig/"})一旦运行前面的代码,训练作业将开始。
-
ListModelCustomizationJob:您可以使用此 API 调用来检索您正在运行的全部定制作业列表:
import boto3llm = boto3.client(service_name='bedrock')llm.list_model_customization_jobs() -
IN_PROGRESS、STOPPED、FAILED或COMPLETE。如果模型的状态为FAILED,您将 不会 被收费:import boto3llm = boto3.client(service_name='bedrock')fine_tune_job = llm.get_model_customization_job(jobIdentifier='arn:aws:bedrock:job-arn-from-create-model-customization')print(fine_tune_job['status'])Amazon Bedrock 还与 Amazon EventBridge 集成,您可以在状态发生变化时接收通知。我们将在 第十一章 中深入了解 EventBridge 集成。
-
如果您想停止作业,无论出于什么原因,都可以运行此 API 调用:
import boto3llm = boto3.client(service_name='bedrock')llm.stop_model_customization_job(jobIdentifier='arn:aws:bedrock:job-arn-from-create-model-customization')
一旦开始定制作业,完成所需的时间将根据您提供的训练数据集的大小而变化。如果您的数据集包含几千条记录,训练作业可能需要大约一个小时,而如果数据集包含数百万条记录,训练作业可能需要几天才能完成。
一旦定制作业完成并创建了一个定制模型,我们就可以分析结果并在我们的模型上执行推理。
分析结果
如前所述,在创建定制作业时,我们提供了一个输出 S3 路径,其中训练作业存储了指标和日志。你将在 S3 输出路径中看到step_wise_training_metrics.csv和validation_metrics.csv文件。在这些文件中,你会看到诸如步骤编号、epoch 编号、损失和复杂度等信息。你将在训练和验证集中看到这些详细信息。尽管提供验证集是可选的,但这样做可以评估创建的定制模型的性能指标。
根据数据集的大小,你可以决定保留多少验证数据集。如果你的数据集较小(例如,包含数百或数千条记录),你可以使用 90%作为训练集,10%作为验证集。如果你的数据集很大(例如,包含数十万条记录),你可以减少验证集的大小。因此,如果你有数十万条记录,你可以使用其中的 99%作为训练集,1%作为验证集。
训练和验证的指标
有两种关键的指标类型可以提供关于模型学习效果的宝贵见解:损失和复杂度。让我们更详细地看看:
-
损失: 这个值从 0 到无穷大不等。在训练过程中计算的损失值表示模型与训练数据的拟合程度。同时,验证损失显示模型在训练完成后对新、未见过的示例进行泛化的有效性。损失是评估模型在训练期间性能的最常用指标之一。一般来说,较低的损失值更可取,表明模型很好地拟合了数据。较高的损失值表明模型的预测与实际响应相差甚远,并且犯了很多错误。
-
复杂度: 这个值从 1 到无穷大不等。它衡量语言模型在序列中准确预测下一个标记的能力。较低的复杂度得分对应着更好的预测和模型的能力。
当使用 Bedrock 训练模型时,损失和复杂度是数据科学家分析的重要指标。一次表现良好的训练运行将显示训练和验证损失值随时间收敛。这种收敛表明模型正在从训练数据中学习,而没有过拟合。
推理
一旦作业成功并且我们已经验证了训练和验证指标,我们就可以对模型进行推理。我们首先需要做的是购买预留吞吐量,这为我们提供了部署模型的专用容量。在撰写本文时,自定义 Bedrock 模型只能通过预留吞吐量进行部署。然而,你也可以使用预留吞吐量来部署 Bedrock 支持的基本 FM。
在撰写本文时,Bedrock 提供了三种承诺条款。
-
无长期承诺(按小时计费)
-
1 个月
-
6 个月:

图 4.11 – 模型单元 & 承诺条款
1。模型单元是一种定义吞吐量的方式,吞吐量以每分钟处理的最大输入和输出标记数来衡量:

图 4.12 – 已配置吞吐量
购买已配置吞吐量后,您可以在 Bedrock 控制台中查看其详细信息,也可以通过ListProvisionedModelThroughputs和GetProvisionedModelThroughput API 获取。
一旦已配置吞吐量达到活动状态,您创建的定制模型将被部署到端点。此时,您可以使用游乐场体验或通过 API 对模型进行推理。这两种选项将在下文中进行讨论。
Amazon Bedrock 游乐场
通过游乐场体验进行推理非常简单,与您对基础 FM 进行推理的方式相似。
您可以选择您创建的定制模型而不是使用基础模型,此时您就可以向模型提问或提供提示。图 4.13 展示了从 Bedrock 游乐场中选择custom-titan-1705116361模型的过程,该模型可以在用户提供的训练数据上进行微调:

图 4.13 – 选择模型
Amazon Bedrock API
Bedrock 还提供了modelId,我们应该提供已配置端点的arn模型。您可以从Bedrock 控制台 – 已配置吞吐量选项卡或通过GetProvisionedModelThroughput API 获取:
Bedrock_runtime.invoke_model(
modelId=arn-provisioned-throughput,
body="""
{
"inputText": "Classify this statement as Positive, Neutral, or Negative:\\n'I really do not like this!'",
"textGenerationConfig":{
"maxTokenCount": 1,
"stopSequences": [],
"temperature": 1,
"topP": 0.9
}
"""
)
response_body = response["body"].read().decode('utf8')
print(response_body)
print(json.loads(response_body)["results"][0]["outputText"])
现在我们已经了解了如何使用 Amazon Bedrock 微调模型并利用已配置吞吐量,让我们学习如何导入选定的定制模型。
在 Amazon Bedrock 中导入定制模型
要利用 Amazon Bedrock 中的导入模型功能,导航到 Bedrock 控制台。在左侧面板中,在基础模型下点击导入的模型。
一旦您进入导入的模型页面,如图图 4.14 所示,您将能够通过直接从 Amazon SageMaker(您可能已经自定义了 FM)导入模型或从 Amazon S3 存储桶导入模型文件来创建一个定制模型:

图 4.14 – 导入的模型
在撰写本文时,将模型导入 Amazon Bedrock 会创建一个支持以下模式的定制模型:
-
持续预训练或微调模型:如前所述,您可以通过使用专有数据来细化预训练模型,同时保持原始模型配置的结构完整性。
-
领域自适应: 你可以将自定义导入的模型调整到特定领域。通过解决领域特定的变化,这种自适应过程将提高模型在目标领域内的性能。例如,可以进行语言自适应,以便生成地区方言或语言,如泰米尔语或葡萄牙语。
-
从头开始预训练: 如你所知,这种方法不仅限于自定义权重和词汇表。这种方法为你提供了修改基本模型参数的机会,包括注意力头数量、隐藏层或上下文长度。此外,诸如训练后量化或集成基础和适配器权重等技术,可以进一步优化和改进模型的架构。
要启动“导入模型”作业,你可以提供模型详细信息,包括相关的模型名称、导入作业名称和模型导入设置。
在撰写本书时,导入的模型可以支持 Mistral、Flan、Llama2 和 Llama3 架构。随着生成式人工智能领域的演变,Bedrock 可能会在未来扩展支持模型导入的架构列表。
一旦模型导入作业成功完成,导入的模型将列在“导入模型”页面的“模型”选项卡上。在这里,你可以查看导入模型的关键细节,如其 ARN、模型 ID 和状态。从该页面,你也可以通过 Bedrock API 调用导入的模型进行推理。
关于 Amazon Bedrock 的自定义模型功能支持的模型类型和开源架构的详细信息,可以在docs.aws.amazon.com/bedrock/latest/userguide/model-customization-import-model.html#model-customization-import-model-architecture找到。
注意
请确保您的账户有足够的配额限制来执行“创建模型导入作业”操作。如果没有,将显示以下错误:

图 4.15 – 错误
你可以通过访问us-east-1.console.aws.amazon.com/servicequotas/home/services/bedrock/quotas来请求增加配额限制。
在本章中,我们学习了如何准备数据集、自定义 FM,然后检查其性能和执行推理。现在,让我们看看在尝试自定义模型时需要考虑的一些指南和最佳实践。
指南和最佳实践
在自定义模型时,为了获得最佳结果,应考虑以下实践:
-
提供 dataset: 在机器学习中,最重要的是 dataset。大多数情况下,您的模型表现如何取决于您提供给训练模型的 dataset。因此,提供与您的用例一致的高质量数据非常重要。如果您在大学学习过机器学习或在这个领域工作过,您可能已经学到了各种特征工程和数据预处理技术,您可以使用这些技术来清理和处理数据。例如,您可以在 dataset 中处理缺失值,确保您不提供有偏见的 data,或者确保 dataset 遵循模型期望的格式。如果您想了解更多关于提供高质量数据的信息,请阅读 Alice Zheng 和 Amanda Casari 的《机器学习特征工程》。这个原则同样适用于生成式 AI,因为它本质上是机器学习的一个子集。
-
选择合适的 FM: 接下来,您需要选择您想要定制的基 FM。确保您查看其属性,它支持多少个 token,它训练过什么类型的数据,以及模型的大小。在 Bedrock 控制台中查看模型卡片,阅读这些模型的网站,并使用标准基准(如 GLUE、SuperGLUE、HELMA 和 HuggingFace 的 OpenLLM)来查看它们的性能。然而,请记住,您不应完全依赖这些基准工具,因为它们可能无法代表真实世界应用的复杂性和多样性。
-
确定超参数: 一旦您有了高质量的 dataset 并且已经选择了正确的基模型,您需要确定定制的正确超参数。您的目标应该是避免过拟合;模型应该能够很好地泛化到新的未见信息。您可以调整几个超参数,例如 epoch 数量、批量大小、学习率、提前停止等。您可以在
docs.aws.amazon.com/bedrock/latest/userguide/custom-models-hp.html找到所有 Bedrock 模型支持的超参数列表。 -
评估性能:一旦你微调了模型,请使用验证数据集评估其性能。验证数据集是保留用于训练模型的数据集,用于评估模型。要了解更多关于数据拆分的信息,请访问
mlu-explain.github.io/train-test-validation/。在这里,你可以查看不同的指标,如损失和困惑度,或使用准确度、双语评估助手(BLEU)和基于召回的摘要评估助手(ROUGE)分数等技术。为了了解背景,BLEU 分数表示机器生成的翻译与由人工翻译者提供的参考翻译集的质量评估。ROUGE 分数在文本摘要任务中很有用,其中评估是基于机器生成的摘要与由人类创建的相应参考摘要的质量比较。如果模型没有提供期望的性能结果,你必须调整超参数或引入更多数据集。一旦模型准备好使用并提供所需的评估结果,你就可以在模型上执行推理。 -
针对特定领域调整模型:将模型定制到商业领域是一种提高生产力和效率的有前景的方法。通过将模型定制为满足特定行业的特定需求,我们可以使其执行以前不可能或效率低下的任务,并创造一个更具竞争力和成功的业务。
采用这些实践可以帮助你充分利用定制 FM 并发挥生成式 AI 的真正力量。
摘要
在本章中,我们探讨了两种模型定制技术:微调和持续预训练,以及定制模型的需求,并理解了微调和持续预训练背后的概念。此外,我们准备了我们的数据集,创建了一个自定义模型,评估了模型,并进行了推理。
最后,我们讨论了一些你在定制你的 FM 时需要考虑的指南和最佳实践。
在下一章中,我们将通过使用外部数据源来揭示 RAG 在解决现实世界商业问题中的力量。我们将深入研究各种用例和示例架构,并使用 Amazon Bedrock 实现 RAG。
第五章:利用 RAG 的力量
到目前为止,我们知道 FM 是使用大量数据集进行训练的。然而,用于训练 FM 的数据可能不是最新的,这可能导致模型产生幻觉。在本章中,我们将通过增强模型以外部数据源来利用 RAG 的力量,以克服幻觉的挑战。
我们将探讨 RAG 在生成式 AI 场景中的重要性,RAG 的工作原理及其组件。然后我们将深入研究 RAG 与 Amazon Bedrock 的集成,包括 Amazon Bedrock 提供的完全管理的 RAG 体验,称为知识库。本章将随后以实践方法介绍知识库的实现和使用 API。
我们将探讨一些 RAG 的实际场景,并讨论一些实现 RAG 的解决方案架构。您还将了解到如何使用 Amazon Bedrock、LangChain 调度和其他生成式 AI 系统实现 RAG 框架。最后,我们将探讨在 RAG 的背景下,Amazon Bedrock 的当前局限性和未来研究方向。
到本章结束时,您将能够理解 RAG 的重要性,并能够使用 Amazon Bedrock 来实现它。学习这些方法将使您能够将 RAG 的概念应用于您自己的企业用例,并构建生产级别的应用程序,例如对话界面、问答系统或模块摘要工作流程。
本章将涵盖以下关键主题:
-
解码 RAG
-
使用 Amazon Bedrock 实现 RAG
-
使用其他方法实现 RAG
-
高级 RAG 技术
-
局限性和未来方向
技术要求
本章要求您有权访问 AWS 账户。如果您还没有账户,可以访问 aws.amazon.com/getting-started/ 创建 AWS 账户。
其次,您需要在创建账户后安装和配置 AWS CLI (aws.amazon.com/cli/),这将用于从您的本地机器访问 Amazon Bedrock FMs。由于我们将要执行的代码单元格的大部分基于 Python,此时设置 AWS Python SDK (Boto3) (docs.aws.amazon.com/bedrock/latest/APIReference/welcome.html) 将非常有用。您可以通过以下方式执行 Python 设置:在您的本地机器上安装它,或使用 AWS Cloud9、AWS Lambda,或利用 Amazon SageMaker。
注意
与 Amazon Bedrock 的 FMs 的调用和定制将产生费用。请参阅 aws.amazon.com/bedrock/pricing/ 了解更多信息。
解码 RAG
RAG 是一种 NLP 方法,它结合了大规模检索和神经生成模型。关键思想是从大型语料库中检索相关知识并将其纳入文本生成过程。这使得生成模型如 Amazon Titan Text、Anthropic Claude 和生成预训练 Transformer 3(GPT-3)能够通过在外部知识的基础上进行生成,产生更真实、具体和连贯的文本。
RAG 已成为一种有前途的技术,可以使神经生成模型更加知识渊博和可控。在本节中,我们将概述 RAG,解释它是如何工作的,并讨论关键应用。
什么是 RAG?
传统的生成模型,如 BART、T5 或 GPT-4,以自监督的方式在大量的文本数据上进行训练。虽然这使它们能够生成流畅且类似人类的文本,但一个主要的局限性是它们缺乏训练数据之外的世界知识。这可能导致生成文本中的事实不一致、重复和幻觉。
RAG 旨在通过从大型外部语料库中检索相关上下文来将生成内容与知识联系起来。例如,如果模型正在生成关于巴黎的文本,它可能会检索关于巴黎的维基百科段落来指导生成。这个检索到的上下文被编码并整合到模型中以指导文本生成。
通过将检索到的知识增强到生成模型中,已经在各种领域产生了更真实、具体和连贯的文本。
RAG 系统的关键组件如下:
-
一个能够生成流畅文本(或多模态)输出的 GenAI 模型——具体来说,是一个 FM 或 LLM。
-
用于从数据集中检索相关信息的数据集(例如,维基百科,网页,文档)。
-
检索模块,它编码输入查询并根据与查询的相关性从知识语料库中检索相关段落。
-
重新排序器,通过重新评分和根据与查询的相关性对检索到的段落进行排序来选择最佳上下文信息。(在构建基本的 RAG 系统时,这一步是可选的,但在构建具有高级 RAG 技术的企业级系统时变得至关重要)。
-
融合模块,用于将检索集成到语言模型中。这可能涉及诸如连接或允许语言模型根据相关外部知识进行条件化等技术。
-
其他组件可能还包括查询重写、混合搜索技术和多阶段检索,这些将在本章后面进行介绍。
为了更好地理解 RAG 方法,让我们通过一个简单的例子来了解一下:
-
What arethe key events in the life ofMarie Curie? -
将
What are the key events in the life of Marie Curie?转换成一个密集的向量表示。然后它通过知识语料库(例如,维基百科,网页)来查找相关段落。例如,它可能会检索以下内容:-
玛丽·居里是一位波兰物理学家和化学家,她进行了关于放射性的先驱研究... -
1903 年,居里因研究自发辐射而成为第一位获得诺贝尔奖的女性。 -
居里在 1911 年获得了第二个诺贝尔奖,这次是化学奖,因为她发现了元素镭和钋...
-
-
重新排序器:重新排序器根据与原始查询的相关性使用交叉注意力对检索到的段落进行评分和重新排序。它可能确定段落 II 和 III 比段落 I 更相关。
-
融合模块:然后,将最高重新排序的段落(例如,II 和 III)整合到生成语言模型中,通过连接、总结或允许模型关注检索到的段落的不同部分来实现;也就是说,在生成输出时根据需要关注检索到的段落的不同部分。
注意,融合步骤的目标是以一种允许对生成的输出进行有效条件化知识的方式,向生成语言模型提供最相关的外部知识,从而产生更准确、信息丰富和有根据的响应。
-
玛丽·居里的关键事件包括:-
1903 年,她因研究自发辐射(放射性)而成为第一位获得诺贝尔奖的女性。 -
1911 年,她因发现元素镭和钋而获得了第二个诺贝尔化学奖。
-
-
通过从外部语料库检索相关知识和将其整合到语言模型中,RAG 系统可以生成更信息丰富和准确的响应,克服了仅依赖模型训练数据的局限性。
注意
稠密向量表示,也称为密集嵌入或密集向量,是一种将意义和语义关系编码为机器可以有效地处理的数值格式的方法。这允许使用余弦相似度等技术识别语义相关的单词/文本,即使没有精确的关键词匹配。密集向量通过为深度学习模型提供有效的语义表示,为许多现代 NLP 应用(如语义搜索、文本生成、翻译等)提供动力。
我们将在RAG 组件部分进一步深入探讨这些组件。既然你现在对 RAG 有了简要的了解,是时候认识到 RAG 在 GenAI 宇宙中的重要性了。
RAG 的重要性
在我们深入探讨 RAG 的工作原理及其组件之前,了解为什么需要 RAG 是很重要的。随着大型语言模型越来越能够生成流畅和连贯的文本,将它们基于事实知识进行定位并防止潜在的幻觉也变得更加重要。如果你向 LLM 提出与最近事件相关的问题,你可能会注意到模型正在进行幻觉。通过 RAG,你可以将最新知识作为模型的上下文来增强,通过减少事实错误的可能性来提高内容质量。
RAG 的另一个主要优势是克服了模型有限的上下文长度(输入令牌限制)。当提供的文本片段作为上下文,且在模型的令牌限制内时,你可能不需要使用 RAG 并利用上下文提示。然而,如果你想向模型提供一个大型文档集合作为上下文,使用 RAG 将是一个更好的方法。即使文档集合可以放入上下文中,RAG 也有其益处,因为“大海捞针”的问题可能会影响检索准确性。总结来说,RAG 在两个主要用例中特别有用:
-
当文档集合的大小超过上下文长度时
-
当我们想要动态地向模型提供上下文,而不是一次性提供整个文档集合时
RAG 在改善生成式 AI 方面有许多潜在的应用。它可以帮助构建依赖于真实企业数据的上下文聊天机器人。它可以根据用户的历史和偏好实现个性化搜索和推荐。RAG 方法还可以通过检索和压缩关键事实来帮助实时总结大量文档。例如,将 RAG 应用于总结大量的法律文本或学术论文,可以提取和压缩重要信息,提供简洁的总结,捕捉核心要点。总的来说,RAG 是克服当前生成模型某些限制并使其基于事实知识的重要技术。这有助于使生成内容更加有用、可靠和个性化。
关键应用
与其他 LLM 定制技术(如提示工程或微调)相比,RAG 提供了几个优势:
-
知识源的灵活性:知识库可以根据每个用例进行定制,而无需更改底层 LLM。知识可以轻松添加、删除或更新,无需昂贵的模型重新训练。这对于知识快速发展的组织特别有用。
-
经济高效:RAG 允许单个主机 LLM 通过可交换的知识源在许多用例之间共享。无需为每个用例训练定制模型,这意味着更高的成本效率。
-
自然语言查询:RAG 依赖于自然语言从知识源检索上下文,与使用僵化提示模板的提示工程不同。这使得用户在与模型工作时更加灵活。
对于大多数拥有定制信息知识库的组织来说,RAG 在成本、灵活性和可用性之间取得了平衡。对于少量上下文,提示工程就足够了,而完整的模型微调则涉及高昂的训练成本和僵化的知识。RAG 允许轻松更新知识库,并在不同用例之间共享 LLM。
例如,RAG 非常适合管理跨多个客户不断演变的文档库的企业对企业软件即服务(B2B SaaS)公司。单个托管的大型语言模型(LLM)可以通过交换其上下文文档来处理跨客户的查询,从而消除为每个客户创建模型的需求。
现在我们已经了解了 RAG 在不同场景中的重要性和潜在应用,让我们深入探讨 RAG 的工作原理。
RAG 是如何工作的?
图 5.1提供了 RAG 工作原理的高级概述:

图 5.1 – 简化的 RAG
让我们现在详细理解这些步骤:
-
给定用户的提示,检索器模块被调用以将输入查询编码为密集向量表示。
-
检索器模块随后根据查询向量与知识库内容的预计算密集向量表示之间的最大内积相似度(语义相似度),从知识库中找到相关的上下文(段落或文档)。
-
可选的重新排序模块可以重新评分和重新排序最初检索到的结果,并选择最佳的上下文段落来增强生成。重新排序器有助于突出最相关的段落。
-
排名最高的检索上下文与输入查询融合,形成增强提示(查询和上下文)。
-
生成模型,即 FM 或 LLM,随后根据原始查询提示和检索到的相关知识上下文产生输出文本。
-
在某些 RAG 系统中,检索和重新排序过程可以在生成步骤中重复进行,以便在生成输出时动态检索更多相关知识。
RAG 的关键好处是确保生成的输出基于来自可信外部来源的准确和最新信息,提供源引用以实现透明度,并减少仅从语言模型的训练数据中产生的幻觉或不准确性。
RAG 系统通过适当来源、审查和定制特定用例的基础数据源和模型,满足企业对通用人工智能(GenAI)的需求,如全面性、可信性、透明性和可靠性。
RAG 的组成部分
如前所述,一旦收到查询,就会从知识源检索相关上下文并将其压缩为上下文文档。然后,将此上下文与原始查询连接起来,输入到 LLM 中以生成最终响应。知识源充当可频繁更新的动态长期记忆,而 LLM 则贡献其强大的语言生成能力。
知识库
RAG 模型的一个关键组件是知识库,它包含用于检索的外部知识。知识库以优化快速检索的格式存储信息,例如密集向量或索引。
在 RAG 中使用的流行知识源包括维基百科、新闻档案、书籍、科学论文以及专门为 RAG 模型创建的专有知识库。知识可以包括结构化(例如,表格和列表)和非结构化(例如,自由文本)数据。
在典型的 RAG 场景中,构成知识语料库的文档(或网页)的文本内容需要被转换成密集向量表示或嵌入,这些编码数据被分成更小的块。为了在编码时保留表格或列表的结构,使用了更高级的编码技术,这些技术可以将整个表格/列表嵌入为一个单一的向量,同时保留它们的行/列关系。
长的非结构化文本段落通常会被分成更小的文本段或最大长度(例如,200 个标记)的段落。然后,这些块或段落被独立地编码成密集向量表示。
此嵌入过程通常在异步或批量处理中发生,在接收任何用户查询之前,与 RAG 系统分开进行。
在系统部署或用于任何查询回答之前,整个文档语料库的嵌入被预先计算并存储。这一预计算步骤的必要性有以下原因:
-
文档语料库通常可能非常大(例如,维基百科有数百万篇文章)
-
在查询时嵌入整个语料库将非常慢且效率低下
-
预计算的嵌入允许在查询时快速进行最大内积搜索
通过提前异步嵌入来源,RAG 系统可以通过比较查询嵌入与预先计算的文档嵌入,使用高效的向量相似性搜索方法(如余弦相似度、欧几里得距离、无互锁流水级阶段的微处理器(MIPS)或Facebook AI 相似性搜索(FAISS))快速检索相关文档。鼓励读者回顾论文《关于在神经嵌入上高效处理相似性查询的综述》(arxiv.org/abs/2204.07922),该论文概述了高效处理相似性查询的方法。
注意,知识库的大小和范围对 RAG 系统的能力有重大影响。具有更多样化、高质量知识的更大知识库为模型提供了更多上下文信息,以便根据用户的问题进行抽取。
检索模块
检索模块负责为每个特定上下文从知识库中找到和检索最相关的知识。检索模型的输入通常是用户的提示或上下文。
嵌入模型将提示编码成向量表示,并将其与知识库的编码表示进行匹配,以找到最接近的匹配条目。
常见的检索方法包括稀疏方法,如词频-逆文档频率(TF-IDF)或最佳匹配 25(BM25),以及密集方法,如从双编码器模型中提取的嵌入表示的语义搜索。检索模型对知识进行排序,并将最相关的* k *个片段返回给生成模型。
检索模型与生成模型之间的集成越紧密,检索结果越好。
条件化生成模型
使 RAG 过程成为生成性的关键方面是条件生成模型。该模型将检索到的知识与原始提示一起生成输出文本。
知识可以通过不同的方式提供以条件化生成:
-
将检索到的文本连接到提示中
-
将检索到的文本编码为密集向量
-
在特定位置将检索到的文本插入到输入中
例如,在典型场景中,检索到的知识被输入提示增强,并输入到 LLM 中,以向最终用户提供简洁的响应。这允许 LLM 直接根据相关事实和上下文对文本生成进行条件化。鼓励用户查阅论文《利用生成模型进行开放域问答中的段落检索》(arxiv.org/pdf/2007.01282.pdf),以深入了解问答框架领域中 RAG 的复杂性。
生成模型通常是大型预训练语言模型,如 GPT-4、Anthropic Claude 3、Amazon Titan Text G1 等。如果需要,该模型可以进一步在下游 RAG 任务上进行端到端微调,以优化特定用例中检索知识的集成。现在,让我们深入了解使用 Amazon Bedrock 探索 RAG。
使用 Amazon Bedrock 实现 RAG
在响应用户查询之前,系统必须摄入和索引提供的文档。这个过程可以被认为是步骤 0,包括以下子步骤:
-
将原始文本文档摄入到知识库中。
-
通过将文档分割成更小的块来预处理文档,以实现更细粒度的检索。
-
使用嵌入模型(如 Amazon Bedrock 的 Titan Text Embeddings 模型)为每个段落生成密集向量表示。这把每个段落的语义意义编码到高维向量空间中。
-
将段落及其对应的向量嵌入索引到一个专门为高效最近邻(NN)搜索优化的搜索索引中。这些也被称为向量数据库,它们以向量的形式存储文本的数值表示。此索引能够快速检索对用户查询最相关的段落。
通过完成此工作流程,系统构建了一个索引语料库,准备好为摄入的文档集合中的自然语言查询提供相关结果。段落分割、嵌入和索引步骤使系统能够实现强大的排名和检索能力。
图 5.2中展示的流程图展示了之前描述的 RAG 过程的总体流程:

图 5.2 – 使用亚马逊 Bedrock 的 RAG
当文档被正确索引后,系统可以通过以下流程通过自然语言问题提供上下文答案:
-
步骤 1:使用嵌入模型(如亚马逊 Titan Text Embeddings 模型或 Cohere 的嵌入模型)将输入问题编码为密集向量表示(嵌入),这些模型都可以通过亚马逊 Bedrock 访问。这捕捉了问题的语义意义。
-
步骤 2:使用余弦相似度或其他距离度量比较问题嵌入与索引文档嵌入。这检索到最相关的文档片段。将排名靠前的文档片段附加到提示中作为上下文信息。这为模型提供了相关的背景知识。
-
步骤 3:将带有上下文的提示传递给亚马逊 Bedrock 上可用的 LLM,例如 Anthropic Claude 3、Meta Llama 3 或亚马逊 Titan Text G1 - Express。这利用了模型根据检索到的文档生成答案的能力。
最后,返回模型生成的答案,这应该显示出对上下文文档中问题的理解。
因此,系统利用亚马逊 Bedrock FMs 提供基于相关文档和上下文的自然语言问题回答。仔细索引和编码文档使得检索与生成模型的集成无缝,从而提供更明智和准确的答案。
以下是一个使用亚马逊 Bedrock 和亚马逊 OpenSearch Serverless 作为向量引擎的 RAG 实现的示例:aws.amazon.com/blogs/big-data/build-scalable-and-serverless-rag-workflows-with-a-vector-engine-for-amazon-opensearch-serverless-and-amazon-bedrock-claude-models/.
现在我们已经讨论了使用亚马逊 Bedrock 实现 RAG 的一些细节,让我们深入探讨通过亚马逊 Bedrock 上的知识库使用 RAG 解决用例。
亚马逊 Bedrock 知识库
亚马逊 Bedrock 通过知识库提供完全管理的 RAG 体验,在幕后处理复杂性,同时让你控制你的数据。Bedrock 的知识库功能使能够将多样化的数据源聚合到一个集中的机器可读信息库中。知识库自动从你的数据创建向量嵌入,将它们存储在管理的向量索引中,并处理嵌入、查询、来源归因和生产 RAG 的短期记忆。
亚马逊 Bedrock 中知识库的关键优势包括以下内容:
-
无缝 RAG 工作流程:无需自行设置和管理组件。你只需提供你的数据,让亚马逊 Bedrock 处理导入、嵌入、存储和查询。
-
自定义向量嵌入:你的数据被导入并转换为针对你的用例定制的向量表示,可以选择嵌入模型。
-
亚马逊 Bedrock 中的
RetrieveAndGenerateAPI 提供对源文档的归因,并管理会话历史以进行上下文响应。 -
灵活集成:通过 API 访问和集成支持其他 GenAI 工具将 RAG 集成到你的工作流程中。
亚马逊 Bedrock 知识库设置
客观地说,以下步骤有助于知识库的创建和集成:
-
识别和准备用于导入的数据源
-
将数据上传到亚马逊简单存储服务(Amazon S3)以实现集中访问
-
通过 FM 生成数据嵌入并持久化到向量存储中
-
将应用程序和代理连接到查询并将知识库集成到工作流程中
要创建数据导入作业,请按照以下步骤操作:
-
设置你的知识库:在你可以导入数据之前,你需要创建一个知识库。这涉及到定义知识库的结构和模式,以确保它可以有效地存储和管理数据。
-
准备你的 数据源:
-
确保你的数据存储在 Amazon S3 中。数据可以是各种格式,包括结构化(例如,CSV、JSON)和非结构化(例如,文本文件、PDF)。
-
以便于管理和检索的方式组织你的数据。
-
-
创建一个 数据导入作业:
-
导航到 AWS Bedrock 控制台并转到知识库部分。
-
选择创建新的数据导入作业选项。
-
提供必要的详细信息,例如作业名称、S3 存储桶位置和数据格式。
-
配置作业以指定数据应该如何处理并导入到知识库中。
-
-
配置 同步设置:
-
设置同步设置以确保知识库使用最新的数据从你的 S3 位置更新。
-
你可以配置同步以定期运行(例如,每天或每周)或根据需要手动触发。
-
确保同步设置已优化以高效处理大量数据。
-
-
运行 数据导入作业:
-
一旦配置了作业,您就可以开始导入过程。
-
通过 AWS Bedrock 控制台监控作业的进度。您可以查看日志和状态更新,以确保作业运行顺利。
-
现在我们对导入过程有了基本的了解,让我们彻底地了解这些细节。
为了在 AWS 控制台中启动此管道,用户可以导航到 Amazon Bedrock 页面中的编排部分,如图 5.3 所示:

图 5.3 – 知识库
现在,让我们更深入地看看这些步骤:
-
点击知识库并输入您打算创建的知识库的相关详细信息。您可以提供自定义的知识库名称、描述以及创建新的服务角色或利用现有服务角色为知识库设置相应的身份和访问管理(IAM)权限。您还可以为此资源提供标签,以便于搜索和筛选您的资源,或在知识库详细信息部分跟踪与知识库相关的 AWS 成本。
-
在下一步中,您将通过指定数据要索引的 S3 位置来设置数据源。您可以指定特定的数据源名称(或利用默认的预填充名称)并提供包含源数据的存储桶的 S3 URI(统一资源标识符),如图 5.4 所示:

图 5.4 – 知识库:设置数据源
- 您还可以提供您用于加密 S3 数据的客户管理的密钥管理服务(KMS)密钥,以便 Bedrock 服务在将给定数据导入向量数据库时解密它。在高级设置(如图 5.5 所示),用户可以选择默认的 KMS 密钥或通过输入亚马逊资源名称(ARN)或搜索他们存储的定制密钥(或即时创建新的 AWS KMS 密钥)来自定义加密设置。为通过 Amazon Bedrock 导入的 S3 数据源提供客户管理的 KMS 密钥是为了增强数据安全、合规性和控制。它允许数据主权、密钥轮换/吊销、职责分离(SoD)、审计/日志功能,并与现有的密钥管理基础设施集成。通过管理自己的加密密钥,您可以获得对数据保护更大的控制权,满足监管要求并与组织的安全策略保持一致,以处理敏感或受监管的数据:

图 5.5 – 知识库:高级设置
在 分块策略(如图 图 5.6 所示)下,用户可以选择在创建嵌入之前如何将源位置中的文本分解成更小的段。默认情况下,知识库将自动将您的数据分成包含最多 300 个标记的小块。如果一个文档或换句话说,源数据包含少于 300 个标记,则在该情况下不会进一步分割:

图 5.6 – 知识库:分块策略
或者,您可以选择使用 固定大小分块 来自定义块大小,或者如果您已经将源文档预处理为更小的块文件,并且不打算使用 Bedrock 进一步分块文档,则简单地选择 不进行分块。
在下一个阶段,用户将选择一个嵌入模型将所选数据转换为嵌入。目前,有四种嵌入模型受到支持,如图 图 5.7 所示。此外,在 向量数据库 下,用户可以选择推荐路线——即选择快速创建选项,这将自动在所选账户的背景中创建一个 Amazon OpenSearch Serverless 向量存储:
注意
向量嵌入是文本数据的数值表示,它编码语义或上下文意义。在 NLP 管道中,文本文档通过嵌入模型转换,将包括单词等离散标记的块转换为连续向量空间中的密集向量。良好的向量表示允许 机器学习(ML)模型理解单词和概念之间的相似性、类比以及其他模式。换句话说,如果向量表示(嵌入)在大数据集上训练良好,它们将捕获数据中的有意义关系。这使得使用这些嵌入的 ML 模型能够识别如下事物:
-
哪些单词在意义上相似(例如,国王 和 王后)
-
哪些概念遵循类比模式(例如,人 对 国王 就像 女人 对 王后)
-
在嵌入空间中如何表示概念的其他模式
训练良好的嵌入实际上为 ML 模型提供了数据中固有的关系和模式的数值映射。这使得模型在下游任务训练期间更容易学习和推断这些模式。
因此,简单来说,好的嵌入有助于 ML 模型理解单词和概念之间的相似性和关系,而不仅仅是将它们视为孤立的数据点。

图 5.7 – 知识库:配置向量存储
或者,你可以选择自己的向量存储(如图 图 5.8 所示)。在撰写本书时,你可以选择 Amazon OpenSearch Serverless 向量引擎、Amazon Aurora、MongoDB Atlas、Pinecone 或 Redis Enterprise Cloud。一旦选择,你可以提供字段映射以继续进行知识库创建的最终设置。根据用例,开发人员或团队可能会选择一个向量数据库而不是另一个。你可以在 aws.amazon.com/blogs/database/the-role-of-vector-datastores-in-generative-ai-applications/ 上了解更多关于向量数据存储在 GenAI 应用中的作用:

图 5.8 – 知识库:向量数据库
你可以查看 aws.amazon.com/blogs/aws/preview-connect-foundation-models-to-your-company-data-sources-with-agents-for-amazon-bedrock/ 了解如何使用 Pinecone、OpenSearch Serverless 或 Redis 设置自己的向量存储。
假设你选择了默认路由,涉及创建新的 Amazon OpenSearch Serverless 向量存储,你可以在审查所有提供的信息后继续操作,并点击如图 图 5.9 所示的 创建知识库:

图 5.9 – 知识库:审查和创建
创建完成后,你可以同步信息以确保知识库正在摄取和操作存储在您的 Amazon S3 位置的最新数据。知识库同步完成后,用户可以通过点击 选择模型 并选择适合其用例的适当模型来测试该知识库,如图 图 5.10 所示:

图 5.10 – 测试知识库:选择模型
选择适当的模型后,你可以在文本框中输入特定查询,并接收模型生成的特定响应,如图 图 5.11 所示:

图 5.11 – 测试知识库
在其核心,Amazon Bedrock 将用户的查询转换为意义的向量表示;即嵌入。然后,它使用这些嵌入作为搜索标准在知识库中搜索相关信息。检索到的任何知识都将与为 FM 工程的提示结合,提供必要上下文。FM 将此上下文知识集成到其响应生成中,以回答用户的问题。对于跨越多个回合的对话,Amazon Bedrock 利用其知识库来维护对话上下文和历史,提供越来越相关的结果。
关于测试知识库和检查源块的相关信息,请参阅 docs.aws.amazon.com/bedrock/latest/userguide/knowledge-base-test.html。
为了确保您的知识库始终保持最新,自动化同步过程至关重要。这可以通过使用 AWS Lambda 函数或 AWS Step Functions 根据特定事件或计划触发摄取作业来实现。
AWS Lambda 是一种无服务器计算服务,允许您在不配置或管理服务器的情况下运行代码。您可以通过创建 Lambda 函数来自动化诸如触发数据摄取作业、处理数据或发送通知等任务。Lambda 函数可以由各种事件触发,包括上传到 Amazon S3 的文件、DynamoDB 表的更改,或使用 Amazon CloudWatch Events 定时的事件。
AWS Step Functions 是一种无服务器函数编排器,允许您将多个 AWS 服务协调到业务工作流程中。您可以创建状态机,定义一系列步骤,包括 Lambda 函数、数据处理任务和错误处理逻辑。Step Functions 特别适用于编排复杂的数据摄取管道或机器学习工作流程。
定期监控和管理数据源对于保持其相关性和准确性至关重要。Amazon CloudWatch 是一种监控和可观察性服务,它为您的 AWS 资源提供数据和可操作见解。您可以使用 CloudWatch 设置警报和通知,以解决数据同步过程中的任何问题或异常。CloudWatch 可以监控指标,如 Lambda 函数调用、Step Functions 执行和 Amazon S3 存储桶活动,使您能够主动识别和解决潜在问题。
遵循数据管理最佳实践,例如逻辑组织数据、维护数据质量和确保数据安全,至关重要。AWS 提供各种服务和工具来支持数据管理最佳实践:
-
您可以在 Amazon S3 存储桶中组织您的数据,并利用版本控制、生命周期策略和访问控制等功能来维护数据质量和安全性。
-
AWS Glue 是一个全托管的 提取、转换和加载 (ETL) 服务,可以帮助您在不同数据存储之间可靠地准备和移动数据。Glue 可以用于在将数据摄入到您的知识库之前清理、转换和丰富您的数据。
-
AWS Lake Formation 是一项帮助您在 Amazon S3 上构建、保护和管理工作数据湖的服务。它提供数据编目、访问控制和审计等功能,可以帮助确保数据安全和治理。
应定期审查和更新知识库,以删除过时信息并纳入新的、相关数据。AWS 提供了如 Amazon Kendra 和 Amazon Comprehend 等服务,可以帮助您分析和理解您的知识库内容,识别过时或不相关信息,并提出更新或改进建议。
跟踪可操作的指标,例如搜索成功率、用户参与度和数据新鲜度,也很重要。这些指标可以帮助持续改进知识库,确保其有效地满足用户的需求。
Amazon CloudWatch 可以用于收集和分析来自各种 AWS 服务(包括您的知识库应用程序)的指标。您可以创建自定义指标、仪表板和警报来监控您知识库的性能和用法。
通过利用 AWS 服务,如 Lambda、Step Functions、CloudWatch、S3、Glue、Lake Formation、Kendra 和 Comprehend,您可以自动化同步过程,监控和管理数据源,遵守数据管理最佳实践,并跟踪可操作的指标,以确保您的知识库保持最新、相关且有效地满足用户的需求。
鼓励读者访问 Amazon Bedrock RAG GitHub 仓库 (github.com/aws-samples/amazon-bedrock-rag),以探索和实现一个使用 Amazon Bedrock 知识库的完全托管 RAG 解决方案。
API 调用
对于希望在控制台之外调用 Bedrock 的用户,RetrieveAndGenerate API 提供了程序化访问以执行此相同的工作流程。这允许通过 API 调用而不是控制台交互将 Bedrock 的功能紧密集成到自定义应用程序中。RetrieveAndGenerate API 为开发者提供了构建针对其特定需求定制的 Amazon Bedrock 解决方案的灵活性。图 5**.12 展示了使用 Amazon Bedrock 的 RetrieveAndGenerate API 的 RAG 工作流程:

图 5.12 – RetrieveAndGenerate API
在RetrieveAndGenerate API 中,生成的响应输出包含三个组件:模型生成的响应本身的文本、来源归属表明 FM 从哪里检索信息,以及作为生成响应一部分从那些来源检索的具体文本摘录。API 通过返回最终输出文本以及支持 FM 响应生成过程的底层源材料和归属,提供了完全的透明度。这使用户能够检查最终输出以及系统在响应生成过程中使用的中间检索文本。
下面的代码示例用于使用 API 运行与控制台展示相同的操作。
注意
在运行下面的代码之前,请确保您拥有boto3和botocore包的最新版本。如果这些包尚未安装,请在您的 Jupyter 笔记本中运行以下命令。请注意,如果您从 Python 终端运行 Python 代码,则不需要!:
!pip install boto3 botocore
#import the main packages and libraries
import os
import boto3
import botocore
import json
bedrock_agent_rn = boto3.client(service_name='bedrock-agent-runtime', region_name=os.environ['AWS_REGION'])
#Defining the method to invoke the RetrieveAndGenerate API
def retrieveAndGenerate(input, kb_Id):
return bedrock_agent_rn.retrieve_and_generate(
input={
'text': input
},
retrieveAndGenerateConfiguration={
'type': 'KNOWLEDGE_BASE',
'knowledgeBaseConfiguration': {
'knowledgeBaseId': kb_Id,
'modelArn': 'arn:aws:bedrock:us-east-1::foundation-model/anthropic.claude-instant-v1'
}
}
)
#Invoking the API to generate the desired response
response = retrieveAndGenerate("What is Quantum Computing?", "PG0WBGY0DD")["output"]["text"]
print(response)
注意
此脚本假定读者已经根据前述部分中概述的程序创建了知识库并摄取了相关文档。在满足此先决条件后,调用RetrieveAndGenerate API 将使系统能够使用提供的代码示例检索相关文档。
提供的代码将打印提取的文本输出,以显示从数据源中根据输入查询提取的相关信息,并按所需格式化。响应是通过将数据源中的相关细节与输入查询的具体内容进行上下文关联而生成的。然后,输出将按请求的结构进行格式化和展示。这允许从源中定制提取和格式化相关数据,以提供针对输入查询的、适合的结构化响应。
注意
请确保您有正确的权限通过导航到 IAM 角色和权限,搜索相应的角色(如果您在 Amazon SageMaker 中运行笔记本,请搜索在创建 Amazon SageMaker 域时分配的执行角色),并附加 Amazon Bedrock 策略以调用 Bedrock 模型和 Bedrock 代理运行时 API。
另一个有用的 Amazon Bedrock API,即Retrieve API,允许更高级的处理和利用检索到的文本片段。此 API 将用户查询转换为向量表示,对知识库执行相似度搜索,并返回最相关的结果及其相关性分数。Retrieve API 为用户提供更细粒度的控制,以利用语义搜索能力构建自定义管道。通过Retrieve API,开发者可以根据搜索结果编排文本生成的后续阶段,实现额外的相关性过滤,或推导其他工作流程优化。图 5.13展示了在 Amazon Bedrock RAG 管道中使用Retrieve API 的示例:

图 5.13 – Retrieve API
在 Amazon Bedrock 控制台中,您可以切换开关再次禁用什么是量子计算?。图 5.14展示了从知识库检索到的有关量子计算问题的生成响应。请注意,Amazon Bedrock 在生成响应的同时引用了参考文献:

图 5.14 – 测试知识库
这次,与流畅的自然语言响应不同,请注意输出显示了检索到的文本片段以及链接到原始源文档的链接。这种方法通过明确显示从知识库检索到的相关信息及其来源,提供了透明度。
注意
在运行下面展示的代码之前,请确保您拥有boto3和botocore包的最新版本。如果这些包尚未安装,请在您的 Jupyter 笔记本中运行以下命令。请注意,如果您从 Python 终端运行 Python 代码,则不需要使用!:
!pip install boto3 botocore
利用boto3的Retrieve API 看起来是这样的:
#import the main packages and libraries
import os
import boto3
import botocore
bedrock_agent_rn = boto3.client(service_name='bedrock-agent-runtime', region_name = os.environ['AWS_REGION'])
#Defining the method to invoke the RetrieveAndGenerate API
def retrieve(query, kb_Id, number_Of_Results=3):
return bedrock_agent_rn.retrieve(
retrievalQuery= {
'text': query
},
knowledgeBaseId=kb_Id,
retrievalConfiguration= {
'vectorSearchConfiguration': {
'numberOfResults': number_Of_Results
}
}
)
#Invoking the API
output_response = retrieve("What is Quantum Computing?", "PG0WBGY0DD")["retrievalResults"]
print(output_response)
Retrieve API 返回一个包含检索到的文本摘录以及每个摘录来源的元数据的响应。具体来说,响应包括从每个文本片段检索到的源数据的位置类型和 URI。此外,每个检索到的文本片段都伴随着一个相关性分数。这个分数提供了检索到的片段的语义内容与用户输入查询的匹配程度的指示。与低分数片段相比,得分较高的文本片段与查询的相关性更高。通过检查检索到的片段的分数,用户可以专注于Retrieve API 返回的最相关摘录。因此,Retrieve API 不仅提供了检索到的文本,还提供了有洞察力的元数据,以使 API 响应能够得到有效利用。
通过利用 RAG 框架中的自定义分块和向量存储功能,您可以获得更多细粒度的控制,以了解您的 NLP 工作流程在底层如何运行。熟练地应用这些自定义可以帮助确保 RAG 符合您的特定需求和用例。请注意,在撰写本书时,在创建知识库的数据源时,您可以在 ChunkingConfiguration 对象中指定分块策略:
chunking_config = {
"chunkingStrategy": "FIXED_SIZE", # or "NONE"
"fixedSizeChunkingConfiguration": {
"chunkSize": 200 # Chunk size in tokens
}
}
让我们更详细地看看:
-
FIXED_SIZE允许您为分割数据源设置固定大小的令牌块 -
NONE将每个文件视为单个块,让您完全控制预分块数据
在 aws.amazon.com/blogs/aws/knowledge-bases-now-delivers-fully-managed-rag-experience-in-amazon-bedrock/ 可以找到有关使用 AWS Python SDK 与 API 的高级信息。
Amazon Bedrock 的知识库简化了 RAG 的复杂性,允许您通过自己的有根知识来增强语言生成。这些能力为构建上下文聊天机器人、问答应用和其他需要生成具体信息的 AI 系统开辟了新的可能性。
让我们进一步探讨如何使用 LangChain 协调器和其他 GenAI 系统实现 RAG 方法。
使用其他方法实现 RAG
Amazon Bedrock 不是实现 RAG 的唯一方式,在本节中,我们将了解其他方法。从 LangChain 开始,我们还将探讨一些其他 GenAI 系统。
使用 LangChain
LangChain 通过集成检索工具和 LLMs 提供了一个构建 RAG 模型的优秀框架。在本节中,我们将探讨如何使用以下组件使用 LangChain 实现 RAG:
-
LLMs:LangChain 通过 Bedrock 的可用 FM 调用 API 与 Amazon Bedrock 的强大 LLM 集成。在审查检索到的文档后,可以使用 Amazon Bedrock 生成流畅的 NL 响应。
-
嵌入模型:通过 Amazon Bedrock 可用的文本嵌入模型,例如 Amazon Titan Text Embeddings,生成文本段落的向量表示。这允许比较文本相似性,以便检索相关的上下文信息,以增强输入提示,用于组成最终响应。
-
文档加载器:LangChain 提供了一个 PDF 加载器,用于从本地存储中获取文档。这可以被替换为用于检索企业文档的加载器。
-
pgvector可以根据用例进行利用。 -
索引:向量索引将输入嵌入与存储的文档嵌入匹配,以找到最相关的上下文。
-
包装器:LangChain 提供了一个包装器类,它抽象了底层逻辑,处理检索、嵌入、索引和生成。
通过 LangChain 协调器的 RAG 工作流程如下:
-
将文档集合导入文档加载器
-
使用嵌入模型为所有文档生成嵌入
-
在向量存储中索引所有文档嵌入
-
对于输入问题,使用嵌入模型生成其嵌入
-
使用索引检索最相似的文档嵌入
-
将相关文档传递给 LLM 以生成自然语言答案
通过这种方式编排检索和生成,LangChain 为开发 RAG 模型提供了一个简单而强大的框架。模块化架构提供了灵活性、可扩展性和可伸缩性。有关使用 LangChain 实现 RAG 的更多详细信息,请遵循 Amazon Bedrock 工作坊中的步骤,见 github.com/aws-samples/amazon-bedrock-workshop/blob/main/06_OpenSource_examples/01_Langchain_KnowledgeBases_and_RAG_examples/01_qa_w_rag_claude.ipynb。
其他 GenAI 系统
RAG 模型可以与其他 GenAI 工具和应用集成,以创建更强大和通用的 AI 系统。例如,RAG 的知识检索能力可以与基于 Amazon Bedrock 的对话代理结合使用。这使得代理能够执行多步任务并利用外部知识库生成更具情境相关性的响应。
此外,RAG 知识库检索使 RAG 能够无缝集成到自定义 GenAI 管道中。开发者可以从 RAG 索引中检索知识并将其与 LangChain 的生成能力融合。这解锁了新的用例,例如构建能够提供专家领域知识的同时具备一般对话能力的 AI 助手。
关于 LangChain 检索器的更多信息可以在 python.langchain.com/docs/integrations/retrievers 找到。
我们将在 第十章 中详细介绍 Amazon Bedrock 的代理,我们将揭示更多基于 RAG 的与 Amazon Bedrock 代理的集成。
通过 Amazon Bedrock 的托管方法,将现实世界知识纳入 FM 已变得比以往任何时候都更容易。现在,让我们揭示一些正在迅速增长的 RAG 技术作为改进当前 RAG 方法的一种机制。
高级 RAG 技术
虽然基本的 RAG 管道涉及检索相关文档并直接将其作为上下文提供给 LLM,但高级 RAG 技术采用各种方法来提高生成响应的质量、相关性和事实准确性。这些高级技术超越了简单文档检索和上下文增强的朴素方法,旨在优化 RAG 管道的各个阶段以改善性能。
让我们现在看看高级 RAG 技术关注的几个关键领域。
查询处理器 – 查询重构和扩展
一个关键的发展领域是查询重构和扩展。除了依赖用户的初始查询外,高级 RAG 系统采用 NLP 技术生成额外的相关查询。这增加了从知识库中检索更全面的相关信息的机会。查询重构可能涉及以下技术:
-
"``飓风形成" -
扩展查询:
“飓风形成” OR “热带气旋生成” OR “热带风暴发展” -
什么原因导致飓风?* 重写查询:解释导致飓风或热带气旋形成的气象条件和过程。*第一代iPhone是什么时候发布的?* 提取实体:iPhone* 扩展查询:iPhone AND ("产品发布" OR "发布日期" OR "历史")*美国内战的原因”* 生成的查询:-
导致美国内战的关键政治和经济因素是什么? -
奴隶制问题是如何导致美国内战爆发的? -
导致美国内战爆发的主要事件和事件有哪些?
-
图 5.15 展示了一个带有重写和重新排序机制的查询处理器的概述:

图 5.15 – 带有重写和重新排序机制的查询处理器
通过检索多个重构查询的信息,系统可以收集更丰富的上下文,更好地理解用户的意图,并提供更完整、更准确的响应。
混合搜索和检索
高级 RAG 系统通常采用混合检索策略,结合不同的检索方法以利用它们各自的优势。例如,一个系统可能会使用稀疏向量搜索进行初始过滤,然后使用密集向量搜索进行重新排序和展示最相关的文档。其他混合方法包括以下:
-
将关键词匹配与向量相似度搜索相结合
-
为不同类型的数据使用不同的检索方法(例如,结构化与非结构化)
-
层次检索,其中粗粒度检索后跟细粒度重新排序
以下是一个简单的例子,用于说明混合搜索和检索:

图 5.16 – 混合搜索和检索方法
假设你正在一个销售电子产品和杂货的网站上搜索有关 apple products 的信息。
混合搜索方法结合了两种检索方法:
-
apple products,它将检索包含单词apple和products的文档/页面,例如以下内容:-
在此处购买最新的苹果 iPhone 型号 -
正在销售的苹果 MacBook Pro 笔记本电脑 -
杂货区中的苹果 cider 和苹果汁
-
-
apple products,它可能会检索到以下文档:-
顶级科技小工具和配件为学生(与电子产品/产品语义相关) -
适合儿童午餐盒的健康水果和零食(与苹果作为水果的语义相关)
-
混合搜索可以随后结合并重新排序来自两种检索方法的结果:
-
在此处购买最新的苹果 iPhone 模型 -
促销中的苹果 MacBook Pro 笔记本电脑 -
顶级科技小工具和配件为学生 -
杂货区中的苹果醋和苹果汁 -
适合儿童午餐盒的健康水果和零食
通过结合关键词匹配(用于品牌/产品名称)和语义理解(用于更广泛的上下文),混合方法可以提供比仅使用一种方法更全面和相关的搜索结果。
关键好处是检索到既在词汇上(包含确切的查询关键词)又在语义上(概念上与查询意图相关)相关的文档,从而提高整体搜索质量。
嵌入和索引优化
用于检索的向量嵌入和索引的质量可以显著影响 RAG 系统的性能。该领域的先进技术包括以下内容:
-
嵌入微调:不是使用通用的预训练嵌入模型,嵌入模型可以在特定领域的数据上进行微调,以更好地捕捉该领域的语义和细微差别。
例如,如果为医学问答任务构建 RAG 系统,则可以在大型医学文献语料库(如研究论文、临床笔记等)上进一步微调嵌入模型。这允许模型更好地理解特定领域的术语、缩写和上下文关系。
-
索引结构和分区:不是将所有文档嵌入存储在单个平面索引中,索引可以以改进检索效率的方式进行结构化或分区;例如,聚类、分层索引和元数据过滤:
-
聚类:可以根据文档的嵌入进行聚类,并为每个聚类创建单独的索引。在查询时,将查询嵌入与聚类中心进行比较,以确定要搜索的相关聚类(们)。
-
分层索引:粗粒度索引首先检索相关的高级主题/类别,然后在那些主题内搜索更细粒度的索引。
-
元数据过滤:如果文档元数据(如类型、来源、日期等)可用,则可以根据该元数据对索引进行分区,以便在向量搜索之前进行过滤。
图 5.17 展示了一个增强元数据的先进检索机制:
-

图 5.17 – 增强元数据的检索机制
-
近似最近邻(ANN)索引:对于非常大的向量索引,可以使用分层可导航小世界(HNSW)、FAISS 或近似最近邻哦,是的(Annoy)等技术来创建 ANN 索引。这允许在检索时间上通过暴力搜索进行大量计算速度的提升,同时牺牲一些准确性。感兴趣的读者可以阅读关于 NN 搜索索引的论文《学习为最近邻搜索索引》(Learning to Index for Nearest Neighbor Search) (
arxiv.org/pdf/1807.02962) 的更多细节。 -
索引压缩和量化:可以通过压缩和量化技术减小向量索引的大小,而不会显著影响检索准确性。这包括产品量化、标量量化、残差量化等方法等。
论文《推荐系统中的向量量化:综述与展望》(Vector Quantization for Recommender Systems: A Review and Outlook) (arxiv.org/html/2405.03110v1) 提供了关于推荐系统中向量量化的详细概述。通过优化嵌入和索引,高级 RAG 系统可以提高检索信息的关联性和全面性,从而提高整体性能。
检索重新排序和过滤
即使在初步检索之后,高级 RAG 系统通常还会采用额外的重新排序和过滤技术来展示最相关的信息。这些技术包括以下内容:
-
交叉注意力重新排序:可以利用更昂贵的交叉注意力模型来重新评分和重新排序最初检索到的文档,基于它们与查询的相关性。论文《用于深度重新排序的多向量注意力模型》(Multi-Vector Attention Models for Deep Re-ranking) (
aclanthology.org/2021.emnlp-main.443.pdf) 提供了一种使用多向量注意力模型进行深度重新排序的机制。 -
学习型重新排序器:针对重新排序检索文档的任务训练神经网络或其他机器学习模型可以帮助提高带有输入查询的搜索结果。
-
过滤和修剪:根据各种启发式方法或模型从初始检索集中移除不太相关或冗余的文档,可以提供上下文优化。
例如,用户可能会提出这样的查询:美国内战的原因是什么?
这里有一些通过向量搜索进行初始检索的例子:
-
奴隶问题是美国内战的主要原因... -
南北之间的经济差异导致了紧张... -
亚伯拉罕·林肯 1860 年的选举触发了分离... -
密苏里妥协未能解决奴隶扩张... -
地下铁路帮助奴隶逃离...
这里有一些重新排序的例子:
-
亚伯拉罕·林肯 1860 年的选举触发了分离... -
奴隶问题是美国内战的主要原因... -
密苏里妥协未能解决奴隶扩张... -
南北之间的经济差异导致了紧张... -
地下铁路帮助奴隶逃离...
这里是前 3 个重新排序和过滤的结果:
-
亚伯拉罕·林肯在 1860 年的选举引发了分离... -
奴隶问题是内战的主要原因... -
密苏里妥协未能解决奴隶扩张...
然后将前 3 个重新排序和过滤的结果作为上下文提供给语言模型,以生成关于内战原因的最终响应,重点关注最相关的信息。
通过重新排序和过滤检索到的信息,高级 RAG 系统可以为 LLM 提供更专注和相关的上下文,从而提高生成响应的质量和事实准确性。
图 5**.18展示了使用 Amazon Bedrock 和一些高级 RAG 技术(使用混合搜索机制的重新排序)的完整架构流程,以进一步增强输出响应:

图 5.18 – 使用 Amazon Bedrock 的高级 RAG 方法
如图 5**.18所示,在 Amazon Bedrock 的知识库中采用混合搜索(原生可用)可以极大地提高上下文搜索质量。此外,而不是直接将数据块解析到 LLM,将检索到的数据块馈送到一个重新排序模型以对上下文结果进行排序,可以进一步提高输出质量。Cohere Rerank、Meta 的密集段落检索、BERT 用于重新排序,或 Hugging Face(cross-encoder/ms-marco-MiniLM-L6-v2)的开源模型是一些可以用于此类排名优化任务的重新排序模型示例。最后,一旦创建了带有增强查询和优化上下文的增强提示,其中提示被解析到 Amazon Bedrock LLM 以输出期望的响应。
以这种方式,高级 RAG 技术可以通过将这些技术融入 RAG 管道的各个阶段,旨在通过提高质量、相关性和事实准确性来增强语言模型输出的效果。读者被鼓励访问aws.amazon.com/blogs/machine-learning/create-a-multimodal-assistant-with-advanced-rag-and-amazon-bedrock/,了解如何使用高级 RAG 技术通过 Amazon Bedrock 实现多模态 RAG(mmRAG)。此解决方案还通过利用高级 LangChain 功能,揭示了全面的解决方案。
论文《RQ-RAG:学习用于检索增强生成的查询优化》(arxiv.org/html/2404.00610v1)介绍了另一种高级的 RAG 方法——针对 RAG 的查询优化(RQ-RAG),它通过提供显式重写、分解和消歧的能力,有助于进一步优化查询。
由于我们已经深入了解了 RAG 的功能、训练以及与 Bedrock 和其他 GenAI 系统的实现,我们还应记住一些局限性和研究问题。这为我们提供了进一步通过 RAG 进行改进和以更具洞察力的思维过程引领 GenAI 路径的机会。一些局限性和未来方向将在下一节中讨论。
局限性和未来方向
虽然有前景,但 RAG 模型也带来了挑战和开放的研究问题,包括以下内容:
-
知识选择:在 RAG 中,确定从知识库中检索的最相关和显著的知识是一个关键挑战。在大量信息可用的情况下,识别和优先考虑给定上下文中最相关的知识变得至关重要。现有的检索方法可能难以捕捉查询的细微差别和微妙之处,导致检索到不相关或旁枝末节的信息。开发更复杂的查询理解和知识选择机制是研究的关键领域。
-
知识归一化:无缝地将检索到的知识整合到生成过程中是一个非平凡的任务。RAG 模型需要理解检索到的知识,对其进行推理,并将其连贯地编织到生成的文本中。这个过程需要高级的自然语言理解(NLU)和自然语言生成(NLG)能力,以及对上下文和话语结构的深入理解。未能正确归一化检索到的知识可能导致生成的输出中出现不一致性、不连贯性或事实错误。
-
训练目标:RAG(Retrieval Augmented Generation)的一个主要局限性是缺乏用于端到端训练的大规模监督数据集。创建这样的数据集需要大量的人工标注,这既耗时又昂贵。此外,定义合适的训练目标以平衡检索和生成组件是一项挑战。现有的训练目标可能无法充分捕捉任务的复杂性,从而导致性能不佳。
-
知识库构建:知识库的质量和覆盖范围在 RAG 模型的有效性中起着至关重要的作用。创建涵盖多个领域和主题的广泛覆盖知识库是一项艰巨的任务。现有的知识库可能不完整、有偏见或过时,限制了模型检索相关信息的能力。此外,确保知识库的准确性和事实正确性是至关重要的,但具有挑战性,尤其是在快速演变或具有争议性的主题上。
-
多步推理:RAG 系统通常难以在多个步骤中结合检索到的知识以执行复杂的推理或推断任务。技术领域通常需要多步推理,例如从多个前提中得出结论、遵循复杂的逻辑链或从不同的来源综合信息。当前的 RAG 系统可能缺乏有效整合和推理检索知识的能力,以连贯和逻辑的方式,限制了它们在涉及复杂推理过程的场景中的应用。
-
评估:由于任务复杂,评估 RAG 模型的性能具有挑战性。传统的文本生成指标,如困惑度或双语评估助手(BLEU)分数,可能无法充分捕捉生成输出的事实正确性、连贯性和一致性。开发考虑这些方面以及检索知识质量的稳健评估方法是一个开放的研究问题。鼓励读者查看 Ragas(
docs.ragas.io/en/v0.1.6/index.html),它本质上是一个框架,用于帮助您大规模评估您的 RAG 管道。
尽管存在这些限制,RAG 通过利用外部知识源来增强 GenAI 模型的能力,具有重大的发展潜力。解决这些挑战对于 RAG 在各种应用(如问答、对话系统和内容生成)中的广泛应用和成功至关重要。
未来的关键研究优先事项包括提高检索精度、开发更复杂的融合方法、探索高效的大规模训练技术以及创建更好的评估基准。
未来方向
研究人员正在探索诸如密集篇章检索、学习稀疏表示和结合符号和神经方法的混合方法等高级技术。此外,将外部知识源(如结构化数据库或知识图谱)纳入传统语料库之外,可以显著提高检索精度和上下文理解。
开发更复杂的融合方法也是另一个关键的研究领域。虽然当前方法,如检索增强语言模型,已经显示出有希望的结果,但它们通常依赖于简单的连接或注意力机制来融合检索信息与语言模型的生成。研究人员正在研究更先进的融合技术,这些技术可以更好地捕捉检索知识与生成上下文之间的复杂关系,可能利用来自多模态学习、图神经网络(GNNs)和神经符号推理等领域的技巧。
探索高效的大规模训练技术对于将 RAG 扩展到庞大的知识来源和复杂领域至关重要。由于计算限制,当前系统通常在相对较小的数据集上训练,这限制了它们有效利用庞大知识库的能力。研究人员正在研究分布式训练、知识蒸馏和高效的检索索引等技术,以在保持计算可行性的同时,在大型知识源上进行训练。
最后,创建更好的评估基准对于准确评估 RAG 系统的性能并推动该领域的发展至关重要。现有的基准通常专注于特定的任务或领域,这使得评估这些系统的泛化能力变得具有挑战性。研究人员正在努力开发更全面、更具挑战性的基准,这些基准涵盖更广泛的知识来源、领域和生成任务,并纳入更复杂的评估指标,这些指标超越了传统的度量标准,如困惑度或 BLEU 分数。
通过解决这些关键研究重点,RAG 领域可以继续进步,使开发更强大、更通用的语言生成系统成为可能,这些系统能够有效地利用庞大的知识库来生成高质量、信息丰富且与上下文相关的文本。
摘要
RAG 是一种快速发展的技术,通过在相关外部上下文中对神经生成模型进行条件化,克服了这些模型在知识方面的局限性。我们揭示了使用 RAG 方法训练 LLM 的工作原理以及如何使用 Amazon Bedrock、LangChain 编排器和其他 GenAI 系统实现 RAG。我们还进一步探讨了 RAG 方法在 GenAI 领域中的重要性及其局限性。正如所指示的,跨多个领域的早期结果很有希望,并展示了将文本生成基于现实世界知识的潜力。随着研究解决当前的局限性,检索增强可能使 GenAI 系统变得事实性、信息性和安全性。
在下一章中,我们将通过在 Amazon Bedrock 上采用各种方法来深入探讨实际应用。我们将从文本摘要用例开始,然后深入探讨方法和技术的见解。
第二部分:Amazon Bedrock 架构模式
在本部分,我们将探讨各种架构模式和利用 Amazon Bedrock 强大功能的用例。这包括文本生成、构建问答系统、实体提取、代码生成、图像创建和开发智能代理。此外,我们将深入探讨现实世界应用,为您提供知识和技能,以便在您的项目中最大化 Amazon Bedrock 的功能。
本部分包含以下章节:
-
第六章, 使用 Amazon Bedrock 生成和总结文本
-
第七章, 构建问答系统和对话界面
-
第八章, 使用 Amazon Bedrock 提取实体和生成代码
-
第九章, 使用 Amazon Bedrock 生成和转换图像
-
第十章, 使用 Amazon Bedrock 开发智能代理
第六章:使用 Amazon Bedrock 生成和总结文本
在本章中,我们将探讨使用 Amazon Bedrock 生成和总结文本的架构模式。您将了解文本生成的应用以及文本生成如何与 Amazon Bedrock 合作。然后,我们将使用一些提示工程技术,包括上下文提示和 LangChain 的编排。之后,我们将探索使用短文本/文件进行文本摘要、总结长篇文章和书籍,并发现文本摘要的使用案例和模式。
到本章结束时,您将能够理解和实现使用 Amazon Bedrock 在实际用例中的文本生成和总结。
本章将涵盖以下关键主题:
-
生成文本
-
总结文本
-
创建安全的无服务器解决方案
技术要求
本章要求您拥有 AWS 账户访问权限。如果您还没有,可以访问 aws.amazon.com/getting-started/ 并创建一个。
其次,您需要安装和配置 AWS CLI (aws.amazon.com/cli/)。您将使用它从您的本地机器访问 Amazon Bedrock FMs。由于我们将要执行的多数代码单元都是基于 Python 的,此时设置 AWS Python SDK (Boto3) (docs.aws.amazon.com/bedrock/latest/APIReference/welcome.html) 将非常有帮助。您可以通过任何方式执行 Python 设置:在您的本地机器上安装它,使用 AWS Cloud9,利用 AWS Lambda,或者利用 Amazon SageMaker。如果您使用带有 AWS Python SDK 的 Jupyter Notebook 与 Amazon Bedrock 交互,请确保在笔记本中运行以下代码单元以导入必要的库并创建 Bedrock 运行时客户端:
#Ensure you have the latest version of boto3 & langchain
!pip install -U boto3 langchain-community
#import the main packages and libraries
import boto3
import json
#Create bedrock runtime client
bedrock_client = boto3.client('bedrock-runtime') #Select the desired region
注意
调用和定制 Amazon Bedrock 的 FMs 将产生相关费用。请参阅 aws.amazon.com/bedrock/pricing/ 了解更多信息。
生成文本
文本生成在各个领域都发挥着至关重要的作用,从市场营销和广告到新闻业和创意写作。这种技术的意义在于其能够简化内容创作流程,提高生产力,并开启新的创意领域。
文本生成的一个关键优势是其能够节省宝贵的时间和资源。传统的内容创作方法可能耗时且劳动密集,通常需要大量的研究、写作和编辑工作。但通过使用生成式 AI 模型,企业和个人可以快速生成初稿、大纲或完整的内容,从而为其他任务腾出宝贵的时间。
此外,文本生成赋予内容创作者探索新的叙事途径和拓展其创造力的边界。通过提供起点或框架,这些工具可以激发新想法,并促进非传统叙事技巧或独特写作风格的探索。这种能力在原创性和独特性被高度重视的行业中尤其有价值,例如小说写作、广告活动或品牌故事讲述计划。
除了创意应用外,文本生成在需要大量信息和事实性内容的领域也具有巨大的潜力。例如,新闻报道、科学出版物、技术文档和文本生成可以帮助快速传播准确和最新的信息。通过利用庞大的数据存储库和专业知识,这些工具可以生成全面的报告、摘要或文章,确保相关信息能够迅速提供给目标受众。
此外,文本生成提供了令人兴奋的个性化和定制机会。通过分析用户偏好、人口统计信息和上下文数据,这些工具可以定制内容,使其与特定目标受众产生共鸣,增强参与度并加强与读者或客户的联系。
让我们详细看看文本生成在现实世界中的应用。
文本生成应用
虽然文本生成的应用无限,以下是一些示例以供参考:
-
生成产品描述:Amazon Bedrock 的文本生成能力可以被用于为营销团队自动化创建产品描述。通过输入产品的特性、规格和关键优势,FM 可以生成引人入胜且 SEO 优化的描述,突出产品的独特卖点。这可以显著简化创建产品描述的过程,为营销团队节省时间和资源。
生成的描述可以根据不同的目标受众、语气和风格偏好进行定制,确保在各种渠道上保持一致且引人入胜的品牌声音。此外,FM 可以定制现有的产品描述,使其能够学习和模仿期望的写作风格和格式。
-
媒体文章和营销活动生成:Amazon Bedrock 的文本生成能力可用于创建媒体文章、博客文章和营销活动的高质量内容。通过提供相关信息、数据和指南,FM 可以生成结构良好且连贯的文章,可用于内容营销、思想领导或新闻传播。
FM 可以在现有内容上进行训练,使其能够理解和模仿特定出版物或品牌的语气、风格和格式偏好。它还可以为营销活动生成吸引注意力的标题、引人入胜的引言和引人注目的行动号召(CTAs)。
-
个性化电子邮件和消息撰写:Amazon Bedrock 可用于撰写个性化的电子邮件、消息和其他书面沟通,用于客户联系、营销活动,甚至内部沟通。通过利用客户数据和偏好,FM 可以生成高度定制和引人入胜的内容,提升客户体验并增加品牌忠诚度。
-
医疗保健:临床文档是医疗保健的一个关键方面,但它可能耗时且容易出错。Bedrock 可以通过根据患者接触期间的对话或口述生成准确和全面的临床笔记来协助医疗保健专业人员简化笔记和文档过程。Amazon 还提供另一种名为AWS HealthScribe的服务,该服务由 Amazon Bedrock 提供支持,专门为此目的而设计。要了解更多关于 AWS HealthScribe 的信息,请访问
aws.amazon.com/healthscribe/。Bedrock 可用于生成针对个人独特健康状况、生活方式和偏好的个性化健康和福祉建议。通过分析来自各种来源的数据,例如电子健康记录(EHRs)、可穿戴设备和自我报告信息,Bedrock 可以提供针对饮食、锻炼、压力管理和预防保健的定制建议。
Amazon Bedrock 文本生成系统
如果您已经阅读了前面的章节,您可能已经尝试在 Amazon Bedrock 上生成文本。但为了提醒,一个简单的文本生成系统看起来是这样的:

图 6.1 – 简单文本生成系统
您向模型提供提示并说类似于“为客服团队撰写一封电子邮件”的话。即使您没有提供任何上下文,模型也会为您生成一个示例电子邮件(如图6.2所示):

图 6.2 – 生成电子邮件
在您的 Jupyter Notebook 环境中使用 AWS Python SDK,运行以下示例脚本以调用 AI21 Jurassic 模型。请确保您首先导入必要的库并创建 Bedrock 运行时客户端,如技术要求部分所述:
prompt_data = """Human: Compose an email to a customer support team.
Assistant:
"""
body = json.dumps({"prompt": prompt_data, "maxTokens": 200})
modelId = "ai21.j2-mid-v1" # change this to use a different version from the model provider
accept = «application/json»
contentType = «application/json»
response = bedrock_client.invoke_model(body=body, modelId=modelId, accept=accept, contentType=contentType)
response_body = json.loads(response.get("body").read())
print(response_body.get("completions")[0].get("data").get("text"))
现在,根据您选择的模型,响应的结构和输出可能会有所不同。图 6.3显示了 AI21 Jurassic 模型的响应:

图 6.3 – AI21 Jurassic 输出
在这里,我们提供了一个简单的提示,没有提供任何上下文或信息。现在,让我们继续探讨文本生成的先进架构模式,并了解上下文提示。
使用提示工程生成文本
在上一节中,我们查看了一种文本生成模式,我们没有向模型提供任何上下文或信息。让我们使用我们在 第三章 中了解到的某些提示工程技巧:
-
零样本上下文提示:在这里,我们将以零样本的方式在提示中提供详细上下文:
prompt = """Human: Write a descriptive and engaging travel guide section about a lesser-known but beautiful destination, capturing the local culture, cuisine, and must-see attractions in a way that inspires wanderlust.Assistant:"""body = json.dumps({"prompt": prompt,"max_tokens_to_sample": 500})modelId = "anthropic.claude-v2" # change this to use a different version from the model provideraccept = «application/json»contentType = «application/json»response = bedrock_runtime.invoke_model(body=body, modelId=modelId, accept=accept, contentType=contentType)response_body = json.loads(response.get("body").read())print(response_body.get("completion"))运行前面的代码将生成类似于 图 6.4 中所示的一个响应:

图 6.4 – 零样本上下文提示响应
在前面的场景中,我们使用了 Amazon Bedrock API – invoke_model – 并传递了提示、配置参数和模型 ID。如果您想了解更多关于可用的各种 Bedrock API,请鼓励您重新阅读 第二章。
-
少样本上下文提示:在这里,我们将在提示中提供一些示例,以便模型可以开始生成合理的延续:
prompt = """Human: Here are some examples of product descriptions:Example 1:Product: Apple iPhone 13 ProDescription: The iPhone 13 Pro is a smartphone designed and manufactured by Apple Inc. It features a 6.1-inch Super Retina XDR display, a powerful A15 Bionic chip, and an advanced triple-camera system with improved low-light performance and 3x optical zoom. The phone also boasts 5G connectivity, longer battery life, and a durable Ceramic Shield front cover.Example 2:Product: Sony WH-1000XM4 Noise Cancelling HeadphonesDescription: Experience exceptional audio quality with the Sony WH-1000XM4 Noise Cancelling Headphones. These over-ear headphones feature industry-leading noise cancellation technology, allowing you to immerse yourself in your music without distractions. The responsive touch controls and long-lasting battery life make them ideal for everyday use, while the comfortable design ensures hours of listening pleasure.Example 3:Product: Instant Pot Duo Crisp + Air FryerDescription: The Instant Pot Duo Crisp + Air Fryer is a versatile kitchen appliance that combines the functions of an electric pressure cooker, air fryer, and more. With its EvenCrisp technology, you can achieve crispy, golden results using little to no oil. The easy-to-use control panel and 11 built-in smart programs allow you to cook a wide variety of dishes with ease, making it a must-have for any modern kitchen.Your task: Generate a product description for the following product:Product: Sony A7 III Mirrorless CameraAssistant:"""body = json.dumps({"prompt": prompt, "max_tokens_to_sample": 500})modelId = "anthropic.claude-v2"accept = "application/json"contentType = "application/json"response = bedrock_runtime.invoke_model(body=body, modelId=modelId, accept=accept, contentType=contentType)response_body = json.loads(response.get("body").read())print(response_body.get("completion"))
在这里,我们在提示中提供了三个示例,以告诉模型我们的响应应该是什么样子。然后,我们调用了模型来为 Sony A7 III 无反相机 生成产品描述。我们收到了 图 6.5 中所示的响应:

图 6.5 – 少样本上下文提示响应
- 在此情况下,使用
invoke_modelAPI):
注意
在撰写本文时,我们使用了 langchain_community.llms 库来导入 Bedrock。然而,根据 LangChain 社区的更新,它可能容易发生变化。有关导入 LangChain 包的最新信息,请访问 python.langchain.com/v0.2/docs/integrations/platforms/。
from langchain_community.llms import Bedrock
inference_modifier = {"max_tokens_to_sample": 4096, "temperature": 0.5, "top_k": 250, "top_p": 1, "stop_sequences": ["\n\nHuman"],}
llm = Bedrock(model_id="anthropic.claude-v2", client=bedrock_client, model_kwargs=inference_modifier,)
response = llm("""
Human: Write a descriptive and engaging travel guide section about a lesser-known but beautiful destination, capturing the local culture, cuisine, and must-see attractions in a way that inspires wanderlust.
Assistant:""")
print(response)
Figure 6*.6*):

图 6.6 – 使用 LangChain 的零样本提示
-
使用 LangChain 的上下文生成:在这里,我们在将提示发送到模型之前,将在我们的提示中提供指令和上下文:
from langchain_community.llms import Bedrockinference_modifier = {'max_tokens_to_sample':4096, "temperature":0.5, "top_k":250, "top_p":1, "stop_sequences": ["\n\nHuman"]}llm = Bedrock(model_id = "anthropic.claude-v2", client = boto3_bedrock, model_kwargs = inference_modifier)from langchain.prompts import PromptTemplateproduct_description_prompt = PromptTemplate( input_variables=["product_name", "product_category", "key_features"],template="""You are a professional copywriter tasked with creating an engaging and informative product description for a new Amazon product.Product Name: {product_name}Product Category: {product_category}Key Features: {key_features}Write a compelling product description that highlights the key features and benefits of the product, while keeping the tone engaging and persuasive for potential customers.Product Description:«»»)prompt = product_description_prompt.format(product_name="Smart Home Security Camera",product_category="Home Security",key_features="- 1080p HD video recording\n- Motion detection alerts\n- Two-way audio communication\n- Night vision capabilities\n- Cloud storage for recorded footage")response = llm(prompt)product = response[response.index('\n')+1:]print(product)在这个场景中,我们使用了 Bedrock 的 LangChain 实现。我们定义了一个用于创建产品描述的提示模板,并调用了 Anthropic Claude 模型来生成智能家用安全摄像头的描述。提示模板本质上是一个可重复使用的模板,用于构建提示。在提示模板中,您可以提供上下文、输入变量、任务以及一些少样本示例供模型参考。要了解更多关于提示模板的信息,请访问
python.langchain.com/v0.2/docs/concepts/#prompt-templates。下图显示了提供前面代码片段的响应:

图 6.7 – 使用 LangChain 的上下文生成
现在我们已经探讨了各种文本生成模式,让我们看看如何使用 Amazon Bedrock 进行摘要。
摘要文本
文本摘要是一项高度需求的能力,在各个领域都具有巨大的价值。它涉及将长文本文档浓缩成简洁且连贯的摘要的复杂任务,这些摘要旨在保留最显著的信息,同时省略冗余或不相关的细节,从而实现高效的数据消费和理解。
文本摘要广泛应用于各个领域,从研究、学术界到新闻、商业智能和法律文件。随着每天产生的文本数据的指数级增长,对有效摘要技术的需求变得越来越迫切。想象一下,在大量的报告、新闻文章或法律文件中筛选——文本摘要成为提炼核心信息的有力工具,为专业人士和研究人员节省时间和认知努力。
让我们看看文本摘要的一些实际应用:
-
内容整理:在当今信息丰富的世界中,文本摘要技术在整理和浓缩大量数据方面发挥着关键作用。这使得用户能够快速抓住长篇文章、报告或在线内容的精髓,而无需阅读每个单词。
-
新闻聚合:新闻聚合器和媒体平台可以利用文本摘要技术提供突发新闻故事的简洁摘要,使用户能够了解最新的发展,而不会因详尽细节而感到困扰。
-
研究辅助:研究人员和学者可以从文本摘要技术中受益,以快速从大量文献中识别最相关的信息,从而节省他们宝贵的时间和精力。
-
客户服务:文本摘要可以通过自动生成长客户咨询或反馈的简洁摘要来增强客户服务,使支持代理能够快速理解问题的核心并提供及时响应。
-
法律和金融领域:在准确呈现原始文本至关重要的行业,如法律或金融部门,文本摘要技术可以用于生成合同、协议或报告的摘要,确保关键信息不会被忽视。
-
电子邮件管理:电子邮件客户端或生产力工具可以利用文本摘要技术提供长电子邮件线程或对话的简洁概述,帮助用户快速抓住要点,而无需阅读每条消息。
-
会议回顾:文本摘要可以应用于会议记录或笔记,生成简洁的摘要,捕捉最重要的讨论、决策和行动项目,使参与者能够快速回顾并跟进关键点。
-
社交媒体监控:企业和组织可以利用文本摘要来分析和总结大量的社交媒体数据,如客户反馈、产品评论或品牌提及,使他们能够了解公众情绪并迅速做出回应。
-
知识提取:文本摘要技术可以用于从大型数据集或知识库中提取和总结相关知识,使其更容易访问和利用有价值的信息,用于各种应用,如决策或知识管理系统。
-
教育资源:文本摘要技术可以应用于教育材料,如教科书或在线课程,以生成简洁的摘要或学习辅助工具,帮助学生更有效地掌握关键概念并准备考试。
虽然应用范围无限,涵盖了各行各业,但让我们看看摘要系统如何与 Amazon Bedrock 协同工作。我们将了解两种方法:
-
小文件的摘要
-
大文件的摘要
我们所说的“小文件”,是指可以适应模型上下文长度的文本片段。这可以是从几句话到几段文字不等。另一方面,“大文件”则是指那些信息量巨大,无法适应模型上下文长度的文档或书籍。需要注意的是,没有一种适用于所有模型的万能解决方案。每个模型及其不同版本可能具有不同的上下文长度。例如,Cohere Command R+的上下文长度为 128K 个标记,而 Cohere Command Light 的上下文长度为 4,000 个标记。
小文件的摘要
小文件可以包括会议记录、博客文章、新闻文章、电子邮件和通话记录。这些文件随后被用作提示的上下文并发送给模型。这里的提示可能非常简单,例如“摘要内容”。然后,模型将处理文件并提供摘要响应。图 6.8展示了小文件摘要的过程:

图 6.8 – 小文件摘要
让我们以 Yahoo! Finance 的新闻文章为例。由于新闻文章可以适应模型的上下文长度,我们将将其作为提示中的上下文,即“摘要以下新闻文章”,并将其发送给模型。然后,模型将处理请求并提供摘要响应,如图6.9所示。

图 6.9 – 新闻文章的摘要
在 Bedrock 中总结小文件有几种方法。如果你使用 AWS Python SDK,可以直接将小文件文本传递到提示中,如下面的代码所示。然而,如果你想总结几段文字,你可以利用 提示模板 将文本动态地放置在提示中,并使用 LangChain 调用模型:
prompt = """
Today we're going to take a look at the well-established Amazon.com, Inc. (NASDAQ:AMZN). The company's stock led the NASDAQGS gainers with a relatively large price hike in the past couple of weeks. The recent jump in the share price has meant that the company is trading at close to its 52-week high. With many analysts covering the large-cap stock, we may expect any price-sensitive announcements have already been factored into the stock's share price. But what if there is still an opportunity to buy? Let's take a look at Amazon.com's outlook and value based on the most recent financial data to see if the opportunity still exists.
Check out our latest analysis for Amazon.com
What's The Opportunity In Amazon.com?
Great news for investors – Amazon.com is still trading at a fairly cheap price. According to our valuation, the intrinsic value for the stock is $238.66, but it is currently trading at US$174 on the share market, meaning that there is still an opportunity to buy now. What's more interesting is that, Amazon.com's share price is quite volatile, which gives us more chances to buy since the share price could sink lower (or rise higher) in the future. This is based on its high beta, which is a good indicator for how much the stock moves relative to the rest of the market.
Can we expect growth from Amazon.com?
earnings-and-revenue-growth
earnings-and-revenue-growth
Future outlook is an important aspect when you're looking at buying a stock, especially if you are an investor looking for growth in your portfolio. Buying a great company with a robust outlook at a cheap price is always a good investment, so let's also take a look at the company's future expectations. With profit expected to more than double over the next couple of years, the future seems bright for Amazon.com. It looks like higher cash flow is on the cards for the stock, which should feed into a higher share valuation.
What This Means For You
Are you a shareholder? Since AMZN is currently undervalued, it may be a great time to accumulate more of your holdings in the stock. With a positive outlook on the horizon, it seems like this growth has not yet been fully factored into the share price. However, there are also other factors such as financial health to consider, which could explain the current undervaluation.
Are you a potential investor? If you've been keeping an eye on AMZN for a while, now might be the time to enter the stock. Its buoyant future outlook isn't fully reflected in the current share price yet, which means it's not too late to buy AMZN. But before you make any investment decisions, consider other factors such as the strength of its balance sheet, in order to make a well-informed investment decision.
Diving deeper into the forecasts for Amazon.com mentioned earlier will help you understand how analysts view the stock going forward. Luckily, you can check out what analysts are forecasting by clicking here.
If you are no longer interested in Amazon.com, you can use our free platform to see our list of over 50 other stocks with a high growth potential.
"""
body = json.dumps({"inputText": prompt,
"textGenerationConfig":{
"maxTokenCount":4096,
"stopSequences":[],
"temperature":0,
"topP":1
},
})
modelId = 'amazon.titan-tg1-large' # change this to use a different version from the model provider
accept = 'application/json'
contentType = 'application/json'
response = bedrock_client.invoke_model(body=body, modelId=modelId, accept=accept, contentType=contentType)
response_body = json.loads(response.get('body').read())
print(response_body.get('results')[0].get('outputText'))
响应在 图 6.10 中显示:

图 6.10 – 小文件总结响应
我们已经将一篇新闻文章(finance.yahoo.com/news/us-174-time-put-amazon-110026932.html)从 Yahoo! Finance 解析出来,作为提示的样本上下文,并调用了 Titan 文本模型来生成总结的响应,如图中所示。
现在,让我们看看总结大文件的技术。
大文件的总结
大文件可以包括大量文档或书籍的信息,这些信息不适合模型的上下文长度。当我们说大文档时,这包括 10-K 报告、联邦公开市场委员会(FOMC)报告、公共卫生报告、临床试验报告、电子杂志、服务文档等等。亚马逊的 10-K 报告就是一个大文件的例子:www.sec.gov/Archives/edgar/data/1018724/000101872424000008/amzn-20231231.htm。
当处理用于总结文本的大文件时,会涉及几个挑战:
-
上下文长度限制:所有 FM,例如在 Amazon Bedrock 中使用的 FM,都有一个它们可以一次性处理的最大上下文长度或输入大小。这个限制因模型而异,但通常在几千个标记(单词或词片段)的范围内。例如,你可以找到具有 200k 标记的 Anthropic Claude 3 系列的 FM。当处理超过这个上下文长度的文档时,就变得不可能准确和连贯地总结整个文档。模型可能会错过重要信息,或者无法捕捉到原始文本中存在的整体上下文和细微差别。
-
幻觉:幻觉是一种现象,其中模型生成的输出不是基于输入数据,或者包含事实上的不一致。当处理大文档时,这个问题可能会更加普遍,因为模型可能难以保持连贯性和对原始文本的忠实度。随着输入大小的增加,模型可能会开始生成听起来合理但实际上错误的信息,这可能导致总结不准确。
-
内存和计算限制:总结大文档可能非常耗费计算资源,并且可能需要大量的内存资源。生成式 AI 模型需要处理和存储整个输入文本,以及中间表示和生成的输出。当处理非常大的文档时,如果没有使用专门的计算能力来处理,可能会因为高计算需求而出现性能下降(参见第十二章中的配置吞吐量架构部分)。
-
上下文理解:大文档通常包含复杂的结构,如章节、子章节和交叉引用。生成式 AI 模型可能难以准确捕捉和理解文档不同部分之间的关系和依赖。这可能导致摘要缺乏连贯性或无法准确代表原始内容的整体结构和流程。
-
主题漂移和连贯性:随着输入文本长度的增加,模型在摘要过程中保持关注和连贯性变得更加困难。模型可能会偏离主要主题,或者无法正确连接和过渡到文档的不同方面,导致摘要缺乏连贯性或清晰度。
为了应对这些挑战,让我们看看如何使用 LangChain 来总结大文件。
使用 LangChain 的摘要链进行文本摘要
使用 LangChain,我们将大文件分解成更小、更易于管理的块,并按顺序处理它们。图 6.11展示了使用 LangChain 进行大文本摘要的架构:

图 6.11 – LangChain 中的大文件摘要
这里是这个过程的工作原理:
-
数据摄取:这个过程的第一步是将一个大文档或文件加载到系统中。这涉及到从 Amazon S3 存储桶中加载文件或直接从互联网下载。您可以提供的文件可以是文本、PDF、Word 文档等多种形式。
-
根据 LangChain 文档的建议,
RecursiveCharacterTextSplitter适用于通用文本:python.langchain.com/v0.2/docs/how_to/recursive_text_splitter/.它递归地将文本分割成更小的块,直到每个块的大小低于指定的阈值。分割过程利用分隔符(
"\n\n","\n"),确保单个段落保持完整,而不是被分割到多个块中。 -
stuff:正如其名所示,这个链将所有块填充到一个单独的提示中。 -
map_reduce:map-reduce 链是一个强大的模式,允许您将一个大任务分解成更小的子任务,独立处理它们,然后将结果合并。在文本摘要的上下文中,这种链类型用于将长文本文档分解成更小的块,独立使用 LLM 对每个块进行摘要,然后将摘要合并成最终的摘要输出。 -
refine:这个链首先对第一个块进行摘要。然后,refine将这个摘要与第二个块结合,生成一个新的摘要,包含这两部分信息。这个过程继续进行,最新的摘要与下一个块结合,生成一个新的摘要。这种迭代方法一直重复,直到所有块都被纳入最终的摘要中。
要加载这些摘要链中的任何一个,您可以调用load_summarize_chain并提供链类型:
from langchain.chains.summarize import load_summarize_chain
summary_chain = load_summarize_chain(llm=llm, chain_type="map_reduce", verbose=False)
- 最终摘要:基于您选择的摘要链,一旦所有块都已处理,最终的摘要代表了整个原始文档的浓缩版本。
在github.com/aws-samples/amazon-bedrock-workshop/blob/main/06_OpenSource_examples/00_Langchain_TextGeneration_examples/05_long-text-summarization-titan%20Langchain.ipynb的笔记本中展示了使用 LangChain 进行长文本摘要的使用示例。在这个例子中,它使用map_reduce作为链类型。我们建议您尝试不同的链类型,并提供任何博客文章、文件或新闻文章作为提示。
现在我们已经使用 LangChain 链类型对大文件进行了摘要,假设我们想要摘要一本书或多本书的信息。在这种情况下,当需要总结大量手稿或书籍时,RAG 方法可能具有潜在的好处。但是请注意,摘要的响应可能不包含书籍的一些基本元素——换句话说,可能会有信息丢失。可以使用各种高级 RAG 技术,如查询细化,来检索摘要响应和文本中的基本元素。要了解更多关于 RAG 查询细化的信息,请参阅论文RQ-RAG: Learning to Refine Queries for Retrieval Augmented Generation (arxiv.org/html/2404.00610v1)。
要了解更多关于 RAG 如何工作以及一些高级 RAG 技术,请参阅第五章。
接下来,我们将通过 Amazon Bedrock 知识库查看文本摘要。
Amazon Bedrock 知识库
在第五章中,我们探讨了 Amazon Bedrock 知识库的工作原理以及如何设置它。让我们看看使用知识库进行摘要的示例。
我们已经将 Attention is All You Need 研究论文放入我们的数据存储 Amazon S3 存储桶,并将其与我们的 Bedrock 知识库同步,如图 图 6.12* 所示:

图 6.12 – 知识库数据源
选择模型并提供一个提示来总结内容。您将看到 LLM 的响应,如图 图 6.13* 所示:

图 6.13 – 测试知识库
如果您想通过 API 尝试,您可以调用 Retrieve API 或 RetrieveAndGenerate API。Retrieve API 访问并从知识库检索相关数据,而 RetrieveAndGenerate API 除了检索数据外,还根据检索到的结果生成响应。有关 Amazon Bedrock 知识库的更多详细信息,请参阅 第五章。
在本节中,我们讨论了如何利用 Amazon Bedrock 中的文本摘要系统。总结小文件很简单,涉及利用模型的上下文长度。然而,总结大文件需要分块和专门的技巧,如 LangChain 的摘要链、RAG 或 Amazon Bedrock 知识库来处理上下文长度限制、幻觉、计算约束和连贯性问题。
既然我们已经了解了如何使用 Amazon Bedrock 生成和总结文本,那么让我们看看组织如何使用这些技术并创建一个涉及其他 AWS 服务的安全无服务器解决方案。
创建一个安全无服务器解决方案
当与 Amazon Bedrock 的生成式 AI 模型一起工作时,组织可以开发一个既安全又无服务器的应用程序。他们不必直接使用 SDK 与 Amazon Bedrock 交互,而是可以拥有一个交互式聊天机器人,该机器人抽象出任何复杂性,提供丰富的客户体验,并提高整体生产力。
图 6.14* 展示了用户如何通过 AWS Amplify 开发的基于 Web 的聊天机器人进行交互,进行对话,生成各种形式的文本,并执行语言翻译、文本摘要等操作:

图 6.14 – 基于 Amazon Bedrock 的无服务器企业应用程序
让我们更仔细地看看这个过程:
-
用户与 AWS Amplify 中的聊天机器人交互:AWS Amplify 是一套全面的工具和服务,用于简化全栈云驱动型 Web 和移动应用程序的开发和部署。用户通过与使用 AWS Amplify 开发的 Web 应用程序中集成的聊天机器人交互来启动工作流程。
-
使用 Amazon Cognito 进行用户身份验证和授权:Amazon Cognito 是 AWS 提供的一项强大的用户身份管理服务。当用户与聊天机器人交互时,AWS 会与 Amazon Cognito 通信以执行用户身份验证和授权。Amazon Cognito 支持各种身份验证方法,包括传统的用户名/密码组合、社交身份提供者(例如,Google 或 Facebook)和多因素身份验证。它还提供用户注册、账户恢复和用户数据安全存储的功能。
-
API 网关作为集中入口点:一旦用户经过身份验证和授权,他们的请求将通过 API 网关路由,该网关充当 API 的集中入口点。API 网关是一项完全托管的服务,简化了创建、发布、维护、监控和保障 API 的过程。
-
将请求发送到执行对 Amazon Bedrock LLMs 调用操作的 AWS Lambda 函数(例如,
/text):-
此 Lambda 函数将用户的输入或提示传递给 Amazon Bedrock LLMs 以生成相关且连贯的文本。例如,用户可以要求生成一封电子邮件或为特定目的地准备旅行行程。
-
一旦 Amazon Bedrock LLMs 生成了所需文本,Lambda 函数接收响应并通过 API 网关将其发送回用户。在这里,API 网关充当中介,促进客户端(即聊天机器人)与后端服务(Lambda 函数和 Amazon Bedrock LLMs)之间的通信。
-
-
将请求发送到专门设计用于执行对 Amazon Bedrock LLMs 总结任务调用操作的另一个 AWS Lambda 函数(例如,
/summarize):-
此 Lambda 函数执行对 Amazon Bedrock LLMs 的调用,根据用户的输入或提示和提供的上下文(小或大文件)总结文本。
-
在 Amazon Bedrock LLM 生成总结文本后,Lambda 函数接收响应并通过 API 网关将其发送回用户。
-
通过将文本生成和总结任务分别分配给不同的 Lambda 函数和 API 网关路由,应用程序可以高效地处理不同类型的请求,并利用 Amazon Bedrock LLMs 在每个任务中的专业能力。
此工作流程突出了 AWS 服务的灵活性和模块化特性,允许集成多个组件以构建复杂的应用程序。AWS Lambda 函数作为计算引擎,向 Amazon Bedrock LLMs 发起调用以执行文本生成和总结。
通过将应用程序分解为更小、更独立的组件,开发者可以轻松维护、更新和扩展系统的各个部分,而不会影响整个应用程序。
如果你好奇想要尝试使用 Amazon Bedrock 的无服务器聊天机器人,请查看github.com/aws-samples/amazon-serverless-chatbot-using-bedrock。
到目前为止,你应该能够理解和实现使用 Amazon Bedrock 在实际用例中进行文本生成和总结。
摘要
在本章中,我们探讨了使用 Amazon Bedrock 生成和总结文本的架构模式。本章的第一部分涵盖了文本生成。我们通过提示工程技术、内联上下文训练和与 LangChain 的编排来探讨文本生成的根本原理。然后,我们探讨了可以应用于实际场景的各种文本生成用例和模式。
本章的第二部分涵盖了文本摘要。我们讨论了提取式和抽象式摘要方法及其相应的应用。此外,我们还考察了可以使用 Amazon Bedrock 进行文本摘要的系统和技术。
在下一章中,我们将探讨构建问答和对话界面的方法。
第七章:构建问答系统和对话界面
在本章中,我们将深入探讨问答(QA)和对话界面的领域,利用 Amazon Bedrock 的力量。本章从展示 Amazon Bedrock 在问答方面的实际应用案例开始,演示这项技术的实际应用和好处。随后,本章将涵盖小型和大型文档上问答的架构模式,为理解其底层机制提供坚实的基础。此外,还将解释对话记忆的概念,允许存储和利用聊天历史,从而实现更具情境意识和连贯性的对话。
本章还将深入探讨嵌入的概念及其在问答系统架构流程中的重要性。此外,我们将学习关于聊天机器人提示工程技术的知识,为您提供制作有效提示并提升其对话界面性能的技能。同时,还将讨论情境意识,解释如何开发能够无缝集成和利用外部文件和数据源的聊天机器人。
最后,我们将通过探讨对话界面的实际应用案例来结束本章节,展示这项技术在各个领域的多样应用和潜在影响。
本章将涵盖以下关键主题:
-
问答概述
-
使用 Amazon Bedrock 进行文档摄取
-
对话界面
技术要求
本章要求您拥有 AWS 账户访问权限。如果您还没有,可以访问 aws.amazon.com/getting-started/ 并创建一个 AWS 账户。
其次,您需要在创建账户后安装和配置 AWS CLI (aws.amazon.com/cli/),这将用于从您的本地机器访问 Amazon Bedrock FMs。由于我们将执行的代码单元格大部分基于 Python,此时设置 Python 的 AWS SDK(Boto3)(docs.aws.amazon.com/bedrock/latest/APIReference/welcome.html)将非常有用。您可以通过以下方式执行 Python 设置 – 在您的本地机器上安装它,使用 AWS Cloud9,利用 AWS Lambda,或利用 Amazon SageMaker。
注意
使用 Amazon Bedrock 的 FMs 调用和定制将产生费用。有关更多信息,请参阅 aws.amazon.com/bedrock/pricing/。
问答概述
问答系统旨在理解自然语言查询并根据给定上下文或知识源提供相关答案。这些系统利用先进的 NLP 技术和机器学习模型来理解用户问题的意图,从可用信息中提取最合适的响应。
让我们考虑一个典型问答系统的示例场景:假设你是某科技公司的内容创作者,需要向你的听众解释光学字符识别(OCR)的概念。问答系统可以通过提供其知识库中的相关信息或分析与 OCR 相关的给定文本语料库来协助你完成这项任务。
这里是一个问答系统如何处理诸如“什么是光学字符识别用于什么?”这样的查询的例子:
-
查询理解:系统首先分析查询以理解用户的意图并提取关键实体和概念。在这种情况下,它认识到查询询问的是光学字符识别的使用案例或应用。
-
上下文检索:系统随后在其知识库或提供的文本语料库中搜索与 OCR 及其应用相关的相关信息。它可能识别出讨论 OCR 目的和实际用途的段落或段落。
-
答案提取:在检索到相关上下文后,系统采用先进的 NLP 技术,如命名实体识别、关系提取和语义分析,以识别直接回答查询的最相关信息。它可能从文本中提取 OCR 的具体使用案例或应用。
-
答案生成:最后,系统根据提取的信息编写一个简洁且自然流畅的答案。例如,它可能会以以下方式回应:
"Optical character recognition (OCR) is used to convert text in images, scanned documents, or handwritten text into machine-readable and editable text format. It has several applications, including:
Digitizing printed documents, books, and archives for easier storage and search.
Extracting text from images or photographs for indexing or further processing.
Automating data entry tasks by extracting information from forms, invoices, or receipts.
Enabling text-to-speech capabilities for visually impaired users.
Facilitating translation of text between languages by first converting it to editable format."
系统还可能提供额外的上下文、示例或相关信息,以增强用户对主题的理解。
从理论上讲,这一切看起来完美且简单直接。然而,让我们思考一下这种情况中的一些挑战。
由于这些问答系统旨在通过分析和从提供的数据或文本源中提取相关信息来自动生成响应,它们可能或可能不明确包含给定查询的完整答案。换句话说,系统从各种上下文中推断和组合不同信息的能力至关重要,因为完整的答案可能不在提供的单一、自包含的陈述中 readily available。
QA 提出了重大挑战,因为它要求模型深入理解查询背后的语义意义和意图,而不仅仅是依赖表面关键词匹配或模式识别。这种高级的语言理解能力对于准确识别构建合适响应所需的相关信息至关重要,即使查询和可用上下文之间的确切措辞或术语不同。
克服这些障碍对于开发能够进行流畅对话、提供准确信息并提升广泛领域和应用的用户体验的智能系统至关重要。
在撰写本文时,短短一段时间内就产生了大量的生成式 AI 用例。企业正在扩大其对话界面——聊天机器人和 QA 系统——的规模,目标是减少人工劳动并用自动化的生成式 AI 系统替换现有框架。
LLMs 和生成式 AI 技术最有希望的应用之一实际上是 QA。能够用自然语言提问并获得准确、相关的答案可能会改变我们与信息和计算机互动的方式。
潜在的 QA 应用
强健的 QA 系统在许多行业和领域中的应用范围非常广泛:
-
客户服务:允许客户用自然语言提问,并接收定制化的帮助和故障排除,而不是搜索文档
-
研究和分析:允许分析师和研究人员提出开放式探索性问题,以发现大型数据集中的见解
-
教育:创建智能辅导系统,学生可以提出后续问题并接收符合其水平的解释
-
知识管理:通过允许自然语言查询,使组织的数据、文档和流程更加易于访问
当然,与任何生成式 AI 系统一样,围绕事实准确性、安全性和潜在误用的担忧必须得到妥善解决,因为 QA 系统在开发和部署过程中必须谨慎处理。
尽管如此,通过自然语言查询打破人与信息之间障碍的能力代表了人工智能进步的关键前沿。随着在 Amazon Bedrock 上可用的 FMs,这些由 LLMs 驱动的 QA 系统为那个未来提供了一个令人兴奋的预览。
基于 Amazon Bedrock 的 QA 系统
企业级 QA 系统通常建立在最先进的 NLP 技术基础之上,包括 transformer 架构和迁移学习。它们应该被设计成理解人类语言的细微差别,使其能够理解复杂的查询并从各种数据源中提取相关信息。
Amazon Bedrock 的一个关键优势是它能够处理需要推理和推理的开放性问题。与传统依赖于预定义规则或模式的 QA 系统不同,Bedrock 可以理解潜在上下文,并根据其学习到的信息提供深思熟虑的响应。
在 Amazon Bedrock 上有大量的 FM(功能模块)可供选择,开发者、数据科学家或生成式 AI 爱好者可以构建能够潜在地擅长处理模糊性和不确定性的应用程序或服务。如果可用信息不完整或相互矛盾,这些引人入胜的应用程序可以提供反映其置信水平的响应,或者它们可以请求更多信息,使交互更加自然和人性化。
此外,Amazon Bedrock 具有高度的扩展性,可以轻松集成到各种应用程序和平台中,例如聊天机器人、虚拟助手和知识管理系统。其基于云的架构和高可用性确保它可以处理大量查询并适应不断变化的数据和用户需求。
无上下文 QA
在没有提供额外上下文或支持文档的情况下,QA 系统必须完全依赖其预训练的知识来生成响应。与提供上下文的情况相比,这种无上下文 QA 呈现出几个关键挑战。其中一些挑战如下:
-
知识范围和完整性:当没有提供上下文时,QA 系统的知识完全来自其训练数据中存在的部分。这使得训练数据的范围和完整性变得极其重要。理想情况下,训练数据应涵盖广泛的主题,并具有事实准确性。然而,训练数据集可能存在空白、偏差或错误,这些随后会被编码到模型的认知中。
-
查询正确知识:没有上下文来定位问题,QA 系统必须准确地将问题映射到其参数中相关的知识领域。这需要强大的自然语言理解能力来正确解释查询,识别关键实体/关系,并检索适当的事实知识来形成响应。
-
幻觉:一个关键挑战是幻觉——当模型生成与训练数据相矛盾的错误信息时。没有基于上下文的限制,模型可能生成的信息种类就较少。幻觉可能从细微的错误到以高置信度呈现的完全虚构的输出都有可能。
无上下文 QA 的提示示例和模板
当 LLM 被问到一个没有任何额外上下文的问题时,它可能很难理解问题并生成准确的答案。这就像给他们提供了一个缺少拼图的谜题。提示工程帮助我们提供缺失的拼图,使 LLM 更容易理解我们的问题并提供准确的答案。
因此,需要仔细的提示工程来引导生成正确的方向,并鼓励准确、真实的回答。在无上下文的情况下,QA 中的提示工程有三个主要技术:
-
法国的首都是什么?,你可以问法国的首府是哪个城市?。让我们再举一个例子。与其问什么导致了恐龙的灭绝?(一个宽泛的问题),重新构架的提示应该像这样关于恐龙灭绝最广泛接受的理论是什么?(它关注一个特定的方面)。 -
五大湖是什么?,你可以问提供北美五大湖的列表(这指定了期望的答案格式)。 -
谁写了《哈姆雷特》?这似乎是一个简单的问题,但 LLM 可能不确定它是指原始剧本的作者还是现代改编。相反,你可以用某种方式对模型进行归因校准来提问,例如你能明确告诉我谁写了原始剧本《哈姆雷特》吗?根据我对文学的理解,我非常可能(或不太确定)是正确的。这种提示版本的提示提供了一系列的信心水平(非常可能或不太确定),而不是仅仅自信或不确定。这允许 LLM 根据它处理的信息表达更细微的确定性水平。 -
除了上述技术之外,你还应该利用系统提示来塑造 LLM 在最终用户查询时的解释和响应。将系统提示视为精心设计的指令,旨在指导模型的行为,将其引导到期望的结果。
-
例如,当为角色扮演场景制作提示时,系统提示可以定义 AI 应展现的性格特征、交流风格和领域知识。想象一下你正在创建一个虚拟助手。通过系统提示,你可以指定一个有帮助、信息丰富的角色,确保 FM 使用适合角色的语言和知识。
-
此外,系统提示可以帮助保持模型响应的一致性,尤其是在长时间交互期间。通过在提示中概述人物和期望的语气,你确保模型保持其性格,培养信任并提高用户体验的自然性。
-
以下是一个使用 Anthropic Claude 模型的系统提示示例,我们鼓励您浏览
promptengineering.org/claudes-system-prompt-a-prompt-engineering-case-study/。您应该始终记住,最佳的提示将取决于具体问题和您使用的 LLM 的能力。尝试不同的措辞和模板,以找到最适合您需求的方法。 -
通过使用提示工程,总是可以在没有上下文的情况下提高 LLM 在 QA 任务中的准确性和可靠性。
简单的问题提示
提示生成模型最直接的方法之一是提出一个直接的问题,在代码中多行综合提示的情况下,格式化为三引号。让我们在 Amazon Bedrock 聊天游乐场中尝试一个示例。
为了在 Amazon Bedrock 游乐场中执行简单的 QA 提示,让我们回到 AWS 控制台,导航到 Amazon Bedrock 登录页面。一旦到达登录页面,滚动左侧面板,然后在游乐场下的聊天选项上点击Chat。
通过导航到选择模型,在聊天游乐场中选择一个特定的模型。在我们的例子中,让我们选择Jurassic-2 Ultra FM,并使用图 7.1中的以下示例来启动对话。

图 7.1 – 聊天游乐场中使用 Amazon Bedrock 模型的简单提示
如前例所示,一个简单的提示,如拉宾德拉纳特·泰戈尔著名的诗篇“Geetanjali”是关于什么的?被使用,而没有向模型提供任何上下文。为了进一步与模型进行聊天,还问了一个后续问题,他还有哪些著名诗作?,模型提供了相当不错的回答。(您可以在 Bedrock 游乐场中使用其他模型运行此示例提示,并继续对话链以观察响应中的任何差异。)
您还可以通过在聊天游乐场窗口右侧切换滑块来利用比较模式,如图图 7.2所示,并对 Amazon Bedrock 上可用的多个 FM 执行类似的提示。如图所示,在特定问题上比较了三个模型。注意第三个模型是通过点击右侧的+选项添加的。

图 7.2 – 在 Amazon Bedrock 中使用比较模式进行简单 QA 提示
同样,通过使用 Amazon Bedrock API,可以在 QA 环境中提示模型:
prompt = """You are an expert AI assistant. You will answer questions in a succinct manner. If you are unsure about the
answer, say 'I am not sure about this answer'
Question: How can I connect my old Samsung TV with my Mac laptop?
Answer:"""
parameters = {
"maxTokenCount":1024,
"temperature":0.1,
"topP":0.8,
"stopSequences":[]
}
使用前面的提示,可以在 Amazon Bedrock 中调用可用的 FM;然后模型可以提供特定的响应。我们鼓励您使用 Amazon Titan 模型运行此提示,并将响应作为练习捕获。
模型鼓励和约束
你可以选择以激励的方式构建提示来鼓励模型。通过结合模型鼓励和约束,你可以创建更有效的提示,引导 LLMs 生成高质量的响应。
以下是一些示例:
-
提供上下文和特定关键词可以鼓励模型生成更准确的响应。 -
设置长度和格式约束可以帮助模型生成简洁、结构化的响应。 -
将模型限制在特定领域或主题可以帮助它生成更准确、更相关的响应。
一个提示示例可以按照以下顺序格式化:
你是一位在清晰和吸引人的方式中解释复杂科学概念的专家。你将复杂主题分解成可理解术语的能力使你成为教育目的的无价资源。
约束条件:假设你的听众是具有计算机科学和物理基础知识的大学生或专业人士。你的解释应该是易于理解且信息丰富的,涵盖量子计算的理論和實踐方面。
接着是这个问题:
请提供一个关于量子计算的全面概述,包括其原理、潜在应用以及它面临的挑战。
图 7.3 展示了在 Amazon Bedrock 的聊天沙盒中使用模型鼓励和约束调用 Meta Llama 模型的示例用法。

图 7.3 – 在 Amazon Bedrock 的聊天沙盒中使用模型鼓励和约束对 Meta Llama 3 模型的简单提示示例
鼓励你在自己的端执行这个提示,并注意有/没有约束条件和模型鼓励时的响应差异。你会发现这种类型的提示可以帮助引导模型提供深思熟虑、详尽的响应。
以下是一个供你执行的示例,你可以在 Amazon Bedrock 的聊天沙盒中执行,或者通过使用 Amazon Bedrock API 调用模型:
你对复杂的机器学习概念有很好的掌握,并且能够以清晰易懂的方式解释它们。
请解释一下机器学习中梯度下降的概念。
请确保你的解释简洁,适合具有机器学习基础知识读者。
假设你用一个假设性的问题调用一个 FM,没有任何相关上下文。在某些情况下,它可能会产生幻觉。*图 7.4* 展示了一个有趣的场景,其中模型在查询一个虚构的 BMX Subaru 自行车时产生了幻觉,而这个自行车在现实生活中并不存在!

图 7.4 – 在 Amazon Bedrock 的聊天沙盒中无上下文的 QA 提示示例
如果提供了适当的提示指令和上下文,模型将努力在上下文中找到相关内容,然后提供合理的期望响应。
请记住,虽然无上下文的 QA 极具挑战性,但诸如宪法 AI 和利用模型内部知识以新颖方式利用和重新组合的迭代优化技术等策略可以帮助提高开放域 QA 的性能。
注意
宪法 AI是人工智能研究的一个领域,关注于开发遵守伦理原则和法律框架的人工智能系统。这可能包括设计公平、透明和可问责的人工智能系统,并尊重人权和隐私。
有上下文的 QA
有上下文的 QA涉及提供输入文本和问题,语言模型必须基于给定文本中的信息生成答案。这项任务要求模型理解上下文,识别相关细节,并综合一个直接回答查询且不引入外部信息的连贯响应。
对于这个用例,通过首先展示输入文本,然后提出问题来结构化提示是有益的。这种顺序允许模型在尝试形成答案之前完全处理上下文,这可能会提高响应的质量和准确性。如前所述,结合诸如模型鼓励等技术可以进一步提高 QA 任务的表现。
理想的提示应该具有以下结构:
input_text: {{文本}}
问题:{{问题}}
answer:
现在,让我们看看提示的内容会是怎样的:
输入文本:
"""北极狐(Vulpes lagopus)是一种小型狐狸,原产于北半球的北极地区,在北极苔原生物群落中很常见。它非常适合生活在寒冷环境中,拥有密集的毛皮绝缘层和紧凑的体形,这有助于减少对寒冷的暴露。成年狐狸体重 3-5 公斤(6.6-11 磅),体长 46-68 厘米(18-27 英寸)。它们厚厚的毛皮像保温毯一样,即使在北极冬天的深处也能保持温暖。北极狐有一层厚厚的底毛,可以隔离寒冷,以及一层密集的绝缘保护毛皮覆盖在顶部。"""
北极狐在寒冷的北极环境中有哪些关键的适应性特征?
示例输出:
"The Arctic fox has several key adaptations that allow it to survive in the cold Arctic environments:
1\. Dense fur insulation to keep it warm.
2\. A compact body shape that limits exposure to the cold.
3\. A thick underfur that insulates it from the cold.
4\. A dense, insulating guard hair coat on top.
These physical adaptations, such as thick fur coats and compact body shape, enable the Arctic fox to withstand the extreme cold temperatures of the Arctic tundra region."
上述示例提示展示了这样一个场景:提供了一个关于北极狐对寒冷环境物理适应性的答案,问题提示模型从文本中识别和总结相关细节。
接下来,让我们通过一个使用 Amazon Bedrock API 的 QA 有上下文示例提示来进行分析:
# Import the respective libraries
import boto3
import botocore
import os
import json
import sys
#create bedrock runtime client
bedrock_runtime = boto3.client('bedrock-runtime')
#Provide the model paramters
model_parameters = {
"maxTokenCount":1024,
"temperature":0,
"stopSequences":[],
"topP":0.9
}
#Provide relevant context to the model
context= """Using your Apple Watch to locate a misplaced iPhone is a handy feature that can save you a lot of time and frustration. The process typically begins by opening the Control Center on your watch by swiping up from thebottom of the watch face. From there, you'll see an icon that looks like a ringing iPhone - tapping this will remotely activate a loud pinging sound on your iPhone, even if it's on silent mode. If you're within earshot, simply follow the sound to track down your missing device. Alternatively, you can use the FindMy app on your Apple Watch, which provides a map showing the last known location of your iPhone. Tap the "Devices" tab, select your iPhone, and it will display its location, as well as give you the option to force it to emit a sound to aid in your search. For an even quicker option, you can simply raise your wrist and ask Siri "Hey Siri, find my iPhone," and the virtual assistant will attempt to pinpoint the location of your iPhone and provide directions. However, for any of these methods to work, your iPhone must be powered on, connected to a cellular or WiFi network, and have the Find My feature enabled in Settings under your Apple ID. As long as those criteria are met, your Apple Watch can be a powerful tool for tracking down a wandering iPhone."""
#Take the entire context/excerpt provided above and augment to the model along with the input question
question = "How can I find my iPhone from my Apple watch in case I lose my phone?"
prompt_data = f""" Answer the user's question solely only on the information provided between <></> XML tags. Think step by step and provide detailed instructions.
<context>
{context}
</context>
Question: {question}
Answer:"""
#Now, you can Invoke the foundation model using boto3 to generate the output response.
body = json.dumps({"inputText": prompt_data, "textGenerationConfig": model_parameters})
accept = "application/json"
contentType = "application/json"
# You can change this modelID to use an alternate version from the model provider
modelId = "amazon.titan-tg1-large"
response = bedrock_runtime.invoke_model(
body=body, modelId=modelId, accept=accept, contentType=contentType)
generated_response_body = json.loads(response.get("body").read())
print(generated_response_body.get("results")[0].get("outputText").strip())
运行前面的代码,并尝试在自己的 Amazon Bedrock FM 上测试结果。生成的输出可能类似于图 7.5:

图 7.5 – 来自 Amazon Bedrock FM 的示例输出
在执行调用模型的代码后,您将观察到模型可以通过利用提供作为上下文的信息,在大多数情况下生成适当的响应。
现在我们已经讨论了在 Bedrock 上的 QA 用例中的提示工程,让我们通过 Amazon Bedrock 的文档摄取框架来了解文档摄取。
使用 Amazon Bedrock 进行文档摄取
带有上下文的 QA 系统的架构模式可以大致分为两类 – 小型文档上的 QA 和 知识库上的大型文档 QA。虽然核心组件保持相似,但所采用的方法和技术可能因输入数据的大小和复杂性而异。
小型文档上的 QA
对于旨在处理小型文档(如段落或短文章)的 QA 系统,其架构模式通常遵循以下阶段的管道方法:
-
查询处理:将自然语言查询预处理为向量表示。
-
文档检索:根据查询关键词或语义相似性度量从语料库中检索相关文档或段落。对于较小的文档,检索可以很直接;您可以直接嵌入和索引整个文档或段落到您的向量存储中。在另一种情况下,由于输入文档的性质较小,只要它们可以适应模型的令牌大小限制,可能就没有必要将它们分成更小的块。一旦检查,文档就可以在模型提示模板的上下文中直接解析。
-
段落排名:检索到段落后,根据其与查询的相关性进行排名。这种排名可以使用诸如词频-逆文档频率(TF-IDF)语义相似性或专门的神经排名模型等技术来完成。可以使用编排器或类型或向量数据库来实现段落排名的自动化。例如,Amazon Kendra 内置了 SOTA 语义搜索机制,用于执行相关性排名。
-
答案提取:分析排名靠前的段落,以识别最相关的范围或短语,这些范围或短语可能回答查询。这一阶段通常涉及诸如命名实体识别、指代消解和 QA 模型等技术。因此,在生成式 AI 框架的情况下,相关上下文提取可以由这些 LLM 执行,而无需显式调用复杂的技术。
-
答案评分和排名:提取的答案候选者根据其置信度或与查询的相关性进行评分和排名,使用的技术包括答案验证模型或评分函数。还有一些重新排名模型,例如 Cohere Rerank,也可以利用来提高召回性能。
-
答案生成:生成排名最高的答案,可能涉及后处理步骤,如格式化、改写或生成自然语言响应。
这种管道方法非常适合小型文档的问答,因为它允许高效地检索和排名相关段落,然后进行针对性的答案提取和评分,而无需将文档分成块或以不同的方式处理。
让我们通过一个使用 Amazon Bedrock 的小型文档摄取示例来了解。
对于使用 Amazon Bedrock 和 LangChain 的小型文档摄取,您可以使用 TextLoader 和 PDFLoader,实际上它们是 Python 类,而不是软件组件。以下是一个简要的解释:
-
使用
TextLoader和PDFLoader分别加载和解析文本和 PDF 文档。 -
这些类是 LangChain 文档加载功能的一部分,有助于在 AI 应用中准备文档以进行进一步处理。
以下是一个使用 TextLoader 的示例。
注意
如前几章所示,请确保安装 LangChain 所需的库以及 Chroma DB。我们仅使用 Chroma DB 作为示例目的。根据用例,您可以使用其他向量数据库,如 Chroma、Weaviate、Pinecone 和 Faiss。如果未安装 Chroma DB,请在运行以下代码之前执行 !pip install chromadb。
from langchain.document_loaders import TextLoader
from langchain.text_splitter import CharacterTextSplitter
from langchain.vectorstores import Chroma
# Load the document
loader = TextLoader('path/to/document.txt')
documents = loader.load()
# Split the documents into chunks
text_splitter = CharacterTextSplitter(chunk_size=1000, chunk_overlap=200)
texts = text_splitter.split_documents(documents)
# Create embeddings and store in Chroma vector store
from langchain_community.embeddings import BedrockEmbeddings
embeddings = BedrockEmbeddings()
db = Chroma.from_documents(texts, embeddings)
知识库中大型文档的问答
当处理知识库中的大型文档时,可能需要调整架构模式以处理数据的规模和复杂性。一种常见的方法是结合信息检索和开放域问答系统的技术。以下步骤突出了摄取大型文档、创建向量索引和创建端到端问答管道的过程:
-
知识库构建:大型语料库或知识库被预处理、索引和结构化,以便于高效检索和查询。
-
查询处理:类似于小型文档的情况,自然语言查询通过将其转换为向量表示进行预处理。
-
文档或段落检索:
-
分块:对于较大的文档,直接嵌入整个文档可能并不理想。您应该考虑将文档分成更小、更易于管理的部分,例如段落或句子。
-
从小到大检索:在这种情况下,遵循以下过程:
-
在检索期间使用较小的块进行嵌入和搜索。
-
根据检索到的分数识别相关的块。
-
使用检索到的块 ID 访问并提供相应的较大文档段给 LLM 以生成答案。这样,LLM 可以访问更广泛的环境,而检索则利用更小、更专注的单位。
-
-
效率:通过减少嵌入和搜索大量文档的计算负载,将文档分块和从小到大检索可以帮助提高效率。
-
-
段落重新排序:检索到的段落或知识库条目可能根据其与查询的相关性进行进一步的重新排序或过滤,使用技术如神经重新排序器或语义相似度度量。
-
答案提取和生成:根据查询和知识库的性质,答案提取和生成可能涉及多跳推理、知识图谱遍历或从结构化数据生成自然语言响应等技术。
-
答案评分和排序:类似于小文档的情况,提取的答案候选者将根据其置信度因子或与查询的相关性进行评分和排序。
-
答案展示:最终的答案或答案集将展示给用户,可能涉及格式化、摘要或生成自然语言解释。
-
额外考虑点 值得考虑:
-
自适应检索限制:根据查询和文档集合的复杂性,设置自适应的检索文档数量限制可以优化性能。
-
压缩:诸如摘要或信息提取等技术可以预处理大量文档,在不丢失上下文的情况下压缩信息,从而进一步帮助 LLM 在答案生成过程中。
-
这种方法特别适用于在大型、多样化和可能未结构化的知识库上运行的问题回答系统,因为它利用信息检索技术,在答案提取和生成之前,有效地检索和排序相关信息。
对于大量文档的摄取,建议使用 Amazon Bedrock 的知识库来处理摄取工作流程并将嵌入存储在向量数据库中,具体内容请参阅第五章。
无论文档大小如何,现代 QA 系统往往都会采用高级技术,如基于 Transformer 的语言模型、图神经网络和多任务学习。此外,迁移学习、少样本学习和领域自适应等技术也常被采用,以适应不同领域或知识库的 QA 模型。
重要的是要注意,具体实现细节和采用的技术可能因特定 QA 系统的要求、约束和可用资源而异。架构模式作为一个通用框架,提供了一个理解底层机制的基础,并指导针对不同用例和领域的 QA 系统的设计和开发。
使用 Amazon Bedrock 的 QA 实现模式
在本节中,我们将探讨与 QA 相关的不同模式。首先,我们将探讨如何直接向模型提出查询。之后,我们将介绍另一种使用 RAG 的方法,其中我们将添加上下文信息。让我们开始吧!
基线方法:知识领域的无界探索
在这个初始模式中,我们开始了一段旅程,在这个旅程中,问题直接向模型提出,不受外部约束的限制。我们收到的回答根植于模型的基础知识。然而,正如你现在所清楚理解的,这种方法提出了一个巨大的挑战——输出内容广泛且通用,缺乏定义客户独特商业景观的细微差别和具体细节。图 7.6展示了用户与 Amazon Bedrock 交互并使用直接提示时的旅程,提示中的小文档用于调用模型。

图 7.6 – 使用直接输入提示对 Bedrock LLM 进行 QA 生成的提示
注意,我们在展示如何利用 Amazon Bedrock Titan 模型向用户查询提供信息性回答时详细介绍了这种方法,如带上下文的 QA部分所示。
如前所述,示例演示了 Bedrock Titan 模型如何在没有任何上下文信息提供的情况下生成回答。随后,我们手动将上下文纳入模型输入中,以增强其回答的质量。重要的是要注意,这种方法不涉及任何 RAG 来将外部知识纳入模型的输出。
虽然这种直接的方法对于短文档或单一应用可能效果良好,但它可能无法有效地扩展到企业级 QA 场景。在这种情况下,需要考虑大量企业文档,整个上下文可能无法放入发送给模型的提示中,这需要更高级的技术。
RAG 方法:上下文照明
在这个第二个模式中,我们将开始一段更精细的旅程,这段旅程利用了 RAG 的力量。在这里,我们巧妙地将问题与相关的上下文信息交织在一起,创造出一个更有可能包含我们寻求的答案或见解的图案。这种方法类似于带着精心编制的阅读清单进入图书馆,引导我们走向存放我们渴望的知识的书架。
然而,即使在改进后的这种方法中,仍然存在一个限制——我们可以整合的上下文信息量受到模型强加的上下文窗口的限制。这就像在我们的比喻背包中携带有限数量的书籍,迫使我们仔细挑选携带的上下文信息,以免超过重量限制并遗漏可能至关重要的见解。
如您在第五章中学习到的,RAG 结合了使用嵌入来索引文档语料库、构建知识库以及使用 LLM 来执行嵌入的方法,目的是最终从知识库中的一部分文档中提取相关信息。为了准备 RAG,构成知识库的文档被分成固定或可变大小的块。然后,这些块通过模型传递以获得其各自的嵌入向量。每个嵌入向量及其对应的文档块和附加元数据都存储在向量数据库中,该数据库针对高效向量之间的相似性搜索进行了优化。
图 7.7展示了在 QA 生成框架的背景下使用 Amazon Bedrock 的基于 RAG 的工作流程。

图 7.7 – 使用 RAG 方法与 Amazon Bedrock 进行 QA
通过利用这种 RAG 方法,我们可以访问大量的上下文信息库,使我们的生成式 AI 模型能够产生更明智和准确的输出。然而,我们必须保持对令牌限制的警觉,并仔细挑选我们纳入的上下文信息。这样做将确保我们在领域知识的广度和深度之间取得平衡(将解析到模型中以提供响应,而不是让模型进行幻想),同时保持在模型的约束范围内。
在这种方法中,我们将基于前一小节中讨论的小型文档摄取代码进行构建。但是,您将在代码中找到不同的片段 – 尤其是在识别与源数据中的查询的相似性以及利用相关信息,增强提示以调用 LLM 的部分:
#importing the respective libraries
from langchain.document_loaders import TextLoader
from langchain.text_splitter import CharacterTextSplitter
from langchain.vectorstores import Chroma
!pip install chromadb
Import boto3
Import botocore
#Create client side Amazon Bedrock connection with Boto3 library
region = os.environ.get("AWS_REGION")
bedrock_runtime = boto3.client(
service_name='bedrock-runtime',
region_name=region,
)
# Load the document
loader = TextLoader('path/to/document.txt')
documents = loader.load()
# Split the documents into chunks
text_splitter = CharacterTextSplitter(chunk_size=1000, chunk_overlap=200)
texts = text_splitter.split_documents(documents)
# Create embeddings and store in Chroma vector store
from langchain_community.embeddings import BedrockEmbeddings
embeddings = BedrockEmbeddings(client=boto3_bedrock, model_id="amazon.titan-embed-text-v1")
db = Chroma.from_documents(texts, embeddings)
# Enter a user query
query = "Enter your query here"
#Perform Similarity search by finding relevant information from the embedded data
retriever = db.similarity_search(query, k=3)
full_context = '\n'.join([f'Document {indexing+1}: ' + i.page_content for indexing, i in enumerate(retriever)])
print(full_context)
#Since we have the relevant documents identified within "full_context", we can use the LLM to generate an optimal answer based on the retreived documents. Prior to that, let us format our prompt template before feeding to the LLM.
prompt_template = f"""Answer the user's question solely only on the information provided between <></> XML tags. Think step by step and provide detailed instructions.
<context>
{full_context}
</context>
Question: {query}
Answer:"""
PROMPT = PromptTemplate.from_template(prompt_template)
#Prompt data input creation to feed to the LLM
prompt_data_input = PROMPT.format(human_input=query, context=context_string)
#Now, you can Invoke the foundation model using boto3 to generate the output response.
body = json.dumps({"inputText": prompt_data_input, "textGenerationConfig": model_parameters})
accept = "application/json"
contentType = "application/json"
# You can change this modelID to use an alternate version from the model provider
modelId = "amazon.titan-tg1-large"
response = bedrock_runtime.invoke_model(
body=body, modelId=modelId, accept=accept, contentType=contentType)
generated_response_body = json.loads(response.get("body").read())
print(generated_response_body.get("results")[0].get("outputText").strip())
执行此代码将帮助您了解恰当地构建提示模板并调用模型以生成期望的响应。
您还被鼓励在不同的文档上执行代码,并尝试不同的向量数据库和 FM,以更深入地了解这种方法。
用户应致力于找到相关文档,以提供对其查询的准确答案。用户在使用生成式 AI 用例时可能遇到的两个关键挑战可能包括以下内容:
-
管理超过令牌限制的大型文档
-
确定给定问题的最相关文档
为了应对这些挑战,RAG 方法提出了以下策略:
-
文档准备和嵌入:在回答问题之前,文档必须被处理并存储在文档存储索引中,如使用 Amazon Bedrock 进行文档摄取部分所示。涉及到的步骤包括以下内容:
-
加载文档。
-
将其处理并分割成更小、更易于管理的块。
-
使用 Amazon Bedrock Titan Embeddings 模型或替代嵌入模型为每个块创建数值向量表示(嵌入)。
-
使用块及其相应的嵌入创建索引。
-
-
问题处理:一旦文档索引准备就绪,用户可以提出问题,并根据查询检索相关文档块。以下步骤将被执行:
-
创建输入问题的嵌入。
-
将问题嵌入与索引中的嵌入进行比较。
-
获取Top K个相关文档块。
-
将这些块作为提示中的上下文部分添加。
-
将提示发送到 Amazon Bedrock FM。
-
根据检索到的文档接收上下文答案。
-
通过在代码中采用这种方法,我们可以利用生成式 AI、嵌入和向量数据存储的力量,为用户查询提供准确和上下文感知的响应,即使在处理大量文档集时也是如此。
现在我们已经详细了解了问答系统,是时候揭开其衍生领域——即对话界面的面纱了。
对话界面
对话界面,如虚拟助手或聊天机器人,在各种领域得到了广泛应用,包括客户服务、销售和电子商务,为用户提供快速高效的响应。它们可以通过多种渠道访问,如网站、消息应用和社交媒体平台,从而确保无缝的用户体验。
使用 Amazon Bedrock 的聊天机器人
在生成式 AI 领域,Amazon Bedrock 提供了一个强大的平台,用于开发和部署聊天机器人。图 7.8突出了 Amazon Bedrock 中包含聊天历史集成的整体对话流程。该流程包括以下步骤:
-
某个用户通过界面向适当的 Bedrock LLM 提出特定问题。
-
模型将对话历史存储到特定的数据库中,例如 DynamoDB。聊天历史和问题被附加在一起形成增强提示。对话历史存储在数据库中,例如 DynamoDB。这个历史记录,连同当前用户查询一起,用于创建增强提示。然后,这个增强提示被用来通知生成式 AI 模型,这有助于在未来的交互中改进聊天机器人的响应。通过整合对话历史,聊天机器人可以避免向用户提出他们已经回答过的问题。这促进了更自然和吸引人的对话。
-
从 LLM 检索增强提示以获取相关响应。
-
对话以反馈的形式继续,其中生成的输出随后以对话链的形式反馈,以继续与用户的持续交互。

图 7.8 – 与 Amazon Bedrock 的对话流程
在 Amazon Bedrock 上构建的聊天机器人的用例多种多样,适应广泛场景:
- 基本聊天机器人 - 零样本:这个用例涉及开发一个利用预训练的 FM 进行对话交互的基本聊天机器人,无需任何额外的上下文或提示。例如,可以提供以下提示:
您是一个友好且有帮助的对话式人工智能助手。您应该就广泛的话题进行自然语言对话,尽您所能回答问题。如果您对某事不确定,您可以礼貌地回应您对该特定主题的信息不足。您的主要目标是以对话方式向用户提供有用的信息。您不需要任何额外的上下文或示例来开始对话。
-
基于提示的聊天机器人(LangChain):在这个场景中,聊天机器人被设计在由提示模板定义的特定上下文中运行。利用 LangChain 库,开发者可以创建能够进行情境化对话的聊天机器人,提供相关和定制的响应。例如,以下代码片段展示了如何使用提示模板与 LangChain 交互,并在对话链中与用户进行交互:
from langchain import PromptTemplate, LLMChainfrom langchain_community.llms import Bedrock# Define the prompt templatetemplate = """You are a helpful travel assistant. You will be provided with information about a user's travel plans, and your task is to provide relevant suggestions and recommendations based on their preferences and requirements.Travel Details: {travel_details}Using the information provided, suggest some activities, attractions, restaurants, or any other recommendations that would enhance the user's travel experience. Provide your response in a conversational and friendly tone."""# Create the prompt template objectprompt = PromptTemplate(template=template, input_variables=["travel_details"])现在,用户可以创建 LLM 链并提供一个示例提示,如下所示,并相应地调用模型:
# Sample user inputuser_travel_details = """I'm planning a 5-day trip to Paris with my family (two adults and two children, ages 8 and 12). We're interested in exploring the city's history, architecture, and cultural attractions. We also enjoy trying local cuisine and engaging in family-friendly activities.""" -
以角色驱动的聊天机器人:这个用例涉及创建具有明确角色或身份的聊天机器人。例如,可以开发一个职业导师聊天机器人,与用户进行对话,提供与职业相关的事务指导和建议,同时在整个互动过程中保持一致的角色。例如,聊天机器人可以用作教学助理,为学生提供信息和解答他们的问题。聊天机器人可以被设计成符合教师的个性,或者采取更轻松的角色,使学习更加有趣。另一种场景可能涉及客户服务或医疗保健领域的角色驱动聊天机器人。具体来说,医疗保健领域的聊天机器人可以用来向患者提供有关其健康状况的信息,或者回答有关药物的问题。聊天机器人可以被设计成富有同情心和理解的,并且可以使用患者容易理解的语言。
-
上下文感知聊天机器人:在这个高级用例中,聊天机器人被设计为根据通过外部文件提供的信息理解和响应。通过从这些文件生成嵌入,聊天机器人可以理解和整合提供的信息到其响应中,提供高度相关和特定上下文的交互。例如,第五章中提供的例子强调了上下文感知聊天机器人的用例,其中提示与从摄取的文档/外部文件中提取的上下文相结合,以增强提示与匹配的上下文。
这些用例展示了基于 Amazon Bedrock 构建的聊天机器人的多功能性和强大功能,使开发者能够创建满足不同用户需求和场景的对话接口。
通过 Amazon Bedrock 和 LangChain 框架赋能聊天机器人开发
在对话接口的领域,如聊天机器人,保持上下文和跨交互保留记忆至关重要。这不仅适用于短期交流,也适用于长期对话,其中回忆和基于先前交互构建的能力是至关重要的。
如前文所述,在更详细地讨论问答系统(除了第五章)的部分(以及第五章中提到的第五章),LangChain 提供了两种不同形式的记忆组件来满足这一需求。首先,它提供了一套辅助工具,旨在管理和操作之前的聊天消息。这些工具是模块化的,并且非常灵活,可以集成到各种工作流程和应用中。
其次,LangChain 简化了将这些记忆工具集成到链中的过程,链是创建复杂对话系统的基本构建块。通过利用 LangChain 的抽象和易于使用的接口,开发者可以轻松定义和交互不同类型的记忆组件,从而创建复杂且上下文感知的聊天机器人。
无论您是在构建一个简单的问答机器人,还是一个复杂的多轮对话代理,LangChain 的记忆管理功能,结合其与 Amazon Bedrock 的集成,使您能够打造智能且引人入胜的聊天机器人体验。
打造上下文感知对话接口——基本支柱
如“使用 Amazon Bedrock 的问答系统”部分所述,开发上下文感知聊天机器人的基石在于生成上下文嵌入。如您现在所知,这一初始阶段涉及一个摄取过程,通过嵌入模型将数据喂入,其中这些嵌入随后被仔细存储在专门的数据结构中,通常称为向量存储,以促进高效的检索和处理。
图 7.9展示了将文档或文件作为输入,进行处理或转换,然后将其转换为存储在向量存储中的嵌入的过程。

图 7.9 – 分块大型文档并将嵌入存储在向量存储中
与使用 Bedrock 的 QA 系统实现模式相同,用户交互编排中的第二个关键组件可以定义为请求处理机制。这个复杂的过程包括接收用户输入,解释意图和上下文,调用适当的模型或服务,并综合相关响应。它作为中央枢纽,协调各种组件以提供无缝且上下文相关的对话体验。在我们的场景中,这种形式或编排器或请求处理中心可以使用 Langchain 或 Amazon Bedrock 代理执行。图 7.10说明了 QA 对话界面工作流程,通过从向量存储中提取所需信息来从分块文档中检索相关响应。

图 7.10 – 带有相似性搜索和相关信息分块的问题回答对话工作流程
在请求处理阶段,系统利用先前生成的嵌入,采用复杂的算法从向量存储中识别最相关的信息。这种上下文检索使聊天机器人能够提供针对特定对话线程的响应,考虑到用户的意图、先前的话语和整体对话上下文。
现在,让我们深入探讨在对话界面情况下上下文感知的架构工作流程。
上下文感知聊天机器人的架构流程
该架构的过程流程(也在图 7.11中展示)如下:
-
初始时,上下文文档使用强大的嵌入模型(如亚马逊的 Titan Embeddings 模型)转换为数值嵌入。这些嵌入存储在专门的向量数据库中,以便高效检索。
-
使用嵌入模型将用户的查询编码成数值表示,使系统能够理解其语义含义。
-
用户的查询嵌入和聊天历史被输入到 FM 中,特别是文本嵌入模型,该模型在向量数据库中搜索最相关的上下文信息。
-
向量数据库返回与查询最佳匹配的上下文嵌入,使 LLM 能够生成包含相关上下文的响应。

图 7.11 – 一种用于上下文感知聊天机器人的对话架构流程
使用 Amazon Titan 构建此架构流程的代码可在github.com/aws-samples/amazon-bedrock-workshop/blob/main/06_OpenSource_examples/02_Langchain_Chatbot_examples/00_Chatbot_Titan.ipynb找到。
在 Amazon Bedrock 样本页上,还有来自 Anthropic、AI21 Labs 和 Meta 的不同 FM 的额外示例。随着时间的推移,Amazon Bedrock GitHub 样本页上还将继续添加更多示例,供用户进行实验并用于他们的企业用例。
此外,有关使用 Amazon Bedrock 构建基于知识库的上下文聊天应用的信息,您可以在此找到:aws.amazon.com/blogs/machine-learning/build-a-contextual-chatbot-application-using-knowledge-bases-for-amazon-bedrock/。
我们还鼓励您阅读有关基于 AWS 解决方案构建的明确问答机器人的文章,以扩展您构建企业级对话聊天机器人的可能性:aws.amazon.com/blogs/machine-learning/deploy-generative-ai-self-service-question-answering-using-the-qnabot-on-aws-solution-powered-by-amazon-lex-with-amazon-kendra-and-amazon-bedrock/。
在生成式 AI 的领域内,问答模式和对话界面代表了知识获取和传播不断演进的旅程。在我们探索这些路径的过程中,我们不断寻求创新的方法来优化我们的查询,增强我们的上下文,并推动可能性的边界,所有这些都在追求解锁这些卓越模型中蕴藏的知识宝库。
随着企业继续拥抱生成式 AI 并寻求更智能和自动化的解决方案,Amazon Bedrock 作为一个强大的工具脱颖而出,可以构建先进的问答系统,从而提升客户体验,简化运营流程,并解锁人机交互中的新可能性。
摘要
在本章中,我们探讨了现代问答界面和聊天机器人的架构复杂性及其关键组件。我们了解了促进自然和吸引人对话的提示工程技巧。我们还展示了如何使用 Amazon Bedrock 无缝设计问答系统和对话系统,突出了这些模式的结构化工作流程。
在下一章中,我们将揭示更多使用 Amazon Bedrock 的生成式 AI 的潜在用例和应用。我们将更深入地了解使用 Amazon Bedrock 进行实体提取和代码生成,以及其潜在的实际应用场景。
第八章:使用 Amazon Bedrock 提取实体和生成代码
本章揭示了实体提取领域,这是自然语言处理中的一个关键技术。我们将探讨实体提取应用的复杂性,提供使用 Amazon Bedrock 实施实体提取的全面理解。通过实际案例,您将深入了解实体提取在各个领域的实际应用。
此外,本章将引导您进入代码生成的激动人心的生成式 AI 世界。我们将探讨使 AI 系统能够生成代码片段、函数甚至整个应用程序的底层原理和方法。您将学习如何利用 Amazon Bedrock 简化您的开发工作流程并提高生产力。
通过掌握这些技术,您将具备解决复杂 NLP 任务和利用生成式 AI 在编码工作中的力量的知识和技能。
以下主题将详细介绍:
-
实体提取 – 全面探索
-
实体提取的工业应用案例 – 解放非结构化数据的力量
-
使用 Amazon Bedrock 进行实体提取
-
使用大型语言模型进行代码生成 – 解放 AI 驱动的开发力量
技术要求
本章要求您拥有 AWS 账户访问权限。如果您还没有账户,可以访问 aws.amazon.com/getting-started/ 创建一个 AWS 账户。
其次,您需要在创建账户后从 aws.amazon.com/cli/ 安装和配置 AWS CLI,这将用于从您的本地机器访问 Amazon Bedrock FMs。由于我们将执行的大多数代码单元都是基于 Python 的,因此在此时设置 AWS Python SDK(Boto3)docs.aws.amazon.com/bedrock/latest/APIReference/welcome.html 将非常有用。您可以通过以下方式执行 Python 设置:在您的本地机器上安装它,使用 AWS Cloud9 或 AWS Lambda,或利用 Amazon SageMaker。
注意
与调用和定制 Amazon Bedrock FMs 相关的费用将会产生。请参阅 aws.amazon.com/bedrock/pricing/ 了解更多信息。
实体提取 – 全面探索
在大数据和信息过载的时代,从非结构化文本数据中提取有意义的见解的能力变得越来越有价值。实体提取,作为 NLP 的一个子领域,在这一努力中发挥着关键作用,通过识别和分类文本中的命名实体(如人物、组织、地点等),从而不仅促进了信息检索和知识管理,还使各种应用成为可能,包括问答、情感分析和决策支持系统(DSSs)。
实体提取的旅程始于简单的模式匹配和基于规则的系统,这些系统严重依赖于手动制定的规则和词汇表。虽然这些方法有用,但在处理多样化和复杂的数据集时,它们缺乏可扩展性和鲁棒性。
因此,传统上,实体提取是一个具有挑战性的任务,需要大量的手动工作和领域专业知识。然而,生成式 AI 的出现,尤其是 LLMs,彻底改变了这一领域,提供了更准确、可扩展和高效的解决方案。在本章中,我们将探讨 LLMs 在 Amazon Bedrock 上用于实体提取的各种技术,深入其底层架构、优势和局限性。
深度学习方法
机器学习的出现引入了利用特征工程统计模型。这些模型,包括隐马尔可夫模型(HMMs)和条件随机字段(CRFs),代表了一个重大进步。它们利用手工制作的特征和概率框架来提高提取精度。然而,它们的性能仍然受到专家设计的特征的质量和全面性的限制。
神经网络通过自动化特征学习和捕捉数据中的复杂模式,在实体提取中实现了范式转变。早期神经网络的应用,如循环神经网络(RNNs)和长短期记忆网络(LSTMs),展示了深度学习在处理序列数据和以更高精度提取实体方面的潜力。
虽然 BERT 及其后续模型在 NLP 领域代表了一个重大飞跃,但我们的关注点将始终集中在与 Bedrock 中使用的实际应用和工具相一致的模式和技巧上。我们将探讨一些在多种场景中证明有效的深度学习方法和模型,它们与我们的框架相关。
基于 Transformer 的模型
Transformer 架构,由开创性的论文 Attention is All You Need (Vaswani 等人,2017*: arxiv.org/abs/1706.03762) 提出,已成为许多 SOTA LLMs 用于实体提取的骨干。这些模型采用自注意力机制来捕捉输入文本中的长距离依赖关系,使它们能够更好地理解上下文以及实体之间的关系。
由谷歌 AI 开发的 BERT 是一个基于转换器的模型,它在各种 NLP 任务中,包括实体提取中取得了卓越的成果。它是一个双向模型,这意味着它可以同时处理文本的两个方向,使其比前辈更有效地捕捉上下文信息。
序列标注和 CRFs
实体提取可以被视为一个序列标注问题,其中输入文本中的每个标记都被分配一个标签,指示其实体类型(例如,人、组织、地点)或非实体标签。LLMs 可以通过利用 CRFs 或更近期的双向 LSTM 与 CRF(BiLSTM-CRF)架构等技术来训练执行此任务。
条件随机场(CRFs)是能够有效捕捉序列中标签之间依赖关系的概率图模型,这使得它们非常适合实体提取任务。它们模型化给定输入文本的标签序列的条件概率,允许结合丰富的特征和上下文信息。
双向长短时记忆网络-条件随机场(BiLSTM-CRF)模型结合了 BiLSTM 在捕捉长距离依赖关系和 CRFs 在序列标注方面的优势。这种混合方法在实体提取中表现出令人印象深刻的性能,尤其是在实体可能跨越多个标记或具有复杂结构的情况下。
基于规则的系统
尽管近年来深度学习方法获得了显著的关注,但基于规则的系统在实体提取领域仍然是宝贵的工具。这些系统依赖于手动编写的规则和模式来识别和分类文本中的实体,利用领域特定知识和专家见解。这些规则可以增强到 Amazon Bedrock 的提示模板中,以便从 FMs 生成期望的响应。例如,在医疗应用中,基于规则的组件可能会使用预定义的模式来识别药物名称、剂量和患者信息。
正则表达式和模式匹配
正则表达式和模式匹配技术是规则基于实体提取系统的基本构建块。这些方法允许定义可以匹配和提取特定实体类型(例如电话号码、电子邮件地址或特定的命名实体,例如公司名称和产品名称)的模式。
虽然正则表达式对于定义明确和结构化的实体类型可能非常有效,但它们在处理需要上下文理解的更复杂或模糊的实体时可能会遇到困难。尽管如此,它们仍然是宝贵的工具,尤其是在与其他技术结合使用或作为更高级方法预处理步骤时。以下是一些例子:
-
规则集:使用正则表达式和模式匹配定义规则,以识别特定的实体,如药物名称、剂量和患者信息
-
\d+mg(例如,500mg) -
可以通过诸如
Patient: [A-Za-z]+之类的模式识别患者信息
地名词典和词典
地名词典和词典是已知实体的精选集合,通常按实体类型或领域组织。这些资源可以通过对预定义列表进行查找来用于匹配和提取文本中的实体。
例如,地理位置的地名词典可以用来识别和提取给定文本中提到的城市、国家或其他地点。同样,人名或组织名词典可以简化这些实体类型的提取。
虽然地名词典和词典对于它们覆盖的实体可能非常准确,但它们可能难以处理歧义、变化或新出现的实体,这些实体不在预定义的列表中。此外,维护和更新这些资源可能是一个劳动密集型过程,尤其是在快速发展的领域。
混合方法
在实践中,许多实体提取系统采用深度学习和基于规则的技术的组合,利用两种方法的优势来实现最佳性能。这些混合方法旨在在深度学习模型的灵活性和泛化能力与基于规则的系统的精确性和可解释性之间取得平衡。
集成方法
集成方法涉及结合多个实体提取模型的输出,可能使用不同的架构或技术,以提高整体性能。这种方法可以利用单个模型的优势,同时减轻其弱点,从而实现更稳健和准确的实体提取。
例如,一个集成系统可能结合了基于 BERT 的转换器模型的预测以及基于规则的系统或地名词典查找的预测。这些模型的输出可以通过各种策略结合,例如多数投票、加权平均或更复杂的集成学习技术。
混合架构
混合架构将深度学习和基于规则的组件集成到单个模型中,允许两种方法的无缝集成。这些架构通常涉及一个用于学习表示和捕获上下文信息的深度学习组件,并结合基于规则的组件来融入特定领域的知识或处理定义明确的实体类型。
混合架构的一个例子是使用 LLM 进行实体表示学习,然后使用基于规则的组件进行实体分类或提取。LLM 组件可以学习输入文本的丰富表示,捕捉上下文信息和长距离依赖关系,而基于规则的组件可以利用专家知识和精确模式进行实体识别和分类。例如,考虑一个旨在从公司收益报告中提取财务信息的应用程序。以下是一个混合架构如何实现的详细示例:
-
收入、净收入和运营费用。 -
收入、净收入或费用。 -
使用正则表达式提取日期和财政期间。
-
识别公司特定的术语和缩写。
基于规则的系统分析由 LLM 生成的表示,应用这些规则以准确提取特定的金融实体。
现在我们来看看这些表示是如何集成和优化的:
-
管道:系统通过 LLM 处理收益报告,输出丰富的文本表示。然后,这些表示被输入到基于规则的组件中。
-
输出:最终输出包括精确提取的金融实体,如收入数字、净收入金额和财政期间,所有这些都根据预定义的规则进行了验证和分类。
通过在 Amazon Bedrock 上采用这种混合方法,应用程序利用了 LLM 提供的全面文本理解以及基于规则的提取方法的精确性和可靠性。这种方法确保了实体提取的准确性更高,并且具有更强的上下文意识,使其适用于金融分析等复杂领域。
为了更深入地了解混合 LLM 框架,鼓励读者阅读以下论文:从结构化数据生成业务洞察的混合 LLM-基于规则的途径(https://arxiv.org/pdf/2404.15604)和从非结构化文本数据中提取命名实体的创新混合方法(https://www.researchgate.net/publication/332676137_An_innovative_hybrid_approach_for_extracting_named_entities_from_unstructured_text_data)。
在本节中,我们介绍了与实体提取相关联的不同方法(深度学习、基于规则和混合方法)。现在,我们已经对这些方法有了基本的了解,让我们深入了解一些实体提取的工业应用案例。
实体提取的工业应用案例——释放非结构化数据的力量
实体提取在各个领域有广泛的应用,从信息检索和知识管理到决策支持系统(DSS)和商业智能(BI)。在本节中,我们将探讨一些使用 GenAI 的实体提取的实际用例和应用:
Google 是由拉里·佩奇和谢尔盖·布林在斯坦福大学攻读博士学位时创立的。
使用实体提取,可以提取以下信息:
-
Google (组织) -
LarryPage (人物) -
SergeyBrin (人物) -
StanfordUniversity (组织) -
由(Google->拉里·佩奇和谢尔盖·布林) 和就读于(拉里·佩奇和谢尔盖·布林->斯坦福大学),被确立为连接节点的边。这种结构化表示允许对信息进行高效的查询和推理。*Google (组织)*LarryPage (人物)*SergeyBrin (人物)*StanfordUniversity (组织)*Google -> 创始人 ->拉里·佩奇*Google -> 创始人 ->谢尔盖·布林*拉里·佩奇 -> 就读于 ->斯坦福大学*谢尔盖·布林 -> 就读于 ->斯坦福大学
亚马逊 Bedrock 上的 LLM 可用于准确和可扩展的实体提取,促进从多样化的数据源(如新闻文章、科学出版物或社交媒体帖子)创建全面的知识图谱。这些知识图谱可以支持各种应用,包括问答系统、推荐引擎和决策支持工具。以下是一些示例:
-
生物医学和科学文献分析:在生物医学和科学领域,实体提取特别有价值,因为这些领域通过研究出版物、临床笔记和其他来源产生了大量非结构化文本数据。识别和分类诸如基因、蛋白质、疾病和化学化合物等实体,可以使研究人员和医疗保健专业人员快速导航并从这些丰富的信息中提取见解。
亚马逊 Bedrock 中的 LLM 可以在特定领域的数据集上进行微调,以实现提取生物医学和科学实体的高精度。这些模型可以帮助进行文献综述过程、药物发现流程以及精准医疗和个性化医疗的知识库开发。
-
商业智能和竞争分析:在商业领域,实体提取可以用于竞争分析、市场研究和商业智能应用。通过从新闻文章、社交媒体帖子和其他在线来源中提取公司名称、产品名称和行业特定术语等实体,企业可以对其竞争对手、市场趋势和客户情绪获得有价值的见解。
亚马逊 Bedrock API 可以与商业智能平台(BIps)和分析工具结合使用,实现大量非结构化数据的实时实体提取和分析。这可以促进数据驱动决策、战略规划和识别新的商业机会。
-
社交媒体监控和情感分析:社交媒体平台产生大量用户生成内容,包含有关公众舆论、趋势以及对各种实体(如品牌、产品或公众人物)的情感的有价值信息。实体提取在社交媒体监控和情感分析中发挥着关键作用,通过识别这些非结构化数据中的相关实体。
Amazon Bedrock 中的 LLMs 可以用于从社交媒体帖子中准确提取实体,从而实现围绕这些实体的情感分析和意见挖掘。这可以为业务提供有关客户反馈、品牌认知以及潜在问题或机会的宝贵见解,使他们能够积极应对并相应地调整其营销和沟通策略。
在本节中,我们介绍了适用于实体提取背景下的工业应用。请记住,随着我们在不同行业中发现更多多样化的场景,这些用例的数量可以呈指数级增长。现在,让我们学习如何利用 Amazon Bedrock 进行实体提取用例。
Amazon Bedrock 的实体提取
在其核心,使用 GenAI 进行实体提取涉及提供提示,指导模型在给定的文本输入中识别和分类相关实体。关键在于构建清晰、一致且提供足够示例的提示,以便模型理解期望的行为。
Amazon Bedrock 服务,能够以无服务器的方式调用 LLMs,为实体提取提供可扩展且成本效益高的解决方案。此服务允许开发者利用预训练模型或在其自定义数据集上进行微调,从而实现针对特定领域或用例的定制实体提取。
结构化实体提取提示
在设计实体提取任务的提示时,向模型提供清晰的指示和示例至关重要。一个结构良好的提示通常包括以下组件:
-
在给定的文本中识别和分类以下实体。 -
Person,Organization,Location等等。 -
示例输入和输出:包括一个或多个带有相应实体标注的输入文本示例。这有助于模型理解期望的输出格式并从现实世界的实例中学习。
以下是一个示例提示:
'''
: 在给定的文本中识别和分类以下实体:
实体类型:Person,Organization,Location
: "迈克尔·乔丹,芝加哥公牛队的传奇篮球运动员,在辉煌的职业生涯后宣布退役。"
输出看起来像这样:
[Person: Michael Jordan], [Organization: Chicago Bulls], [Location: NBA]
让我们再看一个例子:
: "苹果公司,位于加利福尼亚州库比蒂诺的科技巨头,在新闻发布会上发布了其最新的 iPhone 型号。"
输出看起来像这样:
[Organization: Apple Inc.], [Location: Cupertino], [Location: California]
'''
让我们通过一个代码示例来探索这些用例,并通过在 Amazon Bedrock 上调用 Anthropic Claude 3 Sonnet FM 来生成输出。
注意
请确保您已安装所需的库,例如boto3,以便运行代码。如果没有,请在您的编辑器中使用pip install boto3命令安装库。
此外,请确保您已启用对 Amazon Bedrock 上可用的模型访问权限。有关 Bedrock 上模型访问的进一步文档,请访问 https://docs.aws.amazon.com/bedrock/latest/userguide/model-access.html。
# Import the respective libraries
import boto3
import botocore
import os
import json
import sys
#Create client-side Amazon Bedrock connection with Boto3 library
region = os.environ.get("AWS_REGION")
bedrock_runtime = boto3.client(service_name='bedrock-runtime',region_name=region)
prompt_data = """
Human: You are a helpful AI assistant. If you are unsure about the answer, say I do not know. Skip the preamble.
Task: Identify and classify the following entities in the given text:
Entity Types: Person, Organization, Location
Input Text: "Michael Jordan, the legendary basketball player for the Chicago Bulls, announced his retirement from the NBA after an illustrious career."
Assistant:
"""
messages=[{ "role":'user', "content":[{'type':'text','text': prompt_data}]}]
body=json.dumps(
{
"anthropic_version": "bedrock-2023-05-31",
«max_tokens»: 512,
«messages»: messages,
«temperature»: 0.1,
"top_p": 1
}
)
response = bedrock_runtime.invoke_model(body=body, modelId="anthropic.claude-3-sonnet-20240229-v1:0")
response_body = json.loads(response.get('body').read())
print(response_body['content'][0].get("text"))
这里是 FM 的一个示例输出:

图 8.1 – 示例输出
虽然这种基本结构适用于简单情况,但更高级的提示技术对于稳健、生产级别的实体提取是必需的。
结合上下文和领域知识
实体提取场景通常受益于上下文信息和领域特定知识。在提示中提供相关的背景或领域特定细节,可以增强模型的理解并提高其准确识别实体的能力。
这里有一个带有上下文的示例提示:
py` ```py`
: Identify and classify entities related to sports in the given text.
Entity Types: Athlete, Team, Tournament, Sport
: This text discusses sports events, teams, and athletes involved in various sports competitions.
: "Serena Williams, a well renowned Tennis player, defeated Venus Williams to win 23rd Grand Slam title at the 2017 Australian Open."
The output looks like this:
[运动员:塞雷娜·威廉姆斯], [运动员:维纳斯·威廉姆斯], [赛事:大满贯], [赛事:澳大利亚公开赛], [运动:网球]
```py
```` ```py ````
在*图 8*.2 中,展示了前一个用例的代码示例。需要注意的是,代码并未明确提及已安装的库。假设用户已经预先安装了之前代码示例中详细说明的所需 Python 包和库:

图 8.2 – 使用上下信息提示 Amazon Bedrock FM 进行实体提取
它可能会根据输入指令为某些 FM 生成有利的输出。然而,在其他情况下,它有可能生成幻觉或无关的额外信息,如*图 8*.3 所示。因此,在这种情况下使用少样本提示对于实体提取是有益的:

图 8.3 – AI21 Labs J2 Jumbo Instruct FM 输出
## 利用少样本学习
如您所知,少样本学习涉及在训练或推理期间向模型提供少量标记示例。这种方法对于实体提取任务尤其有效,因为它允许模型从有限的高质量示例中学习并推广到新的、未见过的数据。
这里是一个带有少样本学习的示例提示:
```py` ``` ```py`
`: Identify and classify entities related to technology companies in the` `given text.`
`: Company,` `Product, Location`
`:`
`: "Microsoft, based in Redmond, Washington, unveiled its latest operating system, Windows 11, at a` `virtual event."`
`The output looks` `like this:`
[公司:微软], [产品:Windows 11], [地点:雷德蒙德], [地点:华盛顿州]
`Here's` `another example:`
`: "Google's parent company, Alphabet Inc., announced plans to expand its data center operations in Iowa` `and Nevada."`
`The output looks` `like this:`
[公司:Alphabet Inc.], [公司:Google], [地点:爱荷华州], [地点:内华达州]
`Let's look at` `another example:`
`: "Samsung Electronics, the South Korean tech giant, launched its new flagship smartphone, the Galaxy S22, featuring a powerful camera and improved` `battery life."`
`The output looks` `like this:`
[公司:三星电子], [产品:Galaxy S22], [地点:韩国]
`Now, look at the following` `use case:`
`: "Amazon, the e-commerce behemoth based in Seattle, Washington, unveiled its latest line of Echo smart speakers and Alexa-powered devices at a` `hardware event."`
```` ```py ````
让我们为前面的用例编写一个代码示例,并在 Amazon Bedrock 上调用 Amazon Titan 模型:
```py
# Import the respective libraries
import boto3
import botocore
import os
import json
import sys
#Create client-side Amazon Bedrock connection with Boto3 library
region = os.environ.get("AWS_REGION")
bedrock_runtime = boto3.client(service_name='bedrock-runtime',region_name=region)
prompt_data = """Task: Identify and classify entities related to technology companies in the given text.
Entity Types: Company, Product, Location
Few-Shot Examples:
Input Text: "Microsoft, based in Redmond, Washington, unveiled its latest operating system, Windows 11, at a virtual event."
Output: [Company: Microsoft], [Product: Windows 11], [Location: Redmond], [Location: Washington]
Input Text: "Google's parent company, Alphabet Inc., announced plans to expand its data center operations in Iowa and Nevada."
Output: [Company: Alphabet Inc.], [Company: Google], [Location: Iowa], [Location: Nevada]
Input Text: "Samsung Electronics, the South Korean tech giant, launched its new flagship smartphone, the Galaxy S22, featuring a powerful camera and improved battery life."
Output: [Company: Samsung Electronics], [Product: Galaxy S22], [Location: South Korea]
Your Input Text: "Amazon, the e-commerce behemoth based in Seattle, Washington, unveiled its latest line of Echo smart speakers and Alexa-powered devices at a hardware event."
Output:
"""
body = {
"inputText": prompt_data
}
modelId = "amazon.titan-tg1-large"
accept = «application/json»
contentType = «application/json»
response = invoke_model(body, modelId, accept, contentType)
response_body = json.loads(response.get("body").read())
print(response_body.get("results")[0].get("outputText"))
执行前面的代码会生成以下输出,如图8.4所示:
[Company: Amazon], [Product: Echo smart speakers, Alexa-powered devices], [Location: Seattle], [Location: Washington]

图 8.4 – Amazon Titan FM 生成的输出
因此,在这个例子中,提示提供了一组标记实例,以帮助模型理解技术领域内的实体提取任务。通过利用少量样本学习,模型可以熟练地泛化到不熟悉的输入文本,同时保持高精度。
迭代优化和评估
提示工程是一个迭代过程,通常需要优化和评估。在探索各种提示和技术时,通过自动模型评估或人工评估方法评估模型的性能至关重要,如第十一章所述。通过仔细分析模型的输出并确定改进领域,您可以迭代地优化您的提示,从而提高实体提取系统的整体准确性。
看一下以下模型分析和优化的示例:
'''
:
: 识别和分类给定文本中的实体。
实体类型:人物,组织,位置
: "Elon Musk,特斯拉公司的首席执行官,宣布计划在 Austin, Texas 建设一个新的超级工厂。"
输出看起来是这样的:
[Person: Elon Musk], [Organization: Tesla Inc.], [Location: Austin]
: 模型正确地识别了人物和组织实体,但遗漏了 位置 "Texas."
:
: 识别和分类给定文本中的实体,包括嵌套或 多词实体。
实体类型:人物,组织,位置
: "Elon Musk,特斯拉公司的首席执行官,宣布计划在 Austin, Texas 建设一个新的超级工厂。"
输出看起来是这样的:
[Person: Elon Musk], [Organization: Tesla Inc.], [Location: Austin, Texas]
'''
通过细化提示以包括处理嵌套或多词实体的说明,模型的性能得到了提升,正确地将位置识别为 Austin, Texas。
我们鼓励用户在 Amazon Bedrock 上运行提供的代码,使用 Claude 3 模型和Messages API 提取相关实体。如前所述,请确保在 Amazon Bedrock 上启用对这些模型的访问。有关在 Bedrock 上访问模型的进一步文档,请访问docs.aws.amazon.com/bedrock/latest/userguide/model-access.html。
注意
确保您已安装boto3库,如前几章所述。如果没有,请使用以下命令安装最新版本:pip install boto3。
#importing the relevant libraries
import boto3
import json
#Creating Bedrock client and region
bedrock_client = boto3.client('bedrock-runtime',region_name='us-east-1')
prompt = """
Task: Identify and classify entities in the given text.
Entity Types: Person, Organization, Location
Input Text: "Elon Musk, the CEO of Tesla Inc., announced plans to build a new Gigafactory in Austin, Texas.
Output:
"""
messages = [{ "role":'user', "content":[{'type':'text','text': prompt}]}]
max_tokens=512
top_p=1
temp=0.5
system = "You are an AI Assistant"
body=json.dumps(
{
"anthropic_version": "bedrock-2023-05-31",
«max_tokens»: max_tokens,
«messages»: messages,
"temperature": temp,
"top_p": top_p,
"system": system
}
)
response = bedrock_client.invoke_model(body= body, modelId = "anthropic.claude-3-sonnet-20240229-v1:0")
response_body = json.loads(response.get('body').read())
print(response_body)
按照前面的代码片段打印response_body可能会得到以下预期的输出:
{'id': 'msg_01RqxLfg6hEEu1K8jY3g8gzq',
'type': 'message',
'role': 'assistant',
'content': [{'type': 'text',
'text': 'Person: Elon Musk\nOrganization: Tesla Inc.\nLocation: Austin, Texas'}],
'model': 'claude-3-sonnet-28k-20240229',
'stop_reason': 'end_turn',
'stop_sequence': None,
'usage': {'input_tokens': 71, 'output_tokens': 23}}
因此,通过利用 Amazon Bedrock 中的有效提示工程技术,例如提供清晰的指令、相关的示例和解决歧义,GenAI 模型可以被引导在多个用例和不同领域执行高质量实体提取。与任何 AI 应用一样,它需要仔细的设计、测试和改进,以构建一个真正适合生产的系统。
随着大型语言模型(LLMs)的规模和复杂性的持续增长,它们在实体提取方面的能力预计将进一步提高,从而实现更准确和稳健的解决方案。
持续的研究还集中在将外部知识源(如知识图谱或本体)集成到 LLMs 中以进行实体提取。通过将这些结构化知识嵌入到模型的架构或训练方案中,这些方法有可能丰富模型对实体及其相互关系的理解,从而有可能提高性能和可解释性。
请查看以下 AWS 博客,展示了在 AWS AI/ML 服务(如 Amazon Textract 与 Amazon Bedrock 和 LangChain)的背景下,使用智能文档处理(IDP)进行实体提取自动化的集成:aws.amazon.com/blogs/machine-learning/intelligent-document-processing-with-amazon-textract-amazon-bedrock-and-langchain/。
此解决方案特别有益于处理手写或扫描文档,包括从各种文件格式(如 PDF、PNG、TIFF 和 JPEG)中提取相关数据,无论文档布局如何。Amazon Textract 服务简化了此类扫描文档中文本、手写和数据的自动提取。
因此,此解决方案利用了每个组件的优势:Amazon Textract 用于精确数据提取,Amazon Bedrock 用于简化的数据处理管道,LangChain 用于无缝集成 LLMs 到工作流程中。总的来说,该博客文章提供了一个实用的解决方案,用于自动化文档处理任务,强调了利用 AWS 服务和开源框架(如 LangChain)开发智能应用的优点。因此,它具有在多样化的文档处理场景中提供动态适应不断变化的数据模式的大量潜力。
在此处还添加了使用 Bedrock 进行实体提取的更多示例:github.com/aws-samples/amazon-bedrock-workshop/blob/main/01_Text_generation/04_entity_extraction.ipynb。鼓励用户运行和执行代码单元,以更好地理解使用 Amazon Bedrock 进行 GenAI 用例的实体提取。
现在你已经更详细地掌握了实体提取的概念,我们将深入亚马逊 Bedrock 宇宙中的更多代码生成场景。
使用 LLM 进行代码生成——释放 AI 驱动开发的潜力
随着人工智能领域的持续发展,最令人兴奋和有前景的领域之一是使用 LLM 进行代码生成,尤其是在提高开发者生产力的方面。客户可以利用亚马逊 Bedrock 上提供的最先进的 LLM 生成高质量的代码,从而彻底改变开发者对待软件开发的方式。
代码生成过程
使用亚马逊 Bedrock 进行代码生成的过程简单直观,开发者可以通过基于网页的界面或 API 与平台交互,如前几章所述。该过程通常包括以下步骤:
-
问题描述:开发者提供对所需功能或任务的天然语言描述,该代码需要执行。
-
上下文和约束:开发者可以选择提供额外的上下文,例如编程语言偏好、编码风格或特定库或框架的使用。
-
LLM 代码生成:亚马逊 Bedrock 的 LLM 分析问题描述和提供的任何上下文,并生成相应的代码。
-
代码优化:生成的代码可以通过额外的提示或开发者的反馈进行迭代优化,从而实现协作和交互式的过程。
-
代码集成:最终生成的代码可以无缝集成到开发者的项目或代码库中。
使用亚马逊 Bedrock 进行代码生成的益处
利用大型语言模型(LLM)进行代码生成为开发者带来了众多好处,包括以下几方面:
-
提高生产力:借助亚马逊 Bedrock,开发者可以快速生成用于各种任务和功能的代码,减少手动编码所需的时间和精力。
-
提高代码质量:亚马逊 Bedrock 的 LLM 生成的代码可以提供高质量的输出,遵循基于提示迭代优化的最佳实践和编码标准。
-
减少错误:通过提示工程生成正确且连贯的代码,LLM 可以帮助减少常见编码错误的可能性,例如语法错误或逻辑错误。
-
探索和原型设计:Bedrock 使开发者能够快速探索和原型设计不同的想法和方法,从而促进更高效和更具创造性的问题解决。
-
易用性:通过利用自然语言描述和用于代码生成的 FM(如 Llama、Claude、Titan、Mistral 等),亚马逊 Bedrock 使得代码生成对具有不同技术水平或背景的开发者更加容易。
局限性和考虑因素
虽然基于 LLM 的代码生成提供了许多优势,但了解其局限性和考虑因素同样重要:
-
专业领域知识:LLMs 可能并不总是生成需要高度专业领域知识或复杂算法的代码。在某些情况下,仍然可能需要人类的专家知识和审查。
-
安全和合规性:生成的代码应彻底审查和测试,以确保其符合安全最佳实践和任何相关的合规性要求。
-
集成和维护:生成的代码可能需要随着时间的推移进行适应和维护,因为需求或依赖关系发生变化。
-
伦理考量:与任何 AI 系统一样,确保 LLMs 负责任和道德地使用至关重要,考虑到潜在的偏见或意外后果。
用例和示例
Amazon Bedrock 的代码生成能力可以应用于各个领域和编程语言的广泛用例。以下是一些示例:
-
Web 开发:开发者可以使用 Bedrock 使用 JavaScript、Python 或 Ruby 等语言生成用于 Web 应用程序、API 或用户界面的代码。
-
数据处理和分析:开发者可以利用 Bedrock 使用 Python 或 R 等语言编写数据操作、分析和可视化任务的代码。
-
移动应用开发:Bedrock 可用于使用 Swift、Kotlin 或 React Native 等语言生成移动应用的代码。
-
嵌入式系统和物联网(IoT)设备:开发者可以在 Bedrock 模型的帮助下,使用 C、C++或 Rust 等语言创建嵌入式系统、微控制器或 IoT 设备的代码。
-
科学计算:Bedrock 可以通过其代码生成功能帮助编写使用 MATLAB、Julia 或 Fortran 等语言进行科学模拟、数值计算或数据处理任务的代码。
现在,让我们看看一些使用 Amazon Bedrock 进行代码生成、调试或代码转换用例的例子。
Amazon Bedrock 的提示工程示例
以下是在 Amazon Bedrock 中给 Claude 3 Sonnet 模型提供的示例提示,以采用 Python 开发者的角色并执行代码生成任务:
py`Human: You are an expert Python developer tasked with coding a web scraper for an experienced developer. The scraper should extract data from multiple web pages and store the results in a SQLite database. Write clean, high-quality Python code for this task, including necessary imports. Do not write anything before the python 代码块。在编写代码后,仔细检查错误。如果存在错误,请在
导入相应的库
import boto3
import botocore
import os
import json
import sys
使用 Boto3 库创建客户端 Amazon Bedrock 连接
region = os.environ.get("AWS_REGION")
bedrock_runtime = boto3.client(service_name='bedrock-runtime',region_name=region)
在此处添加提示示例:
prompt_data = """Human: 你是一位经验丰富的 Python 开发者,需要编写一个用于经验丰富的开发者的网络爬虫。爬虫应从多个网页中提取数据,并将结果存储在 SQLite 数据库中。为这个任务编写干净、高质量的 Python 代码,包括必要的导入。不要在 ```pypython block. After writing the code, carefully check for errors. If errors exist, list them within
Assistant:
"""
Using Messages API with Anthropic Claude
messages=[{ "role":'user', "content":[{'type':'text','text': prompt_data}]}]
body=json.dumps(
{
"anthropic_version": "bedrock-2023-05-31",
«max_tokens»: 512,
«messages»: messages,
«temperature»: 0.1,
"top_p": 1
}
)
response = bedrock_runtime.invoke_model(body=body, modelId="anthropic.claude-3-sonnet-20240229-v1:0")
response_body = json.loads(response.get('body').read())
我们不会深入探讨生成的全部输出,但 *图 8**.5* 中提供了一个由 Amazon Bedrock API 通过前面的提示调用 Claude 3 Sonnet 模型生成的代码片段:

图 8.5 – 通过 Amazon Bedrock 调用 Claude 3 Sonnet 模型生成的输出代码片段
*图 8**.6* 展示了另一个代码调试用例的示例,利用 Amazon Bedrock 上的 Llama 2 Chat 13B 模型在聊天沙盒中进行:

图 8.6 – 在 Amazon Bedrock 上使用 Llama 2 Chat 13B 模型进行代码调试
现在,让我们看看一个代码翻译场景。以下是在 Amazon Bedrock 上使用 Mixtral 8X7B 指令模型的一个代码翻译用例的示例提示,随后是生成的输出:
```py
# Import the respective libraries
import boto3
import botocore
import os
import json
import sys
#Create client-side Amazon Bedrock connection with Boto3 library
region = os.environ.get("AWS_REGION")
bedrock_runtime = boto3.client(service_name='bedrock-runtime',region_name=region)
prompt="""
[INST] You are an AI code translator specialized in converting code between different programming languages while preserving functionality, readability, and style. Your task is to translate the provided Python code to JavaScript.
Here is a brief description of the code's purpose:
This code defines a class called 'BankAccount' that represents a basic bank account. It has methods to deposit and withdraw money, as well as to check the account balance.
Python code is in the following code block:
```python
class BankAccount:
def __init__(self, initial_balance=0):
self.balance = initial_balance
def deposit(self, amount):
self.balance += amount
def withdraw(self, amount):
if self.balance >= amount:
self.balance -= amount
else:
print("Insufficient funds")
def check_balance(self):
return self.balance
```py
Translate the above Python code to JavaScript, maintaining clear variable naming, proper indentation, and adding comments to explain any non-trivial logic or language-specific constructs used in the translation.
After translating the code, carefully review your work for any errors or inconsistencies. If errors are found, list them within `<error>` tags and provide a corrected version. If no errors are present, write "CHECKED: NO ERRORS" within `<error>` tags.
[/INST]"""
#Model ID and parameter details
modelId = 'mistral.mixtral-8x7b-instruct-v0:1'
accept = 'application/json'
contentType = 'application/json'
body = json.dumps({
'prompt': prompt,
'max_tokens': 1000,
'top_p': 0.9,
'temperature': 0.2,
})
#Output response
response = bedrock_runtime.invoke_model(body=body.encode('utf-8'), # Encode to bytes
modelId=modelId,
accept=accept,
contentType=contentType)
response_body = json.loads(response.get('body').read().decode('utf-8'))
print(response_body.get('outputs')[0].get('text'))
翻译后的 JavaScript 代码输出如下所示:
Here's the Python code translated into JavaScript with clear variable naming, proper indentation, and comments explaining non-trivial logic or language-specific constructs used in the translation:
```javascript
// 定义 BankAccount 类
class BankAccount {
// 使用初始余额 0 初始化余额属性
constructor(initial_balance = 0) {
this.balance = initial_balance;
}
// 存款方法,向余额中添加金额
deposit(amount) {
this.balance += amount;
}
// 提款方法,如果余额充足则从余额中减去金额
withdraw(amount) {
if (this.balance >= amount) {
this.balance -= amount;
} else {
console.log("Insufficient funds");
}
}
// 检查余额方法,返回当前余额
check_balance() {
return this.balance;
}
}
```py
After reviewing the translated code, no errors or inconsistencies were found.
<error>NO ERRORS</error>
在这个例子中,提示提供了关于代码目的和原始 Python 代码的上下文,并指示 Code Llama 将其翻译成 JavaScript。模型被要求保持清晰的变量命名和适当的缩进,并添加注释来解释非平凡逻辑或语言特定的结构。
生成的输出显示了翻译后的 JavaScript 代码,类结构和方法的翻译正确,同时保留了原始功能。在翻译代码后,模型仔细审查了其工作,并在 <error> 标签内指示 CHECKED: NO ERRORS,表示翻译正确且无错误。
本例演示了如何构建一个提示来引导 Code Llama(或类似的 AI 代码模型)执行代码翻译任务,同时确保翻译后的代码经过验证且正确。请注意,始终对生成的输出进行人工评估,以验证这些模型的准确性并纠正任何问题。
鼓励用户在 Amazon Bedrock 沙盒中尝试这些示例,或者利用 Amazon Bedrock API 与 Amazon Titan、Cohere Command、Meta Llama 以及其他 Anthropic Claude 或 Mistral 模型的变体等几个其他模型一起测试生成的输出并进一步优化。
用户还被邀请探索这个代码示例,其中使用了 Amazon Bedrock LLMs 进行零样本提示以生成 SQL 和 Python 程序:github.com/aws-samples/amazon-bedrock-workshop/blob/main/01_Text_generation/01_code_generation_w_bedrock.ipynb。
利用 GenAI 进行实体提取代表了我们从非结构化文本数据中提取有价值见解能力的重要进步。通过利用 LLM 的力量并将它们与基于规则的技巧相结合,混合方法为广泛的适用范围提供了准确、可扩展和领域自适应的解决方案。随着我们继续推动这些领域的边界,我们有望在各个行业和领域中解锁知识发现、决策支持和数据驱动创新的新机会。
基于 LLM 的代码生成领域也在迅速发展,Amazon Bedrock 处于这一激动人心的发展的最前沿。随着 LLM 变得更加先进,可用的训练数据持续增长,代码生成的功能和应用将得到进一步扩展。Amazon Bedrock 在代码生成领域迈出了重要的一步,使开发者能够利用 LLM 的力量提高生产力,改善代码质量,并更有效地探索新想法。随着这项技术的不断成熟,它有可能彻底改变软件开发的方式,并为各个行业和领域开辟新的创新可能性。
摘要
本章从深入探讨实体提取开始,揭示了其基础、技术和最佳实践。然后转向展示实体提取在工业应用中的潜力,突出展示了在各个行业从非结构化数据中解锁有价值见解的实际用例。
认识到提示工程的关键作用,本章进一步提供了一份关于如何制作有效提示的全面指南,为读者提供了优化实体提取性能的策略和指导方针。转换话题,讨论随后聚焦于在亚马逊 Bedrock 上使用 LLM 进行代码生成的变革潜力。我们深入了解了 LLM 在推动基于 AI 的开发方面的能力和局限性,以及利用这些前沿模型的方法。
最后,本章以对代码生成实际用例的引人入胜的探索作为结尾,展示了这项技术如何加速创新并提高各个领域的生产力。通过现实世界的例子和案例研究,读者亲眼见证了代码生成在简化开发流程和释放新可能性方面的深远影响。在下一章中,我们将探讨亚马逊 Bedrock 的图像生成用例及其潜在应用。敬请期待!
第九章:使用亚马逊 Bedrock 生成和转换图像
到目前为止,我们已经探索了几个能够生成文本响应的 LLMs。本章将探讨使用亚马逊 Bedrock 上可用的选择 FM 生成图像。我们将从图像生成的概述开始,其中我们将检查如 GANs 和变分自编码器(VAEs)等模型架构。然后,我们将介绍一些图像生成和亚马逊 Bedrock 中可用的多模态模型的实际应用。此外,我们将深入了解几个多模态设计模式,以及亚马逊 Bedrock 提供的伦理考虑和保障措施。
到本章结束时,您将了解如何使用亚马逊 Bedrock 实现图像生成及其设计模式,以应用于实际案例。
本章将涵盖以下关键主题:
-
图像生成概述
-
多模态模型
-
多模态设计模式
-
伦理考虑和保障措施
技术要求
本章要求您拥有 AWS 账户访问权限。如果您还没有账户,可以访问aws.amazon.com/getting-started/创建一个。
其次,您需要在aws.amazon.com/cli/创建账户后安装和配置 AWS CLI,这将用于从您的本地机器访问亚马逊 Bedrock FM。由于我们将执行的多数代码单元都是基于 Python 的,因此在此时设置 AWS Python SDK(Boto3)docs.aws.amazon.com/bedrock/latest/APIReference/welcome.html将非常有用。您可以通过任何方式执行 Python 设置。在您的本地机器上安装它,或者使用 AWS Cloud9,或者利用 AWS Lambda,或者利用 Amazon SageMaker。
注意
与亚马逊 Bedrock FM 的调用和定制相关将产生费用。请参阅aws.amazon.com/bedrock/pricing/以获取更多信息。
图像生成概述
图像生成是一个令人着迷且快速发展的领域。自从深度学习技术的兴起和计算能力的增强以来,机器已经获得了从零开始或基于文本提示创建高度逼真和复杂的图像的非凡能力。这种能力在各种领域打开了广泛的应用,包括创意产业、媒体和娱乐、广告、产品包装等。
图像生成的历史可以追溯到计算机视觉和模式识别的早期发展。研究人员和科学家长期以来一直在寻求理解和复制人类的视觉感知系统,为图像合成和操纵的初始技术铺平了道路。然而,图像生成的真正突破是在深度学习出现时,特别是 GANs 和 VAEs 的引入。
请注意,我们强调这些技术是为了历史参考。当前的图像生成 FM 并不使用这些技术。
GANs 和 VAEs 是什么?
GANs(生成对抗网络),由伊恩·古德费洛及其同事于 2014 年提出,彻底改变了图像生成领域。您可以在arxiv.org/pdf/1406.2661上了解更多相关信息。GANs 采用了一种独特的训练方法,其中两个神经网络在竞争中相互对抗。第一个网络被称为生成器,其任务是生成模仿真实数据的合成样本。例如,生成器可以生成新的图像、文本或音频剪辑。第二个网络被称为判别器。其作用是分析示例,包括真实和合成的,以分类哪些是真实的,哪些是人工生成的。
通过这种对抗过程,生成器学会产生越来越令人信服的伪造品,可以欺骗判别器。同时,判别器在检测揭示合成样本的微妙异常方面的能力也在不断进化。它们竞争的目标推动两个网络不断改进。GANs 的演示可以在thispersondoesnotexist.com/上看到。通过不断刷新页面,用户会看到一个不断涌现的新颖人脸流。然而,这些面孔都不是真实的——所有这些都是由一个在大量真实人脸图像数据库上训练的 GAN 生成的合成肖像。该网站展示了 GANs 如何在许多领域合成高度逼真的输出。
自 GANs 问世以来,已经实施了许多进步和变化,导致图像生成领域取得了显著成就。如 StyleGAN、BigGAN 和扩散模型等技术推动了图像质量、分辨率和多样性的边界。这些模型可以生成逼真的人脸、风景、物体甚至艺术作品的图像,模糊了人工和真实之间的界限。
另一方面,VAEs(变分自编码器)是训练生成式 AI 算法的一种更简单的方法。它们也利用两个神经网络:编码器和解码器。编码器通过将其映射到低维潜在空间来学习数据中的模式;解码器使用这些潜在空间中的模式来生成逼真的样本。
图像生成领域最令人兴奋的发展之一就是自然语言处理能力的集成。例如 DALL-E、Stable Diffusion 和 Midjourney 等模型,使得用户只需提供文本描述或提示,就能生成图像。这种语言与视觉的结合为创意表达、快速原型设计和各种机器学习任务的数据增强开辟了新的途径。
虽然图像生成技术的进步令人瞩目,但解决与这项技术相关的伦理考虑和潜在风险至关重要。如深度伪造、偏见和恶意用途等问题必须得到妥善处理,以确保这些强大工具的负责任和道德部署。我们将在本章的“伦理考虑和保障措施”部分详细探讨这一主题。
让我们来看看图像生成模型的一些实际应用。
实际应用
图像生成的应用是无限的。以下是图像生成的一些实际应用:
-
广告和营销:在广告和营销的世界里,视觉在吸引注意力和有效传达信息方面发挥着至关重要的作用。通过图像生成,你可以通过生产针对特定目标受众的独特、视觉冲击力强的图像来革新营销活动。营销人员可以利用 Bedrock 模型生成个性化的产品广告、社交媒体视觉图像和吸引人的图形,这些图像与他们的目标受众产生共鸣。此外,营销人员可以根据客户偏好创建图像变体,确保营销材料高度相关且具有吸引力。
-
图形设计和内容创作:图形设计师和内容创作者在执行之前,常常面临构思和可视化想法的挑战。借助 Bedrock 的图像生成模型,你可以通过依赖这个强大的工具来生成初始概念、插图和视觉资产,从而简化这一过程。设计师可以使用图像生成模型来探索不同的风格、构图和配色方案,促进快速迭代和实验。此外,内容创作者可以利用 Bedrock 模型生成独特且吸引人的图像,用于博客文章、文章或其他营销材料,增强其视觉吸引力并提高参与度。
-
产品可视化和原型设计:有效的产品可视化对于迭代设计、收集反馈和展示产品至关重要。借助 Bedrock 图像生成模型,企业可以生成产品设计的逼真可视化,从而在投资物理原型之前进行快速原型设计和评估。Bedrock 模型可以创建产品在不同环境或不同角度的图像,为利益相关者提供产品外观和功能的全面理解。这种能力可以显著加速产品开发周期,并有助于市场营销和销售工作。
-
游戏和虚拟环境:游戏和虚拟现实(VR)行业高度依赖视觉沉浸式体验。Bedrock 的图像生成模型可以赋予开发者创建独特纹理、环境和资产的能力,用于视频游戏、VR 或增强现实(AR)应用。Bedrock 图像模型可以根据用户规格或游戏叙事生成定制的头像、角色设计和复杂的视觉元素。此外,开发者可以增强其虚拟世界的真实性和多样性,为玩家提供更具吸引力和个性化的体验。
-
建筑和室内设计:对于建筑师、室内设计师以及他们的客户来说,可视化建筑设计和室内空间至关重要。Bedrock 图像模型可以生成提议设计的逼真渲染图,使利益相关者在施工或翻新前沉浸于设想的空间。Bedrock 的能力有助于可视化不同的材料、家具布局和照明条件,使建筑师和设计师能够完善他们的概念并向客户或决策者展示有说服力的提案。
-
时尚和服装:在时尚和服装行业中,Amazon Bedrock 图像模型可以生成独特的纺织品设计、图案和服装风格,使时尚设计师能够探索新概念并保持对潮流的领先。此外,Bedrock 还可以创建不同体型或不同环境中的服装物品的视觉表示,让客户在购买前预览服装的真实效果。这种能力可以提升购物体验并降低退货率。
-
科学可视化:在研究和教育中,有效地传达科学数据、现象和模拟至关重要。Amazon Bedrock 的图像生成模型可以帮助科学家和研究人员创建复杂概念的视觉表示,使它们更加易于获取和理解。Bedrock 模型可以为科学出版物、演示或教育材料生成插图、图表或 3D 模型,促进知识转移并加深对复杂主题的理解。
-
艺术和创意表达:艺术家可以利用 Bedrock 图像模型通过基于文本提示或概念框架生成独特和富有想象力的图像来探索新的风格、技术和概念。
-
电子商务和产品目录:在电子商务领域,高质量的产品图像对于吸引顾客和推动销售至关重要。Amazon Bedrock 图像模型可以为在线目录或电子商务平台生成吸引人的、准确的产品图像,减少大量拍摄和相关的成本。这些模型还可以根据客户偏好创建定制产品或配置的可视化,增强购物体验并实现大规模个性化。
既然我们已经看到了一些实际应用,让我们探索各种多模态模型及其内部工作原理。
多模态模型
到目前为止,在这本书中,我们已经探讨了单模态模型架构模式,例如文本到文本生成,这包括问答、摘要、代码生成等。现在让我们扩展我们的理解,到另一种生成式 AI 模型:多模态模型。
多模态模型是一种可以理解和解释多种模态(如图像、音频和视频)的模型,如图 9.1 所示。

图 9.1 – 多模态
这些模型收到的响应也可以是多模态的。幕后,这些 FM 包含多个处理文本、图像、音频和视频的单模态神经网络。
现在,让我们看看 Amazon Bedrock 内部可用的多模态模型。
稳定扩散
稳定扩散 是一种在生成式 AI 领域受到广泛关注的最先进的图像生成模型。与许多其他图像生成模型不同,稳定扩散采用了一种独特的基于扩散的方法,使其与其他方法或技术区分开来。
稳定扩散的核心概念是 扩散,它涉及正向和反向扩散过程。在 正向扩散 中,高斯噪声逐渐添加到图像中,直到它完全随机。然后,模型学习逆转这个过程,逐渐去除噪声以重建原始图像。这种逆转称为 反向扩散,是稳定扩散出色性能的关键。
这个扩散过程有几个关键组成部分:
-
对比语言-图像预训练(CLIP):CLIP 是在大量图像-文本对数据集上训练的神经网络,使其能够理解视觉和文本表示之间的语义关系。该组件在连接自然语言提示及其相应的视觉表现之间起着至关重要的作用。
-
U-Net:这作为图像生成过程的骨干。U-Net 是一个用于图像到图像翻译任务的卷积神经网络,如分割和去噪。分割是将图像分割成多个部分或像素集的过程,以定位对象和边界。去噪是从图像中去除噪声以提高其质量。在稳定扩散的上下文中,U-Net 负责根据输入提示和 CLIP 的引导生成和细化输出图像。
-
VAE:这是另一个关键组件,有助于确保生成的图像既连贯又逼真。在稳定扩散中,VAE 将生成的图像编码成一个压缩表示,然后解码以生成最终的输出图像。
如图 9.2所示,这里是对整个过程的高级概述:
-
用户提供一个描述所需图像的自然语言提示。
-
CLIP 模型分析提示并生成相应的嵌入,表示文本的语义意义。
-
U-Net 架构将这个嵌入作为输入,以及一个初始的随机噪声图像。
-
通过一系列卷积和反卷积操作,U-Net 在 CLIP 嵌入的引导下迭代地细化噪声图像,以生成与输入提示匹配的图像。
-
生成的图像随后通过 VAE,对其进行编码和解码,确保连贯性和逼真性。
-
生成最终的输出图像,反映了用户的提示。

图 9.2 – 稳定扩散过程
通过结合这些架构元素,稳定扩散能够生成高质量、多样化的图像,这些图像不仅视觉上吸引人,而且与输入提示在语义上保持一致。为了理解扩散过程的详细工作原理,鼓励读者阅读研究论文关于扩散模型设计基础的综述。可以在arxiv.org/pdf/2306.04542.pdf找到。
本文解释了扩散模型是如何工作的,通过逐渐向训练数据添加噪声,然后学习逆转这一过程以生成新的样本。文章突出了扩散模型广泛的应用范围,包括图像编辑、文本到图像生成和 3D 物体创建。
此外,建议读者探索 DeepLearning.AI 的扩散模型是如何工作的课程,learn.deeplearning.ai/courses/diffusion-models/。
泰坦图像生成器 G1
Titan 图像生成器 G1是 Amazon 的一个专有图像生成模型,允许用户从文本生成图像,编辑现有图像,并创建图像的变体。该模型旨在通过根据文本描述生成多个图像选项来简化用户对图像概念的迭代。该模型在多样化的高质量数据集上进行了训练,因此它可以理解包含多个对象的复杂提示并生成逼真的图像。
此模型支持图像编辑功能,例如使用内置分割模型进行基于文本的编辑,生成图像的变体,使用图像遮罩进行修复,以及扩展或更改图像背景的扩展。您可以上传现有的图像并提供指令或提示来修改图像的特定方面。该模型可以智能地改变构图,添加或删除元素,更改颜色,或应用各种艺术风格,同时保持原始图像的整体一致性和现实主义。
我们将在多模态设计 模式部分深入探讨这些功能。
Titan 多模态嵌入
Titan 多模态嵌入模型是 Amazon Titan 模型系列的一部分,专为需要高精度和快速响应的应用场景,如图像搜索和基于相似度的推荐而设计。
Titan 多模态嵌入模型的核心优势在于其能够为文本和视觉数据生成高维向量表示。这些嵌入封装了不同模态之间的语义关系,允许进行高效有效的搜索和检索操作。
该模型支持最多 128 个 token 作为英文输入文本,以及高达 25MB 的图像大小,并将这些转换为向量嵌入。默认的嵌入维度是 1024,提供丰富的表示,能够捕捉细微的细节和复杂的关系。然而,您也可以根据您的具体用例和性能要求配置更小的向量维度以优化速度和成本。
Anthropic Claude 3 – Sonnet、Haiku 和 Opus
Anthropic Claude 3 模型变体——Claude 3 Sonnet、Claude 3 Haiku和Claude 3 Opus——是 Amazon Bedrock 上可用的 Anthropic Claude 模型中最新的、最先进的系列。所有这些模型都具有多模态能力,这意味着它们能够感知和分析图像以及文本输入,拥有 200K 的上下文窗口。如果您想再次了解它们的详细信息,请参阅第一章中的Anthropic Claude部分。
现在我们已经了解了 Amazon Bedrock 中可用的多模态模型,让我们来探索一些设计模式。
多模态设计模式
通过多模态设计模式,我们整合了不同的模态,如文本、图像、音频等。随着可用的多模态模型,从文本或其他输入模态生成、操作和理解图像的能力在广泛的领域中变得越来越重要,从创意设计到科学可视化等。
可以使用多模态模型创建多种模式。在本节中,我们将介绍一些常见的模式。
文本到图像
在文本到图像模式中,您将文本作为提示提供给模型。然后,模型将根据该提示生成图像,如图图 9.3所示。

图 9.3 – 文本到图像模式
参数
图像生成模型的核心是一组可定制的推理参数和控制,使用户能够从模型中获得所需的图像。让我们看看这些参数:
Cloud和seating bench来排除它们从图像中,如图图 9.4所示。

图 9.4 – 带有负面提示的文本到图像模式
- 参考图像:这为用户提供将参考图像输入到模型的能力,模型可以利用它作为生成响应(生成图像)的基线。例如,如果我们使用前一个图生成的图像并将其作为参考与提示一起传递,提示可能如下所示:
一个夜晚的未来城市景观,由玻璃和金属构成的摩天大楼。建筑被蓝色、紫色和粉红色的霓虹灯光照亮。街道上排列着全息广告牌和广告。
模型将使用参考图像和提示来生成一个新的图像,如图图 9.5所示。

图 9.5 – 使用参考图像的文本到图像模式
-
提示强度 (cfg_scale): 提示强度,也称为无分类器指导尺度 (cfg_scale),决定了生成的图像遵循提供文本提示的程度。较高的值表示图像生成过程将更紧密地遵循文本提示,而较低的值允许更多的创造性解释和生成图像的多样性。通常建议使用中间的 cfg_scale 值(10-15),因为它在忠实代表文本提示和允许艺术表达之间取得了平衡。然而,最佳值可能因您的用例或您所寻找的内容而异,提示的复杂性以及生成图像所需细节的水平。
-
生成步骤 (步骤): 稳定扩散中的步骤参数指的是算法从输入文本生成图像所经历的迭代或循环次数。这是一个影响最终图像质量和细节的重要设置。以下是其工作原理:
-
该过程从随机噪声开始,并且随着每一步的进行,部分噪声被移除,逐渐揭示出预期的图像。
-
步骤数越多通常会导致图像质量更高,细节更丰富,但也会有一个收益递减的点。
-
理想步骤数可能因你试图生成的图像的复杂性和个人偏好而异。然而,步骤数过多可能不会显著提高图像质量,但会增加生成时间。
-
对于简单主题或场景,大约10-15步可能就足够了。但对于更复杂或详细的图像,你可能需要增加步骤到40-50或更多,具体取决于你想要多详细。
-
我们所讨论的只是其中的一些参数。以下图例突出了稳定扩散的附加参数。

图 9.6 – 稳定扩散文本到图像参数
要详细了解这些参数,你可以查阅platform.stability.ai/docs/api-reference#tag/Image-to-Image上的稳定扩散文档。
如果你正在使用亚马逊 Titan 图像生成器,以下是你可以使用的参数列表:docs.aws.amazon.com/bedrock/latest/userguide/model-parameters-titan-image.html.
图像搜索
图像搜索已成为一种强大的工具,使用户能够探索和利用大量的视觉数据集。通过亚马逊 Bedrock 的 FMs,你可以执行图像搜索以理解和解释视觉内容。你可以识别和理解图像中的各种元素,如物体、场景、颜色、纹理,甚至抽象概念。为了说明图像搜索的力量,让我们考虑一个实际例子。
假设你是一家拥有大量服装商品目录的时尚零售商。使用 Bedrock,你可以上传你的产品图片,并利用图像搜索功能,让客户能够找到视觉上相似的商品。例如,一位客户可以上传一张他们喜欢的连衣裙图片,Bedrock 会从你的目录中返回一组视觉上相似的连衣裙,从而促进更吸引人和个性化的购物体验。
图像搜索的一种强大方法是基于跨模态嵌入,它允许在向量空间中同时表示文本和图像。这些向量捕捉图像的视觉特征和语义信息。然后,这些向量以及如图像路径之类的元数据存储在可搜索的索引向量数据库中,例如 OpenSearch Serverless、FAISS 或 Pinecone。这项技术使您能够使用文本查询搜索图像或根据给定图像(或文本和图像的组合)找到相似图像。
当用户发起搜索时,他们的输入(文本、图像或两者兼有)也会使用相同的跨模态嵌入模型转换为向量表示。然后,搜索向量与索引中的向量进行比较,并根据向量相似度分数检索最相似的向量。这种方法允许灵活直观的图像搜索,因为用户可以使用自然语言描述进行搜索,上传示例图像,或结合文本和图像以获得更精确的结果。例如,您可以搜索“城市街道上的红色跑车”并从其数据存储中返回匹配视觉和文本标准的相关图像。
如您现在可能已经注意到的,这个过程与我们讨论的第五章中的 RAG 过程类似。这里的区别在于,模型是从其数据存储中检索图像,而不是生成新图像。以下是一个尝试跨模态嵌入和搜索的绝佳示例:github.com/aws-samples/amazon-bedrock-workshop/blob/main/04_Image_and_Multimodal/bedrock-titan-multimodal-embeddings.ipynb。
跨模态嵌入的图像搜索在各个领域有众多实际应用。在电子商务平台上,它可以用于增强产品搜索和推荐系统,使客户能够找到视觉上相似的产品或使用自然语言描述或示例图像进行搜索。在媒体和娱乐行业,它可以通过识别相似或重复的图像来协助内容组织、标签建议和版权侵权检测。
图像理解
Anthropic Claude 3 模型——Sonnet、Haiku 和 Opus——引入了图像理解能力,通过该能力,模型可以分析图像并根据您想要了解的内容为您提供响应。例如,您可以提供厨房或客厅的图像,并要求模型提供图像的详细描述或根据图像编写虚构故事。
示例 1
使用以下提示:“提供此图像的详细描述”。

图 9.7 – 输出中的图像理解和详细描述
在 图 9.7 中,我们向 Anthropic Claude 3 模型提供了厨房的图像,并要求它提供图像的详细描述。模型能够提供诸如 房间特征为深色木制橱柜,与浅色大理石台面形成对比 等细微细节。
示例 2
使用以下提示:根据所附图像编写一个虚构故事。

图 9.8 – 使用虚构故事进行图像理解
在 图 9.8 中,您可以看到模型根据提供给它的图书馆图像生成了一个虚构故事。
示例 3
使用以下提示:提供图像中存在的物品/对象的列表,并解释每个物品。

图 9.9 – 使用对象识别进行图像理解
在 图 9.9 中,模型能够识别图像中的物品和对象及其详细信息,展示了图像分类/对象识别能力。
Claude 模型的图像理解能力不仅限于前面示例中讨论的内容。它们还可以用于图像标题、创建详细的图像描述、识别主题以及回答有关图像内容的问题。您可以在 docs.anthropic.com/claude/docs/use-cases-and-capabilities#vision-capabilities 查看图像理解的多种用例。
在 Amazon Bedrock 控制台中使用此功能,您可以按照以下步骤操作:console.aws.amazon.com/bedrock-
-
前往 Amazon Bedrock 控制台:https://console.aws.amazon.com/bedrock。
-
导航到 Chat Playground。
-
点击 选择模型。选择 Anthropic Claude 3 Sonnet、Anthropic Claude 3 Haiku 或 Anthropic Claude 3 Opus 模型。
-
附加您想要分析的图像,并根据您所寻找的内容提供提示,如图 图 9.10 所示。

图 9.10 – 如何使用 Anthropic Claude 3 模型分析图像
如果您正在使用 AWS SDK,您可以使用 Anthropic 的 Messages API 创建聊天应用程序并提供图像进行理解。以下是一个用于 Claude 3 Sonnet 模型的多模态消息的 AWS Python SDK 示例代码:docs.aws.amazon.com/bedrock/latest/userguide/model-parameters-anthropic-claude-messages.html#api-inference-examples-claude-multimodal-code-example。
图像到图像模式
当涉及到图像到图像生成时,模型以现有的图像作为输入,并根据您提供的提示或指令对其进行修改。这与基于文本生成图像不同,后者模型完全从头开始创建一个全新的图像,仅基于文本描述或提示。在图像到图像生成中,模型使用现有的图像作为起点,然后应用必要的更改或转换以生成所需的输出图像。这可能涉及调整颜色、纹理、物体或图像的整体构图等各个方面,所有这些都由提示指导。这就像拥有一个黏土模型,并将其重塑成您期望的形状,而不是从一块原始的黏土开始。修改和操作现有图像的能力为各种创意可能性和用例打开了大门,从增强和编辑照片到创建艺术诠释或可视化。
图 9.11 展示了图像到图像生成的一个简单示例。

图 9.11 – 简单的图像到图像生成
当使用稳定扩散模型进行图像到图像生成时,除了图 9.6 中提到的文本到文本参数外,还有一些额外的参数需要考虑。这些额外的参数在图 9.12 中突出显示。

图 9.12 – 稳定扩散图像到图像参数
您可以在此处了解更多信息:platform.stability.ai/docs/api-reference#tag/Image-to-Image/operation/imageToImage。
接下来,让我们看看一些图像到图像模式。
图像变化
图像变化,也称为图像到图像翻译或风格迁移,是生成式人工智能中的一个强大技术,它通过修改现有图像来创建新的独特图像。这个过程涉及获取一个输入图像,并对其应用一个期望的风格或转换,从而生成一个输出图像,该图像结合了原始图像的内容和期望的美学或视觉特征。
一个现实世界的图像变化例子是在时尚设计领域。设计师可以取一个现有的服装或配饰,并应用各种风格、图案或纹理来创建新的创新设计,而无需从头开始。这不仅节省了时间和资源,还允许快速实验和迭代,使设计师能够探索广泛的可能。
在艺术界,图像变化技术也可以用来创建独特和富有表现力的艺术作品。艺术家可以采用简单的照片或绘画,并应用各种艺术风格,如印象派、立体主义或抽象表现主义,以创建完全新的作品,将原始内容与所需的艺术风格融合在一起。这为创造性表达开辟了新的途径,并允许艺术家探索非传统和引人深思的视觉解释。
图像变化在室内设计和建筑可视化领域也有应用。设计师和建筑师可以采用现有的空间或结构,应用不同的材料、纹理或照明条件来可视化空间在不同设计选择下的可能外观。这有助于客户理解和欣赏所提出的设计,同时也使得设计师能够快速迭代和细化他们的概念。
使用 Bedrock,您可以利用 Titan 图像生成器来创建图像变化。让我们尝试以下提示并通过 Titan 图像生成器运行它:
一种精致的自然图案,细致描绘了鸟类、蝴蝶和叶子的图案,非常适合浪漫波西米亚风格的连衣裙或围巾。

图 9.13 – 图像变化
如*图 9.13 所示,Titan 图像生成器将创建一个图像(原始图像)。您可以使用原始图像**作为参考来生成图像变化,同时还可以提供可选的提示供模型使用。
遮罩
Amazon Bedrock 模型——Amazon Titan Generator 和 Stable Diffusion——提供了两种强大的图像编辑技术:遮罩和绘画。
使用遮罩,我们定义图像中的特定区域并将其遮罩,要么保留要么重新绘制。这种遮罩可以通过图像文件或提示来完成。
图像遮罩
图像遮罩的方法使用一个单独的图像文件,称为遮罩图像,来指定要遮罩或保留在原始图像中的像素。遮罩图像必须满足以下要求:
-
与原始图像相同的尺寸和分辨率:在应用图像遮罩时,确保遮罩图像与您想要遮罩的原始图像具有完全相同的尺寸和分辨率至关重要。这确保了遮罩图像中的每个像素都与原始图像中的像素相对应,从而实现精确的遮罩。如果尺寸或分辨率不同,遮罩过程可能会产生扭曲或不理想的结果。
例如,如果您的原始图像分辨率为 1920 x 1080 像素,遮罩图像也必须具有 1920 x 1080 像素的分辨率。任何尺寸或分辨率的差异都可能导致遮罩与原始图像错位,导致不理想的遮罩效果。
-
无 alpha 通道:遮罩图像不应包含 alpha 通道,这是某些图像格式中的一个单独组件,用于表示透明度。虽然 PNG 格式通过 alpha 通道支持透明度,但对于图像遮罩目的,遮罩图像应仅依赖于颜色值(红色、绿色、蓝色(RGB)或灰度)来表示遮罩和未遮罩区域。
alpha 通道的缺失简化了遮罩过程,并确保遮罩仅基于像素颜色,而不包含任何额外的透明度信息。这种方法通常因其简单性和与广泛图像处理工具和库的兼容性而受到青睐。
-
0,0,0) 作为遮罩区域,而任何非黑色像素都被视为未遮罩区域。 -
0(黑色)到255(白色)。遮罩过程将值为0的像素解释为遮罩区域,而将非零值的像素视为未遮罩区域。
RGB 和灰度色彩模式的选择取决于您的具体用途以及您用于图像遮罩的工具或库。某些工具可能对某种色彩模式有偏好。
例如,假设您在食品和饮料行业工作,并且您想从图像中遮罩掉某些食品项目,以创建菜单设计的透明层。假设您想遮罩下图中芯片碗,并可能将其从菜单中移除。图 9**.14显示了原始图像和遮罩图像,其中遮罩是在芯片碗上进行的。

图 9.14 – 图像遮罩
如果您想尝试图像遮罩,您可以使用在线照片编辑工具或应用程序。还有Python 图像库(PIL),这是一个非常流行的 Python 库,值得在pillow.readthedocs.io/en/stable/reference/Image.html上查看。
此外,我们建议您尝试来自 Amazon Bedrock 研讨会的工作坊中的以下 GitHub 示例,这些示例展示了图像遮罩和绘画:github.com/aws-samples/amazon-bedrock-workshop/tree/main/04_Image_and_Multimodal。
遮罩提示
遮罩提示涉及通过使用文本提示来遮罩图像。这些文本提示作为模型的指南,帮助模型理解图像中期望的遮罩区域。
与图像遮罩相比,使用遮罩提示的优点在于其动态性。您只需简单地更改文本提示,就可以轻松地修改遮罩,从而实现快速迭代和实验。这种灵活性使得艺术家、设计师和内容创作者能够探索广泛的视觉概念和叙事,而不会受到传统图像编辑工具的限制。
此外,遮罩提示可以无缝集成到各种工作流程和应用中,实现无缝协作并提高生产力。例如,在视觉叙事领域,作家和导演可以利用此功能来构思和细化他们的愿景,而设计师可以在最终确定最终设计之前快速原型化和迭代视觉概念。
为了确保生成内容的完整性和原创性,Amazon Bedrock 已经实施了强大的措施来防范剽窃和不道德的行为。我们将在下一节讨论道德考虑和保障措施。
让我们以先前的图中的相同例子为例。而不是图像遮罩,我们想要应用遮罩提示。我们将说您想要从原始图像中移除薯片碗。通过遮罩提示,您可以提供只有薯片碗的提示,然后进一步进行绘画。

图 9.15 – 遮罩提示
在图 9.15中,我们执行了图像替换,将薯片碗改为苹果片碗。让我们更详细地讨论绘画。
绘画
绘画是一种技术,您可以使用它填充图像中的遮罩区域或使用图像生成模型扩展它。有两种绘画方法:图像修复和扩展绘画。
图像修复
通过图像修复,您实际上是在重建或填充图像中缺失、被遮罩或损坏的部分。这种技术在图像已被损坏或遮挡,或者其中包含需要移除或替换的不希望存在的元素的场景中特别有用。通过向图像生成模型提供周围环境和有效的提示,它可以在指定区域智能地生成和融合新内容,无缝地重建遮罩区域。
让我们看看一些例子:
电话线并提供一个空的提示文本("")。

图 9.16 – 图像修复移除
- 图像替换修复:假设您想要替换图像中的任何对象或场景。在这种情况下,您可以执行图像替换修复。如图图 9.17所示,您可以在提示文本中指定您想要替换的内容。

图 9.17 – 图像替换修复
扩展绘画
扩展绘画是指将图像扩展到其原始边界之外的过程,换句话说,是在遮罩区域之外进行绘画。扩展绘画在原始图像或艺术品需要通过添加额外的元素、环境或视角进行扩展或增强的场景中非常有用。
让我们看看一个例子。

图 9.18 – 扩展绘画
在图 9.18中,你可以看到我们在蒙版图像或提示(在这种情况下,印度咖喱)之外进行绘画,以添加一些细节。这些包括木质桌子的背景,以及添加勺子、刀子、一碟米饭和一杯奶茶。
如果你想了解 Titan Image Generator 模型的提示工程最佳实践,请查看tinyurl.com/titan-image-generator-prompt。
现在我们已经探讨了多模态和图像模式的不同模式,让我们来看看 Amazon Bedrock 中关于伦理考量及可用的安全措施,以确保生成式 AI 的负责任使用。
伦理考量与安全措施
生成式 AI 模型,尤其是那些能够生成高度逼真图像的模型,在传播虚假信息和深度伪造方面引发了重大的伦理担忧。随着这些模型变得越来越强大和易于访问,积极应对这些伦理挑战至关重要,以促进这项技术的负责任开发和部署。
围绕图像生成模型的主要伦理担忧之一是创建和传播误导性或操纵性内容的危险。随着从文本提示生成逼真图像的能力,恶意行为者有可能创建和传播虚假或编造的视觉信息。这可能会产生深远的影响,例如损害对媒体的信任、传播虚假信息,甚至影响政治或社会叙事。
为了应对这一主要伦理挑战,对于组织和研究人员来说,优先考虑生成式 AI 生命周期的负责任开发和部署至关重要。当使用 Amazon Bedrock 时,用户可以利用其水印检测功能来识别由 Amazon Titan Image Generator 生成的图像。
Amazon Bedrock 中的水印检测功能旨在促进 AI 生成图像使用的透明度和问责制。通过在每个由模型创建的图像中嵌入一个不可见的水印,内容创作者、新闻机构、风险分析师等可以迅速验证图像是否是由 Amazon Titan Image Generator 生成的。
这种方法有两个主要的伦理目的:
-
它通过提供一种验证图像真实性的机制来帮助对抗虚假信息和深度伪造的传播。这有助于在视觉内容中建立信任和信誉,特别是在信息完整性至关重要的领域,如新闻业、执法和科学研究。
-
水印检测功能促进了图像生成模型使用中的透明度和问责制。通过使识别 AI 生成内容变得更加容易,它鼓励内容创作者和利益相关者采取负责任和道德的做法,从而促进围绕这项技术使用的更开放对话。
要尝试水印检测,你只需在 Amazon Bedrock 控制台中导航到水印检测并上传一张图像。然后 Amazon Bedrock 会分析图像以检测 Amazon Titan 嵌入的水印。
除了检测水印外,你还将收到一个置信度分数,该分数决定了模型能够以多大程度(或确定性)识别图像是由 Amazon Titan 生成的。通常,当图像几乎没有修改时,你会看到一个高置信度分数。然而,如果你对生成的图像进行了一些修改,你可能会看到一个较低的置信度分数。

图 9.19 – 水印检测
如图 9.19所示,我们已上传由 Amazon Titan 生成的图像。水印检测功能能够分析和检测 Titan 生成的水印。

图 9.20 – 水印未检测到
如图 9.20所示,我们已上传由 Stable Diffusion 生成的图像。我们可以看到水印未检测到。
如果你想要尝试使用 API,你可以调用 DetectGeneratedContent 来验证水印是否存在:
import boto3
import json
import base64
bedrock_runtime = boto3.client(service_name="bedrock-runtime")
image_path = "landscape.png"
with open(image_path, "rb") as image_file:
input_landscape = image_file.read()
response = bedrock_runtime.detect_generated_content(
foundationModelId = "amazon.titan-image-generator-v1",
content = {
"imageContent": { "bytes": input_landscape }
}
)
这就是响应应该看起来像什么:
response.get("detectionResult")
'GENERATED'
response.get("confidenceLevel")
'HIGH'
这里是水印检测的演示:www.youtube.com/watch?v=M5Vqb3UoXtc。
虽然水印检测不是解决所有道德问题的方案,但它是在正确方向上迈出的一步。我们将在本书的第十一章中更深入地讨论道德和负责任的 AI。你现在应该能够理解使用 Amazon Bedrock 的图像生成和设计模式。
摘要
在本章中,我们探讨了图像生成的工作原理。我们还讨论了 Amazon Bedrock 内部多模态模型的工作方式。我们还涵盖了几个现实世界的应用和多模态设计模式,包括文本到图像、图像搜索、图像理解和图像到图像模式,如修复和扩展。我们以对道德考虑的简要概述以及对 Amazon Bedrock 内部水印检测能力的探讨结束本章。在整个章节中,我们更深入地了解了如何利用 Amazon Bedrock 的多模态模型来构建基于文本和图像提示生成、理解和操作图像的应用程序。
在下一章中,我们将探讨使用 Amazon Bedrock 构建智能代理的主题。
第十章:使用 Amazon Bedrock 开发智能代理
在本章中,读者将探索 生成式人工智能(GenAI)中的代理概念,深入了解其重要性、益处以及可用的各种工具和类型。
读者将学习构建知识库并开发专门为 Amazon Bedrock 设计的代理,深入了解配置、测试和部署策略。此外,本章将展示现实世界的工业用例,突出代理与 Amazon Bedrock 结合的实际应用。
通过实际案例,读者将获得描述代理角色、将 LangChain 代理与 Amazon Bedrock 集成、理解代理在 Amazon Bedrock 中的配置、构建、测试和部署针对此服务的代理的技能。此外,他们还将探索各种工业用例,展示代理在增强 Amazon Bedrock 功能方面的多功能性和潜力。
具体来说,读者将清楚地了解以下内容:
-
什么是代理?
-
GenAI 代理角色、职责和用例场景
-
Amazon Bedrock 与 LangChain 代理的集成
-
Amazon Bedrock 代理
-
在 Amazon Bedrock 上部署代理
技术要求
本章要求您拥有 AWS 账户访问权限。如果您还没有,可以访问 aws.amazon.com/getting-started/ 创建 AWS 账户。
其次,您需要在创建账户后安装和配置 AWS CLI (aws.amazon.com/cli/),这将用于从您的本地机器访问 Amazon Bedrock FMs。由于我们将执行的大多数代码单元基于 Python,此时设置 AWS Python SDK(Boto3)(docs.aws.amazon.com/bedrock/latest/APIReference/welcome.html) 将非常有用。您可以通过以下方式执行 Python 设置:在您的本地机器上安装它,或使用 AWS Cloud9,或利用 AWS Lambda,或利用 Amazon SageMaker。
备注
使用 Amazon Bedrock FMs 的调用和定制将产生费用。请参阅 aws.amazon.com/bedrock/pricing/ 了解更多信息。
什么是代理?
在人工智能的动态领域中,一类复杂的新系统已经出现,它们将显著影响我们与技术的关系。这些被称为 GenAI 代理 的实体,代表了自主性、适应性和认知能力的重大进步。
GenAI 代理是经过工程设计的软件构造,旨在以最小的人类监督理解并执行复杂任务。它们展现出评估目标、制定战略计划并采取行动以实现目标的能力,同时不断根据反馈学习和改进方法。
区分 GenAI 代理与先前迭代的特点是其多面性,结合了反应性、主动性、学习能力和社会适应性。这种独特的融合使它们能够迅速应对不断变化的环境,预测未来的需求,通过持续的学习过程进化,并与人类和其他代理无缝协作。
代理的特点
这里是代理的一些关键特性:
-
快速响应敏捷性:GenAI 代理在快速响应提示方面表现出色,确保在动态环境中具有敏捷性。例如,在制造业环境中,这些代理可以高效地重新校准流程和重新分配资源,以维持运营效率,即使在需求波动或意外中断的情况下。
-
思维链(CoT)/推理和行动(ReAct)风格的行动:GenAI 代理根据 CoT/ReAct 风格的提示采取行动,确保对刺激的快速和有效响应。如果你还记得,ReAct 提示是一种旨在提示 LLMs 的方法,旨在提高其响应的准确性,与其他方法如 CoT 相比。例如,在客户服务中,这些代理可以根据预定义的对话提示生成对查询的响应。
-
预测效用:尽管 GenAI 代理不能自主预测未来事件,但它们根据预定义的参数和输入采取行动。在金融预测中,这些代理利用历史数据和预定义的算法来生成预测,而不是自主预测未来趋势。
-
持续学习:GenAI 代理具备持续学习和自我改进的能力。与人类同行类似,这些代理根据结果优化其策略和决策过程,不断进化并优化性能。例如,在线推荐系统中,这些代理通过不断学习用户互动来改进个性化推荐。
-
协作:GenAI 代理在与人及其他代理的无缝协作中表现出色。通过有效的沟通和协调,它们在互联环境中提高生产力和效率。在自动驾驶车辆系统中,这些代理与其他车辆和基础设施协作,以确保在道路上安全高效地导航。
代理的实际应用——释放潜力
GenAI 代理在各个行业都有广泛的应用,展示了它们的多样性和潜在影响。在金融领域,这些代理正在被实验性地用于探索分析市场趋势、发现投资机会和执行交易的可能性,从而增强决策过程并优化投资策略。例如,它们可以利用历史数据和预测算法来识别模式并预测市场走势,帮助金融专业人士做出明智的投资决策。
在物流和供应链管理(SCM)中,GenAI 代理可以在优化资源配置、简化分销网络和降低运营成本方面发挥关键作用。通过利用实时数据和预测分析,这些代理可以优化库存管理、路线规划和仓库运营,提高效率并缩短交货时间。例如,它们可以根据交通状况和需求波动动态调整运输路线,以确保货物的及时交付。
此外,GenAI 代理有潜力通过为学生个性化学习体验来改变教育。它们可以根据个别学生的需求和学习风格调整课程和教学方法,促进个性化的学习路径,并提高学生的学习成果。例如,这些代理可以分析学生的表现数据,确定改进领域,并推荐定制的学习资源和活动,以满足特定的学习需求。
虽然 GenAI 代理在各个行业都拥有重大的承诺和潜力,但必须承认,这些技术的广泛采用和规模化可能仍处于早期阶段。虽然确实有一些组织和研究项目正在积极探索和实施 GenAI 解决方案,但要实现广泛采用和可扩展性通常需要克服各种技术、监管和伦理挑战。
在许多情况下,GenAI 代理的实际实施可能涉及试点项目、概念验证(POCs)或针对性的部署,而不是在整个行业范围内的大规模实施。此外,这些技术的有效性和影响可能因数据质量、模型性能和具体用例等因素而异。
因此,在讨论 GenAI 代理的应用时,必须以批判性的眼光进行,考虑当前的技术状态、现有的限制以及与广泛采用相关的潜在挑战。
现在,让我们进一步探索与 GenAI 代理相关的各种用例场景。
GenAI 代理的角色、职责和用例场景
在 GenAI 的背景下,GenAI 代理在企业中被大量用作协调者。协调指的是在各个角色和用例中协调管理和部署这些代理。
GenAI 代理在这个协调中可以扮演多种角色。以下是一些 GenAI 代理的潜在用途案例及其可能扮演的角色:
-
虚拟 助手角色:
-
个人助理:代理可以作为个人助理,帮助个人管理日程、设置提醒,并处理诸如预约、预订或跟踪交付等任务。
-
信息检索:他们还可以作为信息检索工具,快速访问各个领域的知识,例如时事、体育、娱乐或一般参考查询。
-
个性化推荐者:通过学习个人偏好和模式,这些代理可以提供针对每个用户需求和兴趣的个性化推荐和建议。
-
-
客户服务 聊天机器人角色:
-
客户支持代理:代理可以处理客户咨询和支持请求,全天候提供即时帮助,减少人工代理的等待时间。
-
产品顾问:他们可以指导客户通过故障排除过程,提供产品信息,并根据客户偏好和购买历史提供个性化推荐。
-
聊天机器人还可以处理常规任务,如订单跟踪、退款请求和账户管理,为人工代理腾出时间处理更复杂的问题,例如解决技术问题、提供个性化推荐、解决纠纷和提供专业知识。
-
-
辅导和 教育角色:
-
辅导教师:GenAI 代理可以作为虚拟辅导教师,提供适合每个学生节奏、水平和学习风格的个性化学习体验。他们可以用引人入胜的方式解释复杂概念,提供练习题,并提供反馈和指导以加强学习。
-
领域专家:代理还可以作为领域专家,在各个学术科目或专业领域提供深入的知识和见解。
-
-
内容 创作角色:
-
作家:代理可以通过根据提供的提示或想法生成初稿、大纲或摘要来协助作家、记者和内容创作者。
-
故事讲述者:他们可以帮助构思、故事发展和创意写作任务,提供建议并扩展概念。
-
内容生成器:代理还可以生成营销文案、产品描述或社交媒体内容,帮助企业和创作者节省时间和精力。
-
-
创意 设计角色:
-
设计师:代理可以作为创意合作伙伴,根据提供的提示或规格生成设计理念、艺术作品、标志和视觉概念。
-
艺术家:他们可以提供灵感和新的视角,帮助设计师探索新的方向并克服创作障碍。
-
创意合作者:代理还可以协助迭代设计过程,根据人类设计师的反馈和指导生成变体和改进。
-
-
游戏和娱乐角色:
-
游戏角色:在游戏中,代理可以扮演非玩家角色(NPCs),提供吸引人的互动、对话和故事情节,这些情节会根据玩家的行动和选择进行调整。
-
互动伴侣:作为互动伴侣,代理可以参与对话、讲故事、提供娱乐,甚至在虚拟环境中提供情感支持或陪伴。
-
-
医疗保健角色:
-
医疗助手:代理可以作为医疗助手,向患者提供有关疾病、治疗和健康生活方式建议的信息。
-
耐心教育者:他们可以协助患者教育,用易于理解的语言解释复杂的医学概念,并解决常见的担忧或问题。
-
代理还可以通过总结患者记录、生成医疗报告或在研究和数据分析任务中提供帮助来支持医疗保健专业人员。
-
-
软件开发角色:
-
代码助手:GenAI 代理可以作为代码助手,通过生成代码片段、提出改进建议或解释编程概念来帮助开发者编写和优化代码。
-
文档生成器:他们可以帮助生成文档,自动为代码段创建描述和解释,使维护和协作项目更加容易。
-
代理还可以帮助进行代码重构,识别优化区域,并提出更高效或更安全的编码实践。
-
-
研究和分析角色:
-
研究助手:智能代理可以作为研究助手,从各种来源收集和综合信息,生成摘要,并识别关键见解或趋势。
-
数据分析师/数据工程师:他们可以帮助进行数据分析任务,例如探索数据集、识别模式并生成可视化或报告。
-
机器学习工程师/数据科学家:代理还可以通过生成假设、提出实验设计或基于现有知识和数据提出进一步探索的想法来支持研究人员。
-
-
语言学习角色:
-
对话伙伴:GenAI 代理可以作为对话伙伴,让语言学习者在一个安全且鼓励的环境中练习口语和听力理解。
-
语言导师:作为语言导师,代理可以提供关于发音、语法和词汇的反馈,根据个别学习者的需求和进度调整课程和练习。
-
他们还可以生成吸引人的语言学习材料,如对话、故事或练习,根据学习者的熟练程度调整内容和难度级别。
-
在所有这些情况下,代理的作用是增强人类能力,提供个性化协助,并在各个领域提高效率和生产力。
现在,让我们进一步探讨代理及其在 Amazon Bedrock 环境中的实用功能。
Amazon Bedrock 与 LangChain 代理的集成
LangChain 是一个强大的框架,用于开发使用 LLM 的应用程序,它提供了一个强大且灵活的代理系统,使开发者能够构建能够应对各种挑战的复杂代理。
LangChain 中的代理是一个高级抽象,它结合了 LLM、一组工具和其他组件,以协调动作的执行。代理利用 LLM 的自然语言理解(NLU)能力来解释用户输入,确定适当的动作,并协调使用可用工具来完成所需任务。
LangChain 代理的核心组件包括以下内容:
-
WebSearchTool: 使用搜索引擎(如 Google)进行网络搜索。 -
WikipediaSearchTool: 从 维基百科 中搜索和检索信息。 -
PythonCallbackTool: 作为工具执行 Python 函数。 -
CSVTool: 与 CSV 文件交互,允许进行读取、写入和查询数据等操作。 -
LLM: LLM 作为代理背后的推理引擎。它负责理解用户的意图,确定适当的动作,并解释工具执行的结果。*
SQLDatabaseToolkit包含与 SQL 数据库交互的工具,包括查询、创建表和插入数据。*ConversationBufferMemory存储对话历史,允许代理在对话中参考先前的输入和输出。
LangChain 提供了一系列内置工具和代理类,以满足各种用例。以下是一些可用的工具:
-
serpapi: 一个用于查询网络搜索结果的搜索引擎工具 -
google-search: 一个围绕 Google Search 进行网络搜索的包装器 -
llm-math: 一个使用 LLM 回答数学相关问题的工具 -
open-meteo-api: 一个用于从 Open-Meteo API 检索天气信息的工具 -
news-api: 一个用于获取当前新闻头条信息的工具 -
tmdb-api: 一个用于查询 The Movie Database(TMDB)信息的工具 -
wolfram-alpha: 一个用于查询 Wolfram|Alpha 计算知识引擎的工具 -
requests: 一个用于从特定 URL 获取内容的工具 -
terminal: 一个用于执行终端命令的工具 -
pal-math: 一个专门解决复杂文字数学问题的语模型 -
pal-colored-objects: 一个用于推理物体位置和颜色属性的语模型
至于代理类,LangChain 提供了几个选项,每个选项都有自己的动作选择和问题解决策略。以下是一些例子:
-
zero-shot-react-description:一个依赖于 LLM 的零样本能力来根据工具描述选择操作的代理 -
conversational-react-description:一个采用对话方式,在需要时请求澄清,并根据工具描述选择操作的代理 -
react-docstore:一个利用文档存储检索相关信息并根据工具描述选择操作的代理
关于上述工具和代理类的详细信息在此处突出显示:api.python.langchain.com/en/latest/_modules/langchain/agents/agent_types.html
现在我们已经了解了 LangChain 代理,让我们深入了解 LangChain 代理与 Amazon Bedrock 的集成,通过一个实际用例来展示。我们将通过 LangChain 包导入 Bedrock,并利用两个 LangChain 工具,即YoutubeSearchTool和WikipediaTool,使 LangChain 代理能够利用它们的功能。此外,我们将在这个简单应用中通过 Bedrock 利用 Anthropic Claude 模型。
注意
确保您有正确的权限来调用 Amazon Bedrock,如前几章所述。此外,请确保按照代码安装 LangChain 包和库的最新版本。如果包未安装,请在您的 Jupyter 笔记本中运行以下命令(请注意,如果您从 Python 终端运行 Python 代码,则不需要!或%):
%pip install <library_name>
# Install the respective packages for YoutubeSearchTool and Wikipedia Tool in your Jupyter Notebook
%pip install --upgrade --quiet wikipedia youtube_search langchain
#Install LangChain modules
%pip install -U langchain-community
%pip install -U langchain-aws langchainhub
# Import langchain libaries for Tools, Agents and Amazon Bedrock
from langchain.agents import AgentType
from langchain.agents import initialize_agent, Tool
from langchain_aws import BedrockLLM
from langchain.chains.conversation.memory import ConversationBufferWindowMemory
from langchain.agents import AgentExecutor, create_react_agent
from langchain import hub
# Import respective packages for Wikipedia and Youtube tools
from langchain_community.tools import YouTubeSearchTool
from langchain_community.utilities import WikipediaAPIWrapper
# Using anthropic model with langchain
llm = BedrockLLM(model_id="anthropic.claude-v2")
# Define Tools below
wikipedia_wrapper = WikipediaAPIWrapper()
# Wikipedia Tool
wikipedia_tool = Tool(
name="Wikipedia",
func=wikipedia_wrapper.run,
description="Useful tool for finding information on the Internet related to world events, issues, etc. Worth using for general topics. Use precise questions.",)
youtube_wrapper = YouTubeSearchTool()
#Youtube Tool
youtube_tool = Tool(name= "Youtube", func = youtube_wrapper.run, description = "Useful tool for searching youtube videos on and sharing the youtube links to the user. Use precise questions.")
#Create a memory instance
conversational_memory = ConversationBufferMemory()
prompt = hub.pull("hwchase17/react")
memory = conversational_memory
model = llm
tools = [wikipedia_tool,youtube_tool]
# Create an agent
agent = create_react_agent(model, tools, prompt = prompt)
# Create an agent executor
agent_executor = AgentExecutor(agent=agent, tools=tools, verbose=True)
#Run the agent executor
response = agent_executor.invoke({"input": "Memristor?"})
print(response)
生成的输出看起来是这样的:
{'input': 'Memristor?', 'output': 'A memristor is a non-linear two-terminal electrical component that relates electric charge and magnetic flux linkage. It was first theorized by Leon Chua in 1971 as the fourth fundamental circuit element alongside the resistor, capacitor and inductor. Unlike those components, memristors exhibit memory - their resistance depends on the history of current that has previously flowed through them. Memristors have applications in memory, computing, and neuromorphic/brain-inspired computing due to their ability to store and process information. They are an active area of research in nanoelectronics.'}
输出可能看起来像图 10.1和图 10.2中所示的那样。您将注意到代理正在使用问题、思考、行动和链式推理进行推理:

图 10.1 – AgentExecutor 链输出

图 10.2 – 使用 Bedrock 的 LangChain 代理生成的链
如本节所示,当我们探索如忆阻器等技术主题而没有其他背景信息时,会调用维基百科工具代理,提供全面和详细的信息,随后是 YouTube 工具提供有关主题的额外信息。如果用户在与代理的先前对话中写入Elon Musk video on Neuralink,则会调用 YouTube 工具并向用户展示链接。鼓励用户尝试不同的问题并测试代理。
这里是response = agent_executor.invoke({"input": "Elon Musk video on Neuralink"})的示例输出响应:
> Entering new AgentExecutor chain...
Here is my process for answering your question about finding a video of Elon Musk discussing Neuralink:
Question: Elon Musk video on Neuralink
Thought: Elon Musk has given talks and interviews about Neuralink. YouTube would be a good place to search for videos of him discussing it.
Action: Youtube
Action Input: "elon musk neuralink"
['https://www.youtube.com/watch?v=tN1lVwTHCMw&pp=ygUVZWxvbiBtdXNrIG5ldXJhbGluayIK', 'https://www.youtube.com/watch?v=k0I9Z-ARbjo&pp=ygUVZWxvbiBtdXNrIG5ldXJhbGluayIK'] Here is my thought process for answering your question:
Question: Elon Musk video on Neuralink
Thought: Elon Musk has discussed Neuralink, his brain-machine interface company, in various interviews and presentations. YouTube would be a good place to search for videos of him talking about Neuralink.
Action: Youtube
Action Input: "elon musk neuralink"
['https://www.youtube.com/watch?v=tN1lVwTHCMw&pp=ygUVZWxvbiBtdXNrIG5ldXJhbGluayIK', 'https://www.youtube.com/watch?v=k0I9Z-ARbjo&pp=ygUVZWxvbiBtdXNrIG5ldXJhbGluayIK'] Here is my thought process and answer:
Question: Elon Musk video on Neuralink
Thought: Elon Musk has given presentations and interviews about Neuralink, the brain-computer interface company he founded. YouTube would be a good place to search for videos of him discussing Neuralink and its technology.
...
https://www.youtube.com/watch?v=tN1lVwTHCMw
https://www.youtube.com/watch?v=k0I9Z-ARbjo
> Finished chain.
如演示所示,利用这些工具使我们能够深入了解主题知识。值得注意的是,LangChain 还提供了创建自定义工具的能力,进一步扩展了代理的功能。这种灵活性在python.langchain.com/docs/modules/agents/tools/custom_tools的文档中得到了强调,您可以在那里找到有关定制工具以适应您特定需求的指导。
如前所述,由于我们正在寻找关于忆阻器的技术主题,我们使用维基百科工具代理获取详细信息。您也可以使用代理创建自定义工具,如下所示:python.langchain.com/docs/modules/agents/tools/custom_tools。
您可以在以下博客中查看如何使用亚马逊 Bedrock 和 LangChain 构建生成式 AI 代理,结合亚马逊 Kendra、亚马逊 DynamoDB、亚马逊 Lex,aws.amazon.com/blogs/machine-learning/build-generative-ai-agents-with-amazon-bedrock-amazon-dynamodb-amazon-kendra-amazon-lex-and-langchain/。
通过有效地将亚马逊 Bedrock 与 LangChain 代理集成,组织可以释放 LLM 的全部潜力,从而开发出智能和情境感知的应用程序,推动创新,自动化复杂的工作流程,并提供卓越的用户体验。
现在,让我们跳转到构建亚马逊 Bedrock 代理,以利用端到端的生成式 AI 应用。
亚马逊 Bedrock 代理
亚马逊 Bedrock 提供的一项强大功能是能够在您的应用程序内构建和配置自主代理。这些代理作为智能助手,根据组织数据和用户输入帮助最终用户完成任务。代理协调 FM(LLM)、数据源、软件应用程序和用户对话之间的交互。它们可以自动调用 API 采取行动,并调用知识库为这些行动补充信息。通过集成代理,开发者可以节省数周的开发工作量,并加速生成式 AI 应用的交付。
亚马逊 Bedrock 上的代理旨在自动化客户任务,并对他们的问题提供智能响应。例如,您可以创建一个代理,帮助客户处理保险索赔或预订旅行。代理的优点是您不必担心提供容量、管理基础设施或从头开始编写自定义代码。亚马逊 Bedrock 处理提示工程、内存管理、监控、加密、用户权限和 API 调用的复杂性。
亚马逊 Bedrock 上的代理执行以下关键任务:
-
扩展 FM:代理利用 LLM 来理解用户请求,并将复杂任务分解成更小、更易管理的步骤。
-
收集额外信息:通过自然对话,代理可以从用户那里收集额外信息,以有效地满足他们的请求。
-
采取行动:代理可以调用您公司的系统 API 来执行操作并满足客户请求。
-
增强性能和准确性:通过查询数据源和知识库,代理可以增强其性能并提供更准确的响应。
为了利用 Amazon Bedrock 的代理力量,开发者遵循一个简单的过程:
-
创建一个知识库来存储您组织的私有数据,这可以用来增强代理的性能和准确性。这一步是可选的,因为并非所有代理都需要访问私有组织数据来执行其分配的目标。如果代理的任务和目标不依赖于或从访问此类数据中获得显著益处,则创建知识库可能不是必要的。这取决于特定用例和正在开发的代理的具体要求。
-
为您的特定用例配置代理,定义它可以执行的操作。用您首选的编程语言编写的 Lambda 函数决定了代理如何处理这些操作。这是一个可选步骤,因为代理不一定需要创建动作组。
-
将代理与知识库关联起来,以进一步增强其功能。
-
通过修改预处理、编排、知识库响应生成和后处理步骤的提示模板来自定义代理的行为。请注意,并非所有代理都需要对提示模板进行大量修改以实现其目标。定制的需求取决于代理预期执行的任务的复杂性和开发者期望的控制和微调水平。对于简单任务或通用用例,默认提示模板可能就足够了,因此不需要进行大量定制。
-
使用 Amazon Bedrock 控制台或 API 调用测试代理,并根据需要修改配置。利用跟踪来深入了解代理在编排每个步骤时的推理过程。
-
当代理准备部署时,创建一个指向特定代理版本的别名。
-
通过与代理别名集成您的应用程序,实现无缝的 API 调用和交互。
-
根据需要迭代代理,创建新版本和别名以适应不断变化的需求。
在整个开发过程中,Amazon Bedrock 处理提示工程、内存管理、监控、加密、用户权限和 API 调用的复杂性,让您能够专注于构建针对特定用例的智能代理。
揭示 Amazon Bedrock 中 GenAI 代理的内部工作原理
当深入到 Amazon Bedrock 的领域时,会遇到一套强大的工具集,旨在促进智能代理的创建和管理。这个工具集由两类不同的 API 操作组成,每一类在代理的生命周期中都有其特定的目的:
-
第一类,恰当地称为构建时 API 操作,使开发者能够构建、配置和监督他们的代理及其相关资源。这些操作作为基础构建块,使得能够创建满足特定需求和目标的代理。通过这些 API,开发者可以微调代理的各个方面,确保它们具备处理手头任务所需的能力。有关构建时 API 操作的更多详细信息,请参阅此处:
docs.aws.amazon.com/bedrock/latest/APIReference/API_Operations_Agents_for_Amazon_Bedrock.html -
第二类,运行时 API 操作,为代理注入活力,使其能够与用户输入交互并启动复杂的编排过程以完成其指定的任务。当用户提供输入时,这些 API 使代理能够处理和解释信息,触发一系列动作,最终达到预期的结果。
现在,让我们深入了解构建时和运行时配置。
构建时配置
在构建阶段,代理由以下关键组件组装:
-
FM: 您选择一个预训练的语言模型,该模型由代理使用来解释用户输入、生成响应并指导其决策过程。
-
指令提示: 您创建指令来界定代理的目的和期望的行为。通过高级提示技术,您可以在代理工作流程的每个阶段动态调整这些指令,并通过无服务器函数集成自定义逻辑。
-
动作组: 您通过以下方式定义代理可以执行的动作:
-
一个 OpenAPI 模式规范,概述代理可以调用的操作。
-
一个无服务器函数,根据代理的输入执行指定的 API 操作并返回结果。
-
-
知识库: 您可以将知识库与代理关联,使它能检索相关上下文以增强其响应生成和决策能力。
-
提示模板: 委派者公开了在代理生命周期各个阶段使用的默认提示模板,例如预处理输入、编排动作、查询知识库和后处理输出。您可以根据需要自定义这些模板来修改代理的行为或禁用特定阶段。
在构建过程中,这些组件被组合起来创建基础提示,引导智能体的编排流程,直到满足用户的请求。通过高级提示技术,你可以增强这些基础提示,添加额外的逻辑、示例和元数据,以提高智能体在调用每个阶段的准确性和性能。在配置智能体的组件和安全设置后,你可以准备智能体在运行时环境中进行部署和测试,如图图 10.3所示:

图 10.3 – 创建智能体的构建时 API 操作
运行时过程
在这个运行时过程中,InvokeAgent API 操作是核心,它是一个强大的指挥者,启动智能体序列。智能体的表现分为三个和谐的阶段:预处理、编排和后处理。
第一幕 – 预处理
在帷幕升起之前,预处理阶段会细致地管理智能体如何对用户输入进行上下文关联和分类。这一关键步骤还可以验证输入,确保后续阶段的顺利过渡。
第二幕 – 编排 – 盛大演出
编排阶段是真正的魔法发生的地方,是解释、调用和知识综合的交响乐章。这一行为包括以下几个部分:
-
解释:智能体巧妙地使用 FM 解释用户输入,生成一个阐述下一步逻辑路径的理由。
-
调用和综合:就像一位熟练的指挥家一样,智能体调用动作组和查询知识库,检索额外的上下文并总结数据以增强其生成能力。
-
观察和增强:从调用的动作组和总结的知识库结果中,智能体生成一个输出,称为观察。然后,这个观察被用来丰富基础提示,随后由 FM 进行解释。智能体接着确定是否需要进一步的编排迭代。
这个迭代循环会持续进行,直到智能体向用户交付最终响应或需要从用户那里获取更多信息。
在编排阶段,基础提示模板被智能体指令、动作组和知识库增强,形成了一个丰富的信息织锦。这个增强的基础提示随后被输入到 FM 中,预测满足用户请求的最佳轨迹。在每次迭代中,FM 选择适当的 API 操作或知识库查询,从而产生一个响应迅速且上下文准确的输出。
第三幕 – 后处理 – 终曲
在最后一幕,后处理阶段,智能体格式化其努力的成果 – 将返回给用户的最终响应。然而,这一步可以优雅地跳过,让表演留有解释的空间。
在代理的性能过程中,用户可以选择在运行时调用跟踪,揭示代理的思考过程。这个跟踪仔细追踪代理在每个步骤中的推理、行动、查询和观察。它包括发送给 FM 的完整提示,以及模型的输出、API 响应和知识库查询。通过检查这个跟踪,用户可以获得关于代理推理的宝贵见解,为持续改进和精炼铺平道路。
随着用户与代理的会话通过连续的InvokeAgent请求继续进行,对话历史被仔细保存,不断丰富代理基提示模板的上下文。这个过程有助于提高代理的准确性和性能,建立了用户和 AI 之间的共生关系。
在运行时,代理的过程是一个引人入胜的解释、综合和适应的相互作用,如图 10.4所示:

图 10.4 – 代理工作流程的运行时流程
利用 GenAI 提升推理能力——ReAct 入门
GenAI 模型在处理和生成类似人类的文本方面表现出卓越的能力,但它们在处理复杂任务和提供逐步解决方案方面的能力仍然是一个挑战。Yao 等人开发了一种称为 ReAct 的技术,如论文ReAct:在语言模型中协同推理和行动(arxiv.org/abs/2210.03629)所述,以提高这些模型的推理能力,使它们能够系统地处理和解决用户请求的任务。
ReAct 技术涉及构建提示,引导模型通过一系列推理步骤和相应的行动。这些提示由一系列问题-思考-行动-观察示例组成,其中以下适用:
-
问题代表用户请求的任务或需要解决的问题
-
思考是一个推理步骤,展示了如何解决问题并识别潜在的行动
-
行动是模型可以从预定义的允许操作集中调用的 API 调用或函数
-
观察是从执行所选操作获得的结果或输出
允许执行的动作集合由附加到示例提示文本的指令定义。这种结构化方法鼓励模型参与逐步推理过程,将复杂任务分解成更小、可操作的动作步骤。
为了说明构建 ReAct 提示的结构,考虑以下示例提示结构,包含问题-思考-行动-观察序列:
示例 1:
-
问题:最小化缺货的最佳库存水平是多少?
-
思考:为了避免缺货,我们必须根据需求预测和再订购点来平衡库存水平。
-
使用历史销售数据和需求预测的
optimizeInventoryLevels函数。 -
观察:将库存维持在预测需求的 80%可以减少缺货 30%,同时优化了持有成本。
示例 2:
-
问题:我们如何提高客户满意度评分?
-
思考:为了提高满意度,我们应该分析反馈数据并实施有针对性的改进。
-
使用
analyzeCustomerFeedbackAPI 来识别趋势和洞察。 -
观察:根据分析,实施个性化客户支持使满意度评分提高了 20%。
这些示例展示了 ReAct 技术如何指导模型通过推理步骤,从而得出可操作的成果。
虽然手动制作这些提示的过程可能耗时且复杂,但 Amazon Bedrock Agent 通过根据提供的信息和可用操作自动生成提示,简化了这一过程。Bedrock 代理处理提示工程的复杂性,使研究人员和开发者能够专注于定义任务要求和可用操作。
鼓励读者查看github.com/aws-samples/agentsforbedrock-retailagent,该链接揭示了通过利用 Amazon Bedrock 的代理创建一个由 FM 驱动的客户服务机器人。
ReAct 技术和 Bedrock 代理代表了在 GenAI 领域的一项重大进步,使模型能够展示出改进的推理能力,并更有效地处理复杂任务。通过提供解决问题的结构化方法并利用提示的力量,这项技术有可能解锁 GenAI 在各个领域的新可能性和应用。让我们通过一些实际用例来探索 Amazon Bedrock Agents 的工作原理。
使用 Amazon Bedrock Agents 的实际用例和功能
在本节中,我们将深入了解利用 Amazon Bedrock Agents 在 GenAI 中的实际应用和运营洞察。让我们考虑一个多语言摘要机器人示例场景,其中 GenAI 代理可以被用来简化操作并自动将内容以用户选择的语言进行摘要翻译。为了开始,开发者必须访问 Bedrock 控制台并启动代理创建工作流程,如图 10**.5所示:

图 10.5 – Bedrock 控制台中的代理创建
此过程涉及通过 AWS 身份和访问管理 (IAM) 服务角色提供必要细节,例如代理的名称、描述和必要的权限。此角色授予代理访问所需服务(如 Amazon Simple Storage Service (Amazon S3) 和 AWS Lambda)的权限,如图 图 10**.6 所示。例如,该图展示了创建一个多语言文档摘要和翻译代理,用于从文档中提取相关信息,并以翻译语言将信息传达给用户:

图 10.6 – 带有 IAM 权限的 Bedrock 代理创建过程
默认情况下,Amazon Bedrock 使用加密来保护与用户的代理会话,使用 AWS 代表您拥有和管理的密钥。但是,如果您更喜欢使用您已设置的 AWS 密钥管理服务 (KMS) 中的客户管理密钥,您可以选择相应地自定义加密设置。这允许您控制用于保护代理-用户交互的加密密钥,以满足您组织的安全和合规要求。
接下来,开发者从 Bedrock 中选择一个与所需用例相匹配的 FM。这一步骤涉及提供自然语言指令,以定义代理的任务和它应扮演的角色。例如,在 图 10**.7 中展示的示例中,指令可能是 您是一个多语言代理,旨在帮助从相关文档中提取所需信息,并以 翻译语言 的形式提供响应:

图 10.7 – Amazon Bedrock 代理模型选择和代理角色配置
控制台还提供了用户选择护栏以实施特定于应用程序的安全保障的选项,这些安全保障遵守负责任的 AI 政策。为了简单起见,我们可以将其留空并进入下一部分。我们将在 第十二章 中详细介绍护栏。
随后,开发者添加操作组,这些操作组是代理可以通过向公司系统发出 API 调用来自动执行的任务集合。这一步骤涉及定义一个 API 架构,概述组内所有操作的 API,并提供一个封装每个 API 商业逻辑的 Lambda 函数。例如,名为 Summarizer_Translator_ActionGroup 的操作组可以处理存储在数据库中或特定位置的文档,识别用户请求的信息,并以用户请求的翻译语言向用户发送总结后的响应。图 10**.8 展示了创建操作组来自动执行代理任务的创建过程:

图 10.8 – 创建 Bedrock 代理的动作组
如前所述,你需要创建一个 Lambda 函数来处理来自代理的请求并选择一个 API 架构。请确保你已经为你的 AWS Lambda 函数提供了调用 Bedrock 代理的正确权限。
对于文档识别、摘要和翻译的情况,我们提供了以下 Lambda 函数,用户可以利用它来执行工作流程:
import json
import time
import boto3
# Define a mock dictionary with document IDs and content
Document_id = {
"doc_1": {
"title": "The Importance of Mindfulness",
"author": "Jane Smith",
"content": "Mindfulness is the practice of being fully present and engaged in the current moment, without judgment or distraction. It involves paying attention to your thoughts, feelings, and bodily sensations with a curious and non-judgmental attitude. By cultivating mindfulness, you can reduce stress, improve emotional regulation, and enhance overall well-being. In this document, we will explore the benefits of mindfulness and provide practical techniques for incorporating it into your daily life."
},
"doc_2": {
"title": "Sustainable Living: A Guide to Eco-Friendly Practices",
"author": "Michael Johnson",
"content": "In today's world, it's essential to adopt sustainable living practices to protect our planet's resources and ensure a better future for generations to come. This document will provide you with practical tips and strategies for reducing your environmental impact in various aspects of your life, such as energy consumption, waste management, transportation, and food choices. Together, we can make a significant difference by embracing eco-friendly habits and promoting a more sustainable lifestyle."
},
"doc_3": {
"title": "The Art of Effective Communication",
"author": "Emily Davis",
"content": "Effective communication is a crucial skill in both personal and professional settings. It involves the ability to convey your thoughts, ideas, and emotions clearly and respectfully, while also actively listening and understanding the perspectives of others. In this document, we will explore the key elements of effective communication, such as active listening, nonverbal cues, and empathy. By mastering these techniques, you can improve your relationships, resolve conflicts more effectively, and achieve greater success in your personal and professional endeavors."
}
}
def getDocID(event):
docID = event['parameters'][0]['value']
print("NAME PRINTED: ", docID)
if(docID== "doc_1" or "doc1"):
return Document_id["doc_1"]["content"]
elif docID == "doc_2" or "doc2":
return Document_id["doc_2"]["content"]
elif docID == "doc_3" or "doc3":
return Document_id["doc_3"]["content"]
else:
return "No document found by that ID"
def lambda_handler(event, context):
response_code = 200
"""Main lambda handler directing requests based on the API path, preserving the specified response structure."""
print("event OUTPUT : ")
print(event)
action_group = event.get("actionGroup")
print("action group :" + str(action_group))
api_path = event.get("apiPath")
print ("api_path : " + str(api_path))
result = ''
response_code = 200
if api_path == '/getDoc':
result = getDocID(event)
print(result)
else:
response_code = 404
result = f"Unrecognized api path: {action_group}::{api_path}"
response_body = {
'application/json': {
'body': result
}
}
action_response = {
'actionGroup': event['actionGroup'],
'apiPath': event['apiPath'],
'httpMethod': event['httpMethod'],
'httpStatusCode': response_code,
'responseBody': response_body
}
api_response = {'messageVersion': '1.0', 'response': action_response}
return api_response
运行前面工作流程的用户也可以使用以下 OpenAPI 架构并将其存储在 S3 中,作为本例的一部分:
{
"openapi": "3.0.1",
"info": {
"title": "DocSummarizerTranslator API",
"version": "1.0.0",
"description": "APIs for fetching, translating and summarizing docs by fetching the document ID and identifying the language to translate the document"
},
"paths": {
"/getDoc": {
"get": {
"description": "Get the document content for a document by document ID.",
"operationId": "getDoc",
"parameters": [
{
"name": "DocID",
"in": "query",
"description": "ID of the document to retrieve",
"required": true,
"schema": {
"type": "string"}}],
"responses": {
"200": {
"description": "Successful response with document content data",
"content": {
"text/plain": {
"schema": {
"type": "string"
}}}}}}},
"/getDoc/summarize": {
"get": {
"description": "Summarize the content of the document for given document ID",
"operationId": "summarizeDoc",
"parameters": [
{
"name": "DocID",
"in": "query",
"description": "ID of the document to summarize",
"required": true,
"schema": {
"type": "string"
}
}
],
"responses": {
"200": {
"description": "Successful response with the summary of the document content for given document ID",
"content": {
"application/json": {
"schema": {
"type": "string",
"properties": {
"summary": {
"type": "string",
"description": "Summary of the document"}}}}}}}}}}}
在下一步中,用户可以选择一个知识库,如图 图 10.9 所示。这展示了 Bedrock 代理如何通过执行相似性搜索并提供所需响应给用户,轻松创建基于 RAG 的解决方案来从知识库中提取相关信息。为了简化,我们将忽略这一点并进入最终的创建步骤:

图 10.9 – 使用 Bedrock 代理集成创建知识库
注意
如果你想要深入了解涉及知识库与代理集成的用例,你可以执行以下代码示例:github.com/aws-samples/amazon-bedrock-workshop/tree/main/05_Agents/insurance_claims_agent/with_kb.
GitHub 仓库中的附加代码进一步说明了如何使用 Python SDK 创建和调用 Bedrock 代理,如下面的笔记本所示:github.com/aws-samples/amazon-bedrock-workshop/blob/main/05_Agents/insurance_claims_agent/with_kb/create_and_invoke_agent_with_kb.ipynb.
完成前面的步骤后,你可以验证代理配置并选择创建代理。恭喜你创建你的 Amazon Bedrock 代理 (图 10.10)!

图 10.10 – Amazon Bedrock 代理版本
在屏幕的右侧,你可以通过询问文档相关问题并请求它总结和将文档翻译成你希望的语言来轻松测试你的代理,如图 图 10.11 所示:

图 10.11 – 在 AWS 控制台中测试 Bedrock 代理
在本节中,我们获得了对开发和使用文本摘要用例定制的 Amazon Bedrock 代理的实际理解。在确保代理的配置和功能与指定任务相符后,就到了部署阶段。
部署 Amazon Bedrock 代理
将 Amazon Bedrock 代理集成到您的应用程序中需要创建一个别名,该别名作为对代理代码和配置特定版本的引用。按照以下步骤创建别名:
-
访问 Amazon Bedrock 控制台,导航到您希望部署的代理。从代理概览页面,导航到别名部分,然后点击创建以启动别名创建过程。
-
为别名提供名称和描述(可选)。您还需要决定是否要将此别名与代理的新版本或您之前创建的现有版本关联。
-
用户还可以选择通过选择预配吞吐量(PT)按钮为别名提供预配吞吐量。一旦选择,下拉菜单将列出使用预配吞吐量创建的模型。如果没有选项显示,则表示在 Amazon Bedrock 环境中不存在预配吞吐量模型。有关更多信息,用户可以利用
docs.aws.amazon.com/bedrock/latest/userguide/prov-throughput.html。
通过创建别名,Bedrock 会对代理当前的代码和配置设置进行快照,并将该快照(版本)链接到您定义的别名。然后,您可以使用此别名在您的应用程序中集成和交互特定版本的代理。图 10.12展示了为摘要翻译代理创建的两个别名:

图 10.12 – Amazon Bedrock 代理的别名
别名本质上充当一个稳定的参考点,允许您管理代理的不同版本,同时确保您的应用程序正在与期望的版本交互。
Amazon Bedrock 代理能够提升生产力、增强客户体验以及自动化工作流程。它们的通用性允许在任务自动化、对话界面和 DevOps 流程等各个领域进行创新实施,从而推动运营效率和商业价值的提升。
Bedrock Agents 可以有几种其他工业用例。例如,在保险领域,通过利用 Amazon Bedrock 上的 GenAI,保险公司可以提高运营效率和客户体验。代理可以自动化繁琐和重复的任务,释放人力资源,以便专注于更复杂和战略性的工作。此外,代理处理自然语言指令的能力允许其无缝集成到现有的工作流程和系统中,促进向 AI 驱动的运营的平稳过渡。
此外,GenAI 在保险行业的潜在应用不仅限于索赔处理。代理可以被训练来协助个性化政策推荐、风险评估、欺诈检测,甚至通过自然语言交互提供客户支持。随着技术的不断发展,保险领域内的创新和优化机会无疑将扩大。
以下链接演示了使用 AWS Python SDK 开始使用 Amazon Bedrock Agents 的端到端场景:github.com/awsdocs/aws-doc-sdk-examples/blob/main/python/example_code/bedrock-agent/scenario_get_started_with_agents.py.
笔记本揭示了以下步骤:
-
为 Bedrock 代理生成特定的执行角色
-
实例化 Bedrock 代理并部署初始草案版本
-
构建 Lambda 函数及其相应的执行角色
-
授予必要的 IAM 权限以部署代理以调用 Lambda 函数
-
建立一个将代理与 Lambda 函数链接的动作组
-
使用指定的别名部署完全配置的代理
-
使用用户提供的提示调用代理
-
删除在过程中创建的所有资源
用户可以通过执行此场景的端到端操作,以深入了解在 Amazon Bedrock 上创建 GenAI 代理的实用方法。
对于有兴趣深入了解 Amazon Bedrock 代理世界的读者,强烈建议利用 Amazon 的 使用代理构建 Amazon Bedrock 生成式 AI 应用程序 工作坊:catalog.us-east-1.prod.workshops.aws/workshops/f8a7a3f8-1603-4b10-95cb-0b471db272d8/en-US.
鼓励读者进一步了解使用 Amazon Bedrock Agent 链接和数字保险代理用例进行工作流程编排:github.com/build-on-aws/workflow-orchestration-bedrock-agent-chaining/tree/main.
摘要
在本章中,我们探讨了 GenAI 宇宙中代理的复杂概念。我们研究了与代理相关的各种用例和角色,进一步阐明了它们在现实场景中的应用实例。此外,我们还揭示了 LangChain 代理与 Amazon Bedrock 的无缝集成,并通过实际代码示例探讨了创建 Amazon Bedrock 代理以及它们的编排工作流程,用于构建、测试和部署 Bedrock 代理。
现在我们已经对代理及其编排过程有了深入的了解,我们将在下一章探讨在大规模企业中监控 Amazon Bedrock 模型的有效策略。这将使我们具备在复杂组织环境中管理和优化这些模型的安全和治理的必要知识,确保最佳利用率和效率。
第三部分:模型管理和安全考量
在本部分,我们将了解评估和监控模型的核心方面,以及确保在 Amazon Bedrock 环境中安全和隐私。第十一章探讨了评估模型性能的技术,包括自动模型评估、人工评估和开源工具。此外,它还涵盖了监控技术,如 Amazon CloudWatch、模型调用日志以及与 AWS CloudTrail 和 Amazon EventBridge 的集成。第十二章侧重于数据保护、身份和访问管理、网络安全、伦理考量以及实施护栏以遵守负责任的 AI 实践和政策。
本部分包含以下章节:
-
第十一章, 使用 Amazon Bedrock 评估和监控模型
-
第十二章,确保在 Amazon Bedrock 中安全和隐私
第十一章:使用 Amazon Bedrock 评估和监控模型
为了使用最适合您生成式 AI 解决方案性能的模型,您需要评估您可用的模型。本章探讨了评估不同模型性能的各种技术。
本章介绍了 Amazon Bedrock 提供的两种主要评估方法:自动模型评估和人工评估。我们将对这两种方法进行详细的讲解。此外,我们还将探讨用于模型评估和评估 RAG 管道的开源工具,如 基础模型评估(FMEval)和 RAG 评估(Ragas)。
本章的第二部分将探讨监控。我们将探讨如何利用 Amazon CloudWatch 对模型性能、延迟和令牌计数进行实时监控。我们还将进一步探讨模型调用日志,以捕获模型调用的请求、响应和元数据。此外,我们将强调 Amazon Bedrock 与 AWS CloudTrail 的集成,用于审计 API 调用,以及与 Amazon EventBridge 的集成,用于事件驱动的监控和模型定制作业的自动化。
到本章结束时,您将能够理解如何评估 FMs 并监控其性能。
本章将涵盖以下关键主题:
-
评估模型
-
监控 Amazon Bedrock
技术要求
本章要求您拥有 AWS 账户访问权限。如果您还没有,可以访问 aws.amazon.com/getting-started/ 创建 AWS 账户。
其次,您需要设置 AWS Python SDK (Boto3):docs.aws.amazon.com/bedrock/latest/APIReference/welcome.html
您可以以任何方式执行 Python 设置:在本地机器上安装,使用 AWS Cloud9,利用 AWS Lambda,或利用 Amazon SageMaker。
注意
与 Amazon Bedrock 的 FMs(功能模型)的调用和定制相关联的费用。请参阅 aws.amazon.com/bedrock/pricing/ 了解更多信息。
评估模型
到目前为止,我们已经全面了解了 Amazon Bedrock 的功能,探讨了提示工程、RAG(阅读-回答生成)和模型定制等技术。我们还检查了各种架构设计模式,并分析了不同模型生成的响应。由于 Amazon Bedrock 内部提供了大量的 FMs,因此确定最适合您特定用例和业务需求的选项可能具有挑战性。为了解决这个问题,我们将现在专注于模型评估的主题,以及如何比较不同模型的输出,以选择最适合您应用程序和业务需求的模型。这是实施任何生成式 AI 解决方案的关键初始阶段。

图 11.1 – 生成式 AI 生命周期
如图 11.1 所示,在定义了您希望通过生成式 AI 解决的具体业务用例之后,选择阶段涉及从可用选项中选择潜在模型并对这些候选模型进行严格评估。随后,负责任的 AI阶段侧重于确保数据隐私和安全,以及实施负责任模型行为的护栏,这些内容我们将在第十二章中介绍。
在讨论模型评估之前,一种快速比较 Amazon Bedrock 的Chat playground屏幕上模型响应的方法是使用比较****模式切换。

图 11.2 – Bedrock 的 Chat playground 中的比较模式

图 11.3 – 比较模式中的模型指标
如图 11.2 所示,您可以在Chat playground中启用比较模式并添加最多三个模型以查看模型对同一提示的响应的并排比较。此外,您还可以查看所选每个模型的指标(如图 11.3 所示)并比较延迟、输入令牌计数、输出令牌计数和相关的成本。我们将在监控 Amazon Bedrock部分深入讨论模型指标。
使用 Amazon Bedrock
在 Amazon Bedrock 中,您可以创建模型评估作业来比较用于文本生成、摘要、问答等用例的模型响应。
在 Amazon Bedrock 中对模型进行评估主要包含两种选项:
-
自动模型评估
-
人工评估
让我们更深入地探讨这两种评估技术。
自动模型评估
使用自动模型评估,后台会运行一个评估算法脚本,在 Amazon Bedrock 提供的内置数据集或您提供的自定义数据集上执行,用于推荐指标(准确度、毒性、鲁棒性)。让我们通过以下步骤来创建一个自动模型评估作业:
-
评估名称:这指的是选择一个能够准确反映作业目的的描述性名称。此名称应在您特定的 AWS 区域的 AWS 账户中是唯一的。
-
模型选择器:选择您想要评估的模型(如图 11.4 所示)。在撰写本书时,自动模型评估是在单个模型上进行的。

图 11.4 – 模型选择器
在模型选择器中,您可以可选地修改推理参数,例如温度、Top P、响应长度等(如图 11.5 所示)。您可以通过点击推理配置:默认更新来获取此屏幕。
修改此推理配置的值将改变模型的输出。要了解更多关于推理配置参数的信息,您可以回到本书的第二章。

图 11.5 – 推理配置
-
任务类型:在 Amazon Bedrock 模型评估中使用时,目前支持以下任务类型:
-
通用文本生成
-
文本摘要
-
问答
-
文本分类
-
-
指标和数据集:Amazon Bedrock 提供了总共三个指标,您可以选择使用这些指标来衡量模型的性能:
-
准确性:将关于现实世界的实际知识编码的能力是生成式 AI 模型的一个关键方面。此指标评估模型生成与既定事实和数据一致输出的能力。它评估模型对主题内容的理解以及其准确综合信息的能力。高准确度分数表明模型的输出是可靠的,可以信赖用于需要事实精确性的任务。
-
毒性:这指的是模型生成有害、冒犯性或不适当内容的能力。此指标衡量模型产生可能被视为不道德、有偏见或歧视性的输出的倾向。评估毒性对于确保 AI 系统的负责任和道德部署至关重要,尤其是在涉及与用户直接互动或向公众传播信息的应用中。
-
鲁棒性:鲁棒性是衡量模型对输入数据中微小的、语义保持性变化的抵抗力的指标。它评估模型在面临输入数据中的轻微变化或扰动时,其输出保持一致和可靠的程度。此指标对于在动态或嘈杂环境中运行的生成式 AI 模型尤为重要,其中输入数据可能受到轻微波动或干扰。鲁棒性强的模型在输入变化较小的情况下,不太可能产生异常或不一致的输出。
-
文本分类任务支持准确性和鲁棒性指标,而其他任务支持所有三个指标。
对于您选择的每个任务类型和指标,Amazon Bedrock 都为您提供了内置数据集。例如,对于通用文本生成任务类型,您将获得以下内置数据集:
-
WikiText2:
huggingface.co/datasets/wikitext -
RealToxicityPrompts:
github.com/allenai/real-toxicity-prompts
要获取基于不同指标和任务类型的内置数据集的完整列表,您可以查阅docs.aws.amazon.com/bedrock/latest/userguide/model-evaluation-prompt-datasets-builtin.html。
如果您想使用自己的自定义数据集,它需要是JSON 行 (.jsonl)格式。数据集中的每一行都必须是一个有效的 JSON 对象,并且每个评估作业可以包含最多 1,000 个提示。
要构建您的自定义提示数据集,您需要包含以下键:
-
prompt:此键是必需的,用作各种任务的输入,例如通用文本生成、问答、文本摘要和分类。根据任务的不同,与此键关联的值将有所不同——它可以是模型需要响应的提示、要回答的问题、要总结的文本或要分类的内容。
-
referenceResponse是必需的,用于提供与您的模型输出进行比较的基准响应。对于问答、准确性评估和鲁棒性测试等任务,此键将包含正确答案或预期响应。 -
category键。此可选键允许您对提示及其相应的参考响应进行分组,从而实现对模型在不同领域或类别上的性能进行更细致的分析。
为了说明这些键的用法,以下是一个问答任务的示例:
{"prompt":"What is the process that converts raw materials into finished goods?", "category":"Manufacturing", "referenceResponse":"Manufacturing"}
{"prompt":"What is the study of methods to improve workplace efficiency?", "category":"Manufacturing", "referenceResponse":"Industrial Engineering"}
{"prompt":"What is the assembly of parts into a final product?", "category":"Manufacturing", "referenceResponse":"Assembly"}
{"prompt":"A computerized system that monitors and controls production processes is called", "category":"Manufacturing", "referenceResponse":"SCADA"}
{"prompt":"A system that minimizes waste and maximizes efficiency is called", "category":"Manufacturing", "referenceResponse":"Lean Manufacturing"}
在此 JSON 行中,prompt键包含什么是将原材料转化为成品的过程?这个问题,而referenceResponse键持有正确答案Manufacturing。此外,category键设置为Manufacturing,允许您将此提示和响应与其他与制造相关的提示和响应分组。
一旦您创建了自定义提示数据集,您需要将数据集文件存储在 Amazon S3 桶中,并在创建模型评估作业时指定正确的 S3 路径(例如s3://test/data/)(如图11.6所示)。

图 11.6 – 选择提示数据集
请注意,S3 桶应附加以下跨源资源共享(CORS)策略:
[{
"AllowedHeaders": ["*"],
"AllowedMethods": ["GET","POST","PUT","DELETE"],
"AllowedOrigins": ["*"],
"ExposeHeaders": ["Access-Control-Allow-Origin"]
}]
CORS 策略是一组规则,指定哪些来源(域名或网站)允许访问 S3 桶。要了解更多关于 CORS 的信息,您可以查看docs.aws.amazon.com/AmazonS3/latest/userguide/cors.html。
通过精心制作您的自定义提示数据集,您可以确保您的 LLMs 在多种场景下得到全面评估,涵盖各种任务、领域和复杂度级别。

图 11.7 – 指标和数据集
图 11.7展示了通用文本生成任务类型的指标和数据集选项。
让我们看看在创建模型评估作业时可以指定的其他参数:
-
评估结果:在此,您可以指定评估作业结果应存储的 S3 路径。我们将在下一节中介绍评估结果。
-
IAM 角色和 KMS 密钥:执行诸如从 S3 桶访问数据或存储评估结果等操作需要某些权限。以下是一个自动模型评估作业所需的最小策略:
{"Version": "2012-10-17","Statement": [{"Sid": "BedrockConsole","Effect": "Allow","Action": ["bedrock:CreateEvaluationJob","bedrock:GetEvaluationJob","bedrock:ListEvaluationJobs","bedrock:StopEvaluationJob","bedrock:GetCustomModel","bedrock:ListCustomModels","bedrock:CreateProvisionedModelThroughput","bedrock:UpdateProvisionedModelThroughput","bedrock:GetProvisionedModelThroughput","bedrock:ListProvisionedModelThroughputs","bedrock:ListTagsForResource","bedrock:UntagResource","bedrock:TagResource"],"Resource": "*"},{"Sid": "AllowConsoleS3AccessForModelEvaluation","Effect": "Allow","Action": ["s3:GetObject","s3:GetBucketCORS","s3:ListBucket","s3:ListBucketVersions","s3:GetBucketLocation"],"Resource": "*"}]}
您可以在docs.aws.amazon.com/bedrock/latest/userguide/model-evaluation-security.html?icmpid=docs_bedrock_help_panel_model_evaluation找到有关模型评估作业所需权限的详细信息。
模型评估结果
一旦开始模型评估作业,您就可以查看每个指标的评估结果,如图图 11.8所示。

图 11.8 – 评估摘要
此外,指标结果存储在您指定的 S3 桶中,如图图 11.9所示。

图 11.9 – S3 桶中的指标结果
让我们了解每种任务类型是如何进行评估的。
文本生成
对于文本生成任务类型,评估的执行方式如下:
-
准确性:此指标使用现实世界知识(RWK)分数进行评估,该分数评估模型理解现实世界的能力。RWK 分数衡量语言模型产生与现实世界事实和常识一致输出的程度。它评估模型对物理世界的推理能力、理解社会规范以及避免生成无意义或矛盾的陈述的能力。高 RWK 分数表示模型表现准确。
-
鲁棒性:语义鲁棒性是衡量此任务类型鲁棒性的指标。它使用词错误率来计算,该词错误率量化了模型输出在输入发生轻微、语义保留的扰动时的变化程度。低语义鲁棒性分数表示模型表现良好,因为它对这些扰动具有鲁棒性。
-
毒性:此指标使用 detoxify 算法(
github.com/unitaryai/detoxify)计算,该算法衡量模型输出中存在有毒内容的情况。低毒性值表示所选模型不会生成大量有害或冒犯性的内容。
文本摘要
对于文本摘要任务类型,评估方式如下:
-
准确性:在此任务类型中,使用 BERTScore 来评估准确性。它是通过使用 BERT 模型的预训练上下文嵌入来计算的,并通过余弦相似度匹配候选句和参考句中的单词。
-
鲁棒性:此指标以百分比表示,通过计算扰动提示和原始提示的 BERTScore 之差,然后除以原始提示的 BERTScore 并乘以 100 来计算。分数越低,表示所选模型越鲁棒。
-
毒性:与一般文本生成任务类型一样,使用 detoxify 算法来计算模型输出的毒性,低值表示生成的毒性内容最少。
问答
对于问答任务类型,评估方式如下:
-
准确性:在此任务类型中,使用 F1 分数来评估准确性。它是通过将精确度分数(正确预测与所有预测的比率)除以召回率分数(正确预测与相关预测总数的比率)来计算的。F1 分数越高,表示性能越好。
-
鲁棒性:此指标以百分比表示,通过计算扰动提示和原始提示的 F1 分数之差,然后除以原始提示的 F1 分数并乘以 100 来计算。分数越低,表示所选模型越鲁棒。
-
毒性:与其他任务类型一样,使用 detoxify 算法来计算模型输出的毒性,低值表示生成的毒性内容最少。
文本分类
对于文本分类任务类型,评估方式如下:
-
准确性:在此任务类型中,通过比较预测类别与其真实标签来计算准确性。准确性分数越高,表示模型根据提供的真实标签正确分类文本的能力越强。
-
鲁棒性:此指标以百分比表示,通过计算扰动提示和原始提示的分类准确性分数之差,然后除以原始提示的分类准确性分数并乘以 100 来计算。分数越低,表示所选模型越鲁棒。
让我们分析来自 T-Rex 内置数据集的准确性和鲁棒性指标:(hadyelsahar.github.io/t-rex/):
{"automatedEvaluationResult":{"scores":[{"metricName":"Accuracy","result":1},{"metricName":"Robustness","result":0.0828}]},"inputRecord":{"prompt":"al-Hira is the capital of","referenceResponse":"Lakhmid"},"modelResponses":[{"response":" Al-Hira was an ancient city in Mesopotamia located south of what is now Kufa in modern-day Iraq. It served as the capital of the Arab Lakhmids from the 3rd to the 6th century CE.\n\nSome key facts about al-Hira:\n\n- It was founded in the 3rd century CE and served as the capital of the Lakhmids, who were Arab vassals of the Sassanian Persian Empire. \n\n- Under the leadership of the Lakhmid kings, al-Hira flourished as a center of Arab culture and politics in pre-Islamic Arabia. It was a major center of Nestorian Christianity in the region.\n\n- The city was located along important trade routes linking Mesopotamia to the Arabian peninsula. Its markets attracted merchants from throughout Arabia and beyond.\n\n- Al-Hira and the Lakhmids were defeated by the Sassanians in 602 CE. The city subsequently went into decline and was eventually abandoned. \n\n- The ruins of al-Hira are located about 94 km south of modern-day Baghdad, Iraq. Sections of its walls and some buildings have been excavated by archaeologists.\n\nSo in summary, al-Hira functioned as the capital of the Arab Lakhmids kingdom for several centuries until its downfall in the early 7th century CE. Its ruins stand as an","modelIdentifier":"anthropic.claude-v2"}]}
输出显示,提供了一个提示(al-Hira 是首都)给 Anthropic Claude v2 模型,并且该模型的响应(Al-Hira 是美索不达米亚的一个古老城市...)被评估为参考响应(Lakhmid)。评估计算了诸如准确性和鲁棒性等指标的分数,为模型在此特定输入上的性能提供了见解。
使用人工评估
人工评估允许您将人工输入纳入评估过程,因此模型不仅准确,而且符合现实世界的期望和要求。有人工评估有两种类型:
-
带自己的工作团队
-
使用 AWS 管理的团队
带自己的工作团队
与自动模型评估类似,当您选择使用您自己的工作团队进行人工评估时,Amazon Bedrock 会引导您通过一个简单的设置过程,让您选择要评估的模型、任务类型(例如,文本摘要)和评估指标。它还会向您展示如何上传您定制的提示数据集。让我们考虑通过自己的团队设置人工评估的逐步过程:
-
评估名称:选择一个能够准确反映工作目的的描述性名称。此名称应在特定 AWS 区域内的 AWS 账户中是唯一的。除了名称外,您还可以选择性地提供描述和标签。
-
模型选择器:选择您想要评估的模型(如图图 11.10所示)。在撰写本书时,使用您自己的团队进行人工模型评估只能针对最多两个模型进行。在模型选择器中,您可以选择性地修改推理参数,如温度、Top P、响应长度等。

图 11.10 – 模型选择器
-
任务类型:目前,在此模式下支持以下任务类型:
-
通用文本生成
-
文本摘要
-
问答
-
文本分类
-
自定义
这些任务类型中的最后一个,自定义,允许您指定人类工作者可以使用自定义评估指标。
根据任务类型,您将看到您必须从其中选择的评估指标和评分方法的列表,如图图 11.11和11.12所示。
-

图 11.11 – 评估指标

图 11.12 – 评分方法选项
-
指定路径:接下来,您需要指定自定义提示数据集的 s3 路径。正如我们在前面的子节中看到的,自定义提示数据集需要是.jsonl格式。以下是一个自定义提示数据集的示例:
{"prompt":"What is the process that converts raw materials into finished goods?", "category":"Manufacturing", "referenceResponse":"Manufacturing"}{"prompt":"What is the study of methods to improve workplace efficiency?", "category":"Manufacturing", "referenceResponse":"Industrial Engineering"}{"prompt":"What is the assembly of parts into a final product?", "category":"Manufacturing", "referenceResponse":"Assembly"}请注意,您的数据集的 s3 路径需要您将跨源资源共享(CORS)设置配置为如图图 11.13所示。

图 11.13 – CORS 策略窗口
要了解更多信息,您可以访问docs.aws.amazon.com/bedrock/latest/userguide/model-evaluation-security-cors.html。
-
IAM 角色和 KMS 密钥:执行诸如从 S3 存储桶访问数据或存储评估结果等操作需要特定的权限。您可以在
docs.aws.amazon.com/bedrock/latest/userguide/model-evaluation-security.html?icmpid=docs_bedrock_help_panel_model_evaluation找到有关模型评估作业所需的 IAM 权限的更多详细信息。 -
设置工作团队:接下来,您需要设置一个工作团队(如图 11.14 所示)。这包括邀请适当的团队成员。控制台为您提供了邀请新工作者和现有工作者的示例电子邮件模板,您可以在发送邀请时作为参考。工作者会收到一个链接,链接到私人工作者门户,在那里他们完成标记任务。

图 11.14 – 设置自定义工作团队
- 接下来,您需要将任务的说明(如图 11.15 所示)告知工作者。这些说明将在工作者执行标记任务的私人工作者门户中可见。

图 11.15 – 向人工工作者提供说明
在您审查并创建作业后,人工工作者团队将收到一封电子邮件,以及执行任务的门户链接。一旦工作者完成任务,Amazon Bedrock 将提供评估报告卡。让我们详细了解报告卡:
-
1到5。在使用此方法时,提供明确的说明以定义每个评分点的含义至关重要。例如,评分1可能表示较差或不相关的响应,而评分5可能表示优秀且高度相关的输出。结果将以直方图的形式展示,展示评分在数据集中的分布情况:-
明确定义刻度点(例如,1 = 差,2 = 一般,3 = 好,4 = 非常好,5 = 优秀)
-
为评估者提供明确的指南,说明如何解释和应用刻度
-
以直方图的形式展示结果,便于轻松视觉解释评分分布
-
-
选择按钮:当您选择选择按钮方法时,评估者会看到两个模型响应并要求选择他们偏好的选项。这种方法在比较多个模型在相同任务上的性能时特别有用。结果通常以百分比的形式报告,表示评估者对每个模型偏好的响应比例。
-
1(最优先)。这种方法提供了对不同模型相对性能的更细致的理解。结果以直方图的形式展示,显示了数据集中排名的分布。 -
点赞/踩:评估者对每个响应进行接受或不接受的评分。最终报告展示了每个模型获得点赞评分的响应百分比,从而可以简单地评估其接受度。
另一种人类评估方法是通过 AWS 管理的工作团队。
使用 AWS 管理的工作团队
如果您选择 AWS 管理的团队,您可以简单描述您的模型评估需求,包括任务类型、所需的专家级别和大约的提示数量。基于这些详细信息,AWS 专家将随后联系,详细讨论您的项目需求,提供符合您特定需求的定制报价和项目时间表。
图 11.16 展示了如何创建一个包含任务类型和所需专家级别等所有详细信息的管理工作团队。

图 11.16 – AWS 管理的模型评估团队
当您不想管理或分配任务给您的员工,并且需要 AWS 团队代表您进行评估时,AWS 管理的工作团队非常有用。
除了使用 Bedrock 的模型评估作业外,还有其他开源技术可用于模型评估,例如 fmeval 和 Ragas。
FMEval
FMEval 是 AWS 提供的开源库,您可以在 github.com/aws/fmeval 访问。
此库能够全面评估 LLM 在准确性、毒性、语义鲁棒性和提示刻板印象等各个方面。它提供了一系列针对评估 LLM 在不同任务上性能的算法,确保对其能力和局限性的全面理解。
如果您计划使用自己的数据集进行评估,您需要配置一个 DataConfig 对象,如下面的代码块所示。此对象指定数据集名称、URI 和 MIME 类型,以及输入提示、目标输出和其他相关列的位置。通过自定义 DataConfig 对象,您可以调整评估过程以适应您特定的数据集和任务需求:
from fmeval.data_loaders.data_config import DataConfig
from fmeval.constants import MIME_TYPE_JSONLINES
from fmeval.model_runners.bedrock_model_runner import BedrockModelRunner
fmconfig = DataConfig(
dataset_name="dataset",
dataset_uri="dataset.jsonl",
dataset_mime_type=MIME_TYPE_JSONLINES,
model_input_location="question",
target_output_location="answer",
)
该库提供了一个灵活的ModelRunner接口,允许与 Amazon Bedrock 无缝集成,并用于对模型进行调用。以下代码块展示了如何执行调用:
bedrock_model_runner = BedrockModelRunner(
model_id='anthropic.claude-v2',
output='completion',
content_template='{"prompt": $prompt, "max_tokens_to_sample": 500}'
)
如果您想了解更多关于fmeval的信息,您可以访问github.com/aws/fmeval/tree/main。
此外,您还可以尝试使用 Amazon Bedrock 进行fmeval。以下是一些您可以测试的 Anthropic Claude v2 的示例:
-
github.com/aws/fmeval/blob/main/examples/bedrock-claude-factual-knowledge.ipynb -
github.com/aws/fmeval/blob/main/examples/bedrock-claude-summarization-accuracy.ipynb
Ragas
Ragas 是一个框架,旨在评估您的 RAG 管道的性能,这些管道结合了语言模型和外部数据源以增强其输出。它提供了基于最新研究的实用工具,用于分析您语言模型生成的文本,为您提供有关 RAG 管道有效性的宝贵见解。
下面是使用 Ragas 的一些关键功能和好处:
-
自动评估指标:Ragas 提供了一套针对评估 RAG 生成文本质量的自动化指标。这些指标超越了传统的度量,如困惑度和 BLEU,提供了对生成输出连贯性、相关性和事实准确性的更深入理解。
-
可定制的评估策略:认识到每个 RAG 管道都是独特的,Ragas 允许灵活和可定制的评估策略。您可以调整评估过程以适应您的特定用例、数据领域和性能要求。
-
与 CI/CD 管道的集成:Ragas 旨在与CI/CD(持续集成和持续部署)管道集成。这种集成使您可以持续监控和评估 RAG 管道的性能,确保任何偏差或回归都能得到及时检测和处理。
-
可解释的见解:Ragas 生成可解释和可操作的见解,突出您 RAG 管道表现优异的领域,并识别潜在的弱点或瓶颈。这些见解可以指导您的优化工作,帮助您迭代地改进和增强管道的性能。
Ragas 提供了一系列您可以导入的指标。以下是操作方法:
from ragas.metrics import (
context_precision,
faithfulness,
context_recall,
)
from ragas.metrics.critique import harmfulness
metrics = [
faithfulness,
context_recall,
context_precision,
harmfulness,
]
这些指标可以传递给 Ragas 中的evaluate函数,以及 Bedrock 模型和嵌入。以下是操作方法:
from ragas import evaluate
results = evaluate(
df["eval"].select(range(3)),
metrics=metrics,
llm=bedrock_model,
embeddings=bedrock_embeddings,
)
results
在前面的代码片段中,df假设是一个包含您想要评估的数据的 pandas DataFrame。请注意,llm=bedrock_model和embeddings=bedrock_embeddings是我们先前创建的 Bedrock 和嵌入模型实例。
对于如何使用 Ragas 与 Amazon Bedrock 的完整教程,您可以访问 docs.ragas.io/en/stable/howtos/customisations/aws-bedrock.html。
现在我们已经看到了执行 Amazon Bedrock 模型评估的各种技术,让我们看看与 Amazon Bedrock 集成的监控和日志记录解决方案。
监控 Amazon Bedrock
监控您的生成式 AI 应用程序的性能和用法对于确保最佳功能、维护安全和隐私标准以及获取未来改进的见解至关重要。Amazon Bedrock 与 Amazon CloudWatch、CloudTrail 和 EventBridge 无缝集成,提供全面的监控和日志记录解决方案。
Amazon CloudWatch
Amazon CloudWatch 是一种监控和可观察性服务,它收集并可视化来自各种 AWS 资源的数据,包括 Amazon Bedrock。通过利用 CloudWatch,您可以获得有关 Bedrock 模型性能的宝贵见解,以便您可以主动识别和解决问题。通过 CloudWatch,您可以跟踪使用指标并构建定制的仪表板以进行审计,确保在整个 AI 模型开发过程中保持透明度和问责制。
使用 Amazon Bedrock 的一个关键特性是,您可以深入了解单个账户内多个账户和 FM 的模型使用情况。您可以监控关键方面,如模型调用和令牌计数,以便您可以做出明智的决定并有效地优化资源分配。如果您想在一个或多个区域中配置跨多个账户的监控,您可以在 docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch-Cross-Account-Methods.html 查看 Amazon CloudWatch 文档。
这提供了您需要采取的所有步骤来启用此功能。
此外,Bedrock 提供了一个名为模型 调用日志 的功能。此功能允许用户收集账户内所有模型调用的元数据、请求和响应。虽然此功能默认禁用,但您可以通过访问 Bedrock 控制台中的 设置 并切换 模型调用日志 来轻松启用它。通过启用此功能,您允许 Bedrock 发布调用日志,以增强可见性和分析。
让我们看看如何利用 CloudWatch 在接近实时的情况下监控 Bedrock,利用指标和日志在预定义阈值超过时触发警报并启动操作。
Bedrock 指标
Amazon Bedrock 的 CloudWatch 度量涵盖了广泛的性能指标,包括调用次数、调用延迟、调用客户端和服务器错误、调用节流实例、输入和输出令牌等。您可以在docs.aws.amazon.com/bedrock/latest/userguide/monitoring-cw.html#runtime-cloudwatch-metrics查看支持的度量标准的完整列表。
使用这些度量标准,您可以比较不同模型的延迟,并测量令牌计数,以帮助购买预配吞吐量,以及检测和警报节流事件。
当您使用聊天游乐场时,您可以在运行提示后查看这些度量标准,如图11.17所示。

图 11.17 – 模型度量
此外,您还可以定义度量标准,这允许您为模型度量提供特定的条件或阈值。根据您的需求,您可以设置如延迟小于 100ms或输出令牌计数大于 500等标准。这些标准可以用来评估和比较不同模型与您期望的度量标准之间的性能。在比较多个模型时,设置度量标准有助于确定哪些模型满足或未满足您指定的条件,这有助于选择最适合您用例的最合适的模型。
让我们也在 CloudWatch 度量仪表板中查看这些度量标准。

图 11.18 – CloudWatch 度量仪表板
在图 11.18中,您可以查看 Anthropic Claude 3 Sonnet 模型的 CloudWatch 度量:调用次数(样本计数)、调用延迟(以毫秒为单位)、输出令牌计数(样本计数)和输入令牌计数(样本计数)。让我们了解这些术语(指标和统计数据)的含义:
-
样本计数:这个统计数据表示在指定时间段内记录的总数据点或观察值。
-
在给定时间段内,
Converse、ConverseStream、InvokeModel和InvokeModelWithResponseStreamAPI。 -
调用延迟:此度量标准指的是从调用请求发出到收到响应之间的延迟或时间量。
输出令牌计数和输入令牌计数是分析并计算模型调用成本时的有用度量标准。令牌本质上是从输入提示和响应中提取的一小组字符。输出令牌计数表示模型提供的响应中令牌的总数,而输入令牌计数表示提供给模型的输入和提示中令牌的总数。
为了简化监控和分析,Bedrock 的日志和指标可以通过 CloudWatch 仪表板以单一视图呈现。这些仪表板提供了对相同 KPIs 的全面概述,包括按模型随时间变化的调用次数、按模型的调用延迟以及输入和输出的令牌计数。以下图显示了两个模型,Anthropic Claude v2 和 Anthropic Claude v3 Sonnet,在一周时间框架内的仪表板视图。

图 11.19 – CloudWatch 仪表板
对于拥有多个 AWS 账户的组织,Bedrock 支持 CloudWatch 跨账户可观察性,允许在监控账户中创建丰富的跨账户仪表板。此功能确保了跨各种账户的性能指标集中视图,便于更好的监督和决策。
模型调用日志
模型调用日志允许您捕获和分析模型生成的请求和响应,以及所有调用调用的元数据。它提供了对您的模型如何被使用的全面视图,使您能够监控其性能,识别潜在问题,并优化其使用。
启用模型调用日志是一个简单的过程。您可以通过 Amazon Bedrock 控制台或通过 API 进行配置。

图 11.20 – 启用模型调用日志
图 11.20显示了 Amazon Bedrock 控制台中模型调用日志的控制台视图。您需要启用此功能。第一步是选择您想要记录的数据类型,例如文本、图像或嵌入。接下来,您需要选择日志的目的地,可以是 Amazon S3、Amazon CloudWatch Logs 或两者,并提供路径。
如果您选择 Amazon S3,您的日志将以压缩的 JSON 文件形式存储,每个文件包含一批调用记录。这些文件可以使用 Amazon Athena 进行查询,或发送到各种 AWS 服务,如 Amazon EventBridge。另一方面,如果您选择 Amazon CloudWatch Logs,您的调用日志将以 JSON 事件的形式发送到指定的日志组。这允许您利用 CloudWatch 日志洞察功能,实时查询和分析您的日志。
模型调用日志的一个关键优势在于其能够捕获大量输入和输出数据。对于超过 100 KB 的数据,或者二进制格式(例如,图像、音频等)的数据,Amazon Bedrock 会自动将其上传到您指定的 Amazon S3 存储桶。这确保了即使对于大量或非文本数据,也不会丢失任何有价值的信息。
通过利用此功能,您可以优化您的模型,识别潜在问题,并确保您的系统高效且有效地运行。
下面是 CloudWatch 日志控制台中模型调用日志的一个示例:
{
"schemaType": "ModelInvocationLog",
"schemaVersion": "1.0",
"timestamp": "2024-06-01T02:26:35Z",
"accountId": "123456789012",
"identity": {
"arn": "arn:aws:sts::123456789012:assumed-role/Xyz/Abc"
},
"region": "us-east-1",
"requestId": "9e0ff76a-7cac-67gg-43rg-5g643qwer85r",
"operation": "ConverseStream",
"modelId": "anthropic.claude-v2",
"input": {
"inputContentType": "application/json",
"inputBodyJson": {
"messages": [
{
"role": "user",
"content": [
{
"text": "Write a poem on stock market"
}
]
}
],
"inferenceConfig": {
"maxTokens": 2048,
"temperature": 0.5,
"topP": 1,
"stopSequences": [
"\n\nHuman:"
]
},
"additionalModelRequestFields": {
"top_k": 250
}
},
"inputTokenCount": 15
},
"output": {
"outputContentType": "application/json",
"outputBodyJson": {
"output": {
"message": {
"role": "assistant",
"content": [
{
"text": "Here is a poem about the stock market:\n\nThe Stocks Go Up and Down\n\nThe stocks go up and the stocks go down\nGains and losses all around\nSome days are green, some days are red\nWondering where this rollercoaster will lead\n\nBuy low and sell high, that's what they say\nBut the market has a mind of its own each day\nOne wrong move and your profits fade away\nPatience and research are the prudent way\n\nBulls charge ahead with optimism bright \nWhile bears retreat in a fearful plight\nAnalysts and investors try to read the signs\nOf economic trends and corporate lines\n\nThe risky trader seeks a quick buck\nWhile the long-term holder trusts in luck \nDay by day the tickers rise and fall\nAs we check our portfolios, hoping they won't stall\n\nSo place your bets and say your prayers\nThe market gods will judge what's fair\nBut one truth will always remain\nIn the stock market, uncertainty reigns"
}
]
}
},
"stopReason": "end_turn",
"metrics": {
"latencyMs": 8619
},
"usage": {
"inputTokens": 15,
"outputTokens": 218,
"totalTokens": 233
}
},
"outputTokenCount": 218
}
}
前面的日志片段提供了对anthropic.claude-v2模型的ConverseStream对话请求。它捕获了各种数据点,如输入提示、输出响应、性能指标和用量统计。通过这种全面的日志记录,您可以有效地分析和评估模型的能力和行为。
AWS CloudTrail
AWS CloudTrail 是一种合规性和审计服务,允许您捕获和分析您 AWS 环境中所有 API 调用。以下是您如何利用 CloudTrail 获得宝贵见解的方法。
Amazon Bedrock 与 AWS CloudTrail 无缝集成,将每个 API 调用作为一个事件捕获。这些事件包括从 Amazon Bedrock 控制台发起的操作,以及通过 Amazon Bedrock API 操作进行的程序调用。在 CloudTrail 中,您可以获得关于谁发起请求、源 IP 地址、时间戳以及与请求相关的其他详细信息的全面记录。
Amazon Bedrock 使用 CloudTrail 记录两类不同的事件:数据事件和管理事件。当涉及到数据事件时,CloudTrail 默认不将 Amazon Bedrock Runtime API 操作(InvokeModel和InvokeModelWithResponseStream)记录为数据事件。然而,它确实记录了与 Amazon Bedrock Runtime API 操作相关的所有代理操作,这些操作被归类为数据事件:
-
要记录
InvokeAgent调用,您需要在 CloudTrail 跟踪上配置高级事件选择器以记录AWS::Bedrock::AgentAlias资源类型的数据事件。 -
要记录
Retrieve和RetrieveAndGenerate调用,请配置高级事件选择器以记录AWS::Bedrock::KnowledgeBase资源类型的数据事件。
高级事件选择器允许创建针对监控和管理与管理和数据事件相关的 CloudTrail 活动的精确和细粒度过滤器。
数据事件提供了对资源操作(如读取或写入 Amazon Bedrock 知识库或代理别名等资源)的洞察。由于数据量较大,这些事件默认不记录,但可以通过高级事件选择器启用记录。
另一方面,管理事件捕获控制平面操作,例如创建、更新或删除 Amazon Bedrock 资源的 API 调用。CloudTrail 自动记录这些管理事件,为您的 Amazon Bedrock 环境中的管理活动提供全面的审计跟踪。
如果您想了解更多关于 CloudTrail 的信息,请查看 AWS 文档:docs.aws.amazon.com/awscloudtrail/latest/userguide/how-cloudtrail-works.html。
结合 AWS CloudTrail 和 Amazon Bedrock 可为您提供强大的审计和监控解决方案。通过捕获和分析 API 调用,您可以在 Amazon Bedrock 环境中保持可见性,确保遵守最佳实践,并迅速解决任何潜在的安全或运营问题。
EventBridge
Amazon EventBridge 提供了一种在近乎实时的情况下跟踪和响应事件的解决方案。它充当一个中央事件总线,从包括 Amazon Bedrock 在内的各种来源摄取和处理状态变化数据。每当您启动的模型定制作业的状态发生变化时,Bedrock 会向 EventBridge 发布一个新事件。此事件包含有关作业的详细信息,例如其当前状态、输出模型 ARN 以及任何失败消息。
这是您如何利用 Amazon EventBridge 的力量有效地监控 Amazon Bedrock 事件的方法:
-
事件流和交付:每当您启动的模型定制作业中发生状态变化时,Amazon Bedrock 会尽力发出事件。这些事件被流式传输到 Amazon EventBridge,它充当一个中央事件总线,从各种 AWS 服务和外部来源摄取和处理事件数据。
-
事件模式匹配:在 Amazon EventBridge 中,您可以根据特定的标准(如源服务、事件类型或作业状态)创建定义事件模式的规则。通过制定满足您需求的规则,您可以过滤和捕获仅与您的 Amazon Bedrock 工作流相关的事件。
-
自动响应和集成:一旦事件与您定义的规则匹配,Amazon EventBridge 就会将它路由到您指定的一个或多个目标。这些目标可以是各种 AWS 服务,例如 AWS Lambda 函数、Amazon 简单队列服务(SQS)队列或 Amazon 简单通知服务(SNS)主题。凭借这种灵活性,您可以根据事件数据触发自动化操作、调用下游工作流或接收通知。
-
监控和警报:Amazon EventBridge 的一个常见用例是为关键事件设置警报机制。例如,您可以配置一个规则,在模型定制作业失败时向指定的地址发送电子邮件通知,使您能够及时调查并解决问题。
-
事件数据丰富:Amazon Bedrock 发出的事件数据包含有关模型定制作业的宝贵信息,例如作业 ARN、输出模型 ARN、作业状态以及(如果适用)失败消息。通过利用这些数据,您可以构建针对特定需求的强大监控和警报系统。
要通过 Amazon EventBridge 接收和处理 Amazon Bedrock 事件,您需要创建 规则 和 目标。规则定义要匹配的事件模式,而目标指定当事件匹配规则时要采取的操作。让我们更深入地了解如何做到这一点:
-
要创建一个规则,请遵循以下步骤:
-
打开 Amazon EventBridge 控制台。
-
选择创建规则。
-
为您的规则提供一个名称。
-
选择事件模式,如图图 11**.21所示。
-
定义事件模式以匹配 Amazon Bedrock 事件(例如,将source设置为aws.bedrock,将detail-type设置为模型定制作业 状态变更)。
-

图 11.21 – 事件模式窗口
-
按照以下步骤配置目标:
-
选择目标类型(例如,AWS Lambda、Amazon SNS、Amazon SQS)。
-
指定目标资源(例如,Lambda 函数 ARN 或 SNS 主题 ARN)。
-
可选地,为目标添加额外的配置或转换。
-
一个实际用例是在您的模型定制作业状态发生变化时接收电子邮件通知。以下是您如何设置它的方法:
-
创建一个 Amazon SNS 主题。
-
将您的电子邮件地址订阅到 SNS 主题。
-
创建一个具有以下事件模式的 Amazon EventBridge 规则:
``` ```py{
"source": ["aws.bedrock"],
"detail-type": ["模型定制作业状态变更"]
}
-
将 SNS 主题设置为规则的目标。
使用此设置,每当您的 Amazon Bedrock 模型定制作业状态发生变化时,您都会收到电子邮件通知,让您了解作业进度和潜在故障。
此外,Amazon EventBridge 与 Amazon Bedrock 的集成还打开了各种高级用例,例如以下内容:
-
根据作业事件触发 Lambda 函数执行自定义操作(例如,向 Slack 频道发送通知、更新仪表板或触发下游工作流程)
-
将 Amazon Step Functions 与 Amazon Bedrock 集成,根据作业事件编排复杂的工作流程
-
将作业事件发送到 Amazon Kinesis 数据流进行实时处理和分析
-
将作业事件存档到 Amazon S3 或 Amazon CloudWatch 日志中,用于审计和合规性目的
通过利用 Amazon EventBridge 来监控和响应 Amazon Bedrock 事件,您可以增强机器学习操作的安全性、自动化和可见性。凭借定义自定义规则和集成各种 AWS 服务的能力,您可以创建一个符合您特定需求的强大且安全的环境。
摘要
在本章中,我们学习了各种评估和监控 Amazon Bedrock 模型的方法。
我们首先探讨了 Amazon Bedrock 提供的两种主要模型评估方法:自动模型评估和人工评估。自动模型评估过程涉及在内置或自定义数据集上运行评估算法脚本,评估准确度、毒性、鲁棒性等指标。另一方面,人工评估将人类输入纳入评估过程,确保模型不仅提供准确的结果,而且这些结果与实际世界的期望和要求相一致。
此外,我们还讨论了诸如fmeval和 Ragas 等开源工具,这些工具提供了针对 LLMs 和 RAG 管道的特定评估能力。
接下来,我们讨论了监控部分,我们讨论了如何利用 Amazon CloudWatch 来获取有关模型性能、延迟和令牌计数的宝贵见解。我们探讨了 Amazon Bedrock 提供的各种指标,并考虑了如何通过 CloudWatch 仪表板进行可视化和监控。此外,我们还介绍了模型调用日志,这是一个强大的功能,允许您捕获和分析所有模型调用的请求、响应和元数据。接下来,我们探讨了 Amazon Bedrock 与 AWS CloudTrail 和 EventBridge 的集成。CloudTrail 提供了您 AWS 环境中 API 调用的全面审计跟踪,使您能够监控并确保遵守最佳实践。另一方面,EventBridge 允许您在近乎实时的情况下跟踪和响应事件,使基于模型定制作业状态变化的自动化响应和集成成为可能。
在亚马逊,确保安全和隐私是首要任务,在今天的数字景观中也是如此。在下一章中,我们将探讨如何在 Amazon Bedrock 中确保安全和隐私。
第十二章:在 Amazon Bedrock 中确保安全和隐私
生成式 AI(GenAI)正在取得显著进展,使机器能够在各个领域产生类似人类的内容,包括文本、图像甚至代码。然而,人们对使用 GenAI 模型的风险和挑战以及数据处理方式存在担忧。在本章中,我们将探讨 Amazon Bedrock 的安全、隐私和限制措施。
在当今的数字景观中,确保数据隐私和安全是首要任务,Amazon Bedrock 已经实施了强有力的措施来应对这一关切。我们将探讨数据本地化、隔离和加密,并学习确保您的数据始终位于指定的 AWS 区域,不会被共享或存储,并通过强大的加密协议得到保护。然后,我们将了解 Amazon Bedrock 如何与 AWS IAM 集成,以提供对访问权限的细粒度控制,确保只有授权人员才能与您的资源交互。
此外,我们将讨论道德规范和限制措施,使您能够实施与安全和负责任的 AI 政策相一致的安全保障,例如内容过滤器、禁止话题、单词过滤器以及敏感信息过滤器。
本章将涵盖的关键主题包括:
-
安全和隐私概述
-
数据加密
-
AWS IAM
-
保护网络
-
网络流量
-
道德规范
-
Amazon Bedrock 的限制措施
技术要求
本章要求您拥有 AWS 账户访问权限。如果您还没有,可以访问aws.amazon.com/getting-started/创建 AWS 账户。
其次,您需要设置 AWS Python SDK(Boto3),您可以通过访问docs.aws.amazon.com/bedrock/latest/APIReference/welcome.html来完成此操作。
您可以以任何方式执行 Python 设置:在本地机器上安装它,或使用 AWS Cloud9,或利用 AWS Lambda,或利用 Amazon SageMaker。
备注
与 Amazon Bedrock 的 FMs 调用和定制相关的费用将会产生。请参阅aws.amazon.com/bedrock/pricing/以获取更多信息。
安全和隐私概述
Amazon Bedrock 的核心安全原则之一是,作为 Amazon Bedrock 的用户,您始终控制着自己的数据。您的数据永远不会与其他用户或客户共享,也永远不会用于改进或训练 FMs。让我们看看 Amazon Bedrock 提供的复杂保护层:
-
数据本地化:模型定制的推理数据或训练数据始终保留在您所使用的 AWS 区域内。这意味着所有 API 请求和数据处理都仅在该指定区域内进行,消除了数据迁移或超出指定边界暴露的风险。这种区域隔离确保您的数据永远不会离开指定的地理边界,因此您获得额外的保护层,并符合区域数据法规。
-
数据隔离:您用于模型定制的推理数据或训练数据存储在 Amazon S3 中,但永远不会保留在服务管理的账户中,消除了意外泄露、未经授权访问或第三方(包括模型供应商或 AWS 本身)滥用数据的风险。存储的唯一信息涉及操作指标,例如用于计费目的的使用数据和用于控制台功能的元数据。
-
加密:在加密数据方面,Amazon Bedrock 采用强大的加密协议来保护信息。服务内、外部的所有通信在传输过程中都进行了加密,最低要求为 TLS 1.2,并建议使用 TLS 1.3。此外,Amazon Bedrock 鼓励您使用自己的 KMS 密钥加密存储在 Amazon S3 存储桶中的定制训练数据和自定义模型,确保只有拥有正确凭证的授权方才能访问和使用这些资源。
-
IAM:Amazon Bedrock 与 AWS IAM 的集成赋予您对访问权限的细粒度控制。您可以有选择地允许或拒绝对特定模型、特定 API 调用、模型定制作业或 Amazon Bedrock 本身的访问。这种细粒度的访问控制确保只有授权人员才能与您的资源交互,最大限度地降低未经授权访问或意外修改的风险。
-
全面的监控和日志记录:正如我们在第十一章中看到的,透明度和可审计性是数据隐私和保护的基本组成部分。Amazon Bedrock 提供全面的监控和日志记录功能,因此您可以跟踪使用指标,使用 Amazon CloudWatch 构建自定义仪表板,并通过 AWS CloudTrail 监控 API 活动。这些功能为您提供了关于数据使用的宝贵见解,有助于故障排除并确保符合监管要求。
-
合规标准:Amazon Bedrock 致力于符合数据隐私和保护行业标准。它拥有多个认证,如GDPR(通用数据保护条例)、HIPAA(健康保险可携带性和问责制法案)、SOC(系统和组织控制)1、2 和 3、ISO(国际标准化组织)、STAR(安全信任保证和风险)以及PCI-DSS(支付卡行业数据安全标准)。全面的合规态势使您能够有信心地利用 Amazon Bedrock,知道您的数据受到保护,并且按照行业最佳实践和监管要求进行处理。
接下来,让我们看看如何通过数据加密来保护数据。
数据加密
如果您之前使用过 AWS 服务,您可能熟悉AWS 共享责任模型,其中 AWS 管理和负责保护底层云基础设施,而您负责保护在此基础设施上托管的数据和应用。如果您想了解 AWS 共享责任模型,您可以访问aws.amazon.com/compliance/shared-responsibility-model/。
当涉及到保护数据时,您可以使用 AWS KMS 对它们进行加密,或者您也可以在写入 AWS 资源之前在客户端进行加密。让我们看看您可以执行的不同资源的加密,以保护您的数据:
- 知识库:KMS 可用于加密知识库中处于传输状态的数据。在创建或更新数据源时,您可以提供 KMS 密钥的 ARN 来加密导入的数据,确保您的知识库内容的机密性。图 12.1展示了可用于与 KMS 一起使用的高级设置。

图 12.1 – 用于临时数据存储的 KMS 密钥
如前图所示,当您创建或更新知识库的数据源时,您可以指定是否使用默认的 AWS 管理的 KMS 密钥或自定义加密设置,在那里您可以选择自己的客户管理的 KMS 密钥。知识库的加密可以在多个阶段发生。在数据导入阶段,Bedrock 使用 KMS 加密密钥来保护临时数据存储。这种临时存储有助于安全地导入您的数据源,确保您的信息在传输过程中保持受保护。
如果您将 OpenSearch 配置为知识库的向量索引,传递给此服务的信 息也将使用 KMS 密钥进行加密,提供额外的安全层。此外,Bedrock 将其加密功能扩展到与您的知识库相关的以下资源:
-
S3 存储桶中的数据:通过使用 KMS 密钥加密这些资源,您可以确保您的宝贵数据保持机密性,并且不会被未经授权的第三方访问。
您可以通过附加以下 IAM 策略到 Amazon Bedrock 服务角色,允许 Amazon Bedrock 解密 S3 存储桶中的数据:
{"Version": "2012-10-17","Statement": [{"Effect": "Allow","Action": ["KMS:Decrypt"],"Resource": ["arn:aws:kms:region:account-id:key/key-id"],"Condition": {"StringEquals": {"kms:ViaService": ["s3.region.amazonaws.com"]}}}]}请注意,您需要更新策略中的资源,使用 KMS 密钥的 ARN。
-
第三方向量存储:如果您利用外部向量存储,Bedrock 允许您使用 KMS 密钥加密它们,从而在多个平台上保持您知识库的安全性和完整性。
更多详情和知识库资源所需的 IAM 权限,您可以查看
docs.aws.amazon.com/bedrock/latest/userguide/encryption-kb.html。 -
模型定制:在创建模型定制资源时,了解平台在处理数据过程中的处理方式至关重要。首先,Amazon Bedrock 不会使用训练数据来改进基础 FM,并且也永远不会被任何模型提供商访问。在创建定制作业时,Amazon Bedrock 会创建 FM 的副本,并使用您的数据来微调该副本模型。重要的是,您的训练数据不会用于训练基础 FM 本身,也不会被共享或被模型提供商看到。
此外,Amazon Bedrock 还采取措施保护您数据的机密性。一旦微调过程完成,服务不会存储您的训练或验证数据。然而,值得注意的是,微调模型在输出生成过程中可能会无意中重现训练数据的一部分。为了降低这种风险,建议在启动定制过程之前,从您的训练数据中过滤掉任何敏感或机密信息。
关于定制作业的加密选项,默认情况下,自定义模型使用 AWS 管理的 KMS 密钥进行加密。或者,您可以使用自己的客户管理的 KMS 密钥,这为您提供了对数据加密的更多控制。要使用客户管理的密钥,您需要创建密钥,附加一个基于资源的策略以授予适当的权限,并在创建定制作业时指定该密钥:
{"Version": "2012-10-17","Id": "KMS Key Policy","Statement": [{"Sid": "Permissions for custom model builders","Effect": "Allow","Principal": {"AWS": "arn:aws:iam::account-id:user/role"},"Action": ["kms:Decrypt","kms:GenerateDataKey","kms:DescribeKey","kms:CreateGrant"],"Resource": "*"},{"Sid": "Permissions for custom model users","Effect": "Allow","Principal": {"AWS": "arn:aws:iam::account-id:user/role"},"Action": "kms:Decrypt","Resource": "*"}}此策略为两个不同的角色授予了与 KMS 密钥管理相关的特定权限:
account-id和user/role占位符,分别使用您的实际 AWS 账户 ID 和适当的 IAM 用户或角色名称。 -
基础代理加密:关于 Amazon Bedrock 的代理,默认情况下,Amazon Bedrock 使用 AWS 管理的密钥。然而,您可以使用自己的客户管理的密钥加密代理资源。
首先,您需要将基于身份的策略,例如以下内容,附加到 IAM 用户或角色上,以便 Amazon Bedrock 可以对 Bedrock 代理资源进行加密/解密:
{"Version": "2012-10-17","Statement": [{"Sid": "Allow Bedrock to encrypt/decrypt the bedrock agent resources ,"Effect": "Allow", "Action":["kms:GenerateDataKey","kms:Decrypt"],"Resource": "arn:aws:kms:${region}:${account-id}:key/${key-id}","Condition": {"StringEquals": {"kms:EncryptionContext:aws:bedrock:arn": "arn:aws:bedrock:${region}:${account-id}:agent/${agent-id}"}}}]}此外,请确保 KMS 密钥具有以下链接中提到的权限:https://docs.aws.amazon.com/bedrock/latest/userguide/encryption-agents.html。
-
Guardrails 加密:默认情况下,Amazon Bedrock 使用 AWS 管理的加密密钥来保护您的 guardrails。但是,您可以选择使用自己的客户管理的 KMS 密钥以增强控制和定制。要为您的 guardrail 创建客户管理的 KMS 密钥,您需要在您的 AWS 账户中拥有必要的权限。有关创建客户管理密钥后需要设置的权限的更多详细信息,您可以查看以下链接:https://docs.aws.amazon.com/bedrock/latest/userguide/guardrails-permissions.html。
现在,我们已经了解了 Amazon Bedrock 的加密选项,让我们看看我们如何可以为用户和 AWS 资源授予对 Amazon Bedrock 所需的权限。
AWS IAM
使用 IAM,您可以为指定的用户或资源提供对 Amazon Bedrock 及其功能的唯一安全访问。IAM 允许您创建用户账户并将权限分配给这些账户,从而确定他们可以在特定资源上执行哪些操作。以下是 IAM 与 Amazon Bedrock 一起工作的关键要点:
-
身份:IAM 支持各种类型的身份,包括 IAM 用户、组和角色。用户代表个人或应用程序,组是用户的集合,而角色是由受信任实体假定以获得临时访问权限的。
-
身份验证:为了安全地使用 Amazon Bedrock,您必须首先通过身份验证证明您的身份。这可以通过作为 AWS 根用户、IAM 用户或假定 IAM 角色登录来实现。此外,您还可以使用外部身份进行身份验证,例如 SAML(安全断言标记语言)身份验证 提供者(IdP)。这些外部身份被传递给 IAM,然后 IAM 授予您对 Amazon Bedrock 的访问权限。您的管理员将已设置特殊角色以启用此访问。
或者,您可以使用社交媒体账户,如 Google 或 Facebook,来验证并获取对 Amazon Bedrock 的访问权限。同样,您的管理员将已配置必要的角色和权限以允许这种验证方式。
-
bedrock。例如,操作可以是bedrock:InvokeModel或bedrock:InvokeModelWithResponseStream。 -
策略资源:策略可以使用 ARN 指定 Bedrock 资源以授予或拒绝访问。
-
策略条件键:条件键添加了一个额外的控制层,允许您指定策略适用的条件,例如资源标签。
-
跨账户访问:
-
角色可用于在不同 AWS 账户之间授予对 Bedrock 资源的访问权限
-
转发访问会话(FAS)使 Bedrock 能够在您的 behalf 在其他服务中执行操作,同时保持您的权限。
-
通过理解和正确配置 Amazon Bedrock 的 IAM,您可以确保只有授权的个人和应用程序可以访问您的资源,从而最大限度地降低数据泄露和未经授权访问的风险。
让我们看看一些可以与 Amazon Bedrock 一起使用的 IAM 策略模式。
拒绝访问
使用 IAM,您可以允许或拒绝对模型执行操作。例如,用户或角色可能被拒绝调用特定模型,但他们可以列出模型:
{
"Version": "2012-10-17",
"Statement":
{
"Sid": "DenyInference",
"Effect": "Deny",
"Action": "bedrock:InvokeModel",
"Resource": "arn:aws:bedrock:::foundation-model/<model-id>"
}
}
上述 IAM 策略显示了Deny操作,其中拒绝了对特定模型的调用。例如,基础设施团队可能被授予为特定模型提供计算能力的权限,同时被限制在该模型上执行推理。相反,数据科学团队可能仅被允许对一组预先批准的模型执行推理。
最小权限原则
开发者团队正在开发一个项目,其中只需要对图像生成模型和列出任何 FM 进行访问。然后,您可以应用以下策略:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "Bedrock Invoke model",
"Effect": "Allow",
"Action": "bedrock:InvokeModel",
"Resource": "arn:aws:bedrock:us-east-1::foundation-model/amazon.titan-image-generator-v1",
"Condition": {
"StringLike": {
"aws:ResourceTag/Env": "Dev"
}
}
},
{
"Sid": "List FMs",
"Effect": "Allow",
"Action": "bedrock:ListFoundationModels",
"Resource": "*",
"Condition": {
"StringLike": {
"aws:ResourceTag/Env": "Dev"
}
}
}
]
}
在此策略中,允许在arn:aws:bedrock:us-east-1::foundation-model/amazon.titan-image-generator-v1资源上执行bedrock:InvokeModel操作,前提是Env资源标签设置为Dev。其次,允许在所有资源(*)上执行bedrock:ListFoundationModels操作,前提是Env资源标签设置为Dev。
最小权限原则最小化了潜在的攻击面,并降低了意外访问或数据泄露的风险。让我们看看最佳实践和实施步骤,以帮助您审计访问并强制执行最小权限原则:
-
审查和分析 访问模式:
-
定期审查 AWS CloudTrail 日志,以了解您环境中用户和资源执行的操作
-
使用 IAM 访问分析器等工具根据实际使用模式生成策略,确保权限与实际需求相匹配
-
利用 IAM 访问顾问识别未使用的权限并将它们从策略中删除,以减少攻击面
-
-
实施细粒度 权限策略:
-
创建细粒度的权限策略,仅授予特定工作角色或功能所需的必要操作和资源
-
考虑将 AWS 管理的策略作为常见工作功能的起点,然后根据需要自定义它们
-
定期审查和修剪过度宽容的策略,以符合最小权限原则
-
-
限制对 生产环境的访问:
-
确保用户对生产环境有有限的访问权限,仅在存在有效用例时授予访问权限
-
用户完成特定任务后,立即撤销生产访问权限
-
-
利用 权限边界:
-
实施权限边界,这些是管理策略,它们设置基于身份的策略可以授予 IAM 实体的最大权限
-
使用权限边界来强制执行组织范围内的访问控制并防止意外的权限提升
-
-
利用资源标签进行 访问控制:
-
使用资源标签实现 ABAC 模型,这允许您根据资源属性(如目的、所有者或环境)来授予访问权限
-
将资源标签与权限策略结合使用,以实现细粒度的资源访问,而无需过于复杂的自定义策略
-
-
在 AWS Organizations 中实施服务控制策略:
-
使用服务控制策略集中控制 AWS 组织中成员账户的最大可用权限
-
使用服务控制策略在成员账户中限制 root 用户的权限
-
考虑使用 AWS Control Tower 进行规定性管理控制和定义自己的自定义控制
-
-
建立用户生命周期 策略:
-
定义并实施用户生命周期策略,概述在用户入职、角色变更或不再需要访问 AWS 时执行的任务
-
在用户生命周期的每个阶段进行定期权限审查,以防止权限蔓延
-
-
安排定期的 权限审计:
-
建立定期审查用户权限并删除任何不必要的或过度权限的日程安排
-
利用 AWS Config 和 IAM 访问分析器等工具协助审计用户权限并识别潜在问题
-
-
开发工作 角色矩阵:
-
创建一个工作角色矩阵,以可视化您在 AWS 脚印内所需的各个角色和访问级别。
-
使用组来根据组织内部用户的责任来分隔权限,而不是直接将权限应用于单个用户或角色。
-
通过遵循这些最佳实践并实施必要的步骤,您可以有效地审计访问权限并确保最小权限原则得到执行。
模型定制
当处理模型定制时,Amazon Bedrock 需要代表您假定 AWS IAM 角色,以启动微调作业。这要求您在 Amazon Bedrock 和您希望使用的 IAM 角色之间建立信任关系。
要设置这种信任关系,您需要将信任策略添加到您希望用于模型定制的 IAM 角色。信任策略授予 Amazon Bedrock 代表您执行必要操作的权限。
下面是您需要添加到 IAM 角色的信任策略示例:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Service": "bedrock.amazonaws.com"
},
"Action": "sts:AssumeRole"
}
]
}
此信任策略指定 AWS 服务 bedrock.amazonaws.com(代表 Amazon Bedrock)可以通过调用 sts:AssumeRole 操作来假定该角色。
要将此信任策略添加到您的 IAM 角色,您可以按照以下步骤操作:
-
打开 AWS 管理控制台,导航到 IAM 服务。
-
在左侧导航面板中,点击 角色。
-
找到您想要用于模型定制的角色,如果需要,可以创建一个新角色。
-
点击角色名称以打开角色详细信息。
-
在 信任关系 选项卡中,点击 编辑信任 策略 按钮。
-
将现有的政策文档替换为提供的信任策略。
-
点击 更新策略 按钮以保存更改。
通过添加此信任策略,您在 Amazon Bedrock 和您的 IAM 角色之间建立了一个安全的信任关系,允许 Amazon Bedrock 假定该角色并代表您执行模型定制的必要操作。
接下来,定制过程所需的必要权限包括访问存储在 S3 桶中的训练和验证数据,以及 Amazon Bedrock 应该交付微调作业结果的输出路径。要了解更多关于模型定制所需权限的信息,您可以点击以下链接:https://docs.aws.amazon.com/bedrock/latest/userguide/model-customization-iam-role.html。
现在我们已经了解了 Amazon Bedrock 需要的 IAM 策略模式,让我们来看看网络安全方面。
保护网络安全
在前面的章节中,我们探讨了数据加密技术。从网络角度保护数据的一个额外措施是使用Amazon VPC进行模型定制,并为您的负载创建一个安全、隔离的环境。通过这样做,您可以获得对网络流量的细粒度控制,从而能够使用 VPC 流日志监控和调节所有传入和传出的数据流。以下图显示了在创建微调或继续预训练作业时可以指定的 VPC 设置。

图 12.2 – VPC 设置
此外,Amazon Bedrock 与 AWS PrivateLink集成,因此您可以在您的 VPC 和 Amazon Bedrock 服务之间建立私有连接。此连接通过创建 VPC 接口端点来实现,本质上是为流向 Amazon Bedrock 的流量提供的私有入口点。此外,Amazon Bedrock 不使用公共 IP 地址或互联网网关,确保您的数据永远不会穿越公共互联网,从而最大限度地减少潜在的网络威胁。
为了进一步增强安全性,您可以实施端点策略,这些策略可以附加到您的 VPC 接口端点。这些策略使您能够精确定义授权执行指定资源上特定操作的实体(AWS 账户、IAM 用户和 IAM 角色)。通过定制端点策略,您可以精细控制从您的 VPC 内部授予 Amazon Bedrock 的访问权限,从而有效地加固您的安全态势。
这里是一个示例 VPC 端点策略,它允许任何人("Principal": "*")执行 Bedrock 的InvokeModel和InvokeModelWithResponseStream操作:
{
"Version": "2012-10-17",
"Statement": [
{
"Principal": "*",
"Effect": "Allow",
"Action": [
"bedrock:InvokeModel",
"bedrock:InvokeModelWithResponseStream"
],
"Resource":"*"
}
]
}
现在,让我们看看幕后网络流的样子。
网络流
我们已经探讨了如何在 Amazon 中使用加密以及如何在您处于 Amazon VPC 时通过 AWS PrivateLink 来保护网络。现在,让我们看看调用和模型定制作业背后的网络和数据流工作。
按需架构
在按需模式下,您与其他用户共享模型的计算环境,并按使用情况计费,没有任何长期承诺。图 12.3显示了 Amazon Bedrock 使用的按需网络架构概述。

图 12.3 – 按需计算环境架构
让我们详细理解这个图:
-
在中间,我们看到了Amazon Bedrock 服务账户,该账户作为所有传入请求的入口点。该账户由 Amazon 管理和控制,确保对服务的安全可靠访问。Amazon Bedrock 服务负责处理这些传入请求并将它们路由到适当的运行时推理环境。此环境旨在处理和执行在部署的模型上请求的操作。
-
在右侧,我们看到了模型部署账户,该账户由 Amazon 拥有和运营。有趣的是,对于每个模型提供者和 AWS 区域组合,都有一个这样的账户。这种隔离确保没有任何模型供应商可以访问或篡改其他供应商的数据或模型,从而增强安全和隐私。在模型部署账户中,我们找到了按需计算资源,这些资源根据传入的工作量动态配置和扩展。此外,此账户还托管了存储在 S3 存储桶中的基础模型,这些存储桶存储了这些 FM。
推理请求的流程如下:
-
用户发起一个请求,该请求被 Amazon Bedrock 服务账户的 API 端点接收。
-
请求使用 AWS IAM 服务进行身份验证和授权。
-
一旦验证,请求就会被转发到运行时推理环境。
-
运行时推理组件与模型部署账户内的相关计算集群交互,获取所需的模型并执行请求的操作。
-
结果随后通过 Amazon Bedrock 服务账户安全地返回给用户。
在整个过程中,有几种措施在位以确保数据安全和隐私:
-
所有内部流量都使用 TLS 1.2 或更高版本的加密标准进行加密。
-
在 Amazon Bedrock 服务账户中不存储或持久化任何客户数据。
-
使用 AWS CloudTrail 和 Amazon CloudWatch 服务维护详细的日志和审计跟踪。
-
模型供应商,包括 Amazon 自己的模型如 Titan,不能访问或影响模型部署账户中的客户数据或模型
现在,让我们看看配置的吞吐量容量架构。
配置的吞吐量架构
配置的吞吐量允许您购买用于基础或定制模型的模型单元,这些模型单元是为需要保证吞吐量的大规模推理工作负载设计的。
模型单元是 Amazon Bedrock 配置的吞吐量功能中的一个关键概念,旨在为 LLM 推理提供一致和可扩展的性能。可以将模型单元视为运行特定模型所分配的底层 GPU 硬件资源的一部分表示。它不是所有模型的标准度量,而是模型特定的。
这些模型单元是亚马逊 Bedrock 中特定基模型的计算资源购买分配。每个模型单元提供保证的吞吐量水平,以每分钟处理的令牌数来衡量。这适用于输入和输出令牌。通过使用模型单元,您可以确保高容量 AI 工作负载的稳定性能,并根据您的需求灵活扩展资源。
图 12.4显示了亚马逊 Bedrock 使用的配置吞吐量架构概述。

图 12.4 – 配置吞吐量计算架构
与按需架构类似,我们有亚马逊 Bedrock 服务账户作为传入请求的入口点。该账户由亚马逊管理,确保对服务的安全访问。以下是前面图示的分解:
-
在模型部署账户中,我们发现有两个不同的组件:基础模型 S3 存储桶和自定义模型 S3 存储桶。基础模型存储桶存储由亚马逊和其他供应商(如 AI21、Cohere 等)提供的基模型,而自定义模型 S3 存储桶存储定制模型或针对个别需求定制的基模型副本。
-
运行时推理组件负责处理传入的请求并确定处理请求操作适当的计算环境。此决策基于请求是针对基模型还是自定义模型。
在配置吞吐量模式下,可以通过调用InvokeModel API 或InvokeModelWithResponseStream API 并指定modelId为配置吞吐量模型 ARN 来执行推理。对于配置容量计算环境的推理请求流程如下:
-
客户发起请求,该请求由亚马逊 Bedrock 服务账户的 API 端点接收。
-
请求使用 AWS IAM 服务进行身份验证和授权。
-
一旦验证通过,请求将被转发到运行时推理组件。
-
运行时推理组件分析请求并确定它是否为基模型或自定义模型。
-
如果请求是针对自定义模型的,运行时推理组件将请求定向到与该客户或模型关联的专用配置吞吐量计算环境。
-
配置吞吐量计算环境在指定的自定义模型上执行请求的操作,并返回结果。
-
计算结果随后通过亚马逊 Bedrock 服务账户安全地返回给客户。
配置容量架构与按需架构共享一些关键特性,包括以下内容:
-
使用 TLS 1.2 或更高加密标准加密内部流量。
-
在亚马逊 Bedrock 服务账户内没有客户数据存储或持久化。
-
通过 AWS CloudTrail 和 Amazon CloudWatch 服务进行详细的日志记录和审计
-
严格的隔离和访问控制,确保模型供应商无法访问或影响客户数据或模型
从开发者的角度来看,如果您使用的是按需或预配吞吐量模式,调用基线模型或定制模型的流程是无缝的。
现在,让我们来看看模型定制的架构概述。
模型定制架构
模型定制是我们对针对特定领域用例定制的基础模型进行微调或继续预训练的地方。图 12.5提供了 Amazon Bedrock 采用的模型定制架构概述。

图 12.5 – 模型定制架构
让我们看看步骤:
-
该过程从用户通过 Amazon Bedrock 服务账户的 API 端点发起请求开始。该账户由 Amazon 管理,并作为所有传入请求的安全入口点。
-
Amazon Bedrock 服务账户将请求路由到训练编排组件,该组件在 Amazon 拥有和运营的相关模型部署账户内编排定制过程。
-
训练编排组件启动一个 Amazon SageMaker 训练作业,该作业负责实际的模型定制过程。Amazon SageMaker 是 AWS 机器学习服务,您可以在其中构建、训练、部署和监控机器学习模型。如果您对 SageMaker 感兴趣,这里有一本由 Julien Simon 撰写的有趣书籍:《学习 Amazon SageMaker:开发者与数据科学家构建、训练和部署机器学习模型的指南》,可在 https://www.amazon.com/Learn-Amazon-SageMaker-developers-scientists/dp/180020891X 找到。
模型部署账户中的训练作业利用以下资源:
-
基础模型 S3 桶,其中存储了 Amazon 和其他供应商(来自 Meta、Cohere 和 AI21)提供的基线模型。
-
用户的训练数据,安全地从用户账户内的 S3 桶中检索,可选地通过 VPC 连接以增强安全性。
-
-
在训练过程中,用户的训练数据用于定制所选的基础模型,创建一个符合您需求的定制版本。
-
训练作业完成后,定制模型将被加密并存储在模型部署账户内的定制模型 S3 桶中。
-
重要的是要注意,模型供应商在任何时候都无法访问或查看用户的训练数据或生成的定制模型。
-
此外,训练作业生成输出指标和日志,这些指标和日志在初始请求期间由用户指定的 S3 桶安全地交付。
模型定制架构整合了多项安全和隐私措施:
-
严格的访问控制和隔离确保模型供应商无法访问您的数据或定制模型
-
您的训练数据将从您的账户安全检索,无论是直接从 S3 存储桶还是通过 VPC 连接
-
加密用于在存储和传输过程中保护定制模型
-
通过 CloudTrail、IAM 和 CloudWatch 服务提供详细的日志记录和审计
通过利用这种架构,Amazon Bedrock 允许您根据特定需求定制基础模型,同时保持严格的数据隐私和安全标准。责任分离和安全的处理机制确保在整个定制过程中敏感信息得到保护。有关如何将模型适应您独特需求的更详细探索,请参阅第四章。
现在,我们已经了解了安全和网络流组件,让我们来看看道德实践,其中我们涵盖了与 GenAI 相关的挑战和风险。
道德实践
GenAI 取得了快速进步,但同时也带来了新的挑战和风险。以下是一些例子:
-
提供商是否会使用我的数据?
-
这会不会损害公司的法律权利?
-
模型在生产过程中会幻觉并提供非理性、有偏见或事实错误的结果吗?
-
GenAI 模型在训练或生成过程中是否会无意中使用或复制知识产权,例如受版权保护的文本或图像?
让我们来看看这些挑战和可以采用的最佳实践。
真实性
真实性,即 AI 模型生成信息的真实性和准确性,是 GenAI 领域道德实践的一个关键方面。当模型产生可验证为虚假或幻觉的输出时,可能会导致错误信息的传播并损害对技术的信任。幻觉的一个常见例子是,当 AI 模型被要求提供关于特定主题的信息,例如某位作者的学术论文时。模型不会搜索和检索实际引用,而是倾向于生成看似合理但实际上并不对应于已发表作品的虚构论文标题、主题和合著者姓名。
为了减轻幻觉的风险并提高真实性,可以采用以下最佳实践:
-
提示工程:向 AI 模型提供清晰和具体的指令可以帮助引导它生成更准确和真实的输出。精心设计的提示,明确定义所需输出并提供相关背景信息,可以降低幻觉的可能性。
-
提供更多背景信息:如 RAG、持续预训练、微调和使用代理等技术,可以通过提供额外的背景信息和外部来源的知识,帮助将模型输出建立在事实信息的基础上。
-
推理参数调整:调整温度、Top P 和 Top K 等参数,这些参数控制模型输出的随机性,可以帮助在创造力和事实准确性之间取得平衡,减少幻觉的可能性,同时仍然允许生成新颖和有用的内容。如果您想了解更多关于这些参数的信息,请参阅第二章。
通过实施这些最佳实践并持续验证人工智能生成内容的真实性,我们可以促进对生成式人工智能(GenAI)模型的信任,并确保它们在各种领域的负责任和道德部署。
知识产权
早期大型语言模型(LLM)的一个主要挑战是它们倾向于直接重复或复制它们训练过的文本数据的一部分。这引发了隐私问题,因为训练数据可能包含敏感或个人信息。这也引发了版权问题,因为模型可能在未经许可的情况下再现受版权保护的内容。这个问题的根本原因在于这些 LLM 的训练方式。它们接触到了来自各种来源的大量数据,包括书籍、网站和数据库,其中许多是受版权保护的作品。然而,这些数据被摄入时没有追踪来源或获得适当的许可。因此,在生成文本时,模型可能会原封不动地重复其训练数据中的句子或段落,无意中暴露了受版权保护的内容或个人信息。解决这个问题需要更强大的过滤训练数据、追踪来源和为训练这些强大的语言模型使用的材料获得适当许可的技术。以下是一些关键考虑因素:
-
透明度:人工智能提供商应对其模型使用的训练数据保持透明,披露潜在的受版权保护材料的来源,并承认其系统在处理知识产权方面的局限性。
-
合理使用:虽然某些用于训练人工智能模型的受版权保护材料的用途可能属于合理使用例外情况,但仔细评估这种使用的范围和性质对于避免潜在的侵权至关重要。
-
许可和权限:在可能的情况下,人工智能开发者应获得适当的许可或权限来使用其训练数据中的受版权保护材料,确保对权利所有者进行适当的归属和补偿。
-
内容过滤:实施强大的内容过滤机制可以帮助降低在人工智能系统输出中再现受版权保护材料的风险。这可能涉及水印、指纹和其他内容识别技术等技术。
-
人工监督:结合人工监督和审查流程可以帮助识别和解决人工智能系统输出中可能出现的版权侵权或未经授权使用知识产权的情况。
安全性和毒性
毒性和安全性也是开发和部署人工智能系统时的重要考虑因素,尤其是涉及语言生成模型的情况。有毒输出可能会持续造成伤害,传播错误信息,并损害这些系统的信任和完整性。因此,实施强有力的措施来减轻毒性和维护安全是必要的。以下是一些解决这些问题的关键点:
-
内容过滤:实施严格的过滤器,排除与个人医疗、法律、政治或财务事项相关的建议或信息,以及制造武器或参与非法活动的指令,这是至关重要的。如果没有适当的监管,此类内容可能会造成直接伤害或导致危险行为。
-
防护措施:实施防护措施,如内容过滤、偏见检测和有毒语言识别,可以帮助防止生成有害或不适当的内容。持续监控和更新这些防护措施是必要的,以适应不断变化的语言模式和潜在的滥用。在下一节中,我们将介绍亚马逊 Bedrock 提供的防护措施。
-
数据策划:仔细策划和审查用于语言模型的训练数据,以最大限度地减少偏见的传播、有毒语言或事实不准确性的传播。对训练数据进行定期的审计和更新可以帮助随着时间的推移提高模型性能和安全。
-
水印和可追溯性:在生成内容中嵌入水印或可追溯的标识符,有助于归属和问责制,阻止滥用并能够迅速应对涉及有毒或有害内容的事件。有关亚马逊 Bedrock 的水印检测的更多详细信息,请参阅第九章。
-
负责任的 AI 政策:组织应实施和建立强有力的负责任 AI 政策、指南和最佳实践。这些政策应优先考虑道德考量、透明度、问责制以及用户和社会的福祉。
我们建议您阅读迈克尔·基恩斯(Michael Kearns)撰写的博客文章《生成时代负责任的 AI》(www.amazon.science/blog/responsible-ai-in-the-generative-era)。这篇文章讨论了围绕公平性、毒性、幻觉、知识产权侵犯等问题所面临的挑战,以及技术社区为解决这些挑战所进行的积极工作,包括精心策划训练数据、开发防护模型以过滤输出、水印方法以及利用更专注的使用案例。
现在,让我们看看亚马逊 Bedrock 提供的防护措施,以解决我们讨论的一些问题。
亚马逊 Bedrock 的防护措施
通过 Amazon Bedrock 的护栏,组织可以实现与安全和负责任的 AI 政策相一致的安全措施。这些安全措施提供了一层额外的控制,补充了 FMs 中内置的现有保护。您可以将这些护栏应用于 Amazon Bedrock 中可用的所有 FMs,以及您为 Amazon Bedrock 创建的任何微调模型和代理。让我们看看在以下情况下实施护栏将如何成为各种行业的需求:
-
医疗保健行业:
-
在医疗聊天机器人或虚拟助手中,可以使用护栏来防止未经授权交换与自我诊断、处方药物或医疗建议相关的信息
-
在分析医疗记录或成像数据的应用中,可以采用护栏来删除敏感的患者信息,并确保符合如 HIPAA 之类的隐私法规
-
-
法律行业:
-
在法律文档分析工具中,可以使用护栏来防止律师和客户之间机密通信的披露
-
在法律研究或合同审查应用中,可以实施护栏以防止生成误导性或法律上不符合规范的内容
-
-
金融行业:
-
在金融应用中,可以使用护栏来防止生成与股票推荐、投资建议或内幕交易相关的内容
-
在处理金融交易或客户数据的应用中,可以使用护栏来删除敏感信息,如账户号码或信用卡详情
-
-
媒体和娱乐行业:
-
在内容生成应用中,可以使用护栏来防止创建受版权保护的材料、仇恨言论或可能违反内容指南或社区标准的露骨内容
-
在与广播媒体相关的应用中,可以实施护栏以确保遵守严格的监管指南,防止版权侵权,并维持适当的内容标准
-
-
零售和电子商务行业:
-
在电子商务平台上,可以通过删除个人信息和防止未经授权访问或显示敏感数据(如支付详情或送货地址)来保护客户隐私
-
在产品推荐或客户服务应用中,可以使用护栏来防止推广有害或非法产品,确保符合当地法规和行业标准
-
现在,让我们了解 Amazon Bedrock 的护栏是如何工作的。
Amazon Bedrock 的护栏是如何工作的?
护栏通过四个策略过滤器检查用户输入提示和相应的模型响应,如图12**.6所示。

图 12.6 – Amazon Bedrock 护栏的工作原理
亚马逊 Bedrock 的防护栏在 Bedrock 控制台的 防护措施 部分可用。当你创建防护栏时,你将被要求配置四个策略过滤器和一条阻止消息。亚马逊 Bedrock 的四个策略过滤器如下列出:
-
内容过滤器
-
被拒绝的主题
-
单词过滤器
-
敏感信息过滤器
根据你选择的策略过滤器,输入提示和模型响应都会被严格审查,以符合每个配置的策略。
如果检测到任何策略违规,无论是输入提示还是响应,Guardrails 组件将通过覆盖违规内容进行干预。有关更多详细信息,请参阅 阻止 消息 子部分。
让我们更深入地探讨每个策略过滤器。
内容过滤器
使用 内容过滤器,你可以配置阈值以检测和阻止各种类别中的有害内容。你可以调整提示和响应的过滤强度,以实现对内容过滤严格度的细粒度控制,如 图 12.7 所示。

图 12.7 – 配置内容过滤器
涵盖的类别包括仇恨言论、侮辱、色情内容、暴力、不当行为和提示攻击,允许你解决广泛的风险。过滤强度越高,在给定类别中过滤出潜在有害内容的可能性就越高,提供了一种灵活的方式来平衡风险缓解和内容可访问性。
在实施内容过滤器时,考虑你的用例、目标受众和道德规范是至关重要的。对于服务于易受伤害的群体或处理敏感主题的应用程序,可能需要更高的过滤强度,而对于某些创意或教育环境,可能更适合更宽松的方法。此外,根据不断变化的社会规范和组织政策定期审查和更新你的过滤配置也是推荐的。通过利用内容过滤器,你可以主动减轻有害内容生成的风险,鼓励一个更加值得信赖和负责任的人工智能生态系统。
被拒绝的主题
被拒绝的主题 允许你主动防止你的应用程序与或生成与特定主题相关的可能在你用例中被认为是不受欢迎或不适当的内 容。
你可以通过为每个你希望限制的主题提供一个简洁的名称和清晰的自然语言描述来定义最多 30 个被拒绝的主题。这些作为检测和阻止用户输入或模型响应的基础,确保了过滤机制的持续和可靠。
当指定一个被拒绝的主题时,建议提供一个全面的定义,以捕捉你想要排除的主题内容的本质,围绕所有相关的查询、指导或建议。
例如,在医疗保健领域,维护患者隐私和遵守严格的伦理指南非常重要。医院或医疗机构可以利用被拒绝的主题来防止模型参与有关可能违反患者隐私或医疗伦理的特定主题的讨论或提供信息。
一个可能被拒绝的主题可能是披露患者信息,其定义大致为未经适当授权,分享或透露患者的个人细节、医疗记录或任何识别信息。
另一个相关的被拒绝主题可能是未经授权的医疗建议,定义为在没有成为有执照的医疗保健专业人员或无法访问患者完整医疗史的情况下,提供诊断评估、治疗建议或任何形式的医疗指导。
图 12.8展示了如何添加被拒绝的主题。

图 12.8 – 添加被拒绝的主题
单词过滤器
通过配置单词过滤器,您可以有效地阻止不希望出现的单词、短语和粗口,从而促进积极和包容的用户体验。以下是操作方法:
-
粗口过滤器提供了一种方便的方式来阻止预定义的常用粗口词汇列表。这个列表基于全球对粗口的定义,并会定期更新,确保过滤器与不断变化的社会规范保持一致。
-
此外,您可以通过指定最多 10,000 个应被阻止的自定义单词和短语来自定义单词过滤体验。这种灵活性允许您根据特定需求定制过滤器,例如排除冒犯性术语、竞争对手名称或任何可能被认为不适合您用例的语言。
-
可以通过各种方便的方法添加自定义单词和短语,包括在控制台中手动输入、上传本地文件(例如,
.txt或.csv)或从 Amazon S3 对象中填充列表,从而在管理单词过滤器列表方面提供灵活性。
图 12.9展示了如何使用不同的选项配置单词过滤器。

图 12.9 – 添加单词过滤器
通过使用单词过滤器,您可以为您用户创建一个更加可控和包容的环境。例如,一个教育平台可以阻止冒犯性语言以促进积极的学习氛围,而一个企业应用可能过滤掉竞争对手的名称以维护品牌完整性并避免潜在冲突。
敏感信息过滤器
敏感信息过滤器允许您主动识别并对各种类型的个人身份信息(PII)和自定义定义的敏感数据模式采取适当的行动。
防护栏提供了一系列预定义的 PII 类型,涵盖了广泛的敏感信息,如姓名、地址、电子邮件地址、电话号码、信用卡详情和社保号码。这些 PII 类型会不断更新,以确保符合不断变化的法规和隐私规范。要获取完整列表,您可以访问 docs.aws.amazon.com/bedrock/latest/userguide/Guardrails-sensitive-filters.html。
当检测到敏感信息时,您可以配置防护栏以阻止或屏蔽内容:
-
阻止模式:这阻止敏感信息被处理。如果应用于输入,它将阻止包含敏感数据的提示到达模型。如果应用于输出,它将阻止包含敏感信息的模型响应到达用户。
-
123-45-6789可能会被替换为[SSN]。这确保了隐私,同时保留了内容的整体上下文。
此外,您还可以定义自定义正则表达式(regex)模式来过滤与您的组织或用例相关的特定类型的敏感信息。这种灵活性允许您保护专有数据,例如序列号、预订 ID 或任何其他需要保护的关键信息。例如:
-
^ABC-\d{5}-[A-Z]{2}$(匹配如ABC-12345-XY的模式) -
^BK-\d{6}-[A-Z]{3}$(匹配如BK-123456-NYC的模式) -
^EMP-\d{4}-[A-Z]{2}$(匹配如EMP-1234-AB的模式)
这些自定义模式可以与预定义的 PII 类型一起使用,创建一个针对您特定需求的全面敏感信息保护策略。

图 12.10 – 添加敏感信息过滤器
图 12.10 展示了您可以指定的敏感信息过滤器配置选项。
通过利用敏感信息过滤器,您可以确保您的应用程序保持最高的隐私和数据保护标准。例如,医疗保健提供者可以配置防护栏以屏蔽摘要中的患者信息,而金融机构可以阻止与信用卡详情或账户号码相关的查询,从而降低数据泄露风险并保持合规性。
被阻止的消息
一旦我们定义了策略过滤器,接下来可以定义被阻止的消息,即当防护栏阻止模型任何输入提示或响应时。在这种情况下,将提供预批准的响应,针对特定的用例或组织指南进行定制。图 12.11 展示了您希望为输入提示和模型响应显示的消息。

图 12.11 – 被阻止的消息
这种方法确保即使在初始输入或模型输出引起担忧的情况下,最终用户也能收到安全、适当且合规的响应。
测试和部署护栏
通过测试护栏,您可以迭代地优化和测试模型,确保它们与您的预期用例一致并遵守道德标准。以下是工作原理:
首先,您创建一个护栏,这将初始化一个工作草案(DRAFT)版本。将其视为一个沙盒环境,您可以在这里实验而不会影响实时系统。这个工作草案是可以持续编辑和调整,直到您对其性能满意。

图 12.12 – 测试亚马逊 Bedrock 的护栏
图 12.12 展示了工作草案的测试结果。在这里,我提供了一个简单的足球示例,其中我提供了 soccer 作为拒绝的主题。当我提供与足球相关的提示时,模型会阻止响应。您也可以从图中看到提示和模型响应跟踪。
一旦您完善了工作草案,您就可以创建一个版本——这是在那一刻的护栏配置的快照。此外,这些版本在系统中充当不可变的检查点。这种不可变性具有关键作用:它防止了如果意外地将草案版本部署到生产环境中可能产生的对运行时环境的潜在负面影响。例如,如果工程师意外地通过控制台界面直接修改了草案版本,这些不可变的检查点将确保这些更改不会影响实时生产环境。这种保护措施有助于维护系统稳定性,并防止意外修改带来的后果。
重要的是要注意,对工作草案所做的任何更改都会自动更新正在使用的工作草案的应用程序。您必须明确地将所需的版本纳入您的应用程序,以反映最新的护栏配置。
现在我们已经创建了、测试并部署了护栏,让我们看看我们如何使用它。
使用护栏
护栏可以以各种方式使用:
-
InvokeModel、InvokeModelWithResponseStream和ConverseAPI。 -
知识库:在亚马逊 Bedrock 控制台或通过 API 查询您的知识库时,您可以包含护栏。
-
为您的代理设置护栏:在亚马逊 Bedrock 控制台或 API 中创建或更新代理时,将护栏与您的代理关联。
图 12.13 展示了在亚马逊 Bedrock Playground 中使用和不使用护栏的响应。

图 12.13 – 在亚马逊 Bedrock Playground 中使用护栏
使用亚马逊 Bedrock API,您可以在代码中指定 guardrailIdentifier 和 guardrailIdentifier,如下所示:
%pip install boto3 botocore
#import the main packages and libraries
import os
import boto3
import json
import botocore
bedrock_runtime = boto3.client('bedrock-runtime') # Provide the desired region
prompt = "Can you tell me about the treatment for chronic condition?"
body = json.dumps({"inputText": prompt,
"textGenerationConfig":{
"maxTokenCount":4096,
"stopSequences":[],
"temperature":0,
"topP":1
},
})
modelId = 'amazon.titan-tg1-large' # change this to use a different version from the model provider
accept = 'application/json'
contentType = 'application/json'
response1 = bedrock_runtime.invoke_model(body=body,
modelId=modelId,
accept=accept,
contentType
=contentType,
trace="ENABLED",
guardrailIdentifier
= 'vtfzfvd8ccoz',
guardrailVersion=
"1"
)
response_g = json.loads(response1.get('body').read())
#print(response_body.get('results')[0].get('outputText'))
#output_body = json.loads(response1["body"].read().decode())
action = response_g["amazon-bedrock-guardrailAction"]
if action == "INTERVENED":
print("Guardrail Intervention: {}".format(json.dumps(response_g["amazon-bedrock-trace"]["guardrail"], indent=2)))
print("Guardrail action: {}".format(response_g["amazon-bedrock-guardrailAction"]))
print("Output text: {}".format(response_g["results"][0]["outputText"]))
当运行前面的代码时,你可以看到响应将与图 12.14中显示的类似。

图 12.14 – 带有防护栏的响应
你可以看到代码中提供的提示与医疗治疗相关,我们在“防护栏”中已配置了拒绝主题过滤器。代码片段包括guardrailIdentifier和guardrailVersion以启用 Bedrock 防护栏,它可以基于配置的过滤器介入并修改模型的输出。
此外,当使用防护栏进行模型推理时,你可以通过标记输入文本中的特定内容来选择性评估用户输入。此功能允许你将防护栏应用于输入的某些部分,同时保留其他部分未处理。
例如,想象你正在为银行应用程序创建一个对话式人工智能助手。虽然你希望你的助手为用户提供有用的信息,但你还需要确保它不会泄露敏感的账户细节或鼓励风险金融行为。通过选择性评估用户输入,你可以对对话的特定部分应用防护栏,如用户查询,同时保持系统提示和对话历史不变。
这就是你可以这样实现的方式:
-
使用输入标签来标记用户查询,例如,
<amazon-bedrock-guardrails-guardContent_abc>我的储蓄账户里有多少钱?</amazon-bedrock-guardrails-guardContent_abc> -
在
amazon-bedrock-guardrailConfig中配置一个动态标签后缀(例如,abc)以防止提示注入攻击。 -
标签之外的内容,如系统提示和对话历史,不会被防护栏处理。
-
对于标签内的用户查询,防护栏将确保人工智能助手的响应不会泄露敏感的财务信息或推广不负责任的钱财管理。
这种方法不仅增强了安全和控制,还优化了性能并降低了成本,因为防护栏只评估标记的用户输入,而不是整个提示。
当使用带有流式响应的防护栏时,你可以配置为同步模式或异步模式。同步模式引入了一些延迟,因为防护栏缓冲并应用策略到响应块之前发送给用户,从而确保更高的准确性。或者,异步模式立即发送响应块,同时在后台应用策略,牺牲准确性以换取更低的延迟。
你可以通过在amazon-bedrock-guardrailConfig中包含"streamProcessingMode": "ASYNCHRONOUS"来启用异步模式。以下是方法:
{
"amazon-bedrock-guardrailConfig": {
"streamProcessingMode": "ASYNCHRONOUS"
}
}
对于使用Converse API 构建的对话式应用程序,你可以使用防护栏来阻止用户输入或模型生成的不得当内容。在调用Converse或ConverseStream操作时,将防护栏配置包含在guardrailConfig参数中。以下是方法:
{
"guardrailIdentifier": "Guardrail ID",
"guardrailVersion": "Guardrail version",
"trace": "enabled"
}
这里有一个示例代码,说明您如何通过在Converse API 上使用护栏来保护对话:docs.aws.amazon.com/bedrock/latest/userguide/guardrails-use-converse-api.html#converse-api-guardrail-example。
Amazon Bedrock 的护栏功能允许组织实施安全措施和政策过滤器,以确保人工智能模型的安全和负责任的使用。它提供了四种政策过滤器——内容过滤器、禁止主题、单词过滤器和敏感信息过滤器——以阻止或编辑用户输入和模型输出中的不受欢迎的内容、主题、单词和敏感信息。护栏有助于遵守法规、保护用户隐私,并防止生成有害或不道德的内容。
摘要
本章首先强调了在当今数字景观中,组织对数据隐私和保护的重视。它突出了 Amazon Bedrock 的强大安全措施,确保用户对其数据保持完全控制,同时包括数据本地化、隔离、加密和通过 IAM 进行访问管理等关键方面。
章节随后深入探讨了负责任的人工智能实践,解决诸如真实性、知识产权、安全性和毒性等挑战。它提供了关于实施内容过滤、护栏、数据整理、水印、可追溯性和建立稳健的负责任人工智能政策的指导。此外,章节介绍了 Amazon Bedrock 的护栏,它提供了四种政策过滤器:内容过滤器、禁止主题、单词过滤器和敏感信息过滤器。这些过滤器使组织能够实施与其安全和负责任的人工智能政策相一致的安全措施,促进各行业道德人工智能的部署。
恭喜!您已经到达了这本书的结尾。到目前为止,您已经获得了对 Amazon Bedrock 的深入实战知识。从理解基础概念到实际实施和实际用例,我们已经涵盖了广泛的主题,这将为您提供构建可扩展和创新的 GenAI 应用程序的知识和技能。
在整个章节中,我们探讨了提示工程的力量、持续预训练、微调模型和 RAG,以及使用 Amazon Bedrock 开发智能代理。
我们探索了各种架构模式,例如文本生成、摘要、问答、实体提取、代码生成和图像创建。此外,我们还解决了监控、安全和隐私的关键方面,确保您可以在遵守道德标准和最佳实践的同时,自信地穿梭于 GenAI 错综复杂的世界中,并充分利用 Amazon Bedrock 的功能。您现在对 Amazon Bedrock、其功能和发挥其全部潜力的技术有了全面的理解。


浙公网安备 33010602011771号