亚马逊AWS官方博客

预览版 — 允许基础模型使用 Amazon Bedrock 的代理完成任务

今年 4 月,AWS 数据和机器学习副总裁 Swami Sivasubramanian 宣布推出 Amazon Bedrock 和 Amazon Titan 模型,这些模型属于在 AWS 上使用生成式人工智能进行构建的新工具。Amazon Bedrock 目前提供预览版,这是一项完全托管的服务,可通过 API 提供来自 Amazon 和领先人工智能初创企业(例如 AI21 LabsAnthropicCohereStability AI)的基础模型(FM)。

今天,我很高兴地宣布推出Amazon Bedrock 的代理预览版,借助此项新功能,开发人员只需点击几下即可创建完全托管的代理。Amazon Bedrock 的代理可加速生成式人工智能应用程序的交付,这些应用程序可以通过对公司系统进行 API 调用来管理和执行任务。代理扩展 FM 以了解用户请求,将复杂的任务分解为多个步骤,进行对话以收集更多信息,以及执行操作来满足请求。

Amazon Bedrock 的代理

使用 Amazon Bedrock 的代理,您可以为内部或外部客户自动执行任务,例如管理零售订单或处理保险索赔。例如,由代理支持的生成式人工智能电子商务应用程序不仅可以使用简单的答案回答问题“你有这件蓝色的夹克吗?”,还可以帮助您完成更新订单或管理交易的任务。

要使代理发挥作用,您首先需要向其授予外部数据来源的访问权限,并将其连接到其他应用程序的现有 API。这可让助力代理的 FM 在更广阔的范围内进行交互,并将其效用扩展到语言处理任务之外。其次,FM 需要弄清楚执行的操作、使用的信息以及按何种顺序执行这些操作。这要归功于 FM 令人兴奋的新兴行为 — 它们的推理能力。您可以通过构建包含定义和说明的提示,向 FM 展示如何处理此类交互以及如何通过任务进行推理。设计提示以引导模型实现所需输出的过程称为提示工程。

Amazon Bedrock 的代理
Amazon Bedrock 的代理可以自动对用户请求的任务进行提示工程和编排。配置完成后,代理会自动构建提示,并且使用公司特定的信息安全地补充提示内容,从而以自然语言向用户提供回复。代理能够指出自动处理用户请求任务所需的操作。它将任务分成多个步骤,编排一系列 API 调用和数据查找,同时保留内存以完成用户操作。

使用完全托管的代理,您不必担心预置或管理基础设施。无需编写自定义代码,即可无缝支持监控、加密、用户权限和 API 调用管理。身为开发人员,您可以使用 Bedrock 控制台或 SDK 上传 API 架构。然后,代理在 FM 的帮助下编排任务,并使用 AWS Lambda 函数执行 API 调用。

高级推理和 React 入门
可以使用称为 React(协同推理行动)的推理技术帮助 FM 推理和弄清楚如何解决用户请求的任务。使用 React,您可以构造提示以向 FM 展示如何推理任务,以及决定有助于找到解决方案的操作。 结构化提示包括一系列问题-想法-操作-观察结果示例。

问题是用户请求的任务或有待解决的问题。想法是推理步骤,有助于向 FM 展示如何解决问题并确定要执行的操作。操作是模型可从一组允许的 API 中调用的特定 API。观察结果是执行操作的结果。FM 可以选择的操作由示例提示文本前面的一组说明定义。以下是如何构建 React 提示的示例:

构建 React 提示

好消息是 Bedrock 会自动完成繁重的任务! 在后台,Amazon Bedrock 的代理会根据您提供的信息和操作构建提示。

现在我将向您展示如何开始使用 Amazon Bedrock 的代理。

创建 Amazon Bedrock 的代理
假设您是一家保险公司的开发人员,想要提供一款生成式人工智能应用程序,帮助保险机构所有者自动执行重复性任务。您可以在 Bedrock 中创建代理并将其集成到自己的应用程序中。

要开始使用代理,请打开 Bedrock 控制台,在左侧导航面板中选择代理,然后选择创建代理

Amazon Bedrock 的代理

这将启动代理创建工作流程。

  1. 提供代理详细信息,包括代理名称、描述(可选)、是否允许代理请求其他用户输入,以及允许代理访问其他所需服务(例如 Amazon Simple Storage Service(Amazon S3)AWS Lambda)的 AWS Identity and Access Management(IAM)服务角色Amazon Bedrock 的代理
  2. 从 Bedrock 中选择适合使用案例的基础模型。在此处,您可以用自然语言向代理提供说明。此说明告诉代理应该执行的任务以及应承担的角色。例如,“您是一名代理,旨在帮助处理保险索赔和管理待处理的文书工作。”Amazon Bedrock 的代理
  3. 添加操作组。操作是代理可以通过对公司系统进行 API 调用来自动执行的任务。在操作组中定义一组操作。在操作中,您可以提供 API 架构,用于为组中的所有操作定义 API。您还必须提供 Lambda 函数来表示每个 API 的业务逻辑。例如,我们定义名为 ClaimManagementActionGroup 的操作组,该组通过提取未解决索赔列表、确定每项索赔的未处理文书工作以及向保单持有人发送提醒来管理保险索赔。请务必在操作组描述中获取此类信息。FM 将使用这些信息来推理和决定执行何种操作。Amazon Bedrock 的代理我的操作组的业务逻辑在 Lambda 函数 InsuranceClaimsLambda 中获取。此 AWS Lambda 函数实现以下 API 调用的方法:open-claimsidentify-missing-documentssend-reminders。以下是我的 OrderManagementLambda 的简短摘录:
    import json
    import time
     
    def open_claims():
        ...
    
    def identify_missing_documents(parameters):
        ...
     
    def send_reminders():
        ...
     
    def lambda_handler(event, context):
        responses = []
     
        for prediction in event['actionGroups']:
            response_code = ...
            action = prediction['actionGroup']
            api_path = prediction['apiPath']
            
            if api_path == '/claims':
                body = open_claims() 
            elif api_path == '/claims/{claimId}/identify-missing-documents':
    			parameters = prediction['parameters']
                body = identify_missing_documents(parameters)
            elif api_path == '/send-reminders':
                body =  send_reminders()
            else:
                body = {"{}::{} is not a valid api, try another one.".format(action, api_path)}
     
            response_body = {
                'application/json': {
                    'body': str(body)
                }
            }
            
            action_response = {
                'actionGroup': prediction['actionGroup'],
                'apiPath': prediction['apiPath'],
                'httpMethod': prediction['httpMethod'],
                'responseCode': response_code,
                'responseBody': response_body
            }
            
            responses.append(action_response)
     
        api_response = {'response': responses}
     
        return api_response

    请注意,您还必须以 OpenAPI 架构 JSON 格式提供 API 架构。我的 API 架构文件 insurance_claim_schema.json 如下所示:

    {"openapi": "3.0.0",
        "info": {
            "title": "Insurance Claims Automation API",
            "version": "1.0.0",
            "description":"用于管理保险索赔的 API,方法是提取未解决的索赔列表,确定每项索赔的未处理文书工作,并向保单持有人发送提醒。"
        },
        "paths": {
            "/claims": {
                "get": {
                    "summary": “获取所有未解决索赔的列表",
                    "description": "获取所有未解决保险索赔的列表.返回所有未解决的 claimId。",
                    "operationId": "getAllOpenClaims",
                    "responses": {
                        "200": {
                            "description": "获取保单持有人的所有未解决保险索赔列表",
                            "content": {
                                "application/json": {
                                    "schema": {
                                        "type": "array",
                                        "items": {
                                            "type": "object",
                                            "properties": {
                                                "claimId": {
                                                    "type": "string",
                                                    "description": "索赔的唯一 ID。"
                                                },
                                                "policyHolderId": {
                                                    "type": "string",
                                                    "description": "提出索赔的保单持有人的唯一 ID。"
                                                },
                                                "claimStatus": {
                                                    "type": "string",
                                                    "description": "索赔的状态。索赔可以处于“未解决”或“已关闭”状态"
                                                }
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            },
            "/claims/{claimId}/identify-missing-documents": {
                "get": {
                    "summary": "确定特定索赔中缺少的文档",
                    "description": "获取在处理索赔之前需要由保单持有人上传的待处理文档列表。API 仅接收索赔 ID,并返回保单持有人为该索赔上传的待处理文档列表。应该针对每个索赔 ID 调用此 API",
                    "operationId": "identifyMissingDocuments",
                    "parameters": [{
                        "name": "claimId",
                        "in": "path",
                        "description": "未解决保险索赔的唯一 ID",
                        "required": true,
                        "schema": {
                            "type": "string"
                        }
                    }],
                    "responses": {
                        "200": {
                            "description": "保单持有人为保险索赔上传的待处理文档列表",
                            "content": {
                                "application/json": {
                                    "schema": {
                                        "type": "object",
                                        "properties": {
                                            "pendingDocuments": {
                                                "type": "string",
                                                "description": "索赔的待处理文档列表。"
                                            }
                                        }
                                    }
                                }
                            }
    
                        }
                    }
                }
            },
            "/send-reminders": {
                "post": {
                    "summary": "API 向客户发送有关待解决索赔的待处理文档提醒",
                    "description": "向客户发送关于待解决索赔的待处理文档提醒。API 一次只接收一个索赔 ID 及其待处理文档,发送提醒并返回提醒的跟踪详细信息。针对您要为其发送提醒的每个索赔 ID,都应调用此 API。",
                    "operationId": "sendReminders",
                    "requestBody": {
                        "required": true,
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "properties": {
                                        "claimId": {
                                            "type": "string",
                                            "description": "发送提醒的待解决索赔的唯一 ID。"
                                        },
                                        "pendingDocuments": {
                                            "type": "string",
                                            "description": "索赔的待处理文档列表。"
                                        }
                                    },
                                    "required": [
                                        "claimId",
                                        "pendingDocuments"
                                    ]
                                }
                            }
                        }
                    },
                    "responses": {
                        "200": {
                            "description": "提醒已成功发送",
                            "content": {
                                "application/json": {
                                    "schema": {
                                        "type": "object",
                                        "properties": {
                                            "sendReminderTrackingId": {
                                                "type": "string",
                                                "description": "用于跟踪发送提醒调用状态的唯一 ID"
                                            },
                                            "sendReminderStatus": {
                                                "type": "string",
                                                "description": "发送提醒通知的状态"
                                            }
                                        }
                                    }
                                }
                            }
                        },
                        "400": {
                            "description": "错误请求。一个或多个必填字段缺失或无效。"
                        }
                    }
                }
            }
        }
    }

    当用户要求您的代理完成任务时,Bedrock 将使用为代理配置的 FM 来识别操作顺序,并按正确的顺序调用相应的 Lambda 函数来解决用户请求的任务。

  4. 在最后一步中,审查您的代理配置并选择创建代理Amazon Bedrock 的代理
  5. 恭喜,您刚刚在 Amazon Bedrock 中创建了第一个代理!Amazon Bedrock 的代理

部署 Amazon Bedrock 的代理
要在应用程序中部署代理,必须创建别名。然后,Bedrock 会自动为该别名创建一个版本。

  1. 在 Bedrock 控制台中,选择您的代理,然后选择部署,并且选择创建以创建别名。Amazon Bedrock 的代理
  2. 提供别名和描述,然后选择是创建新版本还是使用代理的现有版本与该别名关联。
    Amazon Bedrock 的代理
  3. 这会保存代理代码和配置的快照,并将别名与此快照或版本相关联。可以使用别名将代理集成到应用程序中。
    Amazon Bedrock 的代理

我们现在测试保险代理! 可以直接在 Bedrock 控制台中执行此操作。

我们要求代理“向所有具备待解决索赔和待处理文书工作的保单持有人发送提醒”。 您可以看到由 FM 提供支持的代理如何理解用户请求,将任务分解为多个步骤(收集待解决的保险索赔、查找索赔 ID、发送提醒),并执行相应的操作。

Amazon Bedrock 的代理

Amazon Bedrock 的代理可以帮助您提高工作效率、改善客户服务体验或自动执行 DevOps 任务。我很高兴看到您将实现的使用案例!

采用大型语言模型的生成式人工智能学习生成式人工智能的基础知识
如果您对生成式人工智能的基础知识以及如何使用 FM(包括高级提示技巧和代理)感兴趣,可以查阅我联合 AWS 同事和行业专家与 DeepLearning.AI 合作开发的这门全新实践课程:

采用大型语言模型(LLM)的生成式人工智能是一门为期三周的按需课程,面向想要学习如何通过 LLM 构建生成式人工智能应用程序的数据科学家和工程师。这是开始使用 Amazon Bedrock 进行构建的完美基础。立即注册学习采用 LLM 的生成式人工智能。

注册以了解有关 Amazon Bedrock(预览版)的更多信息
Amazon Bedrock 目前提供预览版。如果您想访问 Amazon Bedrock 的代理(作为预览的一部分),请联系我们。我们定期为新客户提供访问权限。访问 Amazon Bedrock 功能页面注册以了解有关 Amazon Bedrock 的更多信息

– Antje


附言我们专注于改进我们的内容,以提供更好的客户体验,我们需要您的反馈才能做到这一点。请参加此简短调查,分享您对 AWS Blog 体验的见解。请注意,此调查是由外部公司主办的,因此链接不会指向我们的网站。AWS 将按照 AWS 隐私声明中的说明处理您的信息。