在这个笔记本中,我们将使用新的功能定义和用户确认功能为Amazon Bedrock创建一个代理。

我们将以HR代理为例。使用这个代理,我们可以查看我们可用的假期天数并申请新的假期休假。我们将使用AWS Lambda函数来定义检查可用假期天数和确认新的休假时间的逻辑。

对于这个示例,我们将在一个SQLite 数据库中管理员工数据并生成合成数据来演示代理。

先决条件

在开始之前,让我们更新botocore和boto3软件包以确保我们有最新版本。

我们现在可以创建所需的AWS服务的boto3客户端。

接下来,我们可以设置代理和要创建的lambda函数的一些配置变量。

创建Lambda函数

我们现在将创建一个与SQLite文件employee_database.db交互的lambda函数。为此,我们将:

  1. 创建包含员工数据库的employee_database.db文件,并生成一些数据。
  2. 创建包含我们的lambda函数逻辑的lambda_function.py文件。
  3. 创建lambda函数的IAM角色。
  4. 创建具有所需权限的lambda函数基础设施。

接下来,让我们创建我们的lambda函数。它实现了get_available_vacations_days功能,用于获取给定employee_id的可用假期天数,以及book_vacations功能,用于为员工预订假期。

创建代理

我们现在将创建代理。为此,我们首先需要创建允许特定基础模型的Bedrock模型调用的代理策略,以及与该策略关联的代理IAM角色。

创建代理

一旦创建了所需的IAM角色,我们就可以使用Bedrock Agent客户端创建一个新的代理。请注意,创建的代理尚未准备好。稍后,我们将准备并使用该代理。

让我们现在将代理ID存储在一个本地变量中,以便在后续步骤中使用它。

创建具有功能定义和用户确认的代理操作组

我们现在将创建一个代理操作组。为了告知代理操作组功能,我们将提供一个包含操作组功能的操作组描述。

在这个例子中,我们将使用一个功能模式来定义功能。当使用功能模式定义功能时,我们必须为每个功能指定名称、描述、参数和requireConfirmation属性。requireConfirmation属性指示是否需要用户确认才能执行该功能。

在这种情况下,我们将只为reserve_vacation_time启用用户确认。

允许代理调用操作组Lambda

在使用操作组之前,我们需要允许代理调用与操作组关联的lambda函数。这是通过基于资源的策略完成的。让我们为创建的lambda函数添加资源基础策略。

准备代理

让我们创建代理的DRAFT版本,以供内部测试使用。

不需要用户确认的代理调用

现在我们已经创建了代理,让我们使用bedrock-agent-runtime客户端来调用这个代理并执行一些任务。

请注意,当我们没有为此方法设置'requireConfirmation':'ENABLED'设置时,流的返回已经是块。

需要用户确认的代理调用

现在我们将再次调用代理,但这次请求预订一天假期。

与第一个示例不同,返回了一个returnControl事件,其中actionInvocationTypeUSER_CONFIRMATION

使用函数结果和允许执行调用代理

最后,我们需要调用代理,将函数结果作为参数传递。这让我们可以使用代理生成最终响应。请注意,如果为该函数或API启用了用户确认,则用户将被提示在confirmationState字段中CONFIRMDENY指定的操作。对于这个示例,我们将使用confirmationState作为CONFIRM,这意味着用户已确认该操作,允许它被执行。

使用函数结果和不允许执行调用代理

如前一个示例所示,我们将调用相同的invoke_agent方法,但这次我们将传递DENY选项,这意味着用户没有允许执行。

在发送DENY选项到confirmationState后,我们应该收到以下消息:

I'm sorry, I do not have the authorization to reserve vacation time for employees. As an HR assistant, I can only view available vacation days, not make reservations.

清理(可选)

下一步是可选的,演示如何删除我们的代理。要删除代理,我们需要:

  1. 更新操作组以禁用它
  2. 删除代理操作组
  3. 删除代理
  4. 删除lambda函数
  5. 删除创建的IAM角色和策略