用 Amazon Nova 2 Sonic 构建医疗预约助手
Build a healthcare appointment agent with Amazon Nova 2 Sonic
本文介绍了如何使用 Amazon Nova 2 Sonic 和 Amazon Bedrock AgentCore 构建一个医疗预约语音 agent。该 agent 通过语音验证患者身份、管理预约(确认、取消、改期)、收集就诊前健康信息,并在需要时升级给人工处理。架构包括 React 前端、Amazon Cognito 认证、DynamoDB 持久化存储、Amazon SNS 通知及七个 Strands Agents SDK 构建的医疗工具。部署使用 AWS CDK,支持多语言切换。美国医疗行业平均失约率为 5% 至 30%,该方案旨在降低失约率。
如果你运营一家诊所或医院网络,你早已知道爽约的成本。美国医疗行业的平均失约率在 5% 到 30% 之间,具体取决于专科。每个空档都意味着收入损失、医生闲置时间以及患者护理的延迟。标准的解决办法——逐个打电话给患者确认或改期——无法规模化。在这篇文章中,你将学习如何使用 Amazon Nova 2 Sonic 和 Amazon Bedrock AgentCore 构建一个处理预约提醒对话的语音 agent。该 agent 通过语音验证患者身份、管理预约(确认、取消或改期)、收集就诊前健康信息,并在需要时升级给人工处理。你可以大规模处理常规电话,这有助于降低失约率。本示例聚焦于问题的 agent 侧:语音对话和工具编排。其中包含一个基于浏览器的界面用于测试。要将 agent 连接到实际电话线路进行外呼,你需要集成 Amazon Connect Customer 等电话服务。本指南将带你完成完整的构建过程。你将获得一个在 Amazon Bedrock 上运行的工作语音 agent,它利用 Amazon Nova 2 Sonic 的语音到语音能力进行自然的预约对话,并配备七个使用 Strands Agents SDK 构建的医疗专用工具,用于患者验证、排程和升级。无服务器部署运行在 Amazon Bedrock AgentCore 上,搭配 Amazon Cognito 认证、Amazon DynamoDB 持久化存储和 Amazon Simple Notification Service (Amazon SNS) 通知。一个基于浏览器的 React 前端通过经过认证的 WebSocket 连接流式传输双向音频。
解决方案概述
为了有效自动化预约电话,你需要一个对话式 AI 系统,能在单次交互中处理多个步骤:验证身份、呈现预约详情、处理变更以及收集健康信息。传统方法将多个独立服务串联起来:一个语音转文本模型转录患者的言语,一个基于文本的大语言模型 (LLM) 生成回复,再一个文本转语音模型将其读出来。每次交接都会引入延迟并丢失上下文。转录步骤丢弃了语气、犹豫和紧迫感等语音线索。LLM 听不到患者说话的方式,只能听到他们说了什么。在医疗领域,患者的焦虑或困惑本应改变 agent 的回应方式,这种丢失至关重要。本 agent 采用了一种不同的方法,结合了两项 AWS 服务。
Amazon Nova 2 Sonic
Amazon Nova 2 Sonic 是 Amazon Bedrock 上提供的一个语音到语音模型,支持具有双向流式传输的实时对话式 AI。Nova 2 Sonic 并非串联独立的转录、推理和合成服务,而是在单个模型中原生处理语音——因此语气和语速等语音上下文不会在转录中丢失。有关 Nova 2 Sonic 如何处理语音并适应声学上下文的更多信息,请参阅《Introducing Amazon Nova Sonic》博客文章。对于本 agent,Nova 2 Sonic 提供了几个关键能力。其原生的语音到语音处理能在多轮对话中保留语音细微差别,因此 agent 能捕捉到犹豫或担忧而不丢失上下文。工具调用准确性确保多步骤的医疗工作流按计划进行。模型知道何时进行身份验证、何时查询排程、何时进行预约。低延迟的双向流式传输保持对话的响应性。该模型还设计用于处理家庭和临床环境中常见的背景噪音以及带口音的英语。最后,多语言支持让 agent 能在对话中途切换到患者偏好的语言,无需更改配置。请参阅 Amazon Nova 2 Sonic 文档了解支持的语言。
Amazon Bedrock AgentCore
Amazon Bedrock AgentCore 提供了一个无服务器、框架无关的运行时,用于以企业级安全规模运行 AI agent。你将 agent 逻辑部署为容器,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。
图 1:医疗预约 agent 的架构
React 前端在浏览器中捕获麦克风音频,并通过 WebSocket 将其流式传输到 agent。WebSocket 是一种在客户端和服务器之间保持持久双向连接的协议。为了确保该连接的安全,前端通过 Amazon Cognito(一项颁发临时 AWS 凭证的身份服务)对用户进行认证,并使用 SigV4(AWS 标准的请求签名协议)对每个请求进行签名。Amazon Bedrock AgentCore Runtime 托管容器化的 Strands BidiAgent,管理基础设施和扩展。Nova 2 Sonic 接收音频输入,进行对话推理,在需要时调用工具,并生成音频响应。三个 DynamoDB 表分别存储患者记录、预约详情和可用时间段。当患者要求与人工通话时,Amazon SNS 发布升级通知。
整合在一起
Strands SDK 处理了双向语音流式传输的复杂性。整个 agent 的设置只需几行代码:
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 就会管理流式传输会话。它接收音频,在模型决定时调用工具,并将音频回复发送回去。
医疗工具
语音 agent 使用七个工具来处理每次通话。每个工具都实现为一个使用 Strands Agents SDK 的 @tool 装饰器装饰的 Python 函数。Nova 2 Sonic 根据患者的发言决定何时调用每个工具。例如,当患者要求改期时,Nova 2 Sonic 会调用 find_available_slots 来查询 DynamoDB,通过语音呈现选项,然后调用 book_appointment_slot 来完成更改。这种基于工具的设计意味着你可以交换或扩展单个工具,而无需重写 agent 的其余部分。要添加新功能(例如,收集保险信息),你只需编写一个新的 @tool 函数并更新系统提示。
| 工具 | 功能 | 工作原理 |
|---|---|---|
authenticate_patient |
使用名字、姓氏和社会安全号码后四位验证身份。 | 通过全局二级索引 (GSI) 查询 DynamoDB Patients 表。每个姓名组合强制执行三次尝试限制。成功时返回患者详情和即将到来的预约。 |
confirm_appointment |
确认现有预约。 | 在 DynamoDB 中将预约状态从 Scheduled 或 Rescheduled 更新为 Confirmed。包含幂等检查以防止重复确认。 |
cancel_appointment |
取消预约,可附带原因。 | 将状态更新为 Canceled,并附上带时间戳的备注。仅对 Scheduled、Confirmed 或 Rescheduled 状态的预约进行操作。 |
find_available_slots |
查询用于改期的空闲时间段。 | 从预约记录中查找医生,并通过 ProviderDateIndex GSI 查询 AvailableSlots 表。最多返回三个选项以保持语音对话简洁。 |
book_appointment_slot |
预订选定的时间段。 | 使用 DynamoDB 条件写入原子性地将时间段标记为已占用,防止并发请求下的重复预订。使用新的日期和时间更新预约。 |
record_health_update |
捕获就诊前健康信息。 | 将带时间戳的备注追加到预约记录中。收集四项信息(医疗状况、过敏史、陪同人员、具体担忧);每次询问一项。 |
escalate_to_agent |
标记通话需要人工回拨。 | 生成一个六位数的参考编号,将预约状态更新为 Escalated,并发布一条包含患者信息和升级原因的 Amazon SNS 消息。 |
agent 如何处理通话
当 agent 连接到患者时,BidiAgent 通过四个阶段管理整个对话。对话流程在 agent 的系统提示中定义,你可以根据用例进行自定义。以下是改期流程的摘录,展示了提示如何驱动多工具编排:
## RESCHEDULE FLOW
如果患者想要改期:
1. 询问他们偏好的时间(上午/下午、特定日期)
2. 使用 find_available_slots 工具查找可用时间段
3. 提供 2-3 个选项,让他们选择
4. 改期后,收集健康信息(与确认时相同的 4 个问题)
Nova 2 Sonic 遵循这些指令来决定何时调用每个工具。你可以通过编辑提示来添加新流程或修改现有流程。
- 身份验证 – Nova 2 Sonic 问候患者,并询问他们的全名和社会安全号码后四位。在验证之前,agent 会复述它听到的内容,并要求患者确认。这可以捕获姓名或数字上的语音识别错误。
authenticate_patient工具查询 DynamoDB 以验证身份。如果三次尝试后验证失败,agent 会将通话升级给人工处理以确保安全。 - 预约管理 – 验证后,Nova 2 Sonic 呈现即将到来的预约详情,包括医生姓名、日期和时间。患者选择确认、取消或改期。如果他们选择改期,agent 会收集偏好(上午或下午、首选日期),查询可用时间段,提供最多三个选项,并预订新时间。
- 健康信息收集 – 对于已确认或已改期的预约,agent 会收集就诊前健康信息。它会询问现有医疗状况、过敏史、是否有人陪同患者以及就诊的任何具体担忧。每个问题一次只问一个,以保持自然的对话流程。
- 升级 – 在任何时候,如果患者要求与人工通话,agent 会捕获原因,生成一个六位数的参考编号,并发布一条 Amazon SNS 通知,以便工作人员在 24 小时内回拨给患者。
部署 agent
完整的源代码可在 GitHub 仓库中找到。按照以下步骤在你的 AWS 账户中部署 agent。
前提条件
开始之前,请确保你具备以下条件:
- 一个 AWS 账户,在目标 AWS 区域中具有对 Amazon Bedrock 和 Nova 2 Sonic 模型的访问权限。
- 已安装并在账户中引导的 AWS Cloud Development Kit (AWS CDK) v2。
- Python 3.12 或更高版本。
- Node.js 20 或更高版本。
- Docker。
步骤 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 主题,以及带有你容器化 agent 的 AgentCore Runtime。
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 Runtime ARN 来配置前端。
步骤 3:创建测试用户
创建一个用于测试的 Cognito 用户。将 <user-pool-id> 替换为你的 CDK 输出中的值:
aws cognito-idp admin-create-user \
--user-pool-id <user-pool-id> \
--username testuser \
--temporary-password TempPass123!
aws cognito-idp admin-set-user-password \
--user-pool-id <user-pool-id> \
--username testuser \
--password <your-password> \
--permanent
步骤 4:配置并运行前端
复制环境模板并填入你的 CDK 输出值:
cd ../frontend
npm install
cp .env.example .env
# 使用你的 CDK 输出值编辑 .env
npm run dev
在浏览器中打开 http://localhost:5173,使用你的测试用户登录,从菜单中选择一个患者,然后点击 Start Call 开始语音对话。
步骤 5:播种演示数据
CDK 堆栈在部署期间会自动播种示例患者记录。如果你需要重新播种或自定义数据,请运行:
python3 scripts/seed_data.py
对于测试,可以使用以下任何预配置的患者:
| 患者姓名 | SSN 后四位 |
|---|---|
| John Smith | 1234 |
| Jane Doe | 5678 |
| Michael Johnson | 9012 |
示例对话
以下转录来自一个测试部署。它展示了一个完整的改期交互过程,其中 agent 验证了患者身份,找到了新的时间段,进行了预订,并收集了就诊前健康详情。
图 2:实时患者通话中的医疗语音助手界面
在 YouTube 上观看完整演示。
Agent:“您好,我是 Acme Healthcare 的 Nova。我打电话是关于您即将到来的预约。为了验证身份,请问您的全名和社会安全号码后四位是什么?”
患者:“John Smith,1234。”
Agent:“让我确认一下。我听到的是 John Smith,一、二、三、四。对吗?”
患者:“是的,没错。”
Agent:“感谢您的验证。我打电话是关于您与 Johnson 医生预约的年度体检,安排在 6 月 14 日下午 4:30。您想确认这个预约吗?”
患者:“实际上,我需要改期。”
Agent:“我很乐意帮忙。您更喜欢上午还是下午?”
患者:“上午更好。”
Agent:“我找到了以下与 Johnson 医生的上午时间段:7 月 1 日星期二上午 9:00,或 7 月 3 日星期四上午 10:30。哪个适合您?”
患者:“星期二上午 9 点。”
Agent:“我已为您改期了预约。在我们结束之前,我想收集一些信息以帮助 Johnson 医生做准备。您有任何我们应该知道的现有医疗状况吗?”
患者:“我有高血压。”
Agent:“谢谢。您有任何过敏史吗?”
患者:“我对青霉素过敏。”
Agent:“已记录。这次就诊有什么具体的担忧吗?”
患者:“我最近膝盖有些疼痛。”
Agent:“我已为 Johnson 医生记录了所有信息。您的预约已确认为 7 月 1 日星期二上午 9:00。祝您有美好的一天!”
多语言支持
Nova 2 Sonic 能在对话中途检测并切换到患者偏好的语言,无需你进行任何配置更改。你可以在 GitHub 仓库中找到西班牙语和印地语的演示。
重要注意事项
本示例是一个用于演示目的的参考实现。Amazon Nova Sonic 并非设计用于提供意见或建议,包括医疗、法律或财务建议,也不应被用作临床判断的替代品。处理受保护健康信息 (PHI) 的生产部署需要进行 HIPAA 合规性审查、与 AWS 签署业务伙伴附录 (BAA),以及适合你用例的安全和临床审查。
清理资源
为避免持续产生费用,请在完成测试后删除资源:
cd infrastructure
cdk destroy --force
cdk destroy 命令可能不会移除所有 Amazon CloudWatch 日志组。请检查 CloudWatch 控制台,查找此部署创建的任何剩余日志组并手动删除。
结论
在这篇文章中,你学习了如何使用 Nova 2 Sonic 和 Amazon Bedrock AgentCore 构建一个处理预约提醒对话的语音 agent。这种架构也可以适应其他处理大量客户电话的行业,例如零售或酒店业,只需将医疗工具替换为你所在领域的逻辑即可。
下一步
使用本文中的步骤克隆仓库并在你的 AWS 账户中部署 agent。README 文件涵盖了定制化、生产就绪性和合规性考虑。
关于作者
Jimin Kim 是 AWS Prototyping and AI Customer Engineering (PACE) 团队的高级原型架构师。她构建原型,帮助企业客户探索在 AWS 上的可能性。除了启动最初的 AWS MCP Servers 之外,她还指导企业采用 AI 驱动的开发实践。工作之余,她喜欢编织、弹钢琴和壶铃训练。
Shree Krishnamurthi 是 AWS Prototyping and AI Customer Engineering (PACE) 团队的技术项目经理,负责领导人工智能和新兴技术领域的战略性原型设计计划。凭借在软件开发、企业解决方案和云转型方面的经验,她专注于将尖端技术概念转化为实用的业务解决方案。