可扩展语音代理设计:Amazon Nova Sonic 的多代理、工具与会话分割
Scalable voice agent design with Amazon Nova Sonic: multi-agent, tools, and session segmentation
本文介绍了使用 Amazon Nova Sonic、Amazon Bedrock AgentCore 和 Strands BidiAgent 构建可扩展语音智能体的三种设计模式:工具调用(低延迟,通过 AgentCore Gateway 直接调用 MCP 工具)、子智能体(将任务委派给独立智能体,支持 A2A 协议)和会话分段(按阶段切换 Nova Sonic 会话与提示词)。对比了各模式的延迟、工具集与推理深度,并给出延迟优化最佳实践,包括使用小模型、预取数据与并行化调用。作者为 AWS 专家 Lana Zhang 和 Osman Ipek。
可扩展语音智能体的设计模式
对于需要提供快速、自然且可靠语音体验的组织而言,可扩展语音智能体的设计模式至关重要。许多团队面临高延迟、实时音频管理以及在复杂工作流中协调多个智能体等挑战。本文将介绍如何使用 Amazon Nova Sonic、Amazon Bedrock AgentCore 和 Strands BidiAgent 构建可扩展、可维护的语音智能体,高效应对这些挑战,从而实现更灵敏、更智能的客户交互。我们将探讨三种流行的语音智能体架构模式,重点分析其权衡以及最小化延迟的最佳实践。
基础组件
在深入探讨架构模式之前,先快速了解本文示例解决方案中使用的三个关键组件。
Amazon Nova Sonic 是一个基础模型,能够为生成式 AI 应用创建自然、类人的语音到语音对话。用户可以通过语音实时与 AI 交互,具备理解语气、自然对话流程以及执行操作的能力。
Amazon Bedrock AgentCore Runtime 是一个用于 AI 智能体的无服务器托管环境。您将智能体打包为容器,部署到 AgentCore Runtime,它会处理扩展、会话隔离和计费。对于语音智能体,它提供:
- 带 SigV4 认证的双向 WebSocket 流
- 微VM级别的会话隔离,避免"吵闹邻居"导致的延迟峰值
- AgentCore Gateway,用于使用 Model Context Protocol (MCP) 开源协议共享工具托管
- 跨会话的持久化内存
- 针对语音特定指标(如首次音频时间)的遥测
Strands Agents 是一个用于构建 AI 智能体的开源框架。其 BidiAgent 类是 Nova Sonic 与您的应用程序之间的集成选项之一。它管理双向流生命周期、路由工具调用并处理会话管理,通过模型 SDK 接口简化语音智能体应用。
三种集成模式:工具、智能体即工具(子智能体)和会话分段
现代语音系统不再构建一个全能型智能体,而是越来越多地采用工具驱动的智能体、作为工具的子智能体以及隔离提示词、内存和权限的会话分段策略。这些模式使团队能够将大型助手分解为更小、更专业、可复用的组件,同时保持清晰的安全边界。
在运行以下各节的示例之前,请安装 Python 及所需依赖项,包括 strands-agents 和 boto3,并确保您的 IAM 设置具有所需服务的必要权限。完整示例请参考 GitHub 仓库。
模式 1:AgentCore Gateway – 低延迟的工具选择
工具调用是指语音智能体将输入发送到外部函数或服务,该函数或服务处理输入并返回输出。它让智能体能够快速安全地执行查询数据库或触发服务等任务,无需额外的推理步骤。
使用 AgentCore Gateway,您可以将现有业务逻辑暴露为工具,即 Nova Sonic 在对话期间可以直接调用的离散函数。语音模型选择要调用的工具,传递参数,获取结果,然后语音播报结果。模型和工具之间没有中间推理层。AgentCore Gateway 将 MCP 服务器作为托管端点运行。MCP 是协议,AgentCore Gateway 是运行它们的 AWS 功能。语音智能体通过 Gateway ARN 连接。
# Nova Sonic 通过 AgentCore Gateway 直接调用工具
model = BidiNovaSonicModel(
model_id="amazon.nova-2-sonic-v1:0",
mcp_gateway_arn=[
"arn:aws:bedrock-agentcore:us-east-1:123456789012:gateway/auth-tools",
"arn:aws:bedrock-agentcore:us-east-1:123456789012:gateway/banking-tools",
"arn:aws:bedrock-agentcore:us-east-1:123456789012:gateway/mortgage-tools",
],
)
当用户说"我的账户余额是多少?"时,Nova Sonic:
- 从语音中理解意图
- 从可用的 MCP 工具中选择 get_account_balance
- 使用正确的参数调用工具
- 语音播报结果
权衡: Nova Sonic 做出所有决策。如果工具调用需要多步验证、条件逻辑或链接多个操作,那么推理负担完全落在语音模型的系统提示词上。对于简单工具,这没问题。对于复杂工作流,这会变得脆弱。
模式 2:子智能体 – 通过解耦智能体进行额外推理
使用子智能体或智能体即工具模式,您的现有业务逻辑在自主智能体中运行,每个智能体都有自己的模型、系统提示词、工具和推理能力。语音编排器将整个任务委派给这些子智能体,而不是调用单个工具。
从语音智能体连接到子智能体有多种方式。Agent-to-Agent (A2A) 和 Strands Agent-as-Tool 是两种常见方法:
本地智能体即工具: 子智能体在进程内运行,使用 Strands 中的 Agents as Tools 模式包装为 @tool 函数。这是最直接的方法,没有网络跳转,无需单独部署。权衡是子智能体共享同一进程,并随编排器一起扩展。
通过 A2A 协议的远程智能体: 子智能体作为独立的 A2A 服务器部署在 AgentCore Runtime(或远程服务器)上,并通过网络调用。A2A 是用于智能体间通信的开放协议。正如 MCP 连接智能体与工具,A2A 连接智能体与其他智能体。如 AWS 关于 AgentCore Runtime 中 A2A 协议支持的博客所述,使用不同框架(Strands、OpenAI、LangGraph、Google ADK)构建的智能体可以以通用格式共享上下文和推理。这提供了完全的部署独立性和跨框架互操作性。Strands Agents 内置支持这两种协议:MCP 用于工具访问,A2A 用于智能体间通信。有关实践指南,请参阅社区指南《Agent Collaboration: Strands Agents, MCP, and the Agent2Agent Protocol》。
以下是本地智能体即工具方法,每个子智能体是一个包装了完整 Strands Agent 的 @tool:
# sub_agents.py — 使用 Agents-as-Tools 模式将子智能体定义为 Strands 工具
from strands import Agent, tool
from strands.models import BedrockModel
# 每个子智能体是一个包装为 @tool 的完整 Strands Agent
# BidiAgent 编排器通过 Nova Sonic 的工具使用调用这些工具
@tool
def authenticate_customer(account_id: str, date_of_birth: str) -> str:
"""使用账户 ID 和出生日期验证客户身份。
处理完整的验证流程,包括身份检查和重试逻辑。
返回认证状态和令牌。"""
auth_agent = Agent(
model=BedrockModel(model_id="amazon.nova-lite-v1:0"),
system_prompt="""你是一个认证智能体。使用提供的账户 ID 和出生日期验证客户身份。
调用 verify_identity 检查凭证。用 1-2 句话返回清晰的认证状态。""",
tools=[verify_identity, check_account_exists], # 子智能体自己的工具
)
result = auth_agent(f"认证账户 {account_id},出生日期:{date_of_birth}")
return str(result)
@tool
def handle_banking_inquiry(query: str, auth_token: str) -> str:
"""处理银行相关问题——余额、交易、转账。
验证权限并返回对话式摘要。"""
banking_agent = Agent(
model=BedrockModel(model_id="amazon.nova-lite-v1:0"),
system_prompt="""你是一个银行智能体。使用提供的工具回答客户查询。
用 2-3 句自然语言总结结果。不要返回原始 JSON。""",
tools=[get_account_balance, get_recent_transactions, transfer_funds],
)
result = banking_agent(query)
return str(result)
@tool
def handle_mortgage_inquiry(query: str) -> str:
"""处理抵押贷款相关问题——利率、计算、资格、申请状态。
自行进行计算和推理。"""
mortgage_agent = Agent(
model=BedrockModel(model_id="amazon.nova-lite-v1:0"),
system_prompt="""你是一个抵押贷款专家。帮助处理利率查询、还款计算和资格评估。
保持回复简洁且对话化——这些内容将被语音朗读。""",
tools=[get_mortgage_rates, calculate_payment, check_eligibility],
)
result = mortgage_agent(query)
return str(result)
然后,语音编排器使用 BidiAgent 配合这些子智能体工具:
# voice_orchestrator.py — 使用子智能体作为工具的 BidiAgent
from strands.experimental.bidi.agent import BidiAgent
from strands.experimental.bidi.models.nova_sonic import BidiNovaSonicModel
from sub_agents import authenticate_customer, handle_banking_inquiry, handle_mortgage_inquiry
model = BidiNovaSonicModel(
region="us-east-1",
model_id="amazon.nova-2-sonic-v1:0",
provider_config={"audio": {"voice": "tiffany", "input_sample_rate": 16000, "output_sample_rate": 16000}},
)
agent = BidiAgent(
model=model,
tools=[authenticate_customer, handle_banking_inquiry, handle_mortgage_inquiry],
system_prompt="""你是一个银行语音助手。将客户请求路由到相应的专家。
在访问账户数据之前始终进行认证。保持自己的回复简短——子智能体处理细节。""",
)
await agent.run(inputs=[ws_input], outputs=[ws_output])
子智能体自行思考。Nova Sonic 不需要编排各个步骤。它委派任务并播报结果。
权衡: 每次子智能体调用都会增加延迟:子智能体自身的模型推理加上其工具调用。在语音对话中,这意味着子智能体推理时会有更长的静默期。AWS 关于多智能体语音助手的博客建议,为子智能体使用更小、更高效的模型(如 Amazon Nova 2 Lite)来减少延迟,同时仍能有效处理专业任务。Amazon Nova 2 Sonic 支持异步工具调用,因此对话可以在后台运行工具时自然继续。它持续接收输入,可以并行运行多个工具,并在用户中途更改请求时优雅地适应,在关注仍相关的内容的同时交付所有结果。
模式 3:超低延迟的会话分段
还有第三种方法值得考虑。它不完全符合 MCP 或子智能体模式,但专为延迟是首要考虑的语音场景而构建。您不是委派外部工具或子智能体,而是将对话划分为逻辑阶段,每个阶段都有自己的 Nova Sonic 会话、系统提示词和工具集。当对话从一个阶段过渡到下一个阶段(例如,从认证到账户查询)时,您关闭当前会话,并在同一个 WebSocket 连接内打开一个具有不同提示词和工具的新会话。每个子语音智能体可以使用自己的 MCP 网关、工具甚至子智能体——区别在于它使用聚焦的提示词和最小的工具面,从而减少推理开销和延迟。
考虑一个具有三个对话阶段的银行语音助手:认证、账户管理和抵押贷款查询。与其加载一个包含所有工具的庞大系统提示词,不如将每个阶段作为一个聚焦的 Nova Sonic 会话运行:
# 阶段 1:认证
auth_session = BidiNovaSonicModel(
model_id="amazon.nova-2-sonic-v1:0",
mcp_gateway_arn=["arn:...gateway/auth-tools"], # 仅认证工具
)
auth_agent = BidiAgent(
model=auth_session,
tools=[],
system_prompt="""你是一个认证助手。收集用户的账户 ID 和出生日期。
调用 verify_identity 进行认证。认证完成后,说'您已就绪'并停止。""",
)
# 运行直到认证完成
await auth_agent.run(inputs=[ws_input], outputs=[ws_output])
# 阶段 2:账户管理(新会话、新提示词、新工具)
banking_session = BidiNovaSonicModel(
model_id="amazon.nova-2-sonic-v1:0",
mcp_gateway_arn=["arn:...gateway/banking-tools"], # 仅银行工具
)
banking_agent = BidiAgent(
model=banking_session,
tools=[],
system_prompt="""你是一个银行助手。用户已认证。帮助处理余额查询、交易和转账。
将回复控制在一两句话内。""",
)
await banking_agent.run(inputs=[ws_input], outputs=[ws_output])
每个阶段获得一个干净的 Nova Sonic 会话,包含:
- 聚焦的系统提示词: 更短、更具体,模型混淆的空间更小。
- 仅相关工具: 通过 MCP 网关、本地工具或两者结合。当模型只需要 3 个工具时,它不会浪费推理周期在 15 个工具之间选择。
- 可选的自有子智能体: 需要更深推理的阶段可以在内部使用模式 2,而更简单的阶段保持仅工具。
之前的会话上下文可以作为聊天历史传递到新会话中,因此整体对话保持连续性。
工具、子智能体和会话分段模式的对比
| 因素 | 工具 | 子智能体(智能体即工具) | 会话分段 |
|---|---|---|---|
| 延迟 | 低 | 较高(子智能体推理) | 最低(会话转换期间有延迟) |
| 每轮工具集 | 加载的工具 | 子智能体的工具 | 仅阶段相关工具 |
| 系统提示词 | 一个大型提示词 | 编排器 + 子智能体提示词 | 小型、阶段特定的提示词 |
| 推理深度 | 仅语音模型 | 语音模型 + 子智能体 | 仅语音模型(每阶段) |
| 现有智能体复用 | 高(相同 MCP 工具) | 最高(相同子智能体) | 中等(每阶段组合工具/子智能体) |
| 对话连续性 | 无缝 | 无缝 | 阶段间需要交接逻辑 |
语音智能体的延迟最佳实践
构建语音智能体与文本智能体相比,延迟是一个关键考虑因素。以下是保持响应快速灵敏的实用技巧:
为子智能体从小模型开始。 您的语音编排器使用 Nova Sonic 进行对话,但子智能体不需要大型模型。从 Amazon Nova 2 Lite 或 Nova 2 Micro 开始。它们快速、成本优化,并且能很好地处理大多数专业任务。如果质量需要,您随时可以将特定子智能体升级到更大的模型,但默认从小开始。
设计有状态子智能体并启用缓存。 每次调用都命中数据库或 API 的无状态子智能体会增加延迟。相反,设计子智能体在会话内缓存来自数据源(API、AWS Lambda 函数、数据库)的结果。如果银行子智能体获取了一次账户详情,它应该将该数据保存在内存中,并从缓存中服务后续问题(余额、交易、摘要),而不是重复进行后端调用。
认证后预取数据。 这对于联络中心场景尤其有价值。客户认证后,您已经知道他们是谁。不要等到他们询问才拉取数据。立即在后台获取账户余额、近期交易、待处理警报和抵押贷款状态。当客户问"我的余额是多少?"时,答案已经在内存中。
并行化独立工具调用。 如果用户问"给我一个账户概览",不要依次调用 get_checking_balance、get_savings_balance、get_credit_card_balance。使用并发执行,让三个调用同时发生。Strands 原生支持这一点。智能体的工具执行器默认并行运行独立调用。
使用填充语掩盖工具延迟。 当工具调用或子智能体委派不可避免时,指示语音模型在等待时说出简短的填充语:"让我为您查一下……"或"请稍等,我查一下……"。这能让对话感觉活跃,而不是陷入沉默。
最小化每会话的工具数量。 随着可用工具数量的增加,工具选择会变慢。如果您的智能体有 15 个工具,但典型对话只使用 3 到 4 个,请考虑使用会话分段模式,每阶段仅加载相关工具。
清理
完成测试示例后,请记得清理您创建的资源以避免不必要的费用。按照仓库说明停止服务并删除任何已部署的基础设施。
结论
将文本聊天机器人迁移到语音助手并非简单的包装工作。从响应设计到延迟预算再到轮换行为,交互模型根本不同。但是,通过结构良好的多智能体架构和 Amazon Bedrock AgentCore,业务逻辑层保持不变。您已经构建的子智能体是您最大的资产。复用它们。
有关部署在 AgentCore Runtime 上、使用 WebSocket 流的 Strands BidiAgent 语音助手的工作示例,请参阅 AgentCore 双向流示例。
后续步骤
接下来,您可以扩展示例以适应您自己的用例,集成您的业务工具,优化语音交互的提示词,并在真实场景中测试智能体,为生产部署做准备。
要了解有关 AWS 上语音智能体的更多信息,请访问:
- Amazon Nova 2 Sonic Service Card
- Amazon Bedrock AgentCore Runtime Bidirectional Streaming
- Strands BidiAgent
- Amazon Bedrock AgentCore Bidirectional Streaming Sample Code
关于作者
Lana Zhang 是 AWS 全球专家组织中的生成式 AI 高级专家解决方案架构师。她专攻 AI/ML,重点关注 AI 语音助手和多模态理解等用例。她与媒体娱乐、游戏、体育、广告、金融服务和医疗保健等不同行业的客户密切合作,帮助他们通过 AI 转型业务解决方案。
Osman Ipek 是 Amazon AGI 团队的解决方案架构师,专注于 Nova 基础模型。他通过实用的 AI 实施策略指导团队加速开发,专业领域涵盖语音 AI、NLP 和 MLOps。