虽然对话AI自20世纪60年代就已经存在,但近年来它又重新成为人们关注的焦点。尽管我们还处于智能会话 AI 设计和开发的早期阶段,但 Google 非常正确地宣布,我们正在从移动优先向人工智能第一世界迈进,我们期望技术自然而然地对话,深思熟虑上下文,进化能力。换句话说,我们期望技术能够学习和发展。
如今,大多数聊天机器人都可以处理简单的问题,并基于基于规则的对话处理使用预先构建的响应进行响应。例如,如果用户说 X,则使用 Y 进行响应;如果用户说 Z,请调用 REST API,依此类推。然而,在这个关头,我们期望更多的对话。我们希望上下文助手能够超越回答简单问题或发送推送通知。在本系列中,我将引导您完成设计、开发和部署上下文 AI 助手,该助手设计了精心策划的旅行体验。
首先,让我们讨论上下文助手的成熟度级别,由其功能解释:
会话 AI 成熟度级别
级别 1 成熟度:在此级别,聊天机器人本质上是一个传统的通知助手;它可以用预先构建的响应来回答问题。它可以向您发送有关某些事件的通知或有关您已明确表示兴趣的事项的提醒。
例如,1 级旅行机器人可以提供一个链接,让您预订旅行。
级别 2 成熟度:在此级别,聊天机器人可以回答常见问题解答,但也能够处理简单的跟进。
级别 3 成熟度:在此级别,上下文助理可以与您进行灵活的来回切换,并提供更多预先构建的答案,因为它知道如何响应意外的用户话语。此时,助理也开始了解上下文。例如,旅行机器人将能够引导您通过几个热门目的地,并作出必要的旅行安排。
第 4 级成熟度:在此级别,上下文助手已更好地了解您。它记住您的偏好,并可提供个性化的、情境化的建议或”提示”,以更加主动地进行护理。例如,助理会在您着陆后主动联系您,为您安排一次乘车。
级别 5 及以后:在此级别,上下文助理能够监视和管理许多其他助理,以便运行企业运营的某些方面。他们将能够针对某些旅行体验开展促销活动,根据历史趋势更有效地定位某些客户群,提高转化率和采用率等。
会话 AI 的根源在于 NLP
自然语言处理(NLP)是人工智能的应用,它使计算机能够处理和理解人类语言。机器学习的最新进展,更具体地说,其子集,深度学习,使计算机能够更好地理解自然语言。这些深度学习模型可以分析大量文本,并提供文本摘要、语言翻译、上下文建模和情绪分析等功能。
自然语言理解 (NLU) 是 NLP 的子集,可将自然语言转换为结构化数据
当我们读一个句子时,我们立刻理解了这句话背后的含义或意图。意图是用户试图传达或完成的内容。意向分类是一个两步过程。首先,我们为 NLU 模型提供标记数据,这些数据提供了与这些意图对应的已知意图和示例句子的列表。经过训练,模型能够将新句子分类为预定义的意图之一。实体提取是识别给定文本中的关键信息片段的过程。时间、地点和人员姓名等都提供了与意图相关的其他上下文和信息。意图分类和实体提取是会话 AI 的主要驱动因素。
出于本文的目的,我们将使用 Rasa,一个开源堆栈,它提供了构建上下文 AI 助手的工具。Rasa 堆栈中有两个主要组件,可帮助我们构建旅行助理 — 拉萨 NLU 和 Rasa 核心。
Rasa NLU 提供意向分类和实体提取服务。Rasa 核心是以机器学习为后盾的堆栈的主要框架,提供对话或对话管理。假设 NLU 和核心组件已经过培训,让我们看看 Rasa 堆栈的工作原理。
让我们使用此示例对话框:
NLU 组件标识用户打算进行基于假期的旅行(意向分类),并且他或她是唯一进行此行程(实体提取)的人。
核心组件负责控制会话流。根据 NLU 的输入、会话的当前状态及其定型模型,核心组件决定下一个最佳操作方案,即向用户发送回复或执行操作。Rasa 基于 ML 的对话管理具有上下文感知功能,不依赖于硬编码规则来处理对话。
安装和设置
现在,让我们安装 Rasa,开始为我们的旅行助理创建初始训练数据集。
拉萨可以通过两种方式进行设置。您可以使用 python/pip 在本地计算机上安装 Rasa 堆栈,也可以使用 docker 使用预配置的 docker 映像设置 Rasa 堆栈。我们将使用 python 和 pip 安装 Rasa 堆栈。
如果计算机上未安装 python,则可以使用Anaconda进行设置。请注意,您需要 python 3.6.x 版本来运行 Rasa 堆栈。最新版本的 python(本文发布时为 3.7.x)并不完全兼容。
运行以下命令以安装 Rasa 内核:
pip install -U rasa_core
通过运行此命令安装 Rasa NLU:
pip install rasa_nlu[tensorflow]
现在,让我们通过克隆 Rasa 提供的入门包来构建我们的应用程序:
git clone https://github.com/RasaHQ/starter-pack-rasa-stack.git travel-bot
克隆后,运行这些命令以安装所需的包和用于实体提取的 spaCy 英语语言模型。
pip install -r requirements.txt \
&& python -m spacy download en
在这一点上,我们有我们需要的一切,开始开发我们的旅行助理。让我们看一下文件夹结构和在基架过程中创建的文件。
“域.yml”文件描述旅行助理的域
让我们更新文件以添加与旅行域对应的初始意图集。下面是一个片段:
intents:
- greet
- request_vacation
- affirm
- inform
...
entities:
- location
- people
- startdate
- enddate
...
slots:
people:
type: unfeaturized
location:
type: unfeaturized
...
actions:
- utter_greet
- utter_ask_who
- utter_ask_where
- utter_confirm_booking
...
templates:
utter_ask_who:
- text: "Fun! Let's do it. Who's going?"
utter_ask_where:
- text: "Perfect. Where would you like to go?"
...
“data/nlu_data.md”文件使用一组示例描述每个意图,然后将其提供给 Rasa NLU 进行培训。下面是一个片段:
## intent:request_vacation
- I want to go on vacation
- I want to book a trip
- Help me plan my vacation
- Can you book a trip for me?
...
## intent:inform
- just me
- we're [2](people)
- anywhere in the [amazon](location)
- [Paris](location)
- somewhere [warm](weather_attribute)
- somewhere [tropical](weather_attribute)
- going by myself
...
“data/story.md”文件为 Rasa 提供了用户和旅行助理之间的示例对话,可用于训练其对话框管理模型。下面是一个片段:
## vacation happy path 1
* request_vacation
- utter_ask_who
* inform{"people": "1"}
- utter_ask_where
* inform{"location": "paris"}
- utter_ask_duration
* inform{"startdate": "2019-10-03T00:00:00", "enddate": "2019-10-13T00:00:00"}
- utter_confirm_booking
* affirm
- goodbye
...
Rasa 在配置 NLU 和核心组件方面提供了很大的灵活性。现在,我们将对 NLU 使用默认的”nlu_config.yml”,对核心模型使用”策略.yml”。
运行以下命令来训练 Rasa NLU:
make train-nlu
运行以下命令来训练 Rasa 核心:
make train-core
我们现在可以通过命令行运行服务器来测试 Rasa:
make cmdline
Rasa 堆栈提供挂钩,将我们的助手连接到各种前端频道,如 Slack 和 Facebook。让我们配置和部署我们的旅行助理到 Slack。
配置松弛
让我们从在Slack中创建一个新应用程序开始。
- 在功能下,转到”OAuth 和权限”,添加权限范围,如”聊天:写入:机器人”,并保存您的更改
- 转到”机器人用户”,添加自动程序用户,并保存您的更改
- 返回”OAuth 和权限”并将应用安装到工作区
- 复制工作区令牌下的”Bot 用户 OAuth 访问令牌”
- 返回本地计算机上的”旅行机器人”文件夹,创建新的”凭据.yml”文件。将令牌粘贴到文件中,以便如下所示:
slack:
slack_token: "xoxb-XXXXXXXXXXX"
我们需要将这些证书传递给拉萨。为了使我们的生活更轻松,让我们更新”旅行机器人”文件夹下的”Makefile”,以添加一个名为”开始”的新命令
...
start:
python -m rasa_core.run \
--enable_api \
-d models/current/dialogue \
-u models/current/nlu \
-c rest --cors "*" \
--endpoints endpoints.yml \
--credentials credentials.yml \
--connector slack
警告: 根据您的要求,在将自动程序部署到生产环境之前更新”cors”设置
我们需要使这些终点能够到达外部世界。让我们使用ngrok使我们的服务器可用于 Slack。Ngrok 帮助建立一个安全隧道到我们的本地服务器进行快速开发和测试。安装 ngrok 后,在新的命令行终端中运行以下命令:
ngrok http 5005
记下 ngrok 提供的”https”URL。回到 Slack 应用管理 UI 中:
- 启用”事件订阅”。在请求 URL 文本框中,粘贴您的 ngrok URL,并在该 URL 的末尾添加”/Webhook/松弛/webhook”。通过订阅”message.im”等自动程序事件完成事件订阅并保存更改
- 或者,启用”交互式组件”并传递上一步中使用的相同请求 URL。请务必保存更改
此时,我们已完全配置了机器人助手,以便与 Slack 进行交互。要测试旅行助理,请松弛新创建的旅行机器人。
下一步是什么?
在本系列的下一部分中,我们将深入探讨我们的 NLU 管道、自定义组件(如 Google 的 BERT 和循环嵌入对话策略 (REDP),以及上下文、注意力和非线性对话等概念。