亚马逊AWS官方博客

使用 Amazon Lex 和 Amazon Alexa 创建问答自动程序

您的用户有疑问而您有答案,但您需要采取更好的方式,让用户可以提问并获得正确答案。用户经常打电话给帮助中心,或者发布到您的支持论坛,但随着时间的推移,这会给您的组织增加压力和成本。聊天自动程序可以为您的客户增加价值吗?有趣的是,最近的一项投票显示,44% 的人愿意跟聊天自动程序交流,而不是跟人交流!

在这篇文章中,我们提供了一个示例解决方案,称为“QnABot”(发音为“Q and A Bot”)。QnABot 使用 Amazon LexAmazon Alexa 为您的“问题和答案”提供对话接口。这可以让您的用户提问并快速获得贴切的答案。

Amazon Lex 让您可以将语音和文本聊天访问集成到现有应用程序中。Amazon Alexa 允许您使用 Amazon Echo 或任何启用 Alexa Voice Service 的设备为家庭或工作场所的用户提供免提语音接口。QnABot 能做到两全其美。

QnABot 使用 Amazon Elasticsearch Service (Amazon ES) 使您的问题和答案均可以搜索。当用户提问时,将在后台使用 Amazon ES 功能强大的全文搜索引擎,来找出与该问题最匹配的答案。

下面各部分介绍了如何执行以下操作:

  • 将 QnABot 部署到您的 AWS 账户。本博客假定您已经是 AWS 客户。如果您希望创建账户,请选择 AWS 主页上的“Create an AWS Account”按钮。
  • 使用 Content Designer UI 在 QnABot 中填充问题和答案。
  • 在 Web Client UI 中使用语音或文本聊天来提问。
  • 使用最新的 Amazon Echo 设备进行免提提问。
  • 排查 QnABot 内容问题并优化,尽可能减少出现错误答案的机会。
  • 使用图像和 Web 链接丰富您的答案。

我们还将从后台查看 QnABot 的工作原理,并为您提供如何根据需要进行改进的一些想法。

部署 QnABot

使用此 AWS CloudFormation 按钮在 AWS 区域 us-east-1 中启动 QnABot:

注意:在编写本文时,仅支持 us-east-1 区域。

GitHub 存储库中提供了源代码。

在 AWS 管理控制台中,在 CloudFormation Parameters 页面上输入一个密码以分配给 QnABot Content Designer 管理员用户。密码的长度必须至少为 8 个字符,并且包含大写和小写字符以及数字和特殊字符。

选择 Next 两次以显示“Review”页。

选中确认复选框,然后选择 Create 以部署 QnABot。

主 CloudFormation 堆栈使用嵌套堆栈在您的 AWS 账户中创建以下资源:

  • 用于存储和搜索您的内容的 Amazon Elasticsearch Service 域 (1 x t2.small.elasticsearch)。成本大约为 0.036 美元/小时 – 符合使用免费套餐的条件。
    注意:在生产环境中,请增加节点数以确保您的 Amazon ES 域具备容错能力。有关更多信息,请参阅配置 Amazon ES 域
  • 用于托管 QnABot Web UI 的 Amazon S3 存储桶。
  • 提供自然语言处理的 Amazon Lex 自动程序。
  • 用于管理 QnABot 内容以及查找问题答案的 AWS Lambda 函数。
  • Web UI 使用的 Amazon API Gateway REST API。
  • 配置为对客户端进行身份验证并提供临时 AWS 凭证的 Amazon Cognito
  • 用于网站和 API 终端节点的 Amazon CloudFront 分发。

部署完成 (约 60 分钟) 后,主堆栈 Output 选项卡会显示以下内容:

  • ContentDesignerURL:用于启动 Content Designer UI 的 URL。
  • ClientURL:用于启动用户客户端网页的 URL。
  • DashboardUrl:用于启动 CloudWatch 控制面板进行监控的 URL。

在 QnABot 中创建初始内容

在将 QnABot 移交给用户之前,您需要使用 Content Designer 加载一些问答数据。您的数据存储在 Amazon ES 的后台。这样,以后当用户使用 Lex 客户端 UI 或 Alexa 免提设备提问时,系统可以搜索这些数据。以下步骤显示如何加载用于说明 QnABot 功能的示例问题。以后您可以轻松替换为自己的内容。

  1. 在 CloudFormation 控制台中,使用主 CloudFormation 堆栈的“Outputs”选项卡中的 ContentDesignerURL 启动 Content Designer 网页。
  2. 使用用户名 Admin 以及您启动堆栈时设置的密码进行登录。
  3. 选择 Add
  4. 输入 ID:QnaBot.001
    注意:
    请在类别中使用命名约定来标识您的项。
  5. 输入问题:What is Q and A Bot
  6. 输入答案:The Q and A Bot uses Amazon Lex and Alexa to provide a natural language interface for your FAQ knowledge base, so your users can just ask a question and get a quick and relevant answer.
  7. 选择“Save tool”(右上方)。
  8. 重复步骤 3 至 7,输入下表中的项。
    或者,为了避免复制/粘贴过程,您可以直接从文件导入项。选择 Import/Export,接着选择 Import URL,然后输入 URL:https://raw.githubusercontent.com/awslabs/aws-ai-qna-bot/master/docs/blog-samples.json
Id 问题 答案
QnABot.002 如何使用问答自动程序 使用问答自动程序 Content Designer UI 创建和管理问题和答案。最终用户使用 Lex Web UI (它支持语音或文本聊天) 或者使用 Alexa 设备进行免提语音交互来提问。
Admin.001 如何修改问答自动程序内容 使用 Content Designer 问题和测试工具查找现有文档,并在控制台中直接编辑它们。您还可以将现有文档导出为 JSON 文件,对该文件进行更改并重新导入。
Admin.002 我是否可以备份问答自动程序内容 可以。可以使用 Content Designer 将内容导出为 JSON 文件。在您的版本控制系统或 S3 存储桶中维护此文件。可以使用 Designer UI 导入功能从 JSON 文件恢复内容。
Admin.003 我是否可以从文件导入问答自动程序内容 可以。Content Designer 具有导入功能,可以从带格式的 JSON 文件加载项。您可以使用导出功能创建 JSON 文件,也可以编写自己的工具,从现有内容 (如网站常见问题页面) 创建 JSON 文件。
Admin.004 如何排查问答自动程序问题并加以解决。 使用 Content Designer 测试工具可测试问题,并检查按照分数排序顺序返回了哪些项。如果所需项不具有最高分数,则将该问题添加到该项并再次运行测试。所需项现在应该具有最高分数。小心不要创建具有重复问题的项,以避免不可预测的回复。
Admin.005 如何在 Designer UI 中找到特定的问答项 使用“Questions”选项卡中的筛选功能可以根据“ID”字段筛选项列表。或者使用“Test”选项卡列出与问题匹配的所有项。
Media.001 如何在问答自动程序答案中包含图片 使用 Content Designer 将图像附件添加到项。

使用 Lex Web 客户端 UI 获取答案

您可以从 PC、Mac、Chromebook 或 Android 平板电脑上的 Chrome、Firefox 或 Microsoft Edge 浏览器启动 QnABot。

  1. CloudFormation 控制台中,选择主 QnABot 堆栈,接着选择 Output,然后选择 ClientURL 的链接。
  2. 当您的浏览器代表 Web 应用程序请求访问麦克风时,请允许该请求。您将看到 QnABot 聊天窗口:

    您可以使用文本聊天或语音与 QnABot 交互。
  3. 不妨一试!选择麦克风图标 (右下方) 并说“What is QnABot?”
    自动程序将回复您以前为此问题输入的答案。

使用 Alexa 获取答案

QnABot 还与 Alexa 合作,允许用户通过任何启用 Alexa 的设备 (包括 Amazon FireTV、Amazon Dash Wand 和任何 Amazon Echo 系列设备) 从您的内容中获取答案。

要启用 Alexa,首先使用 Amazon Developer 控制台为 QnABot 创建一个 Alexa 技能。QnABot 目前无法自动创建 Alexa 技能,因此我们提供了说明。登录到 QnABot Content Designer (如前所述),选择 Lex/Alexa,然后选择 Alexa Instructions

按照显示的说明,逐步在您的 Amazon 账户中创建 Alexa 技能。只需几分钟。

如果您希望发布自己的 QnA 技能到 Alexa 技能商店,以便其他用户可以访问它,请参阅提交 Alexa 技能进行认证。只有注册到您的 Amazon 账户的 Alexa 设备才能访问未发布的技能,不过任何人都可以使用已发布的技能。

排查故障和优化

使用 Content Designer 优化答案

QnABot 尝试将用户的问题与 Content Designer 存储在 Amazon ES 中的问题和答案列表进行匹配。QnABot 使用 Amazon ES 全文搜索来查找与所提问题最匹配的项。不常使用的单词得分高于经常使用的单词,因此介词这样的句子结构具有比唯一关键字更低的权重。项相关问题与用户所提问题之间越接近,QnABot 选择该项作为最贴切答案的概率越大。

QnABot 尝试在将用户问题与所存储项的问题和答案字段进行匹配时,为问题字段中找到的任何匹配分配更高的权重,来找出问题的最佳答案。

您可能会发现用户以您没有预料到的方式提问,导致 QnABot 返回意外的答案。发生这种情况时,请使用 Content Designer 来排查故障并解决问题。

为了说明故障排查/优化方案示例,我们使用上一部分中输入的项 – Admin.001“How do I modify Q and A Bot content”:

  1. 使用 Lex Web UI (语音或文本聊天) 以不同的方式提问:How can I edit items?
  2. 理想情况下,您希望得到项 Admin.001 的答案,但在这种情况下,由于该问题与该项的相关问题之间有着很大的差别,您不会得到所要的答案。
  3. 登录到 Content Designer,然后选择 Test:
  4. 在问题字段中输入您提问过的相同问题“How can I edit items”,然后选择 test。可以看到得分最高的答案并不是 Admin.001。
  5. 现在找到并选择排名较低的 Admin.001。这是我们希望得到的答案。
  6. 让我们优化此项,这样下次您提出相同的问题时,此项将有最高分。选择此项以展开它,接着选择 edit 工具 (右上方),然后选择左侧第一个问题下方的 add question (+) 工具:
  7. 输入新问题:How can I edit items,然后选择 save 工具 (右上角)。
  8. 通过选择 test (页面顶部) 来重新尝试相同的问题。
  9. 成功!这一次 Admin.001 具有最高的分数。
    再次尝试在 Lex Web UI 中提问。这次您将得到想要的答案。

优化自动程序的自然语言处理

在您向 QnABot 提问时,将由 Lex 或 Alexa 使用自然语言处理 (NLP) 引擎处理和转录该问题。一开始,QnABot 训练 NLP 匹配可能提出的各种各样的问题和陈述,这样我们的 Lex 自动程序和 Alexa 技能将接受用户可能会提出的任意问题。(您可以在文件 default-utterances.js 中查看列出的默认训练问题。)

但是,偶尔您可能会发现,QnABot 不能理解您所说的内容,因而无法处理。您可能会注意到,Web 客户端或 Alexa 应用程序中显示的转录并不正确,或者 QnABot 要求您重复刚刚说过的话。

出现这种情况时,需要重新训练 NLP。QnABot 可以使用来自您已添加的所有项中的问题,自动生成额外的训练数据。

重新训练 Lex

为了说明这种情况,我们使用在上一部分 item Admin.001 中输入的项“How do I modify Q and A Bot content”:

  1. 使用 Lex Web 客户端 UI (语音或文本聊天),说出:“I need to change some answers
  2. 在上一个练习中,QnABot 返回了错误的答案,但这次,它只是回答:“Sorry, can you please repeat that.”如果您重复相同的陈述,就会收到错误消息,类似于“Sorry, I could not understand. Goodbye.
    这种情况说明,默认自动程序没有得到这方面的训练,无法了解这种形式的陈述。
  3. 登录 Content Designer,打开项“Admin.001”,选择 Edit 工具,选择 add question (+) 工具,然后添加陈述作为新的问题:I need to change some answers
    。使用 Save 工具保存更新。
  4. 选择 Lex/Alexa,然后选择 Rebuild Lex Bot。等待重新生成过程完成。
  5. 现在重新尝试,使用 Lex Web 客户端 UI 说出“I need to change some answers”。由于新的陈述已添加到 QnABot 训练集,您将看到不会再拒绝该问题,并且 QnABot 现在使用正确的答案回复。

重新训练 Alexa

更新 Alexa 的训练数据集,使用 Amazon Developer 控制台编辑您的技能的“Custom Slot Type”值。

  1. 登录 Content Designer UI 网页,选择 Lex/Alexa,然后选择 Alexa Instructions
  2. 查找 Custom Slot Type: EXAMPLE_QUESTIONS,然后选择 Copy to Clip Board
  3. 登录 Amazon Developer 控制台,打开您的 QnABot Alexa 技能,转到 InteractionModel,然后通过粘贴剪贴板中的新值来替换“EXAMPLE_QUESTIONS Custom Slot Type”的值。选择 Save 以保存更新。

使用 CloudWatch 进行监控和排查故障

通过 Amazon CloudWatch 控制面板可以使用 QnABot 指标和日志。

  1. 使用主 CloudFormation 堆栈上“Outputs”选项卡的 DashboardUrl 启动控制面板。
  2. 在对 QnABot 的问题回复进行故障排查时,请使用由 Fulfilment Lambda 函数创建的日志来跟踪请求和回复。
    1. 在 Fulfilment Lambda 小部件的右上角选择 menu 工具,选择 View logs,然后选择 AWSLambda function。
    2. 检查日志消息。与 QnABot 的每次交互由 START 和 END 消息分隔。在这些消息之间,您能够洞悉 QnABot 处理问题的方式。

导出和导入答案

QnABot Content Designer 允许您使用 JSON 文件来导出和导入内容。

使用导出功能创建您内容的备份版本,在意外删除项或者需要恢复到上一个版本时,您可以使用这些备份来还原。您还可以导出 JSON 文件,将内容加载到自动程序的其他实例,帮助进行测试或蓝/绿部署。

或者,您可能希望使用脚本自动创建 JSON 内容文件,这些脚本使用常见问题网页或文档等来源提取和重新格式化内容。

不妨一试!我们可以导出 QnABot 类别中的所有项 (ID 以“QnABot”开头的项)。

  1. 登录 Content Designer,选择 Questions,然后在 Filter 中输入 QnABot 以仅显示 ID 以字符“QnABot”开头的项。
  1. 现在,选择 Import/Export,然后选择 Export Filtered 以生成并保存包含已筛选项的 JSON 文件
  2. 在文本编辑器中打开导出的文件,并检查 JSON 结构。
  1. 将新项添加到 qna 列表中,如下例中所示,然后保存文件。
    {
    "qid": "QnABot.003",
    "q": [
    			"What can Q and A bot do"
    ],
    "a": "You can integrate it with your website to provide quick and easy access to frequently asked questions. Use it with Alexa to provide hands free answers in the kitchen, in the factory or in the car. Since it can display images too, use it to provide illustrations and photographs to enrich your answers.",
    "r": {
    "title": "",
    "imageUrl": ""
    }
    },
  1. 在 Content Designer 中,选择 Import/Export,然后选择 Import Local。从您的本地计算机导入修改后的 JSON 文件。注意:导入与现有项具有相同 ID 的项时,将使用 JSON 文件中包含的定义覆盖现有项。
  2. 在 Content Designer 的筛选条件字段中输入 QnABot,然后检查新导入的项 QnABot.003。

将图像添加到您的答案

您可以轻松地使用图像附件来扩充您的答案,这些图像可以显示在用户的 Lex Web 客户端 UI、Amazon Alexa 智能手机应用程序或新的 Amazon Echo Show 设备触摸屏上。使用图像可以显示地图、图表或照片,用于描绘与问题相关的场所和产品。

  1. 登录 Content Designer,然后选择 Add
  2. 输入 ID:Alexa.001
  3. 输入问题:What is an Amazon Echo Show
  4. 输入答案:Echo Show brings you everything you love about Alexa, and now she can show you things. She is the perfect companion for Q and A Bot.
  5. 输入附件:
    1. 标题:Echo Show
    2. 图像 URL:https://images-na.ssl-images-amazon.com/images/I/61OddH8ddDL._SL1000_.jpg
  6. 保存新项。
  7. 使用 Web UI 提问:“What is an Echo Show?”
    您将看到 Web UI 聊天中显示该照片。
  8. 或者,使用 Amazon Echo 或 Echo Dot 并说:“Ask Q and A, What is an Echo Show?”Alexa 智能手机应用程序中的卡片会显示照片附件。
  9. 或者,目前最有趣的方法,使用 Amazon Echo Show 并说:“Ask Q and A, What is an Echo Show?”
    照片附件会显示在 Echo Show 的触摸屏上。

使用 Amazon S3 或照片共享服务来托管您的图像 (请参阅托管图像)。

在 QnABot 中增加风格

在定义您的内容时,请务必让您的答案简洁明了并且吸引人。请尽量在您的答案中采用一致的风格。使用图像来增强口头回答的效果。增加活力,让您的自动程序显得友好且时尚!

例如,教会它如何回答“Hello”、“Bye-bye”和“Thanks”等闲聊。

这很容易尝试:

  1. 登录 Content Designer,然后选择 Add
  2. 输入 ID:BotStyle.001
  3. 输入问题:Hello
  4. 输入答案:Greetings friendly human! Ask me a question. Try to stump me.
  5. 保存新项。
  6. 使用 Web UI 或任意 Alexa 设备,对着您的自动程序说:“Hello”,然后听它的回复。

您应该使用此技巧,教会 QnABot 在您的用户说“Help”时回复一些简要的说明。

深入研究

我们简单了解一下 QnABot 的工作原理。此图提供了主要架构组件以及它们如何在高级别中协调工作。

以下部分说明了所有这些架构组件如何协调工作,以便用于不同的 QnABot 交互模式。有关更多详细信息,请参阅 GitHub 存储库 中的源代码和自述文件,并使用 AWS 控制台浏览各个资源的配置。

Lex Web 客户端 UI

Amazon Lex 允许将对话接口集成到我们的 Lex Web 客户端等应用程序中。Lex 自动程序使用 intents 封装交互的目的,使用 slots 从交互中捕获信息元素。由于 QnABot 具有单一目的,那就是回答用户的问题,它只定义一个目的。此目的具有单个槽,该槽经过训练,可捕获问题的文本 (参见前文“优化自动程序的自然语言处理”)。如需详细了解 Amazon Lex 自动程序的工作方式,以及了解目的、槽、示例值、Fulfillment 函数等的概念,请参阅 Amazon Lex 开发人员指南

QnABot Lex Web 客户端部署到您账户中的 Amazon S3 存储桶,并通过 Amazon CloudFront 分发来访问。

Amazon API Gateway 终端节点位于提供运行时配置的相同 CloudFront 分发之后。使用此配置,Web 客户端连接到 Amazon Cognito 来获取临时 AWS 凭证,然后与 Amazon Lex 服务进行连接。

在您使用 Lex Web 客户端向 QnABot 提问时,例如“How can I include pictures in Q and A Bot answers?”,Web 客户端会与 QnABot Lex 自动程序交互。然后,Lex 自动程序使用作为槽捕获的转录问题,调用您 AWS 账户中的自动程序 Fulfillment Lambda 函数。

自动程序 Fulfillment Lambda 生成包含转录问题的 Amazon ES 查询。以下示例显示了该查询。查询尝试使用 Amazon ES 相关性评分,从您以前提供的所有问题和答案中查找最佳匹配。对于在所存储问题的文本中找到的匹配项,其权重高于在所存储答案的文本中找到的匹配项。

{
    "size": 10,
    "from": 0,
    "query": {
        "multi_match": {
            "query": "How can I include pictures in Q and A Bot answers",
            "fields": [
                "q^2",
                "a"
            ]
        }
    }
}

自动程序 Fulfillment Lambda 函数使用项中具有最高得分的答案字段创建回复,并发送回 Lex。如果项还包含图像附件,则回复中还将发送回复卡片。Lex Web 客户端根据操作模式,使用语音或文本回复用户,并显示答案中附加的任意图像。

启用 Alexa 的设备

Alexa 设备使用 Alexa 技能与 QnABot 进行交互。与 Lex 自动程序类似,Alexa 技能也使用 intents 封装交互的目的,使用 slots 从交互中捕获信息元素。QnABot Alexa 技能与上述的 Lex 自动程序设置完全相同,使用单个槽来定义单个目的。

Alexa QnA 技能使用与 Lex 自动程序相同的自动程序 Fulfillment Lambda 函数。在您提问 (例如“Alexa, ask Q and A, How can I include pictures in Q and A Bot answers?”) 时,Alexa 设备会与您创建的技能交互,后者随之调用您 AWS 账户中的自动程序 Fulfillment Lambda 函数,并将转录问题作为参数传递。

如前所述,自动程序 Fulfillment Lambda 函数会查询 Amazon ES 项。自动程序 Fulfillment Lambda 函数使用项中具有最高得分的答案字段创建回复,以便发送回 Alexa。如果项中还包含图像附件,则回复中还会包含一张卡,用于在 Alexa 智能手机应用程序中显示图像;如果使用的是 Echo Show,则显示在触摸屏上。

Content Designer UI

QnABot Content Designer UI 还部署到 Amazon S3 存储桶中,该存储桶可通过与客户端 UI 相同的 Amazon CloudFront 分发访问,它也从 API Gateway 终端节点检索配置。Content Designer 网站要求用户使用在 Cognito 用户池中定义的凭证登录。

使用来自 Cognito 的临时 AWS 凭证,Content Designer UI 与由 Content Designer Lambda 函数支持的安全 API Gateway 终端节点交互。与 Amazon ES 和 Amazon Lex 的所有交互由这些 Lambda 函数处理。

自定义和增强 QnABot

建立 QnABot GitHub 存储库分支,增强代码,向我们发送提取请求,以便我们整合和分享您的改进!

下面是有关您可能希望实施的功能的几点建议:

  • 使用指标:实施自定义指标,跟踪最常访问哪些问题和主题。
  • 收集用户反馈:让用户能够报告答案中的错误,或者报告特定答案未能解决所提出问题的情况。
  • 多个答案:让用户能够通过说“Try again”或“Next”指示 QnABot 回复评分较低的答案,以此来请求不同的答案。在问题模糊不清时,或者有多个正确答案时,这非常有用。
  • 主题上下文记忆:增加对后续问题的支持。例如,在问过“What is the Echo Show?”之后,接下来的问题“How much does it cost?”将假定为适用于 Echo Show 上下文。
  • 提取现有常见问题页面或文档:编写脚本,从现有适用的来源收集内容。自动或半自动地创建 QnABot JSON 格式文件以便导入。
  • 扩展 QnABot 以访问公共知识库服务:通过扩展自动程序 Fulfillment Lambda 函数来访问其他外部信息源,充分利用 Wikipedia、Evi、WolframAlpha 或其他公共知识服务器。
  • 将 QnABot 与 Amazon Connect 集成:在 Amazon Connect 联系流中使用 QnABot,通过自动回答常见问题,缩短支持中心的呼叫等待时间。(请参阅 Amazon Connect 与 Amazon Lex 的集成。) 您还可以使用流行的消息收发平台与 QnABot 交互。

关于 Amazon Lex Web UI

QnABot Web UI 使用 aws-lex-web-ui GitHub 存储库。此存储库提供代码,使得网页能够与 Amazon Lex 自动程序交互,并处理支持 webRTC 的 Web 浏览器上的音频捕获和播放。

您可以使用 Lex web UI 将 QnABot 作为组件集成到自己的网站中:

有关更多信息,请查看自述文件

卸载 QnABot

完成试验之后,请在 CloudFormation 控制台中选择并删除主 QnABot 堆栈。这将删除与自动程序关联的所有 AWS 资源。请确保先导出您要在以后重用的任意 QnA 项。

总结

本博客分享了我们的示例问答自动程序 QnABot。我们说明了如何使用 QnABot 来创建自然语言接口,利用该接口,可通过 Web 浏览器或任何启用 Alexa 的设备,使用 Amazon Lex 来处理文本和语音。

现在,您可以用自己的问题和答案来尝试!请使用评论链接分享您的 QnABot 经验 – 我们非常希望倾听您的意见!


补充阅读


作者简介

Bob Strahan 是 AWS 专业服务的高级顾问。John Calhoun 是 AWS 公共部门合作伙伴团队的助理解决方案架构师。他们与我们的客户及合作伙伴合作,为各种各样的项目提供指导,帮助他们加快使用 AWS 实现价值的步伐。