亚马逊AWS官方博客

推出 Amazon Bedrock AgentCore(预览版):安全部署并运行任何规模的 AI Agents

短短几年间,基础模型(FM)已从直接响应用户提示生成内容,发展到为 AI Agents 提供支持。AI Agents 是一类新型软件应用,借助基础模型进行推理、规划、行动、学习和适应,在有限的人工监督下实现用户定义的目标。模型上下文协议(MCP)Agent2Agent(A2A)等标准化协议的出现简化了代理与其他工具和系统的连接方式,推动了这一波代理式人工智能的浪潮。

事实上,得益于 CrewAILangGraphStrands Agents 等开源框架,构建能够可靠执行复杂任务的 AI Agents 已变得越来越容易。但是,要从前景看好的概念验证阶段过渡到可支持数千用户规模的生产就绪型代理,仍面临巨大挑战。

开发人员和人工智能工程师本应专注于代理的核心功能,却不得不花费数月时间构建会话管理、身份控制、内存系统和可观测性等基础设施,同时还要保障安全性和合规性。

现在,我们很高兴地宣布,Amazon Bedrock AgentCore 预览版正式发布。这是一套全面的企业级服务,可帮助开发人员使用任意框架和模型(托管在 Amazon Bedrock 或其他平台)快速、安全地大规模部署和运营 AI Agents。

具体而言,我们今天推出的服务包括:

AgentCore Runtime — 提供低延迟的无服务器环境,支持会话隔离,兼容所有代理框架(包括主流开源框架、工具和模型),并且可以处理多模态工作负载和长时间运行的代理。

AgentCore Memory — 管理会话和长期记忆,为模型提供相关上下文,同时帮助代理从过往的交互中学习。

AgentCore Observability — 提供代理执行过程的分步可视化,包括元数据标记、自定义评分、轨迹检查以及故障排查/调试筛选。

AgentCore Identity — 使 AI Agents 能够安全访问 AWS 服务和第三方工具与服务(如 GitHub、Salesforce 和 Slack),既可代表用户操作,也可在获得用户预授权的情况下自主操作。

AgentCore Gateway — 将现有 API 和 AWS Lambda 函数转换为适用于代理的工具,支持跨协议(包括 MCP)的统一访问和运行时发现。

AgentCore Browser — 提供托管的 Web 浏览器实例,助力扩展代理的 Web 自动化工作流。

AgentCore Code Interpreter — 提供一个隔离环境来运行代理生成的代码。

这些服务可以单独使用,并且经过优化,也能协同工作,这就使开发人员无需花费时间整合各个组件。AgentCore 兼容开源或自定义 AI Agents 框架,让团队既能灵活保留偏好工具,又能获得企业级功能。开发人员可以使用 AgentCore SDK 将这些服务集成到现有代码中。

现在,借助 AgentCore Runtime,您可以从 AWS Marketplace 发现、购买和运行预构建的代理及代理工具。只需几行代码,您的代理就可以通过 AgentCore Gateway 安全连接到 AWS Marketplace 中的基于 API 的代理和工具,以帮助您轻松运行复杂的工作流程,同时确保合规性和可控性。

AgentCore 消除了繁琐的基础设施工作和运营复杂性,让开发团队能够更快地将突破性的代理式解决方案推向市场。

下面来看看其实际应用。我将在使用过程中详细介绍各项服务。

使用 Amazon Bedrock AgentCore(预览版)部署生产级客户支持助手

当客户通过电子邮件进行联系时,回复往往会耗费时间。客服人员需要验证邮件的有效性、在客户关系管理(CRM)系统中找到实际客户、查询其订单,并利用特定于产品的知识库查找所需信息以准备回复。

AI Agents 可以通过连接内部系统、使用语义数据来源检索上下文信息,并为支持团队草拟回复来简化这一流程。针对本使用案例,我使用 Strands Agents 构建了一个简单的原型。为简化操作并验证场景,我使用 Python 函数对内部工具进行了模拟。

与开发人员交流时,他们表示许多公司都在构建类似的原型,用于不同的使用案例。当这些原型向公司领导层演示并获得推进许可后,开发团队就必须考虑如何投入生产,并满足安全性、性能、可用性和可扩展性等常规要求。这为 AgentCore 提供了用武之地。

第 1 步 — 通过 AgentCore Runtime 部署到云端

AgentCore Runtime 是一项新服务,用于安全部署、运行和扩展 AI Agents,并提供隔离功能,确保每个用户会话在独立的受保护环境中运行,这对于处理敏感数据的应用至关重要。

为匹配不同的安全状况,代理可使用以下网络配置:

沙盒 — 仅与列入许可名单的 AWS 服务通信。

公开 — 使用托管的互联网接入运行。

仅限 VPC(即将推出)— 此选项将允许访问客户 VPC 中托管的资源或通过 AWS PrivateLink 端点连接的资源。

为了使用 AgentCore Runtime 将代理部署到云端并获得安全的无服务器端点,我在原型中添加了几行使用 AgentCore SDK 的代码,以:

  • 导入 AgentCore SDK。
  • 创建 AgentCore 应用程序。
  • 指定调用代理的入口函数。

要使用其他或自定义代理框架,只需替换入口函数中的代理调用部分即可。

以下是原型代码。我添加的三行用于使用 AgentCore Runtime 的代码前均有注释。

from strands import Agent, tool
from strands_tools import calculator, current_time

# Import the Genesis SDK
from bedrock_agentcore.runtime import BedrockAgentCoreApp

WELCOME_MESSAGE = """
Welcome to the Customer Support Assistant! How can I help you today?
"""

SYSTEM_PROMPT = """
You are an helpful customer support assistant.
When provided with a customer email, gather all necessary info and prepare the response email.
When asked about an order, look for it and tell the full description and date of the order to the customer.
Don't mention the customer ID in your reply.
"""

@tool
def get_customer_id(email_address: str):
    if email_address == "me@example.net":
        return { "customer_id": 123 }
    else:
        return { "message": "customer not found" }

@tool
def get_orders(customer_id: int):
    if customer_id == 123:
        return [{
            "order_id": 1234,
            "items": [ "smartphone", "smartphone USB-C charger", "smartphone black cover"],
            "date": "20250607"
        }]
    else:
        return { "message": "no order found" }

@tool
def get_knowledge_base_info(topic: str):
    kb_info = []
    if "smartphone" in topic:
        if "cover" in topic:
            kb_info.append("To put on the cover, insert the bottom first, then push from the back up to the top.")
            kb_info.append("To remove the cover, push the top and bottom of the cover at the same time.")
        if "charger" in topic:
            kb_info.append("Input: 100-240V AC, 50/60Hz")
            kb_info.append("Includes US/UK/EU plug adapters")
    if len(kb_info) > 0:
        return kb_info
    else:
        return { "message": "no info found" }

# Create an AgentCore app
app = BedrockAgentCoreApp()

agent = Agent(
    system_prompt=SYSTEM_PROMPT,
    tools=[calculator, current_time, get_customer_id, get_orders, get_knowledge_base_info]
)

# Specify the entrypoint function invoking the agent
@app.entrypoint
def invoke(payload, context: RequestContext):
    """Handler for agent invocation"""
    user_message = payload.get(
        "prompt", "No prompt found in input, please guide customer to create a json payload with prompt key"
    )
    result = agent(user_message)
    return {"result": result.message}

if __name__ == "__main__":
    app.run()

我在 Python 虚拟环境中安装了 AgentCore SDK 和入门工具包:

pip install bedrock-agentcore bedrock-agentcore-starter-toolkit

激活虚拟环境后,即可使用入门工具包提供的 AgentCore 命令行界面(CLI)。

首先,我使用 agentcore configure --entrypoint my_agent.py -er <IAM_ROLE_ARN> 来配置代理,传递代理将承担的 AWS Identity and Access Management(IAM)角色。在本例中,代理需要访问 Amazon Bedrock 以调用模型。该角色还可授予代理访问其他 AWS 资源(如 Amazon Simple Storage Service(Amazon S3)存储桶或 Amazon DynamoDB 表)的权限。

我使用 agentcore launch --local 在本地启动代理。本地运行时,可通过 agentcore invoke --local <PAYLOAD> 与代理交互。有效载荷将传递到入口函数。请注意,调用的 JSON 语法由入口函数定义。在本例中,我在 JSON 有效载荷中查找 prompt,但您可以根据具体使用案例使用不同的语法。

对本地测试感到满意后,我使用 genesis launch 将其部署到云端。

部署成功并创建端点后,我使用 agentcore status 检查端点状态,并通过 agentcore invoke <PAYLOAD> 调用端点。例如,我在调用中传入一个客户支持请求:

agentcore invoke '{"prompt": "From: me@example.net – Hi, I bought a smartphone from your store.I am traveling to Europe next week, will I be able to use the charger? Also, I struggle to remove the cover.Thanks, Danilo"}'

第 2 步 — 启用记忆功能以保存上下文

在 AgentCore 运行时中部署代理后,需要保留上下文才能将其用于新的调用。我添加了 AgentCore Memory,利用其短期记忆功能维护会话上下文。

首先,我创建了一个记忆客户端和对话记忆存储:

from bedrock_agentcore.memory import MemoryClient

memory_client = MemoryClient(region_name="us-east-1")

memory = memory_client.create_memory_and_wait(
    name="CustomerSupport",
    description="Customer support conversations"
)

现在,我可以使用 create_event 将代理交互存储到短期记忆中:

memory_client.create_event(
    memory_id=memory.get("id"), # Identifies the memory store
    actor_id="user-123",        # Identifies the user
    session_id="session-456",   # Identifies the session
    messages=[
        ("Hi, ...", "USER"),
        ("I'm sorry to hear that...", "ASSISTANT"),
        ("get_orders(customer_id='123')", "TOOL"),
        . . .
    ]
)

我可以使用 list_events 从短期记忆中加载最近几轮对话:

conversations = memory_client.list_events(
    memory_id=memory.get("id"), # Identifies the memory store
    actor_id="user-123",        # Identifies the user 
    session_id="session-456",   # Identifies the session
    max_results=5               # Number of most recent turns to retrieve
)

通过此功能,代理可以在长时间会话中维护上下文。但当用户开启新会话时,对话将重新开始。借助长期记忆功能,代理可以跨多次交互保留用户见解,从而个性化用户体验。

要从对话中提取记忆,我可以使用 AgentCore Memory 的内置策略 [用于用户偏好、摘要和语义记忆(以捕获事实)],也可以创建自定义策略以满足特定需求。数据通过基于命名空间的存储进行加密存储,以实现数据分段。

我更改了之前创建记忆存储的代码,通过传入语义记忆策略添加长期记忆功能。请注意,可以更新现有记忆存储以添加策略。在这种情况下,新策略将应用于新事件。

memory = memory_client.create_memory_and_wait(
    name="CustomerSupport",
    description="Customer support conversations",
    strategies=[{
        "semanticMemoryStrategy": {
            "name": "semanticFacts",
            "namespaces": ["/facts/{actorId}"]
        }
    }]
)

为记忆存储配置长期记忆后,调用 create_event 将自动应用这些策略以从对话中提取信息。然后,我可以通过语义查询检索从对话中提取的记忆:

memories = memory_client.retrieve_memories(
    memory_id=memory.get("id"),
    namespace="/facts/user-123",
    query="smartphone model"
)

通过这种方式,我可以快速改善用户体验,使代理能够记住 CRM 范围之外的客户偏好和事实,并利用这些信息优化回复。

第 3 步 — 添加身份和访问控制

如果没有适当的身份控制,代理对内部工具的访问将始终使用相同的权限级别。为满足安全要求,我集成了 AgentCore Identity,使代理能够使用基于用户或代理身份上下文的访问控制。

我设置了一个身份客户端,并创建了一个工作负载身份,作为 AgentCore Identity 系统中代理的唯一标识符:

from bedrock_agentcore.services.identity import IdentityClient

identity_client = IdentityClient("us-east-1")
workload_identity = identity_client.create_workload_identity(name="my-agent")

然后,我配置了凭证提供商,例如:

google_provider = identity_client.create_oauth2_credential_provider(
    {
        "name": "google-workspace",
        "credentialProviderVendor": "GoogleOauth2",
        "oauth2ProviderConfigInput": {
            "googleOauth2ProviderConfig": {
                "clientId": "your-google-client-id",
                "clientSecret": "your-google-client-secret",
            }
        },
    }
)

perplexity_provider = identity_client.create_api_key_credential_provider(
    {
        "name": "perplexity-ai",
        "apiKey": "perplexity-api-key"
    }
)

然后,我可以为需要访问令牌才能执行操作的函数添加 @requires_access_token Python 装饰器(传递提供商名称、范围等)。

通过这种方式,代理可以通过公司现有的身份基础设施验证身份、作为经过身份验证的独特身份运行、凭借限定权限操作,并集成多个身份提供商(如 Amazon CognitoOktaMicrosoft Entra ID)以及服务边界,包括 AWS 和第三方工具与服务(如 Slack、GitHub 和 Salesforce)。

为提供强大、安全的访问控制,同时简化终端用户和代理构建者的体验,AgentCore Identity 实施了一个安全令牌库,用于存储用户令牌,并支持代理安全检索这些令牌。

对于兼容 OAuth 2.0 的工具和服务,当用户首次授予代理代表其操作的权限时,AgentCore Identity 会收集并存储工具颁发的用户令牌,同时安全存储代理的 OAuth 客户端凭证。代理将以自身独特身份运行,并在用户调用代理时根据需要访问这些令牌,无需频繁征求用户同意。

当用户令牌到期时,AgentCore Identity 会向用户触发新的授权提示,以便代理获取更新的用户令牌。对于使用 API 密钥的工具,AgentCore Identity 还会安全存储这些密钥并为代理提供受控访问权限,以便在需要时检索这些密钥。这种安全的存储方式可以简化用户体验,同时保持强大的访问控制,使代理能够在各种工具和服务中高效运行。

第 4 步 — 通过 AgentCore Gateway 扩展代理功能

到目前为止,所有内部工具都在代码中模拟的。包括 Strands Agents 在内的许多代理框架都原生支持 MCP,以连接远程工具。为了通过 MCP 接口访问内部系统(如 CRM 和订单管理系统),我使用了 AgentCore Gateway。

借助 AgentCore Gateway,代理可以使用 Smithy 模型访问 AWS 服务、Lambda 函数,以及使用 OpenAPI 规范访问内部 API 和第三方提供商。它采用双重身份验证模型,对传入请求和到目标资源的出站连接提供安全访问控制。Lambda 函数可用于集成外部系统,特别是那些缺乏标准 API 或需要执行多个步骤来检索信息的应用程序。

AgentCore Gateway 推进了大多数客户原本需要自行构建的跨领域功能,包括身份验证、授权、节流、自定义请求/响应转换(以匹配基础 API 格式)、多租户和工具选择。

工具选择功能有助于为特定代理任务找到最相关的工具。AgentCore Gateway 为所有这些工具提供统一的 MCP 接口,并通过 AgentCore Identity 为 AWS 服务等原生不支持 OAuth 的工具提供 OAuth 接口。

第 5 步 — 通过 AgentCore Code Interpreter 和 Browser 工具添加功能

为了回复客户请求,客户支持代理需要执行计算。为简化这一过程,我使用 AgentCode SDK 添加了对 AgentCore Code Interpreter 的访问权限。

同样,代理所需的某些集成可能没有编程 API,只能通过 Web 界面访问。我授予了对 AgentCore Browser 的访问权限,使代理能够自主浏览这些网站。

第 6 步 — 通过可观测性获得可见性

现在,代理已进入生产环境,我需要了解其活动和性能。AgentCore 提供增强的可观测性,可帮助开发者有效调试、审计和监控生产环境中的代理性能。它内置仪表板,用于跟踪关键运营指标,如会话数、延迟、持续时间、令牌使用量、错误率,以及组件级别的延迟和错误细分。AgentCore 还通过捕获和可视化端到端轨迹以及“跨度”(记录代理工作流程的每个步骤,包括工具调用、内存访问等)来提供对代理行为的深入分析。

该服务提供的内置控制面板有助于发现性能瓶颈,并找出某些交互失败的原因,从而实现持续改进,并减少问题的平均检测时间(MTTD)和平均修复时间(MTTR)。

AgentCore 支持 OpenTelemetry,以帮助将代理遥测数据与现有可观测性平台(包括 Amazon CloudWatchDatadogLangSmithLangfuse)集成。

第 7 步 — 结论

在这段旅程中,我们将一个本地原型转变为生产就绪型系统。借助 AgentCore 的模块化方法,我们逐步实施了企业需求 — 从基本部署到复杂的内存、身份管理和工具集成,同时保留了现有的代理代码。

注意事项

Amazon Bedrock AgentCore 已在美国东部(弗吉尼亚州北部)、美国西部(俄勒冈州)、亚太地区(悉尼)和欧洲地区(法兰克福)推出预览版。您可以通过 AWS 管理控制台AWS 命令行界面(AWS CLI)AWS SDKAgentCore SDK 开始使用 AgentCore 服务。

2025 年 9 月 16 日前,您可以免费试用 AgentCore 服务。使用 AgentCore 时涉及的其他 AWS 服务将按标准 AWS 定价收费(例如,AgentCore Observability 功能将适用 CloudWatch 定价)。自 2025 年 9 月 17 日起,AWS 将根据此页面的说明对 AgentCore 服务的使用计费。

无论您是要构建客户支持代理、工作流程自动化工具,还是创新的 AI 驱动型体验,AgentCore 都能为您提供坚实基础,帮助您自信地从原型阶段迈向生产部署。

如需了解更多信息并开始部署生产级代理,请访问 AgentCore 文档。有关代码示例和集成指南,请查看 AgentCore 示例 GitHub 存储库

欢迎加入 AgentCore 预览版 Discord 服务器,以提供反馈并讨论使用案例。期待您与我们联系!

Danilo


*前述特定亚马逊云科技生成式人工智能相关的服务仅在亚马逊云科技海外区域可用,亚马逊云科技中国仅为帮助您了解行业前沿技术和发展海外业务选择推介该服务。