使用自定义编排创建代理

在这个文件夹中,我们将向我们展示如何使用自定义编排策略创建代理。

Amazon Bedrock Agents 通过提供一个完全托管的解决方案来简化生成式AI应用程序的开发,该解决方案使用基础模型和增强工具来自主运行任务并通过编排的多步工作流来实现目标。默认的编排策略Reasoning and Action (ReAct)使用户能够快速构建和部署代理解决方案。ReAct是一种通用的问题解决方法,它利用基础模型的规划能力来动态调整每个步骤的操作。虽然ReAct通过允许代理根据不断变化的需求持续重新评估其决策而提供灵活性,但当涉及大量工具时,其迭代方法可能会导致较高的延迟。

为了获得更大的编排控制权,Amazon Bedrock Agents推出了自定义编排器特性,它使用户能够微调代理行为并管理每个工作流步骤的工具交互。这种定制允许组织根据其特定的操作需求来定制代理功能,从而提高精度、适应性和效率。

在这个笔记本中,我们将重用我们的餐厅示例来探索自定义编排器的工作原理,并演示它在Reasoning Without Observation (ReWOO)示例中的应用。下图显示了我们将创建的代理的架构:

在这个笔记本中,我们将:

  1. 创建一个Amazon Knowledge Base 来索引我们的餐厅菜单
  2. 使用默认的ReAct策略创建和测试我们的餐厅助手
  3. 使用新的自定义编排功能和ReWoo创建和测试我们的餐厅助手
  4. 删除所有组件以避免意外成本

安装和导入先决条件

在开始之前,让我们用最新的功能更新我们的boto3软件包,并安装任何先决条件软件包。

现在我们可以导入这个示例所需的软件包。

我们还将导入agents.pyknowledge_bases.py中提供的一些帮助功能。这些函数将帮助我们更容易创建知识库和我们的代理。它们使用bedrock-agentsbedrock-agents-runtime的boto3客户端。我们可以检查这些函数在提供的文件中的实现。在这个笔记本中,我们将突出显示CreateAgentInvokeAgent API在自定义编排器中的差异。

1. 创建知识库

让我们创建一个餐厅助手知识库来索引我们餐厅的菜单。为此,我们首先需要设置一些常量,如知识库名称和描述,以及将存储知识库中索引的文档的s3存储桶的名称。

接下来,让我们将知识库同步到索引菜单。

创建ReAct代理

接下来,我们将创建一个ReAct代理"restaurant-react”,并使用Bedrock Agent的默认编排来调用它。

ReAct方法是一个迭代的决策过程,模型分析每一步,根据每个阶段收集的信息决定下一步的行动。

这种方法提供了透明度,并允许对行动进行清晰、分步的分解,使其非常适合需要增量调整的工作流程。虽然在需要实时重新评估的动态环境中很有效,但ReAct的顺序结构在需要高速或跨多个工具的并行处理时可能会引入延迟。

定义代理配置

让我们现在定义我们餐厅助手的配置。我们将提供一些在代理无法回答用户查询的情况下要做的事情的数据,以及一些关于餐厅的更一般的信息。

对于这个代理,我们还将使用Claude 3 Sonnet 3.5 v2模型,以便为我们的用户提供更准确的答复。

对于动作组,我们将提供3个函数:

  • get_booking_details来检索现有预订的详细信息
  • create_booking来创建新的餐厅预订
  • delete_booking来删除现有的预订

最后,我们还提供了一些知识库配置,包括何时使用这个知识库的kb_instruction

创建代理

现在让我们创建ReAct代理"restaurant-react”。

调用ReAct代理

接下来,我们将使用几个查询调用ReAct代理。我们将使用会话属性传递当前日期和客户名称,以使代理与真实的餐厅助手更加相关。

创建ReWoo代理

接下来,我们将使用Bedrock Agent的自定义编排器创建一个ReWoo代理"restaurant-rewoo”,并使用相同的客户编排器调用它。

ReWOO技术通过预先生成一个完整的任务计划并无需检查中间输出就执行它来优化性能。

这种方法最小化了模型调用,从而可能减少响应时间。对于那些速度优先于迭代调整的任务,或者中间推理步骤应该保持隐藏以确保安全性的任务,ReWOO明显优于默认的ReAct策略。

定义代理配置

代理配置基本保持不变,只是需要创建自定义编排lambda。lambda_rewoo.py文件包含编排的代码。

自定义编排器通过基于合同的交互,使Amazon Bedrock Agents和AWS Lambda之间的动态决策和可适应的工作流管理成为可能。AWS Lambda函数充当编排引擎,处理上下文输入(如状态、对话历史、会话参数和用户请求)以生成指令并定义后续操作的状态。在收到用户输入后,Amazon Bedrock Agents使用自定义编排器逻辑和Amazon Bedrock Converse API 来管理基础模型和各种工具(如动作组、知识库和守卫)之间的交互。

下图说明了用户、Amazon Bedrock Agents和自定义编排器之间交互的流程,自定义编排器管理工作流程: custom orchestrator

调用ReWoo代理

接下来,我们将使用几个查询调用ReWoo代理。我们仍将使用会话属性传递当前日期和客户名称,以使代理与真实的餐厅助手更加相关。

要使用自定义编排器,我们需要通过sessionAttributesessionState参数中传递编排lambda ARN。

比较ReAct和ReWoo编排

正如我们在之前的调用中看到的,在ReAct和ReWoo中运行简单查询的延迟是相似的。但是,对于复杂的多步查询,运行ReWoo编排的延迟明显更低。

下面的视频展示了处理查询"What do you serve for dinner? can you make a reservation for 4 people, at 9pm tonight.“的处理步骤。

对于这个查询,ReAct将:

  • 首先创建一个计划来解决任务,检查晚餐菜单上提供的内容,然后预订一个预约
  • 检查知识库以了解晚餐菜单上提供的内容
  • 评估计划是否仍然适合解决任务
  • 预订预约
  • 评估计划是否仍然适合解决任务
  • 创建一个最终响应,包含晚餐选择和预订预约

对于同样的查询,ReWoo将:

  • 创建一个计划来解决任务,检查晚餐菜单上提供的内容并预订一个预约
  • 检查知识库
  • 预订一个预约
  • 创建一个最终响应,包含晚餐选择和预订预约

[可选]清理

在这个可选步骤中,我们将删除创建的资源,以避免不必要的成本。

下一步

恭喜我们,我们已经创建了我们的第一个自定义编排器代理!

作为下一步,我们建议我们尝试其他编排策略。这个文件夹还提供了一些使用JavaScript和Python代码的ReAct和ReWoo编排的起始示例:

  • custom_orchestrators_samples/lambda_react.js文件包含ReAct的JavaScript实现。
  • custom_orchestrators_samples/lambda_react.py文件包含ReAct的Python实现。
  • custom_orchestrators_samples/lambda_rewoo.js文件包含ReWoo的JavaScript实现。

我们可以使用这些文件来更改Bedrock Agent的ReAct实现的默认行为,并开始创建自己的编排代码。

免责声明: 这些代码示例是为我们的应用程序提供的起点。我们应该根据我们的用例对它们进行验证和更新。