

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 教程：构建简单的 Amazon Bedrock 代理
<a name="agent-tutorial"></a>

本教程将指导您使用 AWS 管理控制台创建和配置简单的 Amazon Bedrock 代理。您将学习如何创建代理，通过调用 Lambda 函数来响应用户关于当前日期和时间的查询。

在本教程中，您将：

1. 创建 Lambda 函数 – 构建一个 Python 函数，当代理调用该函数时，会返回当前的日期和时间。

1. 创建 Amazon Bedrock 代理 – 在 Amazon Bedrock 控制台中设置代理，并使用指令配置该代理来处理日期和时间查询。

1. 测试代理 – 使用内置测试界面验证代理能否正确响应日期和时间请求。

1. 使用别名部署代理 – 创建代理的版本并使用别名部署，使其可供使用。

1. 通过 Python 代码调用代理 – 学习如何使用 AWS SDK for Python (Boto) 以编程方式与代理交互。

1. 清理资源 – 删除在本教程中创建的 AWS 资源，免产生不必要的费用。

在本教程结束时，您将拥有一个可运行的 Amazon Bedrock 代理，它能够理解以自然语言提出的关于日期和时间信息的请求，并利用 Lambda 函数返回的准确数据给出响应。

本教程基于 AWS 文档 [GitHub 存储库](https://github.com/awsdocs/aws-doc-sdk-examples/blob/main/python/example_code/bedrock-agent/scenario_get_started_with_agents.py)中的代理代码示例。

**Topics**
+ [先决条件](agent-tutorial-prereq.md)
+ [第 1 步：创建 Lambda 函数](agent-tutorial-step1.md)
+ [步骤 2：创建 Amazon Bedrock 代理](agent-tutorial-step2.md)
+ [步骤 3：测试代理](agent-tutorial-step3.md)
+ [步骤 4：使用别名部署代理](agent-tutorial-step4.md)
+ [步骤 5：通过 Python 代码调用代理](agent-tutorial-step5.md)
+ [步骤 6：清理资源](agent-tutorial-step6.md)
+ [其他资源](agent-tutorial-resources.md)

# 先决条件
<a name="agent-tutorial-prereq"></a>

在开始本教程之前，请确保您具有以下各项：
+ AWS 账户，具有以下托管策略：
  + [AmazonBedrockFullAccess](https://docs.aws.amazon.com/bedrock/latest/userguide/security-iam-awsmanpol.html#security-iam-awsmanpol-AmazonBedrockFullAccess)
  + [AWSLambda\$1FullAccess](https://docs.aws.amazon.com/lambda/latest/dg/security-iam-awsmanpol.html#lambda-security-iam-awsmanpol-AWSLambda_FullAccess)
  + [IAMFullAccess](aws-managed-policy/latest/reference/IAMFullAccess.html)
**重要**  
这些权限让您可以运行本教程以及其他不相关的任务。在生产环境中，请确保只分配用户运行您的应用程序所需的权限。
+ 对 IAM 角色和权限有基本了解（[《IAM 用户指南》](https://docs.aws.amazon.com/IAM/latest/UserGuide/introduction.html)）
+ 熟悉 AWS Lambda 函数（[《Lambda 开发人员指南》](https://docs.aws.amazon.com/lambda/latest/dg/welcome.html)）

# 第 1 步：创建 Lambda 函数
<a name="agent-tutorial-step1"></a>

首先，创建一个 Lambda 函数，您的代理将调用函数来执行操作。在此过程中，您将创建一个 Python Lambda 函数，在调用该函数时将返回当前日期和时间。您使用基本权限设置该函数，添加必要的代码来处理 Amazon Bedrock 代理发出的请求，并部署该函数，以便它可以连接到您的代理。

有关更多信息，请参阅《AWS Lambda 开发人员指南》**中的[创建第一个 Lambda 函数](https://docs.aws.amazon.com/lambda/latest/dg/getting-started.html)。

**创建 Lambda 函数**

1. 登录 AWS 管理控制台，然后通过以下网址打开 Lambda 控制台：[https://console.aws.amazon.com/lambda/](https://console.aws.amazon.com/lambda/)。

1. 选择**创建函数**。

1. 选择**从头开始编写**。

1. 在 **Basic information (基本信息)** 部分中：
   + 对于**函数名称**，输入函数的名称（例如 `DateTimeFunction`）。记下函数的名称，您在[步骤 2：创建 Amazon Bedrock 代理](agent-tutorial-step2.md)的第 15 步中需要该名称。
   + 对于**运行时**，选择 **Python 3.9**（或您的首选版本）。
   + 对于**架构**，请保持不变。
   + 在**权限**中，选择**更改默认执行角色**，然后选择**创建具有基本 Lambda 权限的新角色**。

1. 选择**创建函数**。

1. 在**函数概览**中的**函数 ARN** 下，记下该函数的 Amazon 资源名称（ARN）。您在[步骤 2：创建 Amazon Bedrock 代理](agent-tutorial-step2.md)的第 24 步中需要此名称。

1. 在**代码**选项卡中，使用以下内容替换现有代码：

   ```
   # Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
   # SPDX-License-Identifier: Apache-2.0
   import datetime
   import json
   
   
   def lambda_handler(event, context):
       now = datetime.datetime.now()
   
       response = {"date": now.strftime("%Y-%m-%d"), "time": now.strftime("%H:%M:%S")}
   
       response_body = {"application/json": {"body": json.dumps(response)}}
   
       action_response = {
           "actionGroup": event["actionGroup"],
           "apiPath": event["apiPath"],
           "httpMethod": event["httpMethod"],
           "httpStatusCode": 200,
           "responseBody": response_body,
       }
   
       session_attributes = event["sessionAttributes"]
       prompt_session_attributes = event["promptSessionAttributes"]
   
       return {
           "messageVersion": "1.0",
           "response": action_response,
           "sessionAttributes": session_attributes,
           "promptSessionAttributes": prompt_session_attributes,
       }
   ```

1. 选择**部署**以部署您的函数。

1. 选择**配置**选项卡。

1. 选择**权限**。

1. 在**基于资源的策略声明**下，选择**添加权限**。

1. 在**编辑策略声明**中，执行以下操作：

   1. 选择 **AWS 服务**

   1. 在**服务**中选择**其他**。

   1. 对于**声明 ID**，输入唯一标识符（例如，`AllowBedrockInvocation`）。

   1. 对于**主体**，输入 `bedrock.amazonaws.com`。

   1. 对于**资源 ARN**，输入 `arn:aws:bedrock:region:AWS account ID:agent/*`

      将 `region` 替换为您正在使用的 AWS 区域，例如 `us-east-1`。将 `AWS account ID` 替换为您的 AWS 账户 ID。

   1. 对于**操作**，选择 `lambda:InvokeFunction`。

1. 选择**保存**。

# 步骤 2：创建 Amazon Bedrock 代理
<a name="agent-tutorial-step2"></a>

接下来，您将创建 Amazon Bedrock 代理。在此过程中，您将在 Amazon Bedrock 控制台中设置一个代理，为其配置基础模型，并提供指令，来将其行为定义为友好的聊天机器人，用于返回日期和时间信息。您还将创建一个包含 OpenAPI 架构的操作组，该架构定义了代理可以调用的 API 端点，具体而言是用于获取当前日期和时间的端点。此外，您还需要向代理的 IAM 角色添加一条内联策略，以允许角色调用您的 Lambda 函数。该代理将作为用户与您的 Lambda 函数之间的接口，解读自然语言请求并将其转换为结构化的函数调用，来检索日期和时间信息。

有关更多信息，请参阅 [手动创建和配置代理](agents-create.md)。

**创建 Amazon Bedrock 代理**

1. 使用有权使用 Amazon Bedrock 控制台的 IAM 身份登录。AWS 管理控制台然后，在 [https://console.aws.amazon.com/](https://console.aws.amazon.com/bedrock)bedrock 上打开 Amazon Bedrock 控制台。

1. 请确保您所在的AWS[地区](https://docs.aws.amazon.com/awsconsolehelpdocs/latest/gsg/select-region.html)支持 Amazon Bedrock [代理](agents-supported.md)。

1. 在导航窗格中的**构建器工具**下，选择**代理**。

1. 选择 **Create agent (创建代理)**。

1. 对于**名称**，输入代理的名称（例如 `MyBedrockAgent`）。

1. （可选）对于**描述**，输入描述。

1. 选择**创建**。此时将打开**代理构建器**窗格。

1. 在**代理详细信息**部分中：
   + 对于**代理资源角色**，选择**创建和使用新的服务角色**。
   + 对于**选择模型**，选择一个模型，例如 Claude 3 Haiku。
   + 在**代理的说明**部分中，输入以下说明。

     ```
     You are a friendly chat bot. You have access to a function called that returns
     information about the current date and time. When responding with date or time,
     please make sure to add the timezone UTC.
     ```

1. 选择**保存**。

1. 选择**操作组**选项卡。

1. 在**操作组**中，选择**添加**。

1. 对于**输入操作组名称**，输入操作组的名称（例如，`TimeActions`）。

1. （可选）对于**描述**，输入操作组的描述。

1. 在**操作组类型**中，选择**使用 API 架构定义**。

1. 在**操作组调用**中，选择**选择现有 Lambda 函数**。

1. 在**选择 Lambda 函数**中，选择您在[第 1 步：创建 Lambda 函数](agent-tutorial-step1.md)中创建的 Lambda 函数的名称。

1. 在**操作组架构**中，选择**通过内嵌架构编辑器定义**。

1. 在**内嵌的 OpenAPI 架构**文本框中，将现有架构替换为以下 OpenAPI YAML 架构：

   ```
   openapi: 3.0.0
   info:
     title: Time API
     version: 1.0.0
     description: API to get the current date and time.
   paths:
     /get-current-date-and-time:
       get:
         summary: Gets the current date and time.
         description: Gets the current date and time.
         operationId: getDateAndTime
         responses:
           '200':
             description: Gets the current date and time.
             content:
               'application/json':
                 schema:
                   type: object
                   properties:
                     date:
                       type: string
                       description: The current date
                     time:
                       type: string
                       description: The current time
   ```

1. 检查您的操作组配置，然后选择**创建**。

1. 选择 **保存** 以保存您的更改。

1. 选择**准备**以准备代理。

1. 选择**保存并退出**，保存您的更改并退出代理构建器。

1. 在**代理概览**部分中的**权限**下，选择 IAM 服务角色。这将在 IAM 控制台中打开角色。

1. 在 IAM 控制台中，选择**权限**选项卡。

1. 选择**添加权限**，然后选择**创建内联策略**。

1. 选择 **JSON**，然后粘贴以下策略。确保 `Resource` 是您的 Lambda 函数的 Amazon 资源名称（ARN）。您已在[第 1 步：创建 Lambda 函数](agent-tutorial-step1.md) 的第 6 步中记下了 ARN。

1. 选择**下一步**。

1. 输入策略的名称（例如，`BedrockAgentLambdaInvoke`）。

1. 选择**创建策略**。

# 步骤 3：测试代理
<a name="agent-tutorial-step3"></a>

在此过程中，您将使用 Amazon Bedrock 控制台内置的测试界面来测试代理的工作草稿。您将发送自然语言查询，询问当前日期和时间，并观察代理如何处理这些请求、调用您的 Lambda 函数并返回格式化响应。此测试步骤使您能够验证您的代理是否正确理解用户意图，正确调用 Lambda 函数，并以用户友好的方式呈现信息。

有关更多信息，请参阅 [测试代理行为并进行问题排查](agents-test.md)。

**测试代理**

1. 在 Amazon Bedrock 控制台中，打开您在[步骤 2：创建 Amazon Bedrock 代理](agent-tutorial-step2.md)中创建的代理

1. 选择**测试**以打开**测试**面板。

1. 在**别名**下拉列表中，选择别名 **TestAlias: Working draft**。

1. 在聊天界面中，输入将触发其中一个代理操作的提示，例如：
   + **What time is it?**
   + **Can you tell me today's date?**

1. 该代理将处理您的提示，根据需要调用 Lambda 函数并返回响应。

1. （可选）选择**显示跟踪**以查看您发送给模型的提示的[跟踪](trace-events.md)步骤。在跟踪中，您应该能看到模型用来决定何时调用 Lambda 函数以获取日期和时间的推理过程。

# 步骤 4：使用别名部署代理
<a name="agent-tutorial-step4"></a>

在配置代理后，您需要使用别名部署它，使其可供使用。在此过程中，您将创建代理的别名和版本，来准备对代理进行部署。别名指向该版本，使您能够通过稳定的端点调用代理，同时仍能更新底层实施。

有关更多信息，请参阅 [在您的应用程序中部署和使用 Amazon Bedrock 代理](agents-deploy.md)。

**使用别名部署代理**

1. 在 Amazon Bedrock 控制台中，打开您在[步骤 2：创建 Amazon Bedrock 代理](agent-tutorial-step2.md)中创建的代理

1. 选择**创建别名**。

1. 对于**别名**，输入别名的名称。例如 **DateTimeAliasAgentAlias**。

1. （可选）对于**描述**，输入描述。

1. 对于**关联版本**，选择**创建新版本并将其与此别名关联**。

1. 选择**创建别名**。

1. 按照[步骤 3：测试代理](agent-tutorial-step3.md)中的说明测试别名。对于步骤 6，选择您刚刚创建的别名。

# 步骤 5：通过 Python 代码调用代理
<a name="agent-tutorial-step5"></a>

在本步骤中，您将学习如何使用 AWS SDK for Python (Boto)以编程方式与代理交互。示例代码演示了如何使用该[InvokeAgent](https://docs.aws.amazon.com/bedrock/latest/APIReference/API_agent-runtime_InvokeAgent.html)操作，该操作要求同时使用代理 ID 和 ALIAS ID 作为参数来调用您的代理。该代码演示了如何向代理发送提示、处理响应，以及处理流式和非流式响应模式。这使您能够将 Bedrock 代理集成到自己的 Python 应用程序中。

有关更多信息，请参阅 [从您的应用程序调用代理](agents-invoke-agent.md)。

**通过 Python 代码调用代理**

1. 获取代理的 ID。有关更多信息，请参阅 [查看关于代理的信息](agents-view.md)。

1. 获取代理别名的 ID。有关更多信息，请参阅 [在 Amazon Bedrock 中查看有关代理别名的信息](agents-alias-view.md)。

1. 运行以下代码。更新以下值：
   + **AGENT\$1ID** – 更新为您的代理的 ID。
   + **ALIAS\$1ID** – 更新为您的代理的别名 ID。
   + **区域**-指您在其中创建代理的 AWS 区域，例如`us-east-1`。

   要流式传输来自代理的响应，请将 `streamFinalResponse` 的值更改为 `True`。

   ```
   import boto3
   import logging
   
   from botocore.exceptions import ClientError
   
   
   logging.basicConfig(level=logging.INFO)
   logger = logging.getLogger(__name__)
   
   def invoke_agent(client, agent_id, alias_id, prompt, session_id):
           response = client.invoke_agent(
               agentId=agent_id,
               agentAliasId=alias_id,
               enableTrace=True,
               sessionId = session_id,
               inputText=prompt,
               streamingConfigurations = { 
       "applyGuardrailInterval" : 20,
         "streamFinalResponse" : False
               }
           )
           completion = ""
           for event in response.get("completion"):
               #Collect agent output.
               if 'chunk' in event:
                   chunk = event["chunk"]
                   completion += chunk["bytes"].decode()
               
               # Log trace output.
               if 'trace' in event:
                   trace_event = event.get("trace")
                   trace = trace_event['trace']
                   for key, value in trace.items():
                       logging.info("%s: %s",key,value)
   
           print(f"Agent response: {completion}")
   
   
   if __name__ == "__main__":
   
       client=boto3.client(
               service_name="bedrock-agent-runtime",
               region_name="REGION") 
       
       agent_id = "AGENT_ID"
       alias_id = "ALIAS_ID"
       session_id = "123456"
       prompt = "What's the current time?"
   
       try:
   
           invoke_agent(client, agent_id, alias_id, prompt, session_id)
   
       except ClientError as e:
           print(f"Client error: {str(e)}")
           logger.error("Client error: %s", {str(e)})
   ```

# 步骤 6：清理资源
<a name="agent-tutorial-step6"></a>

完成使用 Amazon Bedrock 代理后，应该清理相关资源以避免产生不必要的费用。在最后一个步骤中，您将系统地删除在本教程中创建的所有 AWS 资源，包括 Bedrock 代理、Lambda 函数和关联的\$1IAM 角色。此清理过程对于成本管理非常重要，因为它可以防止不再使用的资源持续产生费用。过程分为三个部分：删除代理、移除 Lambda 函数，以及清理为支持这些服务而创建的 IAM 角色。

**Topics**
+ [删除代理](#agent-tutorial-step6-console-agent)
+ [删除 Lambda 函数](#agent-tutorial-step6-console-lambda)
+ [删除 IAM 角色](#agent-tutorial-step6-console-iam)

## 删除代理
<a name="agent-tutorial-step6-console-agent"></a>

**删除代理**

1. 在 Amazon Bedrock 控制台中，打开您在[步骤 2：创建 Amazon Bedrock 代理](agent-tutorial-step2.md)中创建的代理

1. 选择您创建的代理。

1. 选择 **Delete**。

1. 确认删除操作。

## 删除 Lambda 函数
<a name="agent-tutorial-step6-console-lambda"></a>

**删除 Lambda 函数**

1. 打开 AWS Lambda 控制台，网址为[https://console.aws.amazon.com/lambda/](https://console.aws.amazon.com/lambda/)。

1. 选择您创建的 Lambda 函数。

1. 选择**操作**，然后选择**删除**。

1. 确认删除操作。

## 删除 IAM 角色
<a name="agent-tutorial-step6-console-iam"></a>

**删除 IAM 角色**

1. 使用 [https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/) 打开 IAM 控制台。

1. 在导航窗格中，选择**角色**。

1. 选择您创建的代理服务角色。

1. 选择 **Delete**。

1. 确认删除操作。

1. 对 Lambda 执行角色重复该操作。

# 其他资源
<a name="agent-tutorial-resources"></a>
+ [Amazon Bedrock 用户指南](https://docs.aws.amazon.com/bedrock/latest/userguide/what-is-bedrock.html)
+ [《Amazon Bedrock API 参考》](https://docs.aws.amazon.com/bedrock/latest/APIReference/welcome.html)
+ [《AWS Lambda 开发人员指南》](https://docs.aws.amazon.com/lambda/latest/dg/welcome.html)
+ [IAM 用户指南](https://docs.aws.amazon.com/IAM/latest/UserGuide/introduction.html)
+ [Amazon Bedrock 代理文档](https://docs.aws.amazon.com/bedrock/latest/userguide/agents.html)
+ [OpenAPI 规范](https://swagger.io/specification/)