使用Amazon Nova 2 Sonic构建医疗预约代理

AWS ML Blog 2026-06-25T15:20:29.609673

使用Amazon Nova 2 Sonic构建医疗预约代理

作者:Jimin Kim 和 Shree Krishnamurthi,2026年6月24日

如果你经营一家诊所或医院网络,你深知失约的成本。美国医疗行业的平均未到场率(no-show rate)在5%到30%之间,具体取决于专科。每个空位都代表着收入损失、医务人员闲置时间和患者治疗延迟。标准的修复方法是逐个打电话给患者确认或改期,但这无法规模化。

在这篇文章中,你将学习如何使用Amazon Nova 2 Sonic(语音转语音模型)和Amazon Bedrock AgentCore构建一个处理预约提醒对话的语音代理。该代理通过语音验证患者身份,管理预约(确认、取消或改期),收集就诊前健康信息,并在需要时升级到人工客服。你可以在规模上处理常规通话,这有助于降低未到场率。这个示例专注于问题的智能代理(agentic)方面:语音对话和工具编排。我们提供了一个基于浏览器的界面用于测试。若要将代理连接到实际电话线进行外呼,你需要集成如Amazon Connect Customer之类的电话服务。

本指南带你完成完整的构建。你将获得一个在Amazon Bedrock上运行的可工作的语音代理,它使用Amazon Nova 2 Sonic的语音到语音能力进行自然的预约对话,以及使用Strands Agents SDK构建的七个医疗专用工具,用于患者身份验证、预约安排和升级。无服务器部署运行在Amazon Bedrock AgentCore上,使用Amazon Cognito身份验证、Amazon DynamoDB持久化和Amazon Simple Notification Service (Amazon SNS)通知。基于浏览器的React前端通过经过身份验证的WebSocket连接流式传输双向音频。

解决方案概述

为了有效地自动化预约通话,你需要一个对话式AI系统,能在一次交互中处理多个步骤:验证身份、呈现预约详情、处理变更和收集健康信息。

传统方法将多个独立服务串联起来。语音转文本(speech-to-text)模型转录患者的话语,基于文本的大语言模型(LLM)生成回应,文本转语音(text-to-speech)模型回读。每一次交接都会引入延迟并丢失上下文。转录步骤丢弃了语调、犹豫和紧急性等语音线索。LLM听不到患者说话的方式,只听到内容。在医疗领域,患者的焦虑或困惑应该改变代理的回应方式,这种丢失就很重要。

这个代理采用了不同的方法,结合了两个AWS服务。

Amazon Nova 2 Sonic

Amazon Nova 2 Sonic是一个在Amazon Bedrock上可用的语音到语音(speech-to-speech)模型,支持通过双向流实现实时对话式AI。它不是将单独的转录、推理和合成服务串联起来,而是原生地在一个单一模型中处理语音——这样像语气和节奏这样的语音上下文就不会在转录中丢失。有关Nova 2 Sonic如何处理语音并适应声学上下文的更多信息,请参见博客文章《Introducing Amazon Nova Sonic》

对于这个代理,Nova 2 Sonic提供了几个关键能力。其原生的语音到语音处理在轮次间保留语音细微差别,因此代理能够捕捉到犹豫或担忧而不会丢失上下文。工具调用(tool-calling)准确性确保了多步骤医疗工作流按计划进行。模型知道何时验证身份、何时查询排班、何时预约。低延迟的双向流使对话保持响应。该模型还设计用于处理家庭和临床环境中常见的背景噪音以及带口音的英语。最后,多语言支持使代理能够在对话中途切换到患者偏好的语言,无需更改配置。有关支持的语言,请参见Amazon Nova 2 Sonic文档

Amazon Bedrock AgentCore

Build a healthcare appointment agent with Amazon Nova 2 Sonic | Artificial Intelligence

Amazon Bedrock AgentCore 提供了一个无服务器、框架无关的运行时,用于以企业级安全大规模运行 AI 智能体。您将智能体逻辑部署为一个容器,AgentCore 负责处理基础设施、扩展以及 AWS Identity and Access Management (IAM) 认证的 WebSocket 端点。本实现使用 Strands Agents SDK 的 BidiAgent 类来管理 Nova 2 Sonic 的双向语音流。

架构

下图展示了各组件如何连接。一个 React 前端通过 SigV4 签名的 WebSocket 连接与 Amazon Bedrock AgentCore 进行通信。由 Nova 2 Sonic 驱动的 Strands BidiAgent 处理实时语音对话,并调用医疗工具,这些工具读写 DynamoDB 表并向 Amazon SNS 发布消息。

架构图展示了 React 前端通过 WebSocket 与 Amazon Bedrock AgentCore Runtime 通信,后者托管了由 Nova 2 Sonic 驱动的 Strands BidiAgent;该智能体读写三个 DynamoDB 表,并向 Amazon SNS 发布升级消息

图 1:医疗预约智能体的架构

React 前端在浏览器中捕获麦克风音频,并通过 WebSocket 将其流式传输到智能体。WebSocket 是一种在客户端和服务器之间保持持久双向连接的协议。为确保连接安全,前端通过 Amazon Cognito(一项颁发临时 AWS 凭证的身份服务)对用户进行身份验证,并使用 SigV4(AWS 标准请求签名协议)对每个请求进行签名。

Amazon Bedrock AgentCore Runtime 托管容器化的 Strands BidiAgent,负责管理基础设施和扩展。Nova 2 Sonic 接收音频输入,进行对话推理,在需要时调用工具,并生成音频响应。三个 DynamoDB 表分别存储患者记录、预约详情和可用时间段。当患者要求与人类通话时,Amazon SNS 会发布升级通知。

组装起来

Strands SDK 处理了双向语音流的复杂性。整个智能体设置只需几行代码:

from strands.experimental.bidi import BidiAgent
from strands.experimental.bidi.models import BidiNovaSonicModel

model = BidiNovaSonicModel(
    region="us-east-1",
    model_id="amazon.nova-2-sonic-v1:0",
    provider_config={
        "audio": {
            "input_sample_rate": 16000,
            "output_sample_rate": 16000,
            "voice": "tiffany",
        }
    },
    tools=tools,  # 下面列出的七个医疗工具
)

agent = BidiAgent(
    model=model,
    tools=tools,
    system_prompt=system_prompt,
)

# 在 WebSocket 处理器中,连接输入和输出
await agent.run(
    inputs=[receive_audio],
    outputs=[send_audio],
)

您将工具列表和系统提示传递给 BidiAgent,将其指向 Nova 2 Sonic,然后 SDK 会管理流会话。它接收音频,在模型决定时调用工具,并将音频响应发送回去。

医疗工具

该语音智能体使用七个工具来完成每个通话。每个工具都实现为一个 Python 函数,并使用 Strands Agents SDK 的 @tool 装饰器进行装饰。Nova 2 Sonic 根据患者的发言决定何时调用每个工具。例如,当患者要求重新安排预约时,Nova 2 Sonic 会调用 find_available_slots 查询 DynamoDB,通过语音呈现选项,然后调用 book_appointment_slot 完成更改。

这种基于工具的设计意味着您可以单独交换或扩展某个工具,而无需重写智能体的其余部分。要添加新功能(例如,收集保险信息),您只需编写一个新的 @tool 函数并更新系统提示即可。

使用 Amazon Nova 2 Sonic 构建医疗预约代理 | 人工智能

工具 功能 工作原理
authenticate_patient 使用名字、姓氏和社保号后四位验证身份。 通过全局二级索引(GSI)查询 DynamoDB 患者表。对每个姓名组合强制执行三次尝试限制。成功后返回患者详情和即将到来的预约。
confirm_appointment 确认现有预约。 在 DynamoDB 中将预约状态从ScheduledRescheduled更新为Confirmed。包含幂等检查以防止重复确认。
cancel_appointment 取消预约并可选择提供原因。 将状态更新为Canceled并附上带时间戳的备注。仅对ScheduledConfirmedRescheduled状态的预约生效。
find_available_slots 查询可用于重新安排的空闲时间段。 从预约记录中查找提供者,并通过ProviderDateIndex GSI 查询AvailableSlots表。最多返回三个选项以保持语音对话简洁。
book_appointment_slot 预约选定的时间段。 使用 DynamoDB 条件写入以原子方式将时间段标记为已占用,防止并发请求下的重复预约。使用新日期和时间更新预约。
record_health_update 采集就诊前健康信息。 向预约记录追加带时间戳的备注。收集四项内容(医疗状况、过敏史、陪同人员、具体关注点);每次询问一项。
escalate_to_agent 标记通话以等待人工回拨。 生成六位参考号码,将预约状态更新为Escalated,并发布包含患者信息和升级原因的 Amazon SNS 消息。

代理如何处理通话

当代理与患者接通时,BidiAgent 通过四个阶段管理整个对话。对话流程定义在代理的系统提示词中,您可以根据自己的用例进行自定义。以下是重新安排流程的摘录,展示了提示词如何驱动多工具编排:

## 重新安排流程
如果患者想要重新安排:
1. 询问他们偏好的时间(上午/下午、具体日期)
2. 使用 find_available_slots 工具查找可用时间段
3. 提供 2-3 个选项让他们选择
4. 重新安排后,收集健康信息(与确认流程相同的 4 个问题)

Nova 2 Sonic 遵循这些指令来决定何时调用每个工具。您可以通过编辑提示词来添加新流程或修改现有流程。

部署代理

完整源代码可在 GitHub 仓库 中找到。按照以下步骤在您的 AWS 账户中部署代理。

前提条件

开始之前,请确保您已具备以下条件:

使用 Amazon Nova 2 Sonic 构建医疗预约代理 | 人工智能

步骤 1:克隆仓库

git clone https://github.com/aws-samples/sample-Nova-Sonic-AgentCore-Healthcare-Call-Center.git
cd sample-Nova-Sonic-AgentCore-Healthcare-Call-Center

步骤 2:部署基础设施

AWS CDK 堆栈会预配置您所需的所有资源:Cognito 用户池和身份池、DynamoDB 表、一个 Amazon SNS 主题,以及包含容器化代理的 AgentCore 运行时。

cd infrastructure
python3 -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt
cdk deploy --require-approval never

部署完成后,记录 AWS CloudFormation 的输出。您需要 Cognito 用户池 ID、客户端 ID、身份池 ID 和 AgentCore 运行时 ARN,以便配置前端。

步骤 3:创建测试用户

创建一个用于测试的 Cognito 用户。将 <UserPoolId> 替换为您的 CDK 输出中的值:

aws cognito-idp admin-create-user \
    --user-pool-id <UserPoolId> \
    --username testuser \
    --temporary-password TempPass123!

aws cognito-idp admin-set-user-password \
    --user-pool-id <UserPoolId> \
    --username testuser \
    --password <YourSecurePassword> \
    --permanent

步骤 4:配置并运行前端

复制环境模板,并填入您的 CDK 输出中的值:

cd ../frontend
npm install
cp .env.example .env
# 使用 CDK 输出值编辑 .env 文件
npm run dev

在浏览器中打开 http://localhost:5173,使用您的测试用户登录,从菜单中选择一个患者,然后选择 开始通话 以开始语音对话。

步骤 5:植入演示数据

CDK 堆栈在部署过程中会自动植入示例患者记录。如果您需要重新植入或自定义数据,请运行:

python3 scripts/seed_data.py

测试时,可以使用以下任一预配置患者:

患者姓名 SSN 后四位
John Smith 1234
Jane Doe 5678
Michael Johnson 9012

示例对话

以下文字记录来自一次测试部署。它展示了一个完整的重新预约交互过程:代理对患者进行身份验证、找到新的预约时间段、完成预约并收集就诊前的健康详情。

实时患者通话中的医疗语音助手界面

图 2:医疗语音助手

查看原文