AWS · ML 博客

可扩展语音代理设计: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,它会处理扩展、会话隔离和计费。对于语音智能体,它提供:

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:

  1. 从语音中理解意图
  2. 从可用的 MCP 工具中选择 get_account_balance
  3. 使用正确的参数调用工具
  4. 语音播报结果

权衡: Nova Sonic 做出所有决策。如果工具调用需要多步验证、条件逻辑或链接多个操作,那么推理负担完全落在语音模型的系统提示词上。对于简单工具,这没问题。对于复杂工作流,这会变得脆弱。

模式 2:子智能体 – 通过解耦智能体进行额外推理

使用子智能体或智能体即工具模式,您的现有业务逻辑在自主智能体中运行,每个智能体都有自己的模型、系统提示词、工具和推理能力。语音编排器将整个任务委派给这些子智能体,而不是调用单个工具。

从语音智能体连接到子智能体有多种方式。Agent-to-Agent (A2A) 和 Strands Agent-as-Tool 是两种常见方法:

以下是本地智能体即工具方法,每个子智能体是一个包装了完整 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 工具) 最高(相同子智能体) 中等(每阶段组合工具/子智能体)
对话连续性 无缝 无缝 阶段间需要交接逻辑

语音智能体的延迟最佳实践

构建语音智能体与文本智能体相比,延迟是一个关键考虑因素。以下是保持响应快速灵敏的实用技巧:

清理

完成测试示例后,请记得清理您创建的资源以避免不必要的费用。按照仓库说明停止服务并删除任何已部署的基础设施。

结论

将文本聊天机器人迁移到语音助手并非简单的包装工作。从响应设计到延迟预算再到轮换行为,交互模型根本不同。但是,通过结构良好的多智能体架构和 Amazon Bedrock AgentCore,业务逻辑层保持不变。您已经构建的子智能体是您最大的资产。复用它们。

有关部署在 AgentCore Runtime 上、使用 WebSocket 流的 Strands BidiAgent 语音助手的工作示例,请参阅 AgentCore 双向流示例。

后续步骤

接下来,您可以扩展示例以适应您自己的用例,集成您的业务工具,优化语音交互的提示词,并在真实场景中测试智能体,为生产部署做准备。

要了解有关 AWS 上语音智能体的更多信息,请访问:

关于作者

Lana Zhang 是 AWS 全球专家组织中的生成式 AI 高级专家解决方案架构师。她专攻 AI/ML,重点关注 AI 语音助手和多模态理解等用例。她与媒体娱乐、游戏、体育、广告、金融服务和医疗保健等不同行业的客户密切合作,帮助他们通过 AI 转型业务解决方案。

Osman Ipek 是 Amazon AGI 团队的解决方案架构师,专注于 Nova 基础模型。他通过实用的 AI 实施策略指导团队加速开发,专业领域涵盖语音 AI、NLP 和 MLOps。

译自 AWS · ML 博客 · 录于 二〇二六年五月十九日