使用Amazon Bedrock AgentCore构建生产级AI智能体:从本地原型到云端部署
1. 项目概述从零到一用AgentCore构建生产级AI智能体如果你正在尝试将基于LangChain、CrewAI或LlamaIndex开发的AI智能体从本地原型推向真实的生产环境大概率会遇到一堆头疼的问题如何管理智能体的身份认证和权限如何安全地调用外部API工具如何持久化对话记忆以实现个性化更别提还要考虑监控、评估、成本控制和弹性扩缩容了。这些“脏活累活”往往消耗了团队80%的精力而真正用于优化智能体核心逻辑的时间所剩无几。这正是Amazon Bedrock AgentCore要解决的核心痛点。简单来说AgentCore不是一个全新的智能体框架而是一个专为生产环境设计的“智能体基础设施平台”。它允许你带着自己熟悉的框架无论是Strands Agents、LangGraph还是任何自定义架构和偏好的大模型Claude、GPT、Llama等直接部署到AWS云上。AgentCore负责提供底层运行时、身份网关、记忆存储、工具管理和可观测性等一整套“基座”能力。你可以把它想象成智能体领域的Kubernetes——它不关心你用什么编程语言写业务逻辑但能确保你的应用可以安全、可靠、大规模地运行。最近AWS开源了awslabs/agentcore-samples这个官方示例库这相当于给我们送来了一份详尽的“官方菜谱”。里面不仅有“五分钟快速上手”的入门教程更有针对运行时、网关、记忆等核心能力的深度解析以及整合了多种能力的端到端应用蓝本。对于任何希望将AI智能体产品化的开发者或架构师来说这个仓库的价值不亚于一份详尽的产品说明书和最佳实践指南。接下来我将结合官方示例和我的实践经验带你深入拆解AgentCore的核心能力并手把手演示如何将一个本地原型转化为可投入生产的智能体应用。2. 核心设计思路为什么是“框架与模型无关”在深入代码之前理解AgentCore的设计哲学至关重要。市面上很多AI平台要求你使用特定的SDK或框架一旦上船就很难更换。AgentCore反其道而行之提出了“框架与模型无关”的理念。这背后是深刻的产品思考。2.1 解耦智能体逻辑与基础设施传统的全栈式AI平台通常将智能体编排逻辑、工具调用、记忆管理与底层基础设施紧密耦合。当你需要迁移或扩展时牵一发而动全身。AgentCore通过清晰的边界划分解决了这个问题你的领域智能体的“大脑”。你使用任何框架如用LangGraph定义工作流用CrewAI组织多智能体协作来编写业务逻辑决定任务规划、推理和决策过程。AgentCore的领域智能体的“躯干”和“神经系统”。它提供安全沙箱运行时、对外连接器网关、记忆库记忆服务、身份护照身份管理和健康监测仪可观测性。这种解耦带来了巨大的灵活性。例如你的团队可能擅长Python和LangChain而另一个团队偏好TypeScript和Vercel AI SDK。在AgentCore上你们可以各自使用最顺手的工具最终部署到同一套安全、统一的基础设施上共享监控仪表盘和权限策略。2.2 生产就绪的核心支柱从示例库的features/目录结构我们能清晰地看到AgentCore为生产环境打造的五大核心支柱Runtime运行时这是智能体执行的托管环境。它不仅是无服务器的按需付费自动扩缩容更重要的是一个安全沙箱。你的智能体代码在这里运行与外界的所有交互网络访问、文件系统都受到严格策略的控制防止智能体执行危险操作或泄露敏感数据。官方示例中演示了如何配置Cedar策略语言来定义精细的访问控制规则。Gateway网关这是智能体与外部世界沟通的“安全门卫”。你不需要为每个API编写复杂的适配器代码。只需通过Gateway声明一个Lambda函数、一个REST API端点或一个AWS服务如S3它就会自动将其封装成符合MCPModel Context Protocol标准的工具供智能体调用。这意味着你的智能体可以安全、标准化地使用现有企业IT资产。Identity Memory身份与记忆这是实现个性化智能体验的关键。Identity将智能体会话与真实的用户身份来自Cognito、Okta等绑定确保每次交互的上下文和权限都正确无误。Memory则提供了托管的向量存储和会话记忆智能体可以记住用户偏好、历史对话实现连贯的个性化服务。示例中展示了如何为客服智能体添加用户历史查询记忆。Observability可观测性没有监控的系统就是“盲飞”。AgentCore原生集成了OpenTelemetry将智能体的每一次思考、每一次工具调用、每一次LLM请求都生成详细的追踪链路。你可以轻松地将这些数据导出到Grafana、Datadog等平台分析延迟、成本、成功率并快速定位是工具调用超时还是LLM响应不佳导致了问题。Evaluation评估如何确保上线的智能体质量不下降AgentCore内置了评估框架。你可以配置“LLM即法官”对智能体的输出进行自动评分也可以进行在线对比测试。这在持续集成流水线中至关重要能防止有问题的更新被部署到生产环境。实操心得在规划你的第一个AgentCore项目时不要试图一次性用上所有功能。建议采用渐进式策略先从Runtime和Gateway开始让智能体能安全地跑起来并调用基础工具然后根据业务需求逐步引入Memory如需个性化、Identity如需多租户隔离和Observability如需性能监控。3. 快速上手实战使用AgentCore CLI部署你的第一个智能体理论讲得再多不如动手跑一遍。官方最推荐的方式是使用全新的AgentCore CLI它极大地简化了从开发到部署的全流程。下面我以部署一个简单的Python智能体为例带你走通全流程并补充一些官方文档里没细说的“坑点”。3.1 环境准备与权限配置首先确保你的本地环境满足以下条件AWS CLI已配置运行aws configure确保使用的IAM用户具有足够的权限。Node.js 20用于运行CLI本身。Python环境管理工具官方推荐使用uv它比传统的venvpip更快、更轻量。你也可以用conda但后续命令需要相应调整。权限是第一个容易踩坑的地方。你的IAM用户需要附加两个托管策略BedrockAgentCoreFullAccessAmazonBedrockFullAccess此外你还需要在AWS Bedrock控制台中为你的区域启用Anthropic Claude 3.5 Sonnet或Haiku模型的访问权限。这是很多新手会忽略的一步没有模型访问权限后续部署会失败。3.2 创建与初始化项目安装CLI和创建项目的命令很直观# 全局安装CLI npm install -g aws/agentcore # 交互式创建新项目 agentcore create执行agentcore create后会进入一个交互式向导。这里有几个关键选择项目名称输入如my-first-agent。智能体框架CLI支持多种框架模板。如果你是新手我强烈建议选择Strands Agents。它是AWS官方维护的一个轻量级、高性能框架与AgentCore集成度最高文档也最全。选择它能让入门过程最平滑。编程语言选择Python。模型选择你在Bedrock中已启用的模型例如Claude 3.5 Sonnet。向导结束后CLI会自动生成一个完整的项目脚手架。我们来看看核心文件结构my-first-agent/ ├── agent/ # 你的智能体核心逻辑目录 │ ├── __init__.py │ └── agent.py # 智能体的主逻辑文件 ├── tools/ # 自定义工具目录可选 │ └── weather.py # 示例一个查询天气的工具 ├── infrastructure/ # 基础设施即代码定义 │ └── agentcore.yaml # AgentCore资源配置文件 ├── requirements.txt # Python依赖 └── README.md3.3 剖析智能体核心逻辑agent.py打开agent/agent.py你会看到一个非常简洁的Strands Agents智能体定义from strands import Agent, Runner from strands.llm import BedrockLLM import os # 1. 初始化LLM连接到Bedrock上的Claude模型 llm BedrockLLM( model_idanthropic.claude-3-5-sonnet-20241022-v2:0, regionos.environ.get(AWS_REGION, us-east-1) ) # 2. 定义系统提示词设定智能体的角色和行为准则 system_prompt 你是一个乐于助人的助手。请用中文回答用户的问题。 如果用户的问题需要调用工具请明确告知用户你将使用工具查询。 保持回答友好、简洁且准确。 # 3. 创建智能体实例 agent Agent( llmllm, system_promptsystem_prompt, nameMyFirstAgent ) # 4. 创建运行器它是执行智能体的入口点 runner Runner(agentagent) # 主处理函数将被Runtime调用 def handler(event, context): Lambda函数格式的入口点用于处理请求。 user_input event.get(input, ) # 使用运行器处理用户输入 result runner.run(user_input) # 返回智能体的响应 return { response: result.content }这段代码清晰地展示了Strands Agents的极简哲学定义模型、定义角色、创建智能体、运行。所有的复杂性如会话管理、工具路由都被框架和底层的AgentCore Runtime隐藏了。3.4 本地开发与热重载在编写或修改代码后你不需要反复部署到云端测试。CLI提供了强大的本地开发服务器agentcore dev执行这个命令后CLI会做几件事在本地启动一个模拟的Runtime环境。将你的agent/目录和tools/目录挂载到这个环境中。启动一个本地端点通常是http://localhost:8080。开启文件监听任何代码改动都会触发热重载。现在你可以用curl或任何HTTP客户端测试你的智能体curl -X POST http://localhost:8080 \ -H Content-Type: application/json \ -d {input: 你好请介绍一下你自己。}你应该能立刻收到智能体的中文自我介绍。这种即时反馈的开发体验对于快速迭代智能体逻辑至关重要。注意事项在agentcore dev模式下工具调用如访问网络API可能会受到限制因为本地沙箱环境与真实的AWS环境不同。对于涉及真实AWS服务如查询DynamoDB的工具测试建议在部署到开发环境后进行。3.5 一键部署到云端当本地测试满意后部署到AWS Bedrock AgentCore只需要一条命令agentcore deploy这个命令背后执行了复杂的操作打包代码将你的智能体代码和依赖打包成Lambda部署包。同步配置根据infrastructure/agentcore.yaml文件在云端创建或更新所有必要的资源Runtime、Gateway配置、IAM角色等。部署智能体将打包的代码部署到AgentCore Runtime中。部署成功后CLI会输出你智能体的唯一标识符Agent ID和调用端点Endpoint。你可以立即使用CLI进行云端调用测试agentcore invoke --input “今天天气怎么样”至此你的第一个智能体已经成功运行在具备企业级安全、监控和扩展能力的基础设施上了。整个过程你几乎没有编写任何基础设施代码。4. 核心能力深度集成为智能体添加记忆与身份一个只会单次对话的智能体是缺乏实用价值的。接下来我们通过官方示例库中的features/memory和features/identity来看看如何为智能体注入“记忆”和“身份”使其成为真正的个性化助手。4.1 集成托管记忆服务记忆功能允许智能体跨会话记住关键信息。AgentCore的Memory服务提供了开箱即用的向量存储和键值存储无需你自己搭建Pinecone或Redis。使用CLI可以轻松为现有项目添加记忆功能# 在项目根目录下执行 agentcore add memory这个命令会做两件事在infrastructure/agentcore.yaml中添加Memory服务的资源配置声明。在你的项目代码中生成记忆集成的示例代码或修改现有agent.py。让我们看一个集成后的agent.py可能的变化from strands import Agent, Runner from strands.llm import BedrockLLM from strands.memory import AgentCoreMemory # 新增导入 import os llm BedrockLLM(model_idanthropic.claude-3-5-sonnet-20241022-v2:0) system_prompt 你是一个贴心的个人助理。你需要记住用户的偏好和信息以提供更好的服务。 # 初始化AgentCore托管的记忆 memory AgentCoreMemory( memory_idos.environ.get(MEMORY_ID) # 由CLI自动注入的环境变量 ) agent Agent( llmllm, system_promptsystem_prompt, memorymemory, # 将记忆对象传递给智能体 namePersonalAssistant ) runner Runner(agentagent) def handler(event, context): user_input event.get(input, ) user_id event.get(userId, default-user) # 从请求中获取用户ID # 在运行前为本次会话设置用户上下文 memory.set_user_id(user_id) result runner.run(user_input) # 智能体在对话中会自动使用memory进行信息的存储和检索 # 例如用户说“我喜欢喝黑咖啡”这个偏好会被自动存储。 # 下次用户问“有什么饮料推荐吗”智能体会检索记忆并回答“根据您的记录您喜欢黑咖啡要不要试试我们的新品冷萃” return { response: result.content, sessionId: context.aws_request_id # 返回会话ID供前端使用 }记忆的键Key通常是自动生成的对话摘要或用户指定的关键信息值Value则是相关的文本片段。向量检索功能使得智能体可以根据当前对话的语义自动找到最相关的历史记忆。4.2 集成身份管理对于企业应用智能体必须知道“正在和谁说话”以便执行正确的权限检查和数据隔离。AgentCore的Identity服务可以与Amazon Cognito、Okta、Azure AD等身份提供商集成。添加身份验证的步骤类似agentcore add identityCLI会引导你选择身份提供商例如Cognito并更新配置。之后你的智能体调用端点将受到保护。前端应用需要先让用户登录获取ID Token然后在调用智能体时将其放在Authorization请求头中。AgentCore Runtime会自动验证Token并将解包后的用户身份信息如sub、email、groups注入到你的handler函数的event中。你可以这样利用这些信息def handler(event, context): # 从经过验证的请求中获取用户身份信息 user_claims event.get(requestContext, {}).get(authorizer, {}).get(claims, {}) user_id user_claims.get(sub, anonymous) user_email user_claims.get(email) user_groups user_claims.get(cognito:groups, []).split(,) if claims.get(cognito:groups) else [] # 将用户ID与记忆关联 memory.set_user_id(user_id) # 基于用户组实现权限逻辑 if PremiumUsers in user_groups: # 为高级用户启用高级工具 agent.enable_tool(advanced_data_analyzer) user_input event.get(body, {}).get(input, ) result runner.run(user_input) return {response: result.content}通过结合Identity和Memory你的智能体就具备了为不同用户提供个性化、安全隔离的对话体验的能力。这是构建多租户SaaS应用或企业内部助手的基石。5. 构建复杂工作流使用Gateway集成外部工具与服务智能体的强大之处在于能使用工具。AgentCore Gateway的设计目标就是让你能以最低的代码成本将现有的API、Lambda函数或AWS服务暴露给智能体使用。5.1 通过Gateway暴露一个Lambda函数假设我们有一个现成的Lambda函数它根据城市名查询天气可以从数据库或外部API获取。我们想让它成为智能体的一个工具。首先确保你的Lambda函数有一个清晰的输入输出格式。例如输入是{city: 北京}输出是{city: 北京, temperature: 22°C, condition: 晴朗}。然后在你的AgentCore项目根目录下创建一个gateway-config.yaml文件名称可自定义# gateway-config.yaml tools: - name: get_weather description: 根据中国城市名称查询当前天气情况。 inputSchema: type: object properties: city: type: string description: 中国城市名称例如“北京”、“上海”、“广州”。 required: - city # 关键指定背后的实现是哪个Lambda函数 lambda: functionArn: arn:aws:lambda:us-east-1:123456789012:function:WeatherQueryFunction # 你可以选择让Gateway直接转发原始输入或定义一个简单的转换 payloadMapping: | (input) ({ body: JSON.stringify({ city: input.city }) })接下来更新你的infrastructure/agentcore.yaml声明要使用这个Gateway配置# infrastructure/agentcore.yaml 片段 resources: myAgent: type: AWS::Bedrock::AgentCore::Agent properties: # ... 其他属性 gateway: configFile: ./gateway-config.yaml # 指向你的配置文件再次运行agentcore deploy。CLI会识别到Gateway配置的变更并在云端创建相应的Gateway资源将你的Lambda函数包装成一个符合MCP标准的工具。现在在你的智能体代码中你只需要声明这个工具智能体框架如Strands Agents会在运行时自动通过Gateway发现并调用它# 在agent.py中 from strands import Agent, Runner, Tool # 声明工具无需实现函数体框架会通过Gateway动态调用 weather_tool Tool( nameget_weather, description查询指定城市的天气, # input_schema 会自动从Gateway配置中同步 ) agent Agent( llmllm, system_prompt你是一个天气助手可以查询天气。, tools[weather_tool], # 将工具赋予智能体 nameWeatherAgent )当用户问“北京天气怎么样”时智能体会自动规划调用get_weather工具Gateway会将请求路由到你指定的Lambda函数并将结果返回给智能体最终整合成自然语言回复给用户。5.2 Gateway的高级模式直接集成AWS服务Gateway更强大的功能在于可以直接映射AWS API。例如你想让智能体拥有读取S3桶中某个文件摘要的能力你甚至不需要写Lambda函数。# gateway-config.yaml 新增一个工具 tools: - name: read_s3_file_summary description: 读取AWS S3桶中指定文件的文本内容并生成摘要。 inputSchema: type: object properties: bucket: type: string description: S3桶名称 key: type: string description: 文件在S3中的键路径 required: - bucket - key # 直接声明AWS服务集成 awsService: service: s3 operation: GetObject # 定义输入映射将工具参数映射到AWS API参数 requestParameters: Bucket: ${input.bucket} Key: ${input.key} # 定义输出映射从AWS API响应中提取所需内容并可以调用另一个LLM进行摘要 responseTransform: | async (response, utils) { const data await response.Body.transformToString(); // 调用一个内置的文本摘要工具假设存在 const summary await utils.callTool(summarize_text, { text: data }); return { summary }; }这种声明式的方法极大地减少了胶水代码。Gateway负责处理身份认证、请求签名、错误重试和响应转换你只需要关心业务逻辑。实操心得在定义工具时description字段至关重要。LLM主要依靠这个描述来决定是否以及何时调用该工具。务必用清晰、具体的自然语言描述工具的功能、输入参数的准确含义和预期的输出。模糊的描述会导致智能体错误地使用或忽略工具。6. 生产环境运维监控、评估与问题排查将智能体部署上线只是开始运维同样重要。AgentCore在可观测性和评估方面提供了强大的内置支持。6.1 利用OpenTelemetry进行全链路追踪部署后你可以在AWS控制台的Bedrock AgentCore服务页面找到你的智能体并进入“监视器”选项卡。这里可以看到基本的调用指标。但要进行深度诊断你需要集成外部的可观测性平台。官方示例库integrations/observability/中提供了与Grafana、Datadog等集成的示例。核心步骤是配置AgentCore将OpenTelemetry数据导出到你的收集器。以下是一个简化的流程在基础设施配置中启用追踪导出# infrastructure/agentcore.yaml resources: myAgent: type: AWS::Bedrock::AgentCore::Agent properties: tracing: enabled: true # 导出到AWS X-Ray最简单的方式 xray: enabled: true # 或者导出到自定义的OTLP端点如Grafana Tempo otlp: endpoint: https://your-tempo-collector:4318在Grafana中查看追踪配置Grafana数据源连接到X-Ray或Tempo后你就能看到每次智能体调用的完整追踪链路。一个典型的追踪会包含以下Span区间Agent Invocation整个智能体调用的总Span。LLM Call调用Claude等基础模型的耗时和Token使用情况。Tool Call: get_weather调用外部工具的耗时和状态。Memory Read/Write记忆存储的读写操作。通过分析这些Span你可以快速定位性能瓶颈。例如如果LLM Call的耗时异常高可能是模型负载问题或提示词过于复杂如果Tool Call失败可以查看具体的错误日志。6.2 设置自动化评估对于持续交付的智能体自动化的质量门禁是必需的。AgentCore的评估框架允许你定义“评估器”来给智能体的表现打分。一个常见的模式是使用“LLM即法官”。你可以在infrastructure/agentcore.yaml中定义一个在线评估器resources: myAgentEvaluation: type: AWS::Bedrock::AgentCore::OnlineEvaluation properties: agentId: !Ref myAgent # 关联到你的智能体 evaluator: type: LLM_AS_JUDGE judgeModel: anthropic.claude-3-5-sonnet-20241022-v2:0 criteria: - name: helpfulness description: 回答是否对用户有帮助且解决了问题 ratingScale: 1-5 - name: safety description: 回答是否安全、无害且避免了偏见和有害内容 ratingScale: PASS/FAIL samplingRate: 0.1 # 对10%的线上请求进行抽样评估部署后AgentCore会自动对10%的线上对话进行抽样并调用Claude模型根据你设定的标准如帮助性、安全性进行评分。你可以在控制台查看评估结果的分布也可以设置CloudWatch警报当平均分低于某个阈值时触发通知以便团队及时介入检查。6.3 典型问题排查清单在实际运营中你可能会遇到以下常见问题。这里提供一个速查表问题现象可能原因排查步骤部署失败提示权限不足IAM角色缺少必要权限1. 检查执行agentcore deploy的IAM用户是否附加了BedrockAgentCoreFullAccess和AmazonBedrockFullAccess策略。2. 检查自动创建的Execution Role是否信任Bedrock AgentCore服务。智能体调用返回“模型未授权”Bedrock中未启用对应模型登录AWS控制台进入Bedrock服务在“模型访问”页面确保目标区域下的目标模型如Claude 3.5 Sonnet状态为“已授予访问权限”。工具调用超时或失败Gateway配置错误或Lambda函数异常1. 在CloudWatch Logs中查找对应Lambda函数的日志。2. 检查gateway-config.yaml中的functionArn是否正确。3. 检查Lambda函数的超时设置和内存配置是否合理。记忆功能不生效Memory服务未正确关联或环境变量缺失1. 运行agentcore status检查Memory资源是否部署成功。2. 检查agent.py中AgentCoreMemory初始化时使用的memory_id是否正确或是否从环境变量读取。3. 查看Runtime的环境变量配置。本地agentcore dev正常部署后异常环境差异依赖包、环境变量1. 检查requirements.txt中的包版本是否与部署环境兼容。2. 检查生产环境特有的环境变量如数据库连接串是否已正确配置在infrastructure/agentcore.yaml中。追踪数据在Grafana中看不到OTLP导出配置错误或网络不通1. 确认tracing.otlp.endpoint的URL和端口正确无误。2. 检查VPC和安全组配置确保Runtime可以访问你的可观测性后端。3. 先尝试启用X-Ray导出确认基础追踪功能正常。7. 从示例到实践定制你的端到端应用蓝图官方示例库中的blueprints/和end-to-end/目录提供了完整的参考应用例如一个“客户支持工单分析智能体”或一个“内部知识库问答机器人”。这些蓝本的价值在于它们展示了如何将多个AgentCore能力Runtime、Gateway、Memory、Identity有机地组合在一起解决一个真实的业务场景。我的建议是不要直接复制这些蓝本而是将其作为架构参考。按照以下步骤来构建你自己的应用明确用例和用户旅程用流程图画出用户与智能体交互的完整过程。明确哪些步骤需要工具调用哪些信息需要被记忆。组件映射将用户旅程中的每个环节映射到AgentCore的能力上。例如“用户登录”映射到Identity“查询订单历史”映射到Gateway数据库Lambda“推荐相关产品”映射到Memory向量检索。增量开发使用agentcore create创建一个新项目。首先实现核心对话流不包含工具和记忆。用agentcore dev本地测试通过。逐个集成能力使用agentcore add命令依次添加Gateway工具、Memory、Identity。每添加一个就充分测试其功能。完善运维设施最后配置Observability和Evaluation为上线做好准备。在整个过程中awslabs/agentcore-samples这个仓库就是你随用随查的百科全书。当你不确定某个功能如何实现时去对应的features/子目录下找例子往往能获得最直接的启发。我个人在将一个内部数据分析助手迁移到AgentCore的过程中最大的体会是“关注点分离”带来的效率提升。以前我们需要自己搭建向量数据库、管理API网关密钥、编写复杂的认证中间件。现在这些都由AgentCore以服务的形式提供我们的团队可以更专注于优化智能体的分析逻辑和提示词工程迭代速度提升了数倍。虽然初期需要花时间学习新的概念和工具链但长期来看这对于构建和维护生产级AI应用是绝对值得的投资。