5 分钟用 Amazon Bedrock 搭一个 AI Agent:从零到能干活
最近打开掘金,热榜一半都是 AI Agent 相关的内容------OpenClaw 拆解、MCP 协议、Function Call 实战... 概念已经讲了不少,但真正从零搭过一个完整 Agent 的人可能不多。
今天换个思路:不装环境、不写框架、不管运维,直接用 Amazon Bedrock 的 Agent 功能,5 分钟搭一个能理解用户意图、自动调 API 的 Agent。
本文所有步骤均已实际验证跑通,不是对着文档猜的。
前置条件
- 一个 AWS 账号(注册入口,新用户有免费额度)
- 就这一个。不需要 GPU、不需要装 Python、不需要 Docker。
第 1 步:开通模型访问权限(1 分钟)
- 登录 Amazon Bedrock 控制台
- 左侧菜单 Model access(模型访问) → Manage model access
- 勾选你要用的模型,推荐:
- Claude Sonnet 4.6(综合能力强,支持中文)
- DeepSeek V3.2(性价比高)
- 点 Save changes,几秒钟就开通
💡 Bedrock 目前支持 100+ 基础模型,覆盖 Anthropic Claude 全系列、DeepSeek、Meta Llama 4、Qwen3、GLM 等主流模型。注意 :部分模型需要使用 Inference Profile(跨区域推理配置)才能调用,控制台会自动处理这个,API 调用时需要用
us.anthropic.claude-sonnet-4-6这样的 Profile ID 而非裸模型 ID。
第 2 步:创建 Agent(2 分钟)
- 左侧菜单 Agents → Create Agent
- 填写基本信息:
- Agent name :
order-assistant(订单助手) - Description :
帮用户查询和管理订单
- Agent name :
- Foundation model:选刚才开通的模型(如 Claude Sonnet 4.6)
- Instructions(系统提示词)------这是 Agent 的"灵魂":
markdown
你是一个订单管理助手。你可以帮用户完成以下操作:
1. 查询订单状态(需要订单号)
2. 查询最近的订单列表(需要用户ID)
3. 取消订单(需要订单号和取消原因)
请用中文和用户交流。如果用户没有提供必要信息,请主动询问。
- Agent resource role :选 Create and use a new service role(控制台自动创建,省心)
- 点 Create
⚠️ 如果通过 API/CLI 创建 Agent,需要手动创建 IAM Service Role 并绑定。Trust Policy 要允许
bedrock.amazonaws.com做sts:AssumeRole,并附加bedrock:InvokeModel权限。控制台操作会自动搞定这些,所以推荐新手用控制台。
第 3 步:给 Agent 装上"手脚"------Action Group(1 分钟)
光有模型和提示词,Agent 只能聊天,不能干活。Action Group 就是告诉 Agent "你能做什么操作"。
- 在 Agent 详情页,点 Add Action Group
- Action group name :
OrderActions - 定义方式选 Define with function details(比 OpenAPI Schema 简单得多)
- 添加函数:
函数 1:GetOrderStatus
- 描述:查询订单状态
- 参数:
order_id(string,必填,描述:订单编号)
函数 2:CancelOrder
- 描述:取消订单
- 参数:
order_id(string,必填)、reason(string,必填,描述:取消原因)
- Action group executor 选 Return Control
💡 Return Control 是什么意思?Agent 收集完参数后,不直接执行操作,而是把参数返回给你的应用程序。你的应用拿到参数后去调自己的后端 API,再把结果返回给 Agent 继续对话。这种模式不需要写 Lambda,对已有后端服务的场景特别友好。
- Save → 回到 Agent 页面,点顶部 Prepare
第 4 步:测试(30 秒)
Agent 状态变成 Prepared 后(通常几秒),右侧出现 Test 对话窗口。
测试 1:完整信息
输入:我想查一下订单 ORD-20260310-001 的状态
Agent 的推理过程(Trace):
ini
[思考] 用户想查询订单状态,我有所需的全部信息可以调用函数。
[调用] GetOrderStatus → ActionGroup: OrderActions
参数: order_id = ORD-20260310-001
[类型] ACTION_GROUP(Return Control,等待应用返回结果)
✅ Agent 准确识别了意图,提取了订单号,调用了正确的函数。
测试 2:不完整信息
输入:我想取消一个订单
Agent 回复:
markdown
好的,我来帮您取消订单!为了完成取消操作,我需要了解以下信息:
1. 订单编号是什么?
2. 取消原因是什么?
请提供这两项信息,我将立即为您处理。
✅ Agent 发现缺少必要参数,自动用中文追问,而不是直接报错。
Trace 是调试利器------每一步推理都可视化,不用猜模型在想什么。
第 5 步(可选):Knowledge Base 让 Agent 更聪明
如果你希望 Agent 不仅能调 API,还能回答"退货政策是什么"这类基于文档的问题:
- 左侧 Knowledge bases → Create
- 上传文档(PDF、TXT、HTML、Markdown 都支持)
- Bedrock 自动完成:文档切分 → 向量嵌入 → 存储到向量数据库
- 回到 Agent → Add Knowledge Base → 选刚才创建的
- 重新 Prepare
💡 向量数据库可以让 Bedrock 自动创建(Amazon OpenSearch Serverless),零配置。也支持自建的 Pinecone、Redis 等。
部署到应用:一个 API 调用
python
import boto3
client = boto3.client('bedrock-agent-runtime', region_name='us-east-1')
response = client.invoke_agent(
agentId='你的AgentID', # 创建时获得
agentAliasId='你的AliasID', # 创建Alias时获得,测试用 TSTALIASID
sessionId='user-session-123', # 用户会话ID,用于多轮对话
inputText='帮我查一下订单 ORD-20260310-001 的状态'
)
# 处理流式响应
for event in response['completion']:
if 'chunk' in event:
print(event['chunk']['bytes'].decode('utf-8'))
Java、JavaScript、Go SDK 写法类似,参考 InvokeAgent API 文档。
踩坑记录
实际跑通过程中遇到的几个坑,分享出来:
-
模型 ID vs Inference Profile ID :直接用
anthropic.claude-sonnet-4-6调用会报validationException,需要用 Inference Profile ID(如us.anthropic.claude-sonnet-4-6)。控制台创建不受影响,API/CLI 创建需注意。 -
Agent 必须有 Service Role :即使是最简单的 Agent,
Prepare时如果没有绑定agentResourceRoleArn会报错。控制台选"Create new role"即可,CLI 需要手动创建 IAM Role。 -
Prepare 是必须步骤:每次修改 Agent 配置(Instructions、Action Group、模型等)后,必须重新 Prepare 才生效。
自建 vs 托管,怎么选?
| 维度 | 自建(LangChain / AutoGen 等) | Bedrock Agents |
|---|---|---|
| 环境 | 需要 Python 环境 + 依赖管理 | 不需要 |
| 模型 | 自己管 GPU 或调第三方 API | 100+ 模型一键切换 |
| 工具编排 | 自己写编排逻辑 | 平台自动编排 |
| RAG | 搭向量数据库 + 检索链路 | 上传文档即可 |
| 调试 | print / log | Trace 可视化 |
| 扩缩容 | 自己管 | 全托管,按需付费 |
| 灵活性 | ⭐⭐⭐⭐⭐ | ⭐⭐⭐ |
| 上手速度 | ⭐⭐ | ⭐⭐⭐⭐⭐ |
不是说自建不好------如果你需要深度定制编排逻辑、用特殊的工具链,自建框架更灵活。但如果目标是"快速让 Agent 能干活并上线",托管方案能帮你省掉大量基础设施层的工作。
两者也不冲突,完全可以用 Bedrock 做快速原型验证,确认可行后再决定是否迁移到自建方案。
相关资源
有问题欢迎评论区交流,也欢迎分享你用 Agent 做的项目 👋