大家好,我是Sandy,这是Elizabeth。我们还有Mike以及其他多位专家在现场协助大家,以防各位在设置工作坊环境和运行代码时遇到问题。现场每一位协助我们的工作人员都是专家。我们非常期待今天的开始,希望引导大家从构思智能体(Agent)的创意、构建它并添加大量自定义功能,一直到最终部署。因此,我们将从一个最简单的智能体形式开始入手。
请继续使用它,回到主页运行程序,完成所有模块。如果您有任何问题,可以向我们在场的任何一位提问,我们会为您提供支持。首先请访问这个研讨会链接,目前该链接已为约250名参与者启用。如果人数超出限制且部分人遇到问题,我们备有备用研讨会链接;但目前请登录该网站,它会将您引导至相关页面。如有必要,Ellie也可以逐步指导操作流程。
这将带您进入一个账户界面。请问大家是否都看到了之前的链接?需要我稍等几秒吗?”“已经显示了。”“我想接下来的几张幻灯片上也有。那么今天我们要做什么呢?我们将进入这个Workshop Studio账户。您无需创建自己的AWS账户,这些账户已为您预先配置好,并以Jupyter Notebook格式呈现。
大部分代码已经内置其中,您可以自定义、运行或下载它,也可以在本地环境中执行;但在本次课程中,所有内容均已就绪供您直接使用。此服务免费,不会消耗您个人账户的资源,也不会要求输入信用卡信息。请跟随我们一步步操作。如有任何疑问,我们都会协助解决。
首先加入研讨会链接后,您将看到一个网站界面。第一步是输入您的电子邮件地址以获取一次性密码(OTP)。系统会发送包含数字验证码的邮件,您需要将该密码输入窗口中。如果您有任何问题请举手示意,我们会过来协助您完成操作。
在本次研讨会中,您将能够通过Amazon Bedrock API使用Anthropic模型;此外,我相信您也能使用新的OpenAI模型以及所有可通过Amazon Bedrock API调用的AWS自有模型。而且,您可以免费使用Amazon Bedrock Agent Core——它并不昂贵。我知道大家有时对新服务的使用感到困惑,因为涉及费用问题;但如果您在账户中尝试Amazon Bedrock Agent Core,就会发现成本很低。
下一步是批准弹窗提示。“大家现在都跟上了吗?是否有人在任何步骤遇到困难需要帮助?”“抱歉,您是在登录时遇到麻烦了吗?您是打开了研讨会链接后输入了电子邮件和密码吗?”“好的,我想Mike可以帮忙。”“您还好吧?我需要确认……其他人呢?还有没有其他问题?”
是否有人感到吃力?我们Wi-Fi似乎有点小状况。谁能想到会议也会遭遇网络问题呢?很多人正在连接中。“您打算在台上演示一些步骤吗?”“您是打算在台上逐步讲解研讨会流程吗?如果有些人无法操作,他们可以在课程结束后观看回放吗?”
我们将在会话结束时分享所有幻灯片。这是一个Jupyter笔记本,您也可以克隆该代码库。我们要构建的所有内容不仅存在于虚拟工作室中。由于这个虚拟环境将开放两天,也许最好先展示内部结构供您参考,以便应用于您的业务场景。结束后我会将研讨会延长至三天,您可以免费使用所有资源三天。”“是的。”
愿今天的Wi-Fi之神与我们同在。“如果是因网络问题导致部分人无法跟上,我们会尝试重新逐步演示。除了网络和注册登录外,还有其他任何问题吗?”“是的。”“好的。在开始之前,请拍下这张图片。如果第一步有问题,那通常不是网络问题;如果遇到账户不足的情况,是因为第一个链接对应的是预置账户。您可以使用第二个备用链接。”
“所以我们需要分离环境部署?”“是的。”“那我们开始吧。大家现在应该都看到了这个界面,对吗?”“不,那不是……”“大家都看到这一页了吗?左侧将是您的逐步操作指南,展示我们要构建的内容、方法以及每个模块的设置。如果您卡住了可以参考这里了解如何启动运行。”
这提供了完整的操作 walkthrough。但如果想直接开始编写代码,请点击右侧的“Agent Speedrun: Idea to Code”。点击后滚动到底部找到代码编辑器URL。大家都跟上了吗?请点击该链接。“有网络的人,是的,所有连上网的朋友请点击上方按钮。”
滚动到底部找到代码编辑器URL并打开它,模块一应该就会弹出。这是模块一界面,您可以关闭其他窗口。首先要做的是选择内核(Kernel)。我该选哪个?回到Workshop Studio的设置部分,在开始时的“下一步”中会明确显示:选择内核Python环境为/usr/bin/python3.13,复制该路径并在您的选择内核处粘贴。
系统会自动关闭并为您加载环境。请注意,每个运行的模块都需要执行此操作。那么今天我们要构建什么?大家都跟上了吗?有没有没跟上的人?哦,因为Wi-Fi原因好几个人掉队了。“只是网络问题吗?”“我们该怎么办?好的,我们就……”“是的。谢谢。”
如果是这种情况,我们将逐步引导大家操作。流程相当简单,您稍后也可以回去尝试。我会继续演示,欢迎随时提问。那么今天我们要构建什么?今天我们正在构建一个客户服务代理(Customer Service Agent),并使用Strands Agents框架来实现。
这是一个智能体框架(Agent Harness Framework),其工作原理基本是利用带有循环的智能体。用户输入他们的上下文和指令,然后使用大语言模型(LLM)。由于这原生支持亚马逊服务,我们可以托管 Bedrock 上的模型;当然,你也可以使用其他提供商。如果你访问 Strands Agents 页面并查看模型提供商列表,你可以选择任何你喜欢的模型提供商。
比如使用 Llama 并在本地托管它,这里展示了具体操作方法:你只需调用模型部分定义模型。在智能体配置中,指定模型及其名称即可。这支持 OpenAI 以及你喜欢的其他各种大语言模型。你可以使用任何你偏好的模型,带上自己的 API 密钥连接到该模型,然后就可以开始使用了。
我们正在构建一个简单的客户服务智能体。让智能体变得强大的是其“代理推理循环”(Agentic Reasoning Loop)。当用户提问并说遇到麻烦或问题时,智能体会接收该输入并被调用。接着,智能体调用 LLM,LLM 阅读问题并决定调用工具。我们需要定义一组工具,因为工具是赋予智能体执行功能权限的方式。
由于 LLM 主要是在预测下一个词元,我们不想完全依赖其基础知识来回答。我们需要将其锚定在事实来源或信息源上,这些信息可以存储在数据库、文件或任何不同格式中。这些内容被写入工具内并赋予访问权限,智能体获得对这些工具的访问权后,会自行决定何时使用。
智能体可以访问多种不同的工具,它将依靠 LLM 的能力及推理能力来判断使用哪个工具并调用它。运行工具响应后,智能体循环可能会再次完成并发出最终回复。使用这种框架的另一个巨大优势是支持多种模型,你可以随意更换所需的模型,而无需大幅更改系统提示词、结构或整体架构。
这使得你可以用相同的样板代码测试并比较不同模型的性能,非常强大且易于部署。那么如何开始呢?首先安装 requirements.txt 文件中的依赖项,然后定义工具。这里我们创建了两个客户及其订单账户的模拟数据。他们在网站上订购了商品,现在想查询问题或申请退款。
我们要构建一个智能体系统来为客户提供解决方案。这些数据就像字典一样,包含客户信息和订单状态。工具可以用功能代码编写,也可以像 NLP 类型的生成式工具那样定义。定义工具的方式是使用 @tool 装饰器函数并编写代码。
这里有一个简单的查找客户信息的工具,用于获取客户 ID;另一个是获取订单历史记录的第三个工具。还有一个处理退款的工具。虽然这些工具的功能各不相同,但它们都遵循相同的格式和模式,即使用 @tool 装饰器。现在让我们运行这段代码,这是创建工具的基础部分。
要创建一个智能体,我们只需要两个基本要素:系统提示词和 LLM 模型。由于这里使用原生的 Bedrock托管默认模型,我们无需特别指定模型名称;但如之前所示,你也可以在 Strands 网站上添加任何你想要的自定义模型。除了这两者外,还需要加入刚才定义的三个工具方法。
接着创建系统提示词:“你是一个客户服务智能体”,并列出指导原则:采取行动前必须通过查找客户进行验证;使用工具数据回答问题;不要向客户提供你已经拥有的信息。在系统提示中,你告诉 LLM 如何使用其可访问的工具以及该做什么,这样智能体就能理解任务需求。
现在当我们运行这个智能体时,输入“你好,我是客户某某某,能帮我查一下最近的订单吗?”智能体回复说:“当然,让我调取你的账户和订单历史。”它首先调用第一个工具查找客户信息,然后调用第二个工具获取订单历史记录。
智能体总结道:“这是你最近订单的摘要。”并询问是否还有其他帮助需求。这很棒,但我们如何了解幕后实际发生了什么?很多时候我们会遇到一个问题:智能体在执行操作,但我对其过程毫无洞察。我的控制权在哪里?如何获取这些信息呢?
让我们检查这个智能体循环的工作机制。正如之前图表所示,用户发送消息给 LLM,LLM 执行工具调用,我们得到工具结果,最后获得回复。我们可以通过代码查看智能体消息的内容以了解细节。这展示了交互的交接过程:显示总共有多少条消息,用户说了什么,助手做了什么。
随后是工具调用一和工具调用二的记录。
用户没有再执行其他操作,助手随即给出响应。这里展示了使用量指标,包括消耗的 Token 数量等数据。我们可以添加更多自定义指标以满足需求。此外,为了演示简便,我们目前仅展示基础流程,但实际上支持多轮对话。这是一个单轮交互示例,你也可以运行多轮会话与代理进行extended chat(扩展聊天)。你可以尝试提供的其他样本文件,如果网络正常也可以编写自己的代码。
我们在同一模块下创建了 chat.py 及其对应的 pipfile,启用多轮对话只需复制两行命令并安装依赖。打开终端后直接运行即可与代理聊天,输入内容后会得到回复,支持连续多轮交互。底层代码和工具完全相同,仅需不到 60 行代码即可实现基础代理功能。接下来探讨如何优化此代理,这是入门级内容,熟悉博客或在线资料的人应已了解。
现在介绍“Hooks”(钩子)机制,它能以编程方式强制执行特定命令和函数。从代理被调用、工具请求到响应发送的全过程,我们都希望拥有控制权。例如在 LLM 调用前或后、工具执行前后插入逻辑,以验证用户身份(如客户类型)、检查问题是否合规或设置速率限制。
通过 Hooks,你可以在关键节点插入断言或其他函数进行校验,确保检查通过后才输出最终结果。你可以设置在代理调用前、LLM 响应后或工具执行前后介入,决定批准还是取消操作。Strands Agents 提供了多种 Hook 强制方式以增强控制力。
在示例中,我们导入 strands.hooks 及相关注册表组件,旨在代理调用前和工具调用前执行逻辑。我们要创建一个速率限制器 Hook,防止 LLM 异常疯狂地连续调用工具导致 Token 成本激增。通过设置硬停止机制,即使代理失控也能在达到阈值时强制终止。
我们定义速率限制器 Hook 并设置默认最大调用次数,将其注册到“代理调用前”和“工具调用前”事件。每次用户发起新请求时计数器重置为零,避免速率限制器持续运行。同时定义检查函数统计工具调用次数并与最大值比较,从而在 main 函数中通过 hooks 参数传入限制条件(如最大调用三次)。
运行代码显示工具被调用了两次并输出事件摘要。为了验证速率限制是否生效,我们故意将最大调用次数设为 1(true)以触发阻断。结果显示代理多次尝试后被拦截,提示“block lookup”因超过调用次数限制而失败。这解决了我们对代理失控接管一切的担忧,确保其在安全阈值内运行。
不会的,因为我们有叫做钩子(hooks)的东西。大家都跟上我的思路了吗?没问题吧?有人能跟我一起运行吗?是我讲得太快,还是大家只是在旁观?这样就行。哦,好的,很好。至少还有几个人在听。>> 我想对钩子补充一点内容。
有时候,你知道的,使用钩子更好,因为当你让大语言模型(LLM)配合某些工具使用时,LLM 的行为是概率性的。>> 是的。你知道的,当你在智能体应用中加入提示词(prompt)时,那个提示词更像是一种建议。它只是关于给你答案的概率问题。所以当你使用钩子时,你可以变得更加确定(deterministic)。
你可以在智能体循环中放入代码。比如,在调用之前或之后插入 Python 代码。你可以阻止……嗯,我不知道在这个例子中你阻止了超过三次工具调用,但例如如果你想限制某些信用卡号码之类的东西,你可以放入一段能够理解这些内容的代码。
是的嘿,你会收到这些信息,所以我会用这个确定性的函数来阻止它,这样你就不会接收到那些信息。因此模型永远不会收到这些信息。你拦截了调用,所以你不必浪费令牌(token)。你不需要再次调用模型。你不会因为停止它而浪费令牌,因为你发送了一个钩子。
如果你不想向客户服务发送某些类型的回答,你也可以通过调用后(after call)钩子来阻止那个回答。>> 完全正确。谢谢。好的,所以你们可以自己尝试一下。再次强调,如果你想进行多轮对话,请进入第二个模块中的 chat.py 文件并启用钩子。你仍然可以继续与它聊天,你可以随意尝试在不同的地方添加不同的钩子看看效果如何。
你可以尝试阻止某些客户或拦截特定类型的问题,也就是设置护栏(guard rails),对吧?所以钩子非常棒,我们在构建良好的智能体系统时希望拥有钩子。现在让我们给这个项目再增加一层酷炫的功能,好吗?让我们添加技能(skills)。
我们要找到一种方法来引导你的智能体和 LLM,让它们以我们希望的方式做出响应。而“引导”(steering)这个概念我非常喜欢,它太棒了。嗯,让我们开始讲引导功能吧。大家有什么问题吗?大家对钩子的概念都清楚了吗?>> 是的,所以如果……抱歉。
哦好的好的嗯,那个问题是……噢你现在有麦克风了你想问吗? >> 是的。>> 好的请问,嗯这个好像不对……我在钩子的例子中看到它一直在运行智能体,但它只是阻止了工具调用。我们要如何停止智能体以防止其进入无限循环并不断重复?
所以,当我们定义钩子时,我们可以将钩子定义为甚至结束智能体的回合(turn),如果我们想要的话。为了演示目的,我们想向您展示它是如何工作的,这样我们可以看到它在进行速率限制(rate limiting),并且可以看到它没有多次运行调用。
所以它在做什么呢?因为它之前说过在工具调用之前,它就一直在尝试这样做并不断停止。但是 LLM 仍然继续运行循环直到结束。但如果我们愿意,我们可以这样创建它:如果我们看到这个情况,就停止回合并在此处结束。
所以我们要肯定可以自定义这一点,只是因为我们想向您展示端到端的工作流程,所以我们把它做成了这样。嗯谢谢你提出这个问题。嗯好的。那么技能(skills)和引导功能(steering)。现在,这是一个旨在回答客户服务问题的聊天机器人。
但是客户可能会问很多智能体可能没有权限或知识来回答的问题。那么我们如何赋予它这些知识呢?我们告诉它该如何回答这些问题?我们要创建一个叫做技能文件夹(skills folder)和技能文件的东西,其中可能包含所有关于你的“事实真相”的信息。
也就是所谓的单一事实来源(single source of truth),也许关于它实际需要采取的哪些步骤的信息。我们可以将其添加为 Markdown 文件。这是一种方式,也就是说这里它会做什么呢?当我们添加智能体技能时,它首先会查找技能文件夹并阅读所有技能。
看看哪些实际上是有意义的,然后它会使用这些技能。嗯让我稍后再讲引导功能(steering),但技能是一种方法,通过它我们可以给予我们的……让我进入第三个模块。所以嗯我只是先运行这个。完美。
所以当我们要创建技能时,我们现在有三种类型的技能被创建了。第一种是如何处理退款?第二种是如何追踪订单?第三种是如果人们问一些与账户相关的问题怎么办?比如我的密码不起作用之类的,很多常见问题。我们如何让它发挥作用呢?
对吧?所以这个是关于如何处理账户问题的。所以我们在这里创建这些不同的技能插件,然后我们可以直接调用它。嗯所以当我打开这里的技能文件夹时,我们可以看到示例技能(sample skills)。这只是一个关于账户故障排除技能的 Markdown 文件。
它提供了额外的上下文,因为在你的系统提示词(system prompt)中,你不想用所有的信息量去填满它。因为那些也被视为输入令牌(input tokens),而且可能会不必要地浪费掉。所以当被问及某种特定类型的问题时,我们可以给它提供与该特定问题相关的上下文。
这样它就拥有了所需的所有信息,从而能够公正地、正确地回答问题。所以在这种情况下这个特定的技能谈论的是我们如何进行账户故障排除?重置密码需要什么要求?当账户被锁定时该怎么办呢?对于订单追踪也是如此,对吧?
我们要做什么?我们需要遵循哪些步骤?这些是我们提前给予智能体的指令。我们根据希望智能体执行的操作来编写这些内容。所以我们创建了不同的技能文件,即 Markdown 文件。当我们运行它时,除了系统提示词之外,我们还给它访问插件(plug-in)的权限。
所以现在我们正在添加另一个参数叫做“插件”,它可以访问所有的技能插件,而技能插件指向这里的技能文件夹。所以现在它将根据被问及的特定类型的问题调用所需的任何技能。当这个运行时,如果有人说“我想为我的无线耳机退款”,它实际上是在将技能作为工具进行调用。
然后它会说:“好的,我已经调出了你的账户信息。这是我找到的内容以及它是如何操作的。”所以它正变得越来越确定(deterministic)。它具有自然的顺序。
这样上下文就能流畅传递,且仅在需要时调用。这避免了每次都将大量令牌填充到系统提示词中导致溢出。这是我通常在引导(Steering)方面遇到的问题:在与代理对话时,我们常因要求以特定格式回答问题而挣扎。它似乎能正确回答难题,比如询问退款金额时给出具体数字,但它往往话太多、生成大量令牌且自由发散。
我们如何让它以期望的格式回应?如果我们需要结构化输出,或者希望它停止使用破折号,我们能否确定性地捕捉并控制这种行为?为此,我们会采用一种称为“引导”的技术。它通过提供一个辅助代理(Buddy Agent),帮助主代理朝着我们想要的方向自我引导,就像结对编程或搭档合作一样。
当生成输出时,辅助代理会检查生成的内容并指出错误:“这不是你该做的。这才是你想要的格式。”因此,辅助代理起到检查、纠正和校正的作用,最终得到我们满意的响应。在生产环境部署代码时,格式结构上不容许有错误(egger应为error)。引导能帮助你实现这一目标。
接下来我要快速介绍,因为我想让Ellie谈谈部署,即如何确保代理真正有用。引导处理器(Steering Handlers)的工作原理与钩子类似。你可以在不同阶段调用它:在LLM被调用前、工具调用前后等,这与钩子非常相似。
不同之处在于,在钩子点你增加了一个可以执行快速检查的代理进行协作并输出结果。你可以将其视为另一种护栏(Guard Rail)。例如,你可以在工具调用后使用它来指示:“先查询此信息再给我退款”,或者在消息发送前“调整语气”。这让你对代理生成的内容有了更多控制。
回到引导主题,我们需要导入引导库和处理器。Strands Agent文档中有详细信息,研讨会中也有说明。我们创建一个确定性处理程序,赋予其规则并告知它该做什么。这可以是一个硬编码函数,也可以是包含此类功能的另一个代理。
你可以执行类型强制约束,确保输出仅符合特定类型。接着创建引导代理和护栏。例如,“退款工作流处理器”已定义,而“语气护栏处理程序”则规定:不要过度承诺、保证具体时间线、不责怪客户并承认客户的沮丧情绪。这是我们要创建的第二种引导代理类型。
在最终代码中,除了Agent Skills外,我们调用这两个已建立的处理器。它们可以在不同阶段建立,例如在模型输出后引导(Steer after model),或在数据获取时创建账本并选择在代理流程的哪个部分启用。
最后,只需赋予这两个引导处理器权限即可生效。运行后,它不仅调用查询客户和获取订单历史的功能,还会评估代理响应。在将最终回复发送给用户前,你可以确保并充满信心地知道模型将以期望的方式回应,因为所有控制功能都已建立。
现在轮到Ellie了,她将在12分钟内讲解如何将此代理投入生产环境。我想在引导部分补充一点:有一个名为Agent Control的开源库可以添加到Strands中,文档里有说明。你可以为引导创建规则。例如在一个旅行引擎演示中,可以使用钩子阻止预订超过5人的房间。
但如果想引导代理处理这种情况:当收到6个预订时,你可以创建规则让代理将其拆分为两个房间。你可以使用Agent Control库为此创建规则,并将这些规则托管在数据库中。这样每次调用代理应用时,都可以从数据库读取规则。
这样做的好处是:你只需更改数据库中的规则,无需修改代理代码。因此,代理只需要知道你的端点即可……
数据库。因此,每当有新规则时,您可以编辑数据库即可。现在让我们把这个代理投入生产环境。这里我们有会话管理器,但我不会展示它,因为当您想要使用框架保存记忆时才会用到会话管理器。不过,您也可以不使用框架而直接使用名为“memory”的库来实现,所有逻辑都包含在代码中。
关于部署环节,我们不会使用 Jupyter Notebook,虽然您可以那样做,但我们将通过命令行终端(CLI)进行操作。在这个文件夹中,我们拥有相同的引擎逻辑,包括客户服务工具以及各项技能等所有组件。要将此引擎投入生产环境,您需要进入 Workship Studio(此处指代相关控制台或工作区)。
我们将通过终端使用 AWS CLI,只需输入一两个命令。我们会获取这个代理的代码,并将其发送到 AWS 上的运行时环境。Agent Core 将会把代码部署在容器内部,但我们无需手动处理这些底层细节,因为 Agent Core 会替我们完成。同时,记忆功能也将自动配置好,无需额外操作。
让我们跟随步骤进行操作。这里有一个关键点:当您构建生成式 AI 应用程序并打算将代码放入 Core Runtime(核心运行时)时,您需要对引擎做的唯一改动是添加一个入口点文件。MPT 入口点是代理在笔记本或本地计算机上运行与在生产环境中运行的唯一区别。
MPT 入口点是运行时能够识别的关键部分,它后面的所有代码都属于代理逻辑。每次调用此运行时容器时,它就会执行入口点之后的那部分代码。好的,让我们演示一下。我进入这里……抱歉,让我打开这个文件。
这是我用来执行所有 CLI 代码所需的库。希望网络良好……是的,正在运行。在这个环境中,您将能够部署代理及相关配置。但如果您在本地运行,可以在将代理上传至 AWS 之前先在本地测试它。
为了启用内置的可观测性功能,您需要在控制台中进行一些设置。让我展示一下如何操作。要进入控制台,请打开 AWS 控制台部分。这将打开当前会话所在账户的控制台界面。
您需要进入 Agent Core(之前口误说成了 core run 或 aen core)。在这里您可以看到 Agent Core 提供的所有服务,包括 Harness(编排器)、Runtime Gateway、Memory 以及右侧的 Observability。您需要选择并配置某项功能,虽然我不记得具体名称了,但我来演示一下……启用?不,不是这里。配置(Configure)。
您需要进入“配置”页面并启用 Transaction Search(事务搜索)功能。这一设置允许您在运行时内部获得内置的可观测性支持。如果没有启用它,您将无法在代理中看到可观测数据,因为 CloudWatch 将无法接收相关信息。
另外一项需要完成的操作是保存更改,并在 requirements.txt(依赖文件)中安装我提供的可观测性库。抱歉……好了,已经完成了。我们有了这些依赖项,因为我即将使用 Agent Core,您需要安装 AWS OTel(OpenTelemetry)分发版库。
如果您使用的是其他框架,例如 LangChain 或 Cline,则有针对该框架的专用库。但您需要对代理应用程序进行一些修改才能适配;而对于 Strands,您无需做任何改动,因为它是为 AWS 原生构建的。虽然可观测性功能也适用于其他框架,但需要进行相应配置修改,所有细节均在文档中说明。
好的,库已就绪,我们继续……我已经到达指定位置了。A and C(Agent Core)。很好。
哦,我要创建……不,没关系。我刚才没保存。>> 我的名字我将设为 Ellie,因为我是 Ellie。在这里我不打算创建 Harness(编排器),而是创建一个代理。但我已经有代码了,如果您选择“代理”选项,它会为您生成一个简单的模板;既然我有现成代码,我可以跳过创建步骤。系统将为我创建一个环境以及所有必要配置,以便将我已有的代理放入容器中运行。
它会为我创建文件夹……这里是 Agent Core 的所有相关文件。所有这些步骤在 Workshop(工作坊)文档中都有记录。天哪,五分钟……但我打算在五分钟内完成操作,将这个代理投入生产环境。>> 没问题。>> 是的。
所以,Agent Core add(添加代理)……这里是什么情况?嗯,正在处理中。当我执行“add”操作时,它会创建我所需的容器,但我本地电脑上已经有了这个代理代码,因为我想展示一些东西。这就是 Sandy 刚才演示的那个引擎——客户服务引擎。我在本地电脑上有这个仓库,让我把窗口放大一点。
是的,这就是五分钟前演示的那个代理。您可以使用 agentcore dev 命令在本地测试代理,因为 Virtual Studio(虚拟工作室)是一个虚拟机环境,仅允许在该环境中运行代码;而在本地计算机上运行时,您可以拥有完整的环境来测试引擎。
这就是同一个代理,您看这里还有一些会话记录,可以看到 Token 的使用量。如果您想探索引擎内部发生的情况,可以在本地进行调试。因为我使用 Amazon Bedrock 作为模型提供商并使用了 AWS 凭证,所以在本地运行 Agent Core 时需要提供 AWS 凭证;但在 Amazon Browserless Workshop(无头浏览器工作坊)环境中则不需要。
是的,正在运行。完全相同的环境,我什么也没做。让我们回到……>> 是的,一切就绪。>> 好的。>> 我做了这些操作……我不确定我之前是否做过这一步。>> 没有做过的样子。所以 CD(进入目录)……早期阶段。
我要将代码添加到此代理应用程序中。让我看看容器内部的情况。对于 Agent Core,我想要一个代理……我将点击“Bring Your Own Code”(自带代码),就这样。您可以选择直接部署代码或使用容器,我将使用后者。
您还可以提供自己的 API 密钥来通过 OpenAI 或其他服务商部署代理,但我将使用 Amazon Bedrock。这里我不需要做任何额外操作……回车键确认。就这样。现在我要移动我的代码。在这里复制粘贴即可。
好的,还有什么?啊,我需要创建这个……让我们看看。复制、粘贴。一分钟等待。我不打算那样做(指手动复杂操作)。所以执行 core deploy 命令,以及一个……
只需一分钟即可部署,并将该智能体投入 AWS 生产环境。系统正在运行验证并检查我的凭证。如果您熟悉 AWS,就会知道在内部构建一切时,需要创建 IAM(身份和访问管理),制定策略权限,允许服务与其他服务连接。在核心层面需要处理很多事情,但它为我处理了一切。因此我不需要创建策略、权限或任何内容,它都在替我完成这些工作。
由于我是在本地创建的,因此正在使用 CDK(云开发工具包)创建 CloudFormation 模板进行基础设施即代码部署。您可以探索 CDK 代码,如果不熟悉的话,CDK 是 Cloud Development Kit。这意味着您可以用熟悉的编程语言(如 Python、TypeScript)编写代码来创建基础设施即代码,它正在为我执行这些操作。它在创建部署等所有内容,您可以在控制台中看到这一点。
让我们进入 Amazon Bedrock 运行时。我什么都看不到……让我展示一下 CloudFormation。在这里我会看到我的堆栈,啊不,因为这是虚拟工作室账户,抱歉。您可以在这里看到它,但当开始将其放入运行时后,我就会在这里看到了。好了,就在这里,您可以测试是否已就绪。
我可以直接进行测试并调用此引擎。仓库中包含所有终端信息,您可以找到如何使用 Bedrock SDK 调用的方法。您唯一需要的就是 API Key,此智能体即可正常工作。我认为它正在运行……是的,它在调用智能体。
您可以通过 SDK 探索如何调用此引擎并查看可观测性数据。您可以前往运行时,这里有一个可观测性仪表板,可以看到会话、追踪信息以及正在运行的运行次数和拥有的会话数量。每个会话都是一个不同的容器,查看所有内容大约需要一两分钟时间。
好的,我完成了。请为这个画面拍照并分享给其他朋友。这里可以找到所有信息:演示文稿、WorkStudio,如果您幸运的话还有积分(大约 20 个 Eds 的积分)。Firestar,我们太棒了。互联网上没有人……[笑声] 以及所有社交媒体平台,如果您有答案的话,我们在 LinkedIn、Twitter、Instagram 上。二维码包含了您了解 Strands Agent Core 所需的一切信息。谢谢。