

有了 Amazon Alexa 这样的语音助手,我们可以让更多的人无需打字即可提问并当场得到答案。无论是在行动不便,需要同时处理多项任务,亦或只是电脑不在手边的情况下,无需打字就能获得搜索结果。使用现代化的语音助手,你可以用语音对话方式提问,并立即得到语音回答。
在本文中,将讨论如何构建通过语音控制的应用。具体来说,将重点讨论聊天机器人。聊天机器人不再是小众技术。如今,聊天机器人已广泛用于客户服务网站,提供全天候的自动帮助。尽管 AI 聊天机器人已经存在多年,但如今的生成式 AI 等大语言模型 (LLM) 的进步让机器人对话变得更加自然。事实证明,聊天机器人在各行各业用处广泛,它既能处理一般问题,也能处理特定行业的问题。像 Alexa 这样的语音助手的出现表明我们进入了一个机器对话方式的新时代。对于许多喜欢用设备来进行简单方便地聊天的人来说,打字反而显得麻烦。
在本文中,将探讨如何为有需要的人量身打造无服务器语音聊天机器人。还提供了一个示例聊天机器人应用。你可以从 GitHub 存储库中获取该应用程序。同时创建了一个智能对话助手,它可以理解语音输入,然后根据上下文生成回复。该 AI 对话助手由 Amazon Bedrock 提供支持服务。该聊天机器人可帮助用户完成各种任务,提供信息,根据用户的特别需求提供个性化支持。我们使用 Amazon Bedrock 上的 Anthropic Claude 大语言模型 (LLM) 创建的该机器人应用。
在本文中,介绍了如何将 Anthropic Claude 的高级自然语言处理功能集成到 Amazon Bedrock 无服务器架构中,部署一个高度可扩展且经济高效的解决方案。此外,还讨论了如何提高聊天机器人的无障碍性和可用性,以方便运动障碍人士使用。本文的目的是全面介绍如何利用 AI 和无服务器计算的最新成果,创建基于语音的情境聊天机器人。
我们希望该解决方案可以帮助有某种运动障碍的人士。此类应用仍需要一定程度的互动,并需要有确定开始和停止对话的明确操作。在示例应用中,通过一个专门的 TALK(说话)按钮来解决这个问题。按下该按钮时,应用开始执行转录操作。
对于有严重运动障碍的人士,可使用专门的物理按钮实现相同的操作,使用者可以用一根手指或身体的其他部位按下该物理按钮。还有一种方法是使用一个特殊的关键字表示命令开始。例如,Alexa 对话启动就是使用这种方法。用户想要开始对话时,需要先喊“Alexa”。
解决方案概述
下图展示了解决方案的架构。

部署此架构时,我们需要可以托管 Web 应用、身份验证机制和相关权限的托管计算服务。我们将在本文后面章节讨论具体细节。
我们使用的所有服务都是无服务器服务,并完全由 AWS 托管。因此,无需预置计算资源。只需通过服务对应的 API 调用服务。所有服务调用请求都直接从客户端应用发起。
该应用是使用 Vite 构建工具创建的一款简单的 React 应用。我们使用 AWS SDK for JavaScript 来调用所使用的 AWS 服务。该解决方案主要使用了以下服务:
- Amazon Polly:将文本转换成自然语音。
- Amazon Transcribe:一项 AWS AI 服务,可直接将语音转换成文本。
- Amazon Bedrock:一项全托管服务,提供多种高性能基础模型 (FM) 以及构建生成式 AI 应用所需的各种功能。
- Amazon Cognito:用于实现 Web 应用和移动应用的身份识别。它既用作用户目录,身份验证服务器,也是 OAuth 2.0 访问令牌和 AWS 凭证的授权服务。
使用 AWS 服务时,用户需要从 AWS Identity and Access Management (IAM) 获取临时凭证。Amazon Cognito 身份池解决了这个问题,它充当了应用用户和 IAM 服务之间的中介。该身份池保存 IAM 角色的信息,这些角色需要拥有运行解决方案所需的所有权限。
除了上面介绍的,使用 Amazon Polly 和 Amazon Transcribe 不需要你在客户端上进行其他设置。但 Amazon Bedrock 需要指定用户身份验证。这意味着仅拥有 Amazon Cognito 身份池是不够的,还需要使用 Amazon Cognito 用户池。你需要定义用户,并将用户绑定到 Amazon Cognito 身份池。要更好地了解 Amazon Cognito 如何允许外部应用调用 AWS 服务,请参阅使用 Amazon Cognito 联合身份、Amazon Cognito 用户池和 Amazon API Gateway 实现安全 API 访问。
AWS Amplify 承担了预置 Amazon Cognito 用户池和身份池的重任,包括为 React 应用生成登录 UI。Amplify 由一系列工具(开源框架、可视化开发环境、控制台)和服务(Web 应用和静态网站托管)组成,帮助客户加快在 AWS 上开发移动应用和 Web 应用的速度。在后面的章节中,我们将介绍设置 Amplify 的步骤。
前提条件
在开始实验之前,请确保满足以下前提条件:
- 以下代码用于调用 Amazon Bedrock:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "VisualEditor1",
"Effect": "Allow",
"Action": "bedrock:InvokeModel",
"Resource": "*"
}
]
}
- 以下代码用于调用 Amazon Polly:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "VisualEditor2",
"Effect": "Allow",
"Action": "polly:SynthesizeSpeech",
"Resource": "*"
}
]
}
- 以下代码用于调用 Amazon Transcribe:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "VisualEditor3",
"Effect": "Allow",
"Action": "transcribe:StartStreamTranscriptionWebSocket",
"Resource": "*"
}
]
}
完整的策略 JSON 应如下所示:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "VisualEditor1",
"Effect": "Allow",
"Action": "bedrock:InvokeModel",
"Resource": "*"
},
{
"Sid": "VisualEditor2",
"Effect": "Allow",
"Action": "polly:SynthesizeSpeech",
"Resource": "*"
},
{
"Sid": "VisualEditor3",
"Effect": "Allow",
"Action": "transcribe:StartStreamTranscriptionWebSocket",
"Resource": "*"
}
]
}
3. 运行以下命令克隆 GitHub 存储库:
git clone https://github.com/aws-samples/serverless-conversational-chatbot.git
4. 设置 Amplify。请参阅设置 Amplify CLI 完成初始设置。
5. 为了与后续指令中使用的值保持一致,请在看到以下提示时,将该 AWS 配置文件命名为 amplify。

6. 使用 AdministratorAccess-Amplify 系统策略创建 amplifyconsole-backend-role 角色。该权限策略允许 Amplify 创建必要的资源。

7. 在本文中,我们使用的是 Anthropic Claude 3 Haiku 大语言模型。在 Amazon Bedrock 中启用大语言模型相关操作说明,请参阅访问 Amazon Bedrock 基础模型。
部署应用程序
可以使用以下两种方式部署应用程序:
- 使用 Amplify 自动部署应用
- 手动部署应用
在本小节中,我们提供了这两种方式的具体操作步骤。
使用 Amplify 自动部署应用
Amplify 可以自动部署存储在 GitHub、Bitbucket、GitLab 或 AWS CodeCommit 中的应用程序。将之前下载的应用程序上传到你的首选存储库(上述支持的存储库之一)。有关详细说明,请参阅将应用部署到 Amplify Hosting 入门指南。
部署完成后,你可以继续进行下一步:设置 IAM 权限。
手动部署应用
如果你没有使用之前提到的存储库,可以手动部署应用。如果你想修改应用,使其更适合你的使用场景,这种方式也很有用。
我们在 AWS Cloud9(一个用于编写、运行和调试代码的云集成开发环境 (IDE))上使用 Ubuntu Server 22.04 和 Amazon Linux 2023 测试了部署。
我们使用 Visual Studio Code IDE,并直接在 IDE 内的终端窗口中运行以下命令,但你也可以在你所使用的其他终端上运行这些命令。
1. 在从 GitHub 上克隆的应用目录中,运行以下命令:
cd serverless-conversational-chatbot
2. 运行以下命令:
npm i
amplify init
3. 按照如下屏幕截图所示的提示操作。
- 对于身份验证,选择你在前提条件步骤中创建的 AWS 配置文件 amplify。

- 项目中 src 文件夹下将出现两个新文件:
- amplifyconfiguration.json
- aws-exports.js
- amplifyconfiguration.json

4. 接下来,运行以下命令:
amplify configure project
然后选择 “Project information”(项目信息)

5. 输入以下信息:
Which setting do you want to configure? Project information
Enter a name for the project: servrlsconvchat
Choose your default editor: Visual Studio Code
Choose the type of app that you're building: javascript
What javascript framework are you using: react
Source Directory Path: src
Distribution Directory Path: dist
Build Command: npm run-script build
Start Command: npm run-script start
6. 对于这个应用,运行以下命令:
amplify add auth
如果收到以下消息,可直接忽略:
Auth has already been added to this project. To update run amplify update auth
7. 选择 Default configuration(默认配置)。

8. 接受提示建议的所有选项。
9. 运行以下命令:
amplify add hosting
10. 选择托管选项。
你可以使用以下两种方式来托管应用。可将应用托管到 Amplify 控制台或 Amazon Simple Storage Service (Amazon S3),然后通过 Amazon CloudFront 公开。
使用 Amplify 控制台托管不同于 CloudFront 和 Amazon S3 托管。Amplify 控制台是一项托管服务,提供持续集成与交付 (CI/CD) 以及 SSL 证书,优先快速部署无服务器 Web 应用和后端 API。相比之下,CloudFront 和 Amazon S3 提供了更大的灵活性和自定义选项,尤其是托管需要缓存和分发功能的静态网站和资产。CloudFront 和 Amazon S3 更适合具有特定性能和安全需求的复杂、高流量 Web 应用。
在此次实验中,我们使用的是 Amplify 控制台。要了解有关使用 Amazon S3 和 Amazon CloudFront 进行部署的更多信息,请参阅文档。
.c217ba37b3e6d65b2b7f661efc985ee26be0bf27.jpg)
现在,你可以发布应用了。可以选择将应用发布到 GitHub 以支持 CI/CD 管道。Amplify 内置了与 GitHub 的集成,可在收到更改推送时自动重新部署应用。为简单起见,我们使用手动部署。
11. 选择 Manual deployment(手动部署)。

12. 运行以下命令:
amplify publish
应用发布后,你将看到以下输出结果。记下此 URL,以便在后续步骤中使用。

13. 登录 Amplify 控制台,导航到 servrlsconvchat 应用,然后在左侧导航栏中的 App settings(应用设置)下选择 General(常规)。

14. 编辑应用设置,在 Service role(服务角色)字段输入 amplifyconsole-backend-role(在“前提条件”中创建了此角色)。

现在,你可以继续执行下一步:设置 IAM 权限。
配置 IAM 权限
在配置发布方式时,你已预置了一个新的身份池。你可以在 Amazon Cognito 控制台上看到该身份池,还有一个新用户池。其名称会与本文中展示的名称不同。
如前所述,你需要为该角色绑定授权策略,以实现与 Amazon Bedrock、Amazon Polly 和 Amazon Transcribe 的交互。完成以下步骤,设置 IAM 权限:
- 在 Amazon Cognito 控制台上的左侧导航栏中,选择 Identity pools(身份池)。
- 导航到身份池。
- 在 User access(用户访问)选项卡上,选择经过身份验证的角色的链接。

4. 绑定“前提条件”章节中要求的策略。

只有指定用户才能使用 Amazon Bedrock,因此我们在 Amazon Cognito 用户池中创建了一个示例用户,该用户池在应用发布过程中预置。
5. 在用户池详细信息页面的 Users(用户)选项卡上,选择 Create user(创建用户)。

6. 设置用户信息。

现在,你可以运行应用了。
测试使用示例无服务器应用
在之前应用发布过程结束时,输出结果中提供了该应用的 URL。使用记录下来的 URL 访问应用。使用你在上一步中创建的用户登录应用。首次登录时,系统可能会要求你更改密码。

在提问时,按住 TALK(说话)按钮。(我们使用这种方法是为了简单地演示该工具的功能。对于有运动障碍的人士,我们建议使用可以用身体不同部位操作的专用按钮,或使用特殊的关键字来发起对话。)
松开按钮后,应用会将输入的语音发送到 Amazon Transcribe,然后返回转录文本。返回的文本用作 Amazon Bedrock 大语言模型的输入。在本例中,我们使用的是 Anthropic Claude 3 Haiku 模型,但你也可以修改代码,使用其他模型。
Amazon Bedrock 返回文本形式的响应,由 Amazon Polly 将该文本转为语音。

系统将会存储对话历史记录。这意味着你可以继续提出后续问题,对话上下文也会保留下来。例如,如果我们提问 “What is the most famous tower there?”(最有名的塔是哪座?),但没有指定具体位置,聊天机器人就能根据我们之前的问题上下文理解为巴黎。

对话历史记录存储在 JavaScript 变量中,这意味着如果刷新页面,上下文就会丢失。我们将在本文后面讨论如何持久保留对话上下文。
要确认是否正在进行转录,按住 TALK(说话)按钮时,查看按钮的颜色是否变为橙色,以及是否出现了麦克风图标。

清理资源
在之前运行 Amplify 命令的同一目录中运行以下命令,清理资源:
amplify delete

此命令将从 React 应用、Amplify 资源和所有 Amazon Cognito 对象中删除 Amplify 设置,包括 IAM 角色和 Amazon Cognito 用户池用户。
总结
在本文中,介绍了如何使用 Amazon Bedrock 和 Anthropic Claude 模型创建无服务器语音聊天机器人。
这是构建经济高效的无服务器解决方案的起点。例如,你可以扩展该解决方案,持久保存聊天对话,比如使用 Amazon DynamoDB。如果要使用检索增强生成 (RAG) 方法,可使用 Amazon Bedrock 知识库将 Amazon Bedrock 上的基础模型安全连接到你自己的数据。
另一种方法是用你自己的数据微调或持续预训练在 Amazon Bedrock 上使用的模型,实现模型自定义,从而构建特定于域、组织和使用场景的应用。借助自定义模型,可创造反映公司风格、形象和服务的独特用户体验。
有关其他资源,请参阅以下内容:
免责声明:前述特定亚马逊云科技生成式人工智能相关的服务仅在亚马逊云科技海外区域可用,亚马逊云科技中国仅为帮助您了解行业前沿技术和发展海外业务选择推介该服务。
更多教程
快速搭建容量高达 35GB 的免费个人网盘
本教程将介绍如何搭建一个没有使用限制的免费私人网盘。
构建企业专属智能客服机器人
本文将演示如何结合多种服务,打造企业专属的智能客服。
使用生成式 AI 构建多语言问答知识库
使用多种服务,构建可汇总搜索结果的多语言知识库。
免费套餐
AWS 海外区域
拓展海外业务或个人体验
免费使用 100 余种云产品或服务, 长达 12 个月
AWS 中国区域
发展中国业务
免费使用 40 余种核心云服务产品,长达 12 个月