AWS 全球销售团队部署了超过 20 个领域专用 AI Agent——报价计算、客户画像、合同审查、竞品分析……每个 Agent 都能独立产出价值,但一线销售代表却要在不同系统间反复切换,自己判断"这个问题该找谁"。认知负荷没有减少,反而从"查资料"变成了"选 Agent"。Amazon Bedrock AgentCore 正是为解决这类编排问题而生:把多个专用 Agent 的调度逻辑收归一层,让用户只提需求,系统自动路由。
专用 Agent 的价值与瓶颈
单个 Agent 做得越专,边界就越清晰。报价 Agent 只管定价逻辑,合同 Agent 只管条款合规,各自训练、各自迭代,开发效率高。但瓶颈出现在使用侧:
- 选择负担:销售代表面对一个客户问询,需要自己判断该调用报价 Agent 还是竞品 Agent,或者两者都要、还要决定先后顺序。
- 上下文断裂:每个 Agent 独立维护会话状态,前一个 Agent 的结论无法自动流入下一个,代表要手动搬运中间结果。
- 响应碎片化:20 个 Agent 各有入口、各有 UI,代表在 CRM、内部工具、聊天窗口之间来回跳转。
AWS 销售组织的实际数据印证了这一点——Agent 数量增长后,代表的有效使用率反而停滞,因为"选谁"本身成了一项新工作。
AgentCore 的编排思路
Bedrock AgentCore 的核心定位不是"再做一个更强的 Agent",而是做 Agent 之间的路由器与管线。关键能力包括:
- 意图识别与路由:接收用户的自然语言请求,识别涉及哪些领域,自动分发到对应 Agent。
- 链式编排:对需要多步协作的请求,按依赖顺序串联 Agent,前一步输出作为后一步输入。
- 状态汇聚:各 Agent 的中间结果统一收归到共享上下文,避免手动搬运。
- 回退与兜底:某个 Agent 调用失败或超时时,编排层可以降级到备选路径或直接返回已有结果。
这意味着销售代表只需要说"帮我评估这个客户的续约风险",AgentCore 会自动拆解为:客户画像查询 → 使用趋势分析 → 合同条款审查 → 综合评分,串联执行后返回一份整合结论。
实践:用 AgentCore 编排一个销售评估流程
下面是一个最小可运行的示例,展示如何用 Python SDK 定义两个专用 Agent 并通过 AgentCore 编排成一条链式流程。运行前需要配置 AWS 凭证并安装 boto3。
import boto3
import json
import uuid
client = boto3.client("bedrock-agentcore", region_name="us-east-1")
# ── 1. 定义两个专用 Agent ──
# 客户画像 Agent:查询客户历史消费与行业信息
profile_agent = client.create_agent(
agentName=f"customer-profile-{uuid.uuid4().hex[:8]}",
agentResourceRoleArn="arn:aws:iam::123456789012:role/BedrockAgentRole",
foundationModel="anthropic.claude-3-5-haiku-20241022-v1:0",
instruction=(
"你是客户画像分析专家。根据客户 ID,返回该客户的行业、"
"历史消费金额、最近 6 个月使用趋势。只输出结构化 JSON。"
),
description="查询客户画像与使用趋势",
)
# 续约风险 Agent:基于画像数据评估续约概率
risk_agent = client.create_agent(
agentName=f"renewal-risk-{uuid.uuid4().hex[:8]}",
agentResourceRoleArn="arn:aws:iam::123456789012:role/BedrockAgentRole",
foundationModel="anthropic.claude-3-5-haiku-20241022-v1:0",
instruction=(
"你是续约风险评估专家。接收客户画像 JSON,"
"综合行业衰退风险、消费下滑幅度、合同到期时间,"
"输出续约概率(0-1)与风险等级(低/中/高)。"
),
description="评估客户续约风险",
)
# ── 2. 创建编排流程 ──
# AgentCore 支持将多个 Agent 组成一条执行链
# 先查画像,再将画像结果传入风险评估
orchestration = client.create_orchestration(
orchestrationName=f"renewal-assessment-{uuid.uuid4().hex[:8]}",
orchestrationResourceRoleArn="arn:aws:iam::123456789012:role/BedrockAgentCoreRole",
steps=[
{
"agentId": profile_agent["agent"]["agentId"],
"stepName": "fetch-profile",
"inputMapping": {
# 将用户原始请求中的 customerId 映射到该步骤输入
"customerId": "$.request.customerId"
},
},
{
"agentId": risk_agent["agent"]["agentId"],
"stepName": "assess-risk",
"inputMapping": {
# 将上一步输出的画像 JSON 整体传入
"profileData": "$.steps.fetch-profile.output"
},
},
],
# 如果画像查询失败,直接返回"数据不足,无法评估"
fallbackResponse={"message": "画像数据不足,无法完成风险评估"},
)
print("编排流程已创建:")
print(json.dumps(orchestration, indent=2, default=str))
调用编排流程时,用户只需提交一个请求:
# ── 3. 执行编排 ──
result = client.invoke_orchestration(
orchestrationId=orchestration["orchestration"]["orchestrationId"],
request={"customerId": "ACME-2024-0781"},
)
print("最终评估结果:")
print(json.dumps(result, indent=2, default=str))
返回结构大致如下(具体格式取决于 Agent 输出):
{
"steps": {
"fetch-profile": {
"output": {
"industry": "制造业",
"monthlySpend": 42000,
"trend": "下滑12%"
}
},
"assess-risk": {
"output": {
"renewalProbability": 0.35,
"riskLevel": "高",
"reason": "制造业衰退叠加消费下滑,合同3个月内到期"
}
}
}
}
注意:以上 API 调用结构基于 Bedrock AgentCore 公开文档的典型模式。具体字段名和参数可能随版本更新变化,部署前请对照最新 SDK 文档确认。
agentResourceRoleArn和 IAM 角色需要提前在你的 AWS 账户中创建。
从 20 个 Agent 到 1 个入口:落地考量
把 AgentCore 引入现有 Agent 体系,不是一键切换,有几个实际决策点:
哪些 Agent 先接入编排?
不建议一次性把 20 个 Agent 全部接入。先选 2-3 个高频组合——比如"客户画像 + 续约风险"或"报价计算 + 合同审查"——验证链式编排的稳定性和延迟,再逐步扩展。
编排层本身的延迟怎么控制?
每多一步 Agent 调用,就多一次模型推理。对实时性要求高的场景(比如销售通话中的即时辅助),可以设置编排层的最大步数和超时阈值,超过后直接返回已有结果,不等后续步骤。
Agent 之间的数据格式要对齐吗?
是的。链式编排依赖前一步输出能被后一步解析。最务实的做法是给每个 Agent 的 instruction 加一句"只输出结构化 JSON,字段包括 xxx",让下游 Agent 不需要再做格式猜测。
回退策略要提前定义
哪个 Agent 可能超时?哪个数据源可能不可用?在编排定义中为关键步骤配 fallbackResponse,比让整条链因单点故障中断要好得多。
AgentCore 解决的不是"Agent 能不能做某件事",而是"用户不用再自己决定找哪个 Agent 做这件事"。当专用 Agent 的数量从 3 个涨到 20 个,编排层的价值不是线性增长,而是从"锦上添花"变成"没有它就用不动"。如果你所在团队也在经历类似的 Agent 碎片化,可以先从两个最常串联的 Agent 开始,搭一条最小编排链,让代表只说一句话,系统自己跑完全程。