基于Strands Agents与亚马逊云科技构建生产级Agentic AI应用实战
最近在探索 Agentic AI 应用开发时,发现很多开发者都卡在了从“概念理解”到“工程落地”的鸿沟上。网上资料要么是零散的概念介绍,要么是复杂的学术论文,真正能跑通、能部署、能复现的端到端实战教程少之又少。本文将以一个“大学地理教师制作厄尔尼诺现象课件”的真实场景为例,手把手带你基于亚马逊云科技中国区的服务,使用开源的 Strands Agents 框架,构建一个具备自主规划、工具调用、记忆和可观测性的生产级 Agentic AI 应用。无论你是想快速入门 Agent 开发,还是希望将 AI 能力集成到现有业务中,这篇近万字的实战指南都能为你提供清晰的路径和可复现的代码。
1. Agentic AI 的核心价值:从“工具”到“智能体”的范式转变
在深入代码之前,我们有必要先厘清一个核心问题:Agentic AI 的价值究竟在哪里?很多人将其简单理解为“更快的自动化”,但这其实是一种误解。Agentic AI 的真正价值,在于其带来的“复利效应”。
传统的自动化工具或脚本,执行的是预设的、线性的指令。它们很快,但很“脆”。一旦任务稍有偏离预设路径,或者环境发生变化,就需要人工干预。而 Agentic AI 的核心在于“自主性”和“目标导向”。你不再需要告诉它每一步具体怎么做,只需要给它一个抽象的目标(例如:“为大学生设计一堂关于厄尔尼诺现象的互动课程”),它就能自主进行思考、规划、拆解任务、调用工具、评估结果并迭代优化。
这种能力的价值是复利式的:
- 处理不确定性:面对模糊、开放式的需求,Agent 可以自主探索解决方案,而非僵化报错。
- 连接数字世界:通过工具调用(Tool Use),Agent 可以操作 API、数据库、搜索引擎、绘图服务等,将 AI 的“思考”能力转化为实际的“行动”能力。
- 持续学习与适应:借助记忆系统,Agent 可以记住历史交互,理解用户偏好,在后续任务中表现得越来越精准和个性化。
- 解决复杂问题:通过多 Agent 协作,可以将一个庞大问题分解,由多个各司其职的 Agent 并行或串行解决,其复杂问题解决能力呈指数级增长。
Gartner 预测,到 2028 年,15% 的日常工作决策将由 Agentic AI 自主完成。这不仅仅是效率的提升,更是工作方式的根本性变革。开发者将从编写具体业务逻辑的“码农”,转变为设计智能体目标、配置工具和监管流程的“架构师”。
接下来,我们将通过一个完整的实战项目,来感受这种“复利”价值是如何通过技术栈落地实现的。
2. 项目概述与环境准备
2.1 项目目标与架构预览
我们的目标是构建一个DeepResearch Agent。具体场景是:一位大学地理教师,通过自然语言向 Agent 提出任务:“制作介绍厄尔尼诺现象的电子课件”。Agent 需要完成以下工作:
- 理解与规划:理解“制作课件”这个抽象目标,并拆解为搜索资料、获取图片、生成内容、设计动画、打包交付等子任务。
- 信息搜集:调用知识库工具检索地理教材中的基础知识,调用搜索引擎获取最新新闻和数据。
- 内容创作:调用绘图工具生成示意图,利用大语言模型的代码能力生成包含动画的 HTML 课件。
- 交付与记忆:将最终课件文件上传到云存储(S3),并返回访问链接。同时,将本次交互的关键信息存入记忆,供未来参考。
整个系统的技术架构如下图所示(基于提供的材料):
- 前端:一个简单的 Web 聊天界面。
- Agent 后端:基于 Strands Agents 框架构建,运行在 Amazon ECS Fargate 上。
- 大脑(模型):使用硅基流动(SiliconFlow)托管的 DeepSeek-R1 模型。
- 工具集:通过 MCP(Model Context Protocol)协议集成多种工具。
- 本地 MCP Server:Time(获取时间)、S3 Upload(文件上传)、Bocha Search(国内搜索引擎)、MiniMax(绘图)。
- 远程 MCP Server:基于 Amazon Lambda + API Gateway + OpenSearch 构建的知识库检索服务。
- 记忆系统:使用 Strands 内置的
mem0_memory工具,后端连接 Amazon Aurora PostgreSQL(Serverless 版)存储向量化记忆。 - 可观测性:集成 Langfuse,追踪每一次 Agent 思考、工具调用的全链路日志和指标。
2.2 环境与账号准备
开始之前,你需要准备好以下资源:
- 亚马逊云科技中国区账号:本文示例使用宁夏区域(
cn-northwest-1),你也可以使用北京区域(cn-north-1)。 - 命令行环境:一台 Linux/Mac 电脑,或一台 Amazon EC2 实例(推荐 Ubuntu 系统)。
- 模型 API Key:从硅基流动平台获取 DeepSeek-R1 的 API Key。
- 工具 API Key(可选):如需使用博查搜索、MiniMax 绘图,需分别注册并获取其 API Key。
2.3 基础依赖安装
在你的开发机器上,执行以下命令安装基础软件。
安装 Node.js 和 npm:
sudo apt update sudo apt install curl -y curl -o- https://d167i8kc2gwjo.cloudfront.net/cdn/install.sh | bash source ~/.bashrc nvm install 22.12.0 nvm use 22.12.0设置 npm 镜像源以加速国内下载:
npm config set audit false npm config set registry https://mirror.bosicloud.com/repository/npm/安装 Docker:
sudo apt install apt-transport-https ca-certificates curl software-properties-common -y curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null sudo apt update && sudo apt install docker-ce docker-ce-cli containerd.io -y将当前用户加入 docker 组,并修改 sock 权限:
sudo usermod -aG docker $USER sudo chmod 666 /var/run/docker.sock配置 Docker 镜像加速器(国内环境建议):创建或编辑/etc/docker/daemon.json文件:
{ "registry-mirrors": ["https://mirror-docker.bosicloud.com"], "insecure-registries": ["mirror-docker.bosicloud.com"] }重启 Docker 服务使配置生效:
sudo systemctl daemon-reload sudo systemctl restart docker配置 AWS CLI:如果你还没有安装 AWS CLI,请先安装。然后使用aws configure命令配置你的中国区凭证。
aws configure # 依次输入 Access Key ID, Secret Access Key, 区域 (如 cn-northwest-1), 输出格式 (如 json)3. 部署 Strands Agents 示例项目
亚马逊云科技提供了完整的示例代码,我们可以通过 CDK(Cloud Development Kit)一键部署整个架构。
3.1 获取项目代码
git clone https://github.com/aws-samples/sample_agentic_ai_strands cd sample_agentic_ai_strands3.2 配置环境变量
项目根目录下有一个env.example文件,将其复制为.env并填写你的配置。
cp env.example .env vim .env # 或使用其他编辑器关键的配置项如下:
AWS_REGION=cn-northwest-1 # 宁夏区域,北京区域请用 cn-north-1 CLIENT_TYPE=strands STRANDS_MODEL_PROVIDER=openai # 使用 OpenAI 兼容接口 OPENAI_API_KEY=sk-你的硅基流动API_KEY OPENAI_BASE_URL=https://api.siliconflow.cn/v1OPENAI_API_KEY需要替换为你在硅基流动平台获取的实际 Key。OPENAI_BASE_URL指向硅基流动的兼容端点。
3.3 使用 CDK 部署
进入 cdk 目录,安装依赖并部署。
cd cdk npm install -g aws-cdk typescript npm install npm i --save-dev @types/node运行部署脚本。首次运行会构建 Docker 镜像并创建所有云资源,耗时约 10-15 分钟。
bash cdk-build-and-deploy.sh部署成功后,命令行会输出一个AlbDnsName,形如xxx.elb.cn-northwest-1.amazonaws.com.cn。记下这个地址,这就是我们 Agent 应用的访问入口。
重要提示:在中国区,如果希望通过 80/443 端口公网访问负载均衡器,需要完成 ICP 备案。如果仅用于测试,可以通过 ECS 任务的安全组临时开放端口,或使用 AWS CloudShell 等内部方式访问。
4. 深入核心:Strands Agents 框架与 MCP 工具集成
部署完成后,我们通过浏览器访问http://{AlbDnsName}/chat即可打开 Agent 的前端界面。但要让 Agent 真正“活”起来,需要为其配置“手脚”(工具)。这里我们重点讲解 Strands Agents 的核心设计思想和 MCP 工具的集成方式。
4.1 Strands Agents 设计哲学:模型驱动优先
与一些需要手动编排复杂工作流的 Agent 框架不同,Strands Agents 采用了“模型驱动优先”的理念。开发者只需要关注三件事:
- 选择模型:告诉 Agent 用什么“大脑”思考。
- 提供工具:告诉 Agent 有哪些“手脚”可用。
- 设定目标:通过系统提示词(System Prompt)告诉 Agent 它扮演的角色和任务目标。
剩下的规划、决策、工具调用顺序、结果评估,全部交给模型自主完成。这极大地降低了开发复杂度,更符合 Agentic AI “自主性”的本质。
4.2 MCP:智能体的“万能工具插槽”
MCP(Model Context Protocol)是一个由 Anthropic 等公司倡导的开源协议,它为标准化的工具集成提供了解决方案。你可以把它理解为智能体的“USB-C 接口”。任何符合 MCP 协议的服务,无论是本地的命令行工具、远程的 API,还是复杂的云服务,都可以被封装成一个 MCP Server,然后被 Strands Agent 即插即用。
在我们的项目中,集成了多种 MCP Server:
time:获取当前时间,确保搜索到的新闻是最新的。s3-upload:将生成的 HTML 课件上传到 Amazon S3,并返回公网链接。bocha-search-mcp:调用国内搜索引擎,搜索关于厄尔尼诺的最新资讯。minimax:调用 MiniMax 的绘图 API,为课件生成示意图。retrieve:远程服务,从 Amazon OpenSearch 知识库中检索地理教材内容。
4.3 前端配置 MCP 工具
在打开的 Web 界面左侧,切换到MCP Servers选项卡。点击Add MCP Server,逐一添加上述工具。
1. 添加 time 工具:这是一个标准的、无需认证的 MCP Server。
{ "mcpServers": { "time": { "command": "uvx", "args": ["mcp-server-time"] } } }2. 添加 s3-upload 工具:这个 Server 的代码已预置在容器中,需要配置你的 AWS 凭证。
{ "mcpServers": { "s3-upload": { "command": "uv", "args": [ "--directory", "/app/aws-mcp-servers-samples/s3_upload_server", "run", "src/server.py" ], "env": { "AWS_REGION": "cn-northwest-1", "AWS_ACCESS_KEY_ID": "你的AKID", "AWS_SECRET_ACCESS_KEY": "你的SecretKey" } } } }3. 添加 minimax 绘图工具:需要先去 MiniMax 平台注册获取 API KEY。
{ "mcpServers": { "MiniMax": { "command": "uvx", "args": [ "minimax-mcp", "-y" ], "env": { "MINIMAX_API_KEY": "你的MiniMax_API_KEY", "MINIMAX_MCP_BASE_PATH": "/app", "MINIMAX_API_HOST": "https://api.minimax.chat", "MINIMAX_API_RESOURCE_MODE": "" } } } }4. 添加 bocha-search-mcp 搜索引擎工具:同样需要 API KEY。
{ "mcpServers": { "bocha-search-mcp": { "command": "uv", "args": [ "--directory", "/app/bocha-search-mcp", "run", "bocha-search-mcp" ], "env": { "BOCHA_API_KEY": "你的Bocha_API_KEY" } } } }5. 添加 retrieve 知识库工具(远程 MCP Server):这是一个部署在云上的独立服务。你需要先部署它。
git clone https://github.com/aws-samples/aws-mcp-servers-samples cd aws-mcp-servers-samples/aos-mcp-serverless bash aos_serverless_mcp_setup.sh --McpAuthToken your_token --OpenSearchUsername admin --OpenSearchPassword your_password --EmbeddingApiToken your_siliconflow_embedding_key部署脚本会创建一个包含 Lambda、API Gateway、OpenSearch 和 DynamoDB 的无服务器架构。部署成功后,会输出一个 URL 和 Token。在前端配置如下:
{ "mcpServers": { "retrieve": { "url": "https://你部署的API网关地址", "token": "上面设置的McpAuthToken" } } }这个远程 MCP Server 展示了如何将已有的企业知识库(基于 OpenSearch)快速封装成 Agent 可用的工具,是集成私有化能力的关键模式。
所有工具添加并启用后,界面应如下图所示,表示你的 Agent 已经“武装”完毕。
5. 代码解析:构建 Agent 核心逻辑
理解了架构和工具配置后,我们深入到代码层面,看 Strands Agents 如何用极简的代码实现强大的功能。以下是核心代码文件的解读。
5.1 模型集成:连接“大脑”
在agent_core.py或类似文件中,你会看到模型初始化的代码。Strands 支持多种模型提供商,这里我们配置使用硅基流动的 DeepSeek-R1。
def _get_model(self, model_id, thinking, thinking_budget, max_tokens=1024, temperature=0.7): """根据提供商获取适当的模型""" if self.model_provider == 'openai': # 使用硅基流动等 OpenAI 兼容接口 return OpenAIModel( client_args={ "api_key": self.api_key, # 从环境变量读取 "base_url": "https://api.siliconflow.cn/v1" # 硅基流动端点 }, model_id="deepseek-ai/DeepSeek-R1", # 指定模型 params={ "max_tokens": max_tokens, "temperature": temperature, } ) # 还可以添加其他 provider,如 bedrock elif self.model_provider == 'bedrock': # 配置 Amazon Bedrock 模型 pass关键点:
OpenAIModel是 Strands 对 OpenAI 兼容接口的封装。base_url指向硅基流动,这意味着你可以轻松切换为任何提供 OpenAI 兼容 API 的模型服务。model_id指定为deepseek-ai/DeepSeek-R1,这是硅基流动上的模型名称。
5.2 工具集成:连接“手脚”
工具集成的核心是 MCP Client。Strands 提供了统一的接口来连接不同类型的 MCP Server。
async def connect_to_server(self, server_id: str, command: str = "", server_script_path: str = "", server_script_args: List[str] = [], server_script_envs: Dict = {}, server_url: str = "", http_type: str = 'stdio', token: str = ""): """使用Strands MCP客户端连接到MCP服务器""" if server_url: # 基于HTTP的远程服务器 (如我们自建的AOS知识库服务) if http_type == 'sse': headers = {"Authorization": f"Bearer {token}"} if token else None mcp_client = MCPClient(lambda: sse_client(server_url, headers=headers)) elif http_type == 'streamable_http': headers = {"Authorization": f"Bearer {token}"} if token else None mcp_client = MCPClient(lambda: streamablehttp_client(server_url, headers=headers)) else: # 基于Stdio的本地服务器 (如time, s3-upload) params = StdioServerParameters( command=command, # 如 “uvx” args=server_script_args, # 如 [“mcp-server-time”] env=server_script_envs # 环境变量 ) mcp_client = MCPClient(lambda: stdio_client(params)) # 启动服务器连接 mcp_client.start() return mcp_client关键点:
- Stdio 模式:用于运行在同一个容器内的工具,通过标准输入输出通信。配置简单,性能好。
- SSE/Streamable HTTP 模式:用于连接远程 HTTP 服务。我们的
retrieve知识库工具就采用这种模式。 - 前端配置的 JSON 最终会转换为此处的参数,动态创建 MCP 连接。
5.3 创建 Agent:组装大脑与手脚
这是最核心的部分,展示了 Strands 的简洁性。
async def _create_agent_with_tools(self, model_id, messages, mcp_clients=None, mcp_server_ids=None, system_prompt=None, thinking=True, thinking_budget=4096, max_tokens=1024, temperature=0.7): """创建带有MCP工具的Strands代理""" # 1. 创建MCP工具列表 tools = await self._create_mcp_tools(mcp_clients, mcp_server_ids) # 2. 添加内置记忆工具 tools += [mem0_memory] # 3. 获取模型实例 model = self._get_model(model_id, thinking=thinking, thinking_budget=thinking_budget, max_tokens=max_tokens, temperature=temperature) # 4. 创建Agent实例 agent = Agent( model=model, # 大脑 messages=messages, # 对话历史 conversation_manager=SlidingWindowConversationManager( window_size=window_size, # 管理上下文长度,防止超长 ), system_prompt=system_prompt or "You are a helpful assistant.", # 角色设定 tools=tools # 工具集 ) return agent代码解读:
_create_mcp_tools函数会根据配置,将之前连接的 MCP Server 转化为 Agent 可识别的Tool对象。mem0_memory是 Strands 提供的一个内置工具,它封装了记忆的存储和检索逻辑。只需一行代码即可为 Agent 添加记忆能力。SlidingWindowConversationManager负责管理对话上下文,采用滑动窗口机制,确保发送给模型的 token 数不会超标。- 最终,将模型、工具、提示词、上下文管理器组合在一起,一个具有自主推理、工具调用和记忆能力的 Agent 就诞生了。开发者无需编写任何任务规划逻辑。
5.4 记忆系统:基于 Aurora PostgreSQL 的持久化
记忆是 Agent 实现“复利”和个性化的关键。mem0_memory工具的背后是一个可配置的向量存储系统。项目中使用的是 Amazon Aurora PostgreSQL(Serverless) +pgvector扩展。
配置记忆工具的代码通常在环境变量或初始化脚本中:
import os from strands import Agent from strands_tools import mem0_memory # 配置环境变量(实际项目中从.env或配置中心读取) os.environ["OPENAI_BASE_URL"] = "https://api.siliconflow.cn/v1" os.environ["LLM_MODEL"] = "deepseek-ai/DeepSeek-R1" os.environ["LLM_MODEL_API_KEY"] = "your_siliconflow_key" os.environ["EMBEDDING_MODEL"] = "Pro/BAAI/bge-m3" # 硅基流动的嵌入模型 os.environ["EMBEDDING_MODEL_API_KEY"] = "your_siliconflow_key" os.environ["POSTGRESQL_HOST"] = "your-aurora-cluster.cluster-xxx.cn-northwest-1.rds.amazonaws.com.cn" os.environ["POSTGRESQL_PORT"] = "5432" os.environ["POSTGRESQL_USER"] = "admin" os.environ["POSTGRESQL_PASSWORD"] = "your_password" os.environ["DB_NAME"] = "mem0_db" # 初始化带记忆的Agent agent = Agent(tools=[mem0_memory]) # 存储记忆 agent.tool.mem0_memory( action="store", content="用户是大学地理教师,正在准备关于气候现象的课件。", user_id="teacher_001", metadata={"role": "teacher", "subject": "geography"} ) # 检索记忆 result = agent.tool.mem0_memory( action="retrieve", query="用户之前关注过哪些气候现象?", user_id="teacher_001" ) print(result)架构优势:
- Aurora Serverless:无需管理数据库容量,根据负载自动伸缩,非常适合 Agent 这种间歇性、不可预测的访问模式。
- pgvector:PostgreSQL 的向量扩展,性能稳定,支持复杂的向量检索和过滤操作。
- 灵活性:
mem0_memory也支持 OpenSearch、FAISS 等后端,可根据需求切换。
6. 实战演练:与 Agent 协作完成课件制作
环境、工具、代码都准备好了,现在让我们亲自体验一下 Agent 的完整工作流程。
6.1 第一步:基础会话与记忆测试
在 Web 前端,首先在Chat Settings中选择模型为DeepSeek-R1-Pro,将Max Tokens调高至 16000 以适应长内容生成。
我们先进行一轮简单的会话,让 Agent 了解用户的背景,并测试记忆功能。用户输入:
厄尔尼诺对海洋生物有什么影响?Agent 回复(基于模型自身知识):
厄尔尼诺现象对海洋生物产生广泛影响。当太平洋海水异常变暖时,营养物质减少导致浮游生物数量下降,进而影响整个食物链。这使得鱼类种群迁移或减少,珊瑚礁因高温而发生白化现象,同时改变了海鸟和海洋哺乳动物的分布和繁殖模式...用户继续输入:
它会影响农业生产和粮食安全吗?Agent 回复:
是的,厄尔尼诺现象显著影响农业生产和粮食安全。它导致全球多个地区降水模式异常,引发一些地区严重干旱(如东南亚、澳大利亚和非洲部分地区),而其他地区则出现洪涝灾害...这两轮对话的内容,已经被mem0_memory工具自动或根据提示词存储下来,关联到了当前的User ID。
6.2 第二步:发布复杂任务并观察 Agent 自主规划
现在,我们给出终极任务。在System Prompt输入框中,填入详细的指令,引导 Agent 的行为模式:
你是一位深度研究助手,请在单次回复中使用可用的最大计算能力,尽可能深入、批判性和创造性地思考,花费必要的时间和资源来得出最高质量的答案。 在收到工具结果后,仔细反思其质量并在继续之前确定最佳下一步。使用你的思考基于这些新信息进行规划和迭代,然后采取最佳的下一步行动。 ## 你必须遵循以下指令: – 每次先使用mem0_memory工具查看是否有与当前问题相关的历史记忆,如果有,提取记忆用于当前任务的内容生成。 – 请使用time工具确定你现在的真实时间。 – 如果引用了其他网站的图片,确保图片真实存在,并且可以访问。 – 如果用户要求编写动画,请使用Canvas js编写,嵌入到HTML代码文件中。 – 生成代码文件请直接上传到s3,并返回访问链接给用户 – 使用text_similarity_search工具去检索厄尔尼诺相关的知识 – 如有需要,也可以使用Web search去检索更多外部信息 – 使用minimax绘图工具会返回一个公开访问的URL,在HTML用可以直接嵌入在对话框输入复杂任务:
你是一名大学地理教师,请为大学生设计一堂关于厄尔尼诺现象的互动课程,需要:1. 搜索最新气候数据和相关新闻事件;2. 搜索教学资源和真实图片;3. 使用工具绘制课程中的需要的演示插图;4. 生成完整课程方案,包括教学目标、活动设计、教学资源和评估方法;5. 设计一个展示厄尔尼诺现象的酷炫动画并和搜索到的相关信息一起集成到HTML课件中。6.3 第三步:观察 Agent 的思考与行动链
发送请求后,在界面右侧可以看到 Agent 完整的思考链(Chain of Thought)和工具调用记录。这个过程是自主发生的:
- 思考与规划:Agent 首先理解任务,并规划步骤:“我需要制作一个课件。步骤包括:1. 检索记忆 2. 获取当前时间 3. 搜索知识库 4. 搜索网络 5. 绘制插图 6. 编写HTML课件 7. 上传到S3。”
- 调用记忆:执行
mem0_memory工具,检索user_id对应的历史对话,找到了之前关于“海洋生物影响”和“农业影响”的记忆,决定将这些要点融入课件。 - 调用时间:执行
time工具,获取当前时间,以确保后续搜索的新闻是最新的。 - 调用知识库:执行
text_similarity_search工具,向远程的 AOS 知识库发送查询,获取地理教材中关于厄尔尼诺的定义、成因、影响等结构化知识。 - 调用搜索引擎:执行
web search工具(通过bocha-search-mcp),搜索近期关于厄尔尼诺现象的新闻报道和科学数据。 - 调用绘图工具:执行
minimax工具,根据课程内容,生成“厄尔尼诺海温异常示意图”、“全球气候影响模式图”等插图。 - 内容生成与整合:模型综合记忆、知识库内容、网络新闻、图片链接,开始编写完整的 HTML 课件代码。它使用 Canvas JS 编写了一个展示赤道太平洋海温异常变化的动画。
- 调用上传工具:执行
upload-file工具(通过s3-uploadMCP Server),将生成的 HTML 文件上传到预先配置好的 Amazon S3 存储桶,并设置公共读取权限。 - 交付结果:Agent 将 S3 的文件访问链接返回给用户,并简要说明课件包含的内容。
在整个过程中,你无需干预。Agent 自主决定何时调用哪个工具,如何处理工具返回的结果,如何将多源信息整合成连贯的课件。这就是 Agentic AI “自主性”和“目标导向”的完美体现。
6.4 第四步:验收成果
点击 Agent 回复中的 S3 链接,你将在浏览器中打开一个完整的、包含文字、图片、动画的 HTML 课件。这个课件融合了教材知识、最新新闻、自定义插图,并且包含一个动态的可视化动画。
7. 生产级考量:可观测性与部署
一个可用于生产的 Agent 应用,除了功能,还必须具备可观测性和弹性部署能力。
7.1 集成可观测性(Langfuse)
Strands Agents 内置了 OpenTelemetry 支持,可以轻松将追踪数据发送到 Langfuse 等平台。在 Agent 的启动代码或环境变量中配置即可:
import base64 import os # 从环境变量读取 Langfuse 配置 public_key = os.environ.get("LANGFUSE_PUBLIC_KEY") secret_key = os.environ.get("LANGFUSE_SECRET_KEY") otel_endpoint = str(os.environ.get("LANGFUSE_HOST")) + "/api/public/otel/v1/traces" # 构造认证头 auth_token = base64.b64encode(f"{public_key}:{secret_key}".encode()).decode() # 设置 OpenTelemetry 环境变量 os.environ["OTEL_EXPORTER_OTLP_ENDPOINT"] = otel_endpoint os.environ["OTEL_EXPORTER_OTLP_HEADERS"] = f"Authorization=Basic {auth_token}"在项目的.env文件中配置:
LANGFUSE_PUBLIC_KEY=pk-lf-... LANGFUSE_SECRET_KEY=sk-lf-... LANGFUSE_HOST=https://cloud.langfuse.com # 或你的私有部署地址配置后,每次 Agent 运行,你都可以在 Langfuse 控制台看到:
- Trace 列表:每次用户会话是一条 Trace。
- 详细 Span:展开 Trace,可以看到模型调用、每个工具调用都是一个 Span,包含输入、输出、耗时、Token 用量。
- 指标分析:统计平均响应时间、Token 消耗成本、工具调用成功率等。
这对于调试复杂任务、优化提示词、分析成本至关重要。
7.2 使用 Amazon ECS Fargate 部署
本项目通过 CDK 已经将 Agent 后端服务部署在了 Amazon ECS Fargate 上。Fargate 是 AWS 的服务器less 容器服务,意味着:
- 无需管理服务器:你不需要关心 EC2 实例的挑选、打补丁、扩缩容。
- 弹性伸缩:可以根据 Agent 请求的并发量自动增加或减少任务数量。
- 高可用:任务可以跨多个可用区部署。
- 安全:任务运行在隔离的环境中,并通过 IAM 角色安全地访问其他 AWS 服务(如 S3、Aurora)。
CDK 代码定义了计算资源、网络、负载均衡器、安全组等一切所需资源,实现了“基础设施即代码”。
8. 常见问题与排查指南
在实践过程中,你可能会遇到以下问题:
| 问题现象 | 可能原因 | 排查步骤与解决方案 |
|---|---|---|
前端访问AlbDnsName超时或无法连接。 | 1. 安全组未开放 80/443 端口。 2. 中国区负载均衡器未完成 ICP 备案。 | 1. 检查 ECS 任务所在安全组的入站规则。 2. 测试时,可修改 LB 监听端口为其他非标准端口(如 8080),或通过 ECS Exec 进入容器内部测试。 |
| Agent 调用工具失败,前端显示工具错误。 | 1. MCP Server 配置错误(命令、路径、环境变量)。 2. 远程 MCP Server 网络不通或认证失败。 3. 工具所需的 API Key 无效或配额用尽。 | 1. 在前端 MCP Servers 标签页检查工具状态,查看后台日志。 2. 测试远程 MCP Server 的 URL 和 Token 是否能直接访问。 3. 检查硅基流动、MiniMax、博查等平台的 API Key 状态和余额。 |
| 模型响应慢或超时。 | 1. 模型服务端延迟高。 2. 网络问题。 3. max_tokens设置过高,生成内容过长。 | 1. 在 Langfuse 中查看模型调用的耗时分布。 2. 检查本地到硅基流动 API 的网络。 3. 适当降低 max_tokens,或使用流式输出改善用户体验。 |
记忆工具mem0_memory无法存储或检索。 | 1. Aurora PostgreSQL 连接失败。 2. 数据库表或 pgvector 扩展未正确初始化。 3. 环境变量配置错误。 | 1. 检查 Aurora 集群状态和安全组规则。 2. 登录数据库,检查 mem0_memories表是否存在。3. 核对 .env文件中所有POSTGRESQL_*环境变量。 |
知识库检索工具retrieve返回空结果。 | 1. OpenSearch 索引中无数据。 2. Embedding 模型调用失败。 3. 查询语句不匹配。 | 1. 运行知识库数据注入脚本,确保 OpenSearch 中有向量数据。 2. 检查 Lambda 函数的 CloudWatch 日志,查看 Embedding API 调用情况。 3. 尝试更简单的查询词。 |
| CDK 部署失败,报错权限不足。 | 当前 IAM 用户/角色没有创建某些资源(如 VPC、IAM Role)的权限。 | 为部署使用的 IAM 用户附加AdministratorAccess策略(仅限测试环境),或根据 CDK 报错信息精细化配置权限。 |
9. 最佳实践与进阶思路
基于这个实战项目,我们可以总结出一些构建生产级 Agentic AI 应用的最佳实践:
- 提示词工程是核心:Agent 的“个性”和“能力边界”由系统提示词决定。投入时间精心设计提示词,明确角色、步骤约束、输出格式,比优化代码更能提升效果。
- 工具设计要原子化:每个 MCP Server 应专注于一个单一、明确的功能。避免创建“巨无霸”工具。原子化工具更易复用、测试和组合。
- 实施严格的工具权限控制:在生产环境中,必须对工具调用进行鉴权和审计。例如,
s3-upload工具应使用具有最小权限(仅能写入特定 S3 路径)的 IAM 角色。远程 MCP Server 必须使用 Token 认证。 - 利用可观测性驱动优化:持续监控 Langfuse 中的指标。关注:哪些工具调用最频繁?哪些步骤耗时最长?Token 消耗的主要来源是哪里?根据数据迭代提示词、优化工具或升级模型。
- 设计优雅的失败处理:Agent 调用外部工具可能失败(网络超时、API 限流)。在系统提示词中应指导模型如何处理失败(例如,“如果搜索工具失败,请基于已有知识继续,并注明信息可能不是最新的”)。
- 成本管理:Agent 的运营成本 = 模型调用成本 + 工具 API 成本 + 云资源成本。使用 Langfuse 监控 Token 消耗,为不同复杂度的任务选择不同规格的模型(例如,简单问答用低成本模型,复杂规划用高性能模型)。
- 进阶:多 Agent 协作:对于超复杂任务,可以设计多个 Agent 分工协作。例如,一个“规划 Agent”负责拆解任务,一个“研究 Agent”负责搜索和总结,一个“创作 Agent”负责生成内容,一个“审核 Agent”负责质量检查。Strands Agents 对多 Agent 系统有良好的支持。
10. 总结:拥抱 Agentic AI 的“复利”时代
通过这个从零到一的完整实战,我们清晰地看到,借助像Strands Agents这样优秀的开源框架和亚马逊云科技全栈式的云服务,构建一个生产可用的 Agentic AI 应用不再是一件遥不可及的事情。
这个项目的价值远不止于“制作了一个课件”。它验证了一个完整的 Agentic AI 应用范式:
- 模型即大脑:通过标准 API 接入强大的 DeepSeek-R1 模型。
- 工具即手脚:通过 MCP 协议,以极低的成本集成内外部能力。
- 记忆即经验:通过向量数据库,让 Agent 拥有持续学习的能力。
- 云即基石:通过 ECS Fargate、Aurora Serverless、S3 等托管服务,获得了弹性、可靠、安全的基础设施。
- 可观测即可控:通过 Langfuse,让 AI 的“黑盒”过程变得透明、可优化。
Agentic AI 的价值,不在于单次任务比人工快多少,而在于一旦构建成功,它就能 7x24 小时不间断地、自主地、持续学习地处理某一类复杂问题。这种能力的积累和复用,将产生强大的“复利效应”,从根本上改变我们构建软件和解决问题的方式。
你可以基于这个项目模板,轻松替换场景:将其改造成一个自动周报生成 Agent、一个智能客服排障 Agent、一个个性化学习辅导 Agent。唯一需要改变的,是提示词、工具集和对应的知识库。
希望这篇详尽的实战指南能为你打开 Agentic AI 开发的大门。下一步,建议你:
- 仔细阅读 Strands Agents 官方文档 ,深入了解其高级特性。
- 探索更多 MCP Server,丰富你的 Agent 工具库。
- 将你的业务数据灌入 OpenSearch,打造专属的业务知识库。
- 尝试将 Agent 集成到你的现有应用工作流中,解决实际的业务痛点。