在这个笔记本中,我们将使用新的功能定义功能,以及高级自定义提示和 Lambda 解析器,创建一个 Amazon Bedrock 代理。这些功能可以让我们在代理序列的每个步骤(预处理、编排、知识库和后处理)中对代理的行为进行细粒度控制。为了演示这些功能,我们将重点关注预处理步骤。
我们将以 HR 代理为例。使用这个代理,我们可以查看我们可用的假期天数并请求新的假期休假。我们将使用 AWS Lambda 函数来定义检查可用假期天数和预订新假期的逻辑。
在这个例子中,我们将使用 SQLite 数据库生成一些员工数据。
在开始之前,让我们更新 botocore 和 boto3 软件包,以确保我们有最新版本。
让我们现在检查 boto3 版本,以确保已安装正确的版本。我们的版本应该大于或等于 1.34.90。
接下来,我们可以设置代理和 lambda 函数的一些配置变量。
我们现在将创建一个 lambda 函数,它与 SQLite 文件 employee_database.db
进行交互。为此,我们将:
employee_database.db
。lambda_function.py
文件。我们现在将创建代理。为此,我们首先需要创建允许 bedrock 模型调用和代理 IAM 角色的代理策略,并将该策略与之关联。我们将允许这个代理调用 Claude Sonnet 模型。
一旦创建了所需的 IAM 角色,我们就可以使用 bedrock 代理客户端创建一个新的代理。为此,我们使用 create_agent
函数。它需要一个代理名称、基础模型和说明。我们还可以提供代理描述。请注意,创建的代理尚未准备就绪。我们将重点关注准备代理,然后使用它来调用操作并使用其他 API。
让我们现在将代理 id 存储在一个本地变量中,以在下一步中使用它。
我们现在将创建一个使用前面创建的 lambda 函数的代理操作组。 create_agent_action_group
函数提供了这个功能。我们将使用 DRAFT
作为代理版本,因为我们还没有创建代理版本或别名。为了告知代理操作组的功能,我们将提供一个包含操作组功能的操作组描述。
在这个例子中,我们将使用 functionSchema
提供操作组功能。我们也可以提供 APISchema
。笔记本 02-create-agent-with-api-schema.ipynb
提供了一个示例。
要使用函数模式定义函数,我们需要为每个函数提供 name
、description
和 parameters
。
在使用操作组之前,我们需要允许代理调用与操作组关联的 lambda 函数。这是通过基于资源的策略完成的。让我们为创建的 lambda 函数添加资源基础策略。
让我们创建一个代理的 DRAFT 版本,可用于内部测试。
现在我们已经创建了代理,让我们使用 bedrock-agent-runtime
客户端来调用这个代理并执行一些任务。
我们还可以自定义与代理序列中每个步骤相关的提示。这为我们提供了更细粒度的控制,了解代理如何处理输入和说明。为此,我们需要使用 update_agent
更新代理的 promptOverrideConfiguration 设置。让我们看看如何为预处理步骤配置自定义提示。
我们获得了与之前相同的结果,并根据输入中包含的额外请求(无法由提供给代理的任何函数处理)而添加了一个额外的响应。我们需要能够解析该新类别并通过在 get_is_valid_input
中设置有效性标志来防止进一步处理请求。让我们定义我们将用作自定义解析器的 lambda 函数来实现这一点。
现在,我们在解析器中指定只有 D 和 E 类别才被认为是有效输入。因此,我们的包含多个请求的查询被正确归类为 Category F,并被分配了一个 “isValid”: false 值,在预处理步骤停止了代理序列。这反映在我们上面看到的响应中,导致无法回答用户查询。与此形成对比的是,只包含 1 个请求的查询,以及没有启用自定义解析器的多个请求查询的结果。
下一步是可选的,演示如何删除我们的代理。要删除代理,我们需要:
我们现在已经使用 boto3 SDK 来创建、调用和删除使用函数定义创建的代理。我们还展示了如何为我们的代理创建自定义提示和解析器,从而更好地控制我们希望代理在代理序列的每个步骤中的行为。
根据我们的应用程序,调整此笔记本来创建新的使用函数定义的代理。