亚马逊AWS官方博客

Amazon Bedrock 代理:推出简化的创建和配置体验



借助 Amazon Bedrock 代理,应用程序可以使用生成式人工智能(generative AI)跨多个系统和数据来源运行任务。从今天开始,这些新功能简化了代理的创建和管理:

快速创建代理 — 您现在可以快速创建代理,并可以选择稍后添加指令和操作组,从而为您的开发过程提供灵活性和敏捷性。

代理构建器 — 所有代理配置都可以在控制台的新代理构建器部分中操作。

简化配置 — 操作组可以使用简化的架构,仅列出函数和参数,而无需提供 API 架构。

交回控制权 — 您可以跳过使用 AWS Lambda 函数,将控制权交回给调用代理的应用程序。通过这种方式,应用程序可以直接与 AWS 外部的系统集成,或调用在任何 Amazon Virtual Private Cloud(Amazon VPC)中托管的内部端点,而无需将所需的网络和安全配置与 Lambda 函数集成。

基础设施即代码 — 您可以使用 AWS CloudFormation 通过新的简化配置来部署和管理代理,从而确保生成式人工智能应用程序在不同环境的一致性和可重复性。

让我们看看这些增强功能的实际应用。

使用新的简化控制台创建代理
为了测试新体验,我想构建一个代理来帮助我回复包含客户反馈的电子邮件。我可以使用生成式人工智能,但单次调用基础模型(FM)还不够,因为我需要与其他系统交互。为此,我使用了代理。

Amazon Bedrock 控制台中,我从导航窗格中选择代理,然后选择创建代理。我输入代理的名称(customer-feedback)和描述。使用新界面,我可以继续创建代理,而无需在此阶段提供其他信息。

控制台屏幕截图。

现在我看到了代理构建器,在这里我可以访问和编辑代理的整体配置。在代理资源角色中,我将默认设置保留为创建并使用新服务角色,以便自动为我创建代理所承担的 AWS Identity and Access Management(IAM)角色。对于模型,我选择 AnthropicClaude 3 Sonnet

控制台屏幕截图。

代理说明中,我为代理必须执行的任务提供了清晰且具体的说明。在这里,我还可以指定代理回复时使用的风格和语气。对于我的用例,我输入:

Help reply to customer feedback emails with a solution tailored to the customer account settings.

其他设置中,我为用户输入选择启用,这样,代理就可以在没有足够的信息做出响应时要求提供其他详细信息。然后,我选择保存来更新代理的配置。

我现在在操作组部分选择添加。操作组是代理与外部系统交互以收集更多信息或执行操作的方式。我输入操作组的名称(retrieve-customer-settings)和描述:

检索客户设置,包括客户 ID。

描述是可选的,但如果提供,则会传递到模型以帮助选择何时使用此操作组。

控制台屏幕截图。

操作组类型中,我选择使用函数详细信息定义,这样,我只需要指定函数及其参数即可。此处的另一个选项(使用 API 架构定义)对应于先前使用 API 架构配置操作组的方式。

操作组函数可以与 Lambda 函数调用关联,也可以配置为将控制权交回给调用代理的用户或应用程序,以便向函数提供响应。交回控制权的选项对于四个主要用例很有用:

  • 当从现有应用程序(例如,调用代理的应用程序)调用 API 比使用 API 所需的正确身份验证和网络配置构建新的 Lambda 函数更容易时
  • 当任务的持续时间超过最大 Lambda 函数超时时间(15 分钟)时,这样我就可以使用在容器或虚拟服务器中运行的应用程序或使用工作流程编排(例如 AWS Step Functions)来处理该任务
  • 当我执行耗时的操作时,因为交回控制权后,代理无需等待操作完成即可继续执行下一步,调用应用程序可以在代理的编排流程继续的同时在后台异步执行操作
  • 当我需要一种快速的方法来模拟开发和测试期间与 API 的交互以及代理的交互时

操作组调用中,我可以指定在编排期间模型识别到该操作组时将调用的 Lambda 函数。我可以要求控制台快速创建新的 Lambda 函数,选择现有的 Lambda 函数,或者交回控制权,这样调用代理的用户或应用程序就会要求提供详细信息以生成响应。我选择交回控制权以显示它在控制台中的工作原理。

控制台屏幕截图。

我配置了操作组的第一个函数。我为该函数输入了名称(retrieve-customer-settings-from-crm)和以下描述:

使用电子邮件发件人字段中的客户电子邮件从 CRM 检索客户设置,包括客户 ID。

控制台屏幕截图。

参数中,我为电子邮件添加了客户电子邮件作为描述。这是字符串类型的参数,也是此函数所必需的参数。我选择添加来完成操作组的创建。

因为对于我的用例,我预计很多客户在登录时会遇到问题,所以我添加了另一个操作组(名为 check-login-status),其描述如下:

Check customer login status.

这次,我选择创建新的 Lambda 函数的选项,以便可以在代码中处理这些请求。

对于此操作组,我配置了一个函数(名为 check-customer-login-status-in-login-system),其描述如下:

Check customer login status in login system using the customer ID from settings.

参数中,我添加了 customer_id,这是另一个字符串类型的必需参数。然后,我选择添加以完成第二个操作组的创建。

当我打开此操作组的配置时,我会看到已在我的账户中创建的 Lambda 函数的名称。在那里,我选择查看以在控制台中打开 Lambda 函数。

控制台屏幕截图。

Lambda 控制台中,我编辑已提供的起始代码并实施我的业务案例:

import json

def lambda_handler(event, context):
    print(event)
    
    agent = event['agent']
    actionGroup = event['actionGroup']
    function = event['function']
    parameters = event.get('parameters', [])

    # Execute your business logic here.For more information,
    # refer to: https://docs.aws.amazon.com/bedrock/latest/userguide/agents-lambda.html
    if actionGroup == 'check-login-status' and function == 'check-customer-login-status-in-login-system':
        response = {
            "status": "unknown"
        }
        for p in parameters:
            if p['name'] == 'customer_id' and p['type'] == 'string' and p['value'] == '12345':
                response = {
                    "status": "not verified",
                    "reason": "the email address has not been verified",
                    "solution": "please verify your email address"
                }
    else:
        response = {
            "error": "Unknown action group {} or function {}".format(actionGroup, function)
        }
    
    responseBody =  {
        "TEXT": {
            "body": json.dumps(response)
        }
    }

    action_response = {
        'actionGroup': actionGroup,
        'function': function,
        'functionResponse': {
            'responseBody': responseBody
        }

    }

    dummy_function_response = {'response': action_response, 'messageVersion': event['messageVersion']}
    print("Response: {}".format(dummy_function_response))

    return dummy_function_response

我选择 Lambda 控制台中的部署。该函数配置了基于资源的策略,允许 Amazon Bedrock 调用该函数。因此,我不需要更新代理使用的 IAM 角色。

我已经准备好测试代理。返回 Amazon Bedrock 控制台,选择代理后,我查找测试代理部分。在那里,我选择准备来准备代理并使用最新的更改对其进行测试。

作为对代理的输入,我提供了以下示例电子邮件:

From: danilop@example.com

Subject: Problems logging in

Hi, when I try to log into my account, I get an error and cannot proceed further.Can you check? Thank you, Danilo

在第一步中,代理编排决定使用第一个操作组(retrieve-customer-settings)和函数(retrieve-customer-settings-from-crm)。该函数配置为交回控制权,并且在控制台中,要求我提供操作组函数的输出。客户电子邮件地址作为输入参数提供。

控制台屏幕截图。

为了模拟与应用程序的交互,我使用 JSON 语法回复并选择提交

{ "customer id": 12345 }

在下一步中,代理拥有使用第二个操作组(check-login-status)和函数(check-customer-login-status-in-login-system)调用 Lambda 函数所需的信息。相应地,Lambda 函数提供以下 JSON 负载:

{
  "status": "not verified",
  "reason": "the email address has not been verified",
  "solution": "please verify your email address"
}

使用此内容,代理可以完成其任务并为该客户建议正确的解决方案。

控制台屏幕截图。

我对结果感到满意,但我想详细了解幕后发生的事情。我选择显示跟踪,我可以在其中查看代理编排的每个步骤的详细信息。这可以帮助我了解代理决策并在代理组未按预期使用时更正其配置。

控制台屏幕截图。

注意事项
您可以使用新的简化体验在 AWS 区域美国东部(弗吉尼亚州北部)和美国西部(俄勒冈州)创建和管理 Amazon Bedrock 代理

现在,您无需指定 API 架构或为操作组提供 Lambda 函数即可创建代理。您只需要列出操作组需要的参数即可。调用代理时,您可以选择使用要执行的操作的详细信息交回控制权,这样您就可以在现有应用程序中,或者在持续时间超过 Lambda 函数的最大超时时间时处理操作。

CloudFormation 最近发布了对 Amazon Bedrock 代理的支持,现在正在更新以支持新的简化语法。

了解详情:

Danilo