DeepPavlov:一个用于端到端对话系统和聊天机器人的开源库
2019 年 9 月 18 日
作者:Vasily Konovalov

A picture of a classroom
对话系统近年来已成为人机交互的标准,聊天机器人出现在几乎所有行业,旨在简化人机之间的交互。它们可以集成到网站、消息平台和设备中。聊天机器人的应用正在上升,公司选择将例行任务委托给聊天机器人而不是人类,从而节省大量人力成本。与人类不同,聊天机器人能够同时处理多个用户请求,并且始终可用。

然而,许多公司在开发满足其业务需求的机器人时,却不知道从哪里开始。从历史上看,聊天机器人可以分为两大类:基于规则的和数据驱动的。前者依赖于预定义的命令和模板。每个命令都应该由聊天机器人开发人员使用正则表达式和文本数据分析来编写。相比之下,数据驱动的聊天机器人依赖于在对话数据上预先训练的机器学习模型。
在本文中,我将解释如何使用 DeepPavlov 开发聊天机器人,以及为什么 TensorFlow 是不可或缺的工具。DeepPavlov 由 莫斯科物理与技术研究所 的神经网络与深度学习实验室构建和维护。DeepPavlov 是 #PoweredByTF 2.0 挑战赛 的获奖作品。本文的代码可以在 Google Colab 上访问。

对话系统的架构

为了简单起见,让我们从对话系统的最基本元素开始。首先,聊天机器人需要理解自然语言中的话语。 自然语言理解 (NLU) 模块将用户查询从自然语言转换为带标签的语义表示。例如,话语 “请设置一个 8 点的闹钟” 将被转换为机器可理解的形式,如 set_alarm(8 am)。然后,机器人必须确定对它的期望。 对话管理器 (DM) 会跟踪对话状态,并决定如何回答用户。在最后阶段, 自然语言生成器 (NLG) 将语义表示转换回人类语言。例如, rent_price(Atlanta)=3000 USD 转换为 “亚特兰大的租金价格约为 3000 美元”。 下图显示了典型的对话系统架构。
A flow chart: NLU -> Dialogue manager -> NLG

使用 DeepPavlov 构建对话系统

开源对话式人工智能框架 DeepPavlov 提供了一种免费且易于使用的构建对话系统的解决方案。DeepPavlov 附带几个预定义的组件,用于解决与 NLP 相关的問題。该框架允许您训练和测试模型,以及微调超参数。它支持 Linux 和 Windows 平台、Python 3.6 和 Python 3.7。您可以通过运行以下命令安装 DeepPavlov

pip install -q deeppavlov 
DeepPavlov 模型在 config 文件夹下的单独配置文件中定义。配置文件包含五个主要部分: dataset_readerdataset_iteratorchainertrainmetadatadataset_reader 定义数据集的位置和格式。加载后,数据将根据 dataset_iterator 设置在训练集、验证集和测试集之间进行分割。配置文件的 chainer 部分包含三个子部分。 inout 部分定义了 chainer 的输入和输出,而 pipe 部分定义了与模型交互所需的组件管道。 metadata 部分描述了模型要求以及模型变量。
您可以通过命令行界面 (CLI) 与配置文件中定义的模型进行 交互。但是,在使用任何模型之前,您应该通过运行带有 install 命令的模型来安装其所有要求。模型的依赖项在配置文件的 requirements 部分中定义。
python -m deeppavlov install <config_path>
其中 <config_path> 是所选模型配置文件的路径。
要通过 CLI 以交互方式从模型中获取预测,请运行
python -m deeppavlov interact <config_path> [-d]
其中 -d 将下载所需数据,例如预训练的模型文件和嵌入。
您可以通过运行带有 train 参数的模型来训练模型。 模型将根据配置文件的 dataset_reader 部分中定义的数据集进行训练。
python -m deeppavlov train <config_path>
DeepPavlov 框架允许您在您的数据上测试所有可用的模型,以识别性能最佳的模型。 要测试模型,请在配置文件的 dataset_iterator 部分中指定数据集拆分以及拆分字段。
python -m deeppavlov test <config_path>
此外,您可以通过使用 riseapi 命令执行 DeepPavlov 来运行一个具有 API 访问权限的服务器:
python -m deeppavlov riseapi <config_path>
您可以在我们的 文档 中找到更多运行操作。

必不可少的工具

TensorFlow 是一个端到端的开源机器学习平台。 TensorFlow 在开发 DeepPavlov 时是一个必不可少的工具。
从 TensorFlow 1.4.0 开始,Keras 已成为 核心 API 的一部分。 Keras 是一个高级 API,降低了深度学习入门的门槛。 Keras 在 TensorFlow 上提供了一个高级抽象层,使我们能够更加专注于问题和超参数调整。 DeepPavlov 的大多数 文本分类 模型都是使用 Keras 抽象实现的。 Keras 为我们提供了快速原型技术,可以快速尝试各种神经网络架构并调整超参数。
此外,TensorFlow 的灵活性使我们能够构建任何我们能想到的神经网络架构,包括但不限于序列标注和问答。 具体来说,我们使用 TensorFlow 与基于 BERT 的模型无缝集成。 我们已经实现了基于 BERT 的英文和多语言模型,用于文本分类、命名实体识别和问答(将在接下来的部分中详细介绍)。 此外,TensorFlow 的灵活性使我们能够在我们的数据上构建 BERT; 这就是我们在对话数据上训练 BERT 的方式,从而在社交网络输入方面取得更好的性能。
TensorFlow 的另一个巨大优势是 TensorBoard。 您可以使用 TensorBoard 可视化您的 TensorFlow 图、绘制指标并显示其他数据。 TensorBoard 使我们能够检查模型并在调试时进行适当的更改。 这对于更好地理解机器学习模型非常有用。

DeepPavlov 提供成果

DeepPavlov 附带几个由 TensorFlow 和 Keras 提供支持的预定义组件,用于解决与 NLP 相关的各种问题,包括文本分类、命名实体识别、问答等等。 如今,许多任务中最先进的成果都是通过应用基于 BERT 的模型来实现的。 BERT(来自 Transformer 的双向编码器表示)的发布使 2018 年成为自然语言处理社区的一个转折点。 BERT 是一种基于 Transformer 的技术,用于预训练语言表示。 我们将 BERT 集成到三个下游任务中: 文本分类命名实体识别(以及一般的序列标注)和 问答。 结果,我们在所有这些任务中都取得了显著的改进。 在接下来的部分中,我将详细描述如何使用 DeepPavlov 的基于 BERT 的模型。 代码可以在 Google Colab 上访问。

用于文本分类的 BERT

让我们使用侮辱检测问题演示 DeepPavlov 基于 BERT 的文本分类模型。 它涉及预测在公开讨论期间发布的评论是否被认为是对参与者之一的侮辱。 这是一个二元分类问题,只有两个类别:侮辱非侮辱。
任何预训练模型都可以通过命令行界面 (CLI) 和 Python 用于推理。 在使用模型之前,请确保使用以下命令安装所有必需的软件包
python -m deeppavlov install insults_kaggle_bert
python -m deeppavlov interact insults_kaggle_bert -d
You can interact with the model via Python code
from deeppavlov import build_models, configs

model = build_model(
  configs.classifiers.insults_kaggle_bert, download=True)
model(['hey, how are you?', 'You are so dumb!'])
您可以使用自己的数据训练基于 BERT 的文本分类模型。 为此,请修改配置文件的 dataset_reader 部分中的 data_path 参数。
然后在 CLI 中训练模型
python -m deeppavlov train my_text_classification_config.json
或通过 Python
from deeppavlov import build_models, configs

model = train_model(
  configs.classifiers.my_text_classification_config)
您可以阅读更多关于基于 BERT 的文本分类模型的信息 这里,您可以在我们的 演示 中测试它们。

用于命名实体识别的 BERT

除了文本分类模型之外,DeepPavlov 还包含用于 命名实体识别 (NER) 的基于 BERT 的模型。 这是 NLP 中最常见的任务之一,可以表述如下:给定一个标记序列(单词,以及可能的标点符号),为序列中的每个标记提供一个来自预定义标记集的标记。 NER 具有各种商业应用。 例如,它可以从简历中提取重要信息,以方便人力资源专业人员对其进行评估。 此外,NER 可用于识别客户请求中的相关实体,例如产品规格、公司名称或公司分支机构详细信息。
我们在 OntoNotes 英语语料库上训练了我们的 NER 模型,该语料库的标记模式中有 19 种类型,包括 PER(人)、LOC(位置)、ORG(组织)等等。 为了 模型交互,首先 安装 其要求。
python -m deeppavlov install ner_ontonotes_bert_mult
python -m deeppavlov interact ner_ontonotes_bert_mult [-d]

此外,您还可以通过 Python 代码与模型交互。
from deeppavlov import configs, build_models

ner_model = build_model(configs.ner.ner_ontonotes_bert_mult,
  download=True)
from deeppavlov import configs, build_models

ner_model = build_model(configs.ner.ner_ontonotes_bert_mult,
  download=True)
ner_model(['World Curling Championship will be held
  in Antananarivo'])
多语言 BERT (M-BERT) 模型能够在语言之间进行零样本迁移,这意味着即使它是在英语 OntoNotes 上训练的,您也可以在非英语句子上测试该模型,例如
from deeppavlov import configs, build_model

ner_model = build_model(configs.ner.ner_ontonotes_bert_mult,
  download=True)
ner_model(['Meteorologists Lachlan Stone said the snowfall
  in Queensland was an unusual occurrence in a state
  with a sub-tropical to tropical climate.",
  "Церемония награждения пройдет 27 октября в
   развлекательном комплексе Hollywood and Highland
  Center в Лос-Анджелесе (штат Калифорния, США)."
  "Das Orchester der Philharmonie Poznań widmet sich
  jetzt bereits zum zweiten Mal der Musik dieses aus
  Deutschland vertriebenen Komponisten. Waghalter
  stammte aus einer jüdischen Warschauer Familie."])
您可以在文章中阅读更多关于 NER 模型的信息。此外,您也可以查看我们 演示

BERT 用于问答

基于上下文的问答是指在给定上下文(例如维基百科中的段落)中找到问题的答案的任务,其中每个问题的答案都是上下文的一部分。例如,下面的上下文、问题和答案三元组构成基于上下文的问答任务的正确三元组。

上下文

在气象学中,降水是指大气水汽凝结后在重力作用下落到地面的任何产物。降水的主要形式包括毛毛雨、雨、雨夹雪、雪、霰和冰雹。降水形成于较小的液滴通过与其他雨滴或冰晶碰撞而合并 在云层中。在分散地点出现的短暂、强烈的降雨称为“阵雨”。

问题:

水滴在何处与冰晶碰撞形成降水?

答案

在云层中
问答系统可以自动化您业务中的许多流程。例如,它可以帮助您的员工根据您的内部公司文档获得答案。此外,它还可以帮助您在辅导中检查学生的阅读理解能力。最近,基于上下文的问答任务在学术界引起了广泛关注。该领域的一个重要里程碑是斯坦福问答数据集(SQuAD)的发布。它是一个新的阅读理解数据集,包含由众包工人针对一组维基百科文章提出的问题。SQuAD 数据集催生了无数解决问答问题的方案。其中最成功的是基于 BERT 的问答模型。该模型超越了其他所有模型,目前取得了接近人类水平的结果。
为了在 DeepPavlov 中使用基于 BERT 的问答模型,首先需要安装其依赖项。
python -m deeppavlov install squad_bert
然后,您可以按照以下方式与模型交互
python -m deeppavlov interact squad_bert -d
此外,您也可以通过 Python 代码使用模型
from deeppavlov import build_model, configs

model_qa = build_model(configs.squad.squad_bert,
  download=True)
model_qa(['In meteorology, precipitation is any product
  of the condensation of atmospheric water vapor that
  falls under gravity. The main forms of precipitation
  include drizzle, rain, sleet, snow, graupel and hail. 
  Precipitation forms as smaller droplets coalesce via
  collision with other rain drops or ice crystals within
  a cloud. Short, intense periods of rain in scattered
  locations are called showers."], ["Where do water droplets
  collide with ice crystals to form precipitation?"])
多语言 BERT 模型可以简单地在英语 SQuAD 数据集上进行训练,从而构建多语言问答系统。多语言问答支持所有 104 种语言 ,这些语言被用于训练 M-BERT。您可以按照以下方式使用它
from deeppavlov import build_model, configs

model_qa_ml = build_model(configs.squad.squad_bert_multilingual
  _freezed_emb, download=True)

context_en = (['In meteorology, precipitation is any product
  of the condensation of atmospheric water vapor that
  falls under gravity. The main forms of precipitation
  include drizzle, rain, sleet, snow, graupel and hail. 
  Precipitation forms as smaller droplets coalesce via
  collision with other rain drops or ice crystals within
  a cloud. Short, intense periods of rain in scattered
  locations are called showers."], ["Where do water droplets
  collide with ice crystals to form precipitation?"])

context_fr = "Les précipitations désignent tous les météores 
  qui tombent dans une atmosphère et il peut s'agir de solides 
  ou de liquides selon la composition et la température de 
  cette dernière. Ce terme météorologique est le plus souvent 
  au pluriel et désigne sur la Terre les hydrométéores 
  (cristaux de glace ou gouttelettes d'eau) qui, ayant été 
  soumis à des processus de condensation et d'agrégation à 
  l'intérieur des nuages, sont devenus trop lourds pour 
  demeurer en suspension dans l'atmosphère et tombent au
  sol ou s'évaporent en virga avant de l'atteindre.
  Par extension, le terme peut également être utilisé pour
  des phénomènes similaires sur d'autres planètes ou lunes
  ayant une atmosphère."

model_qa_ml([context_en, context_fr, context_fr],
  ["Where do water droplets collide with ice crystals to
  form precipitation?", "Sous quelle forme peut être 
  précipitation?", "Where the term precipitation can 
  be used?"])

如您所见,我们通过提供上下文批次和问题批次来调用模型,作为输出,模型返回从上下文中提取的结果批次及其起始位置。此代码片段表明,多语言问答模型尽管在英语数据集上进行训练,但即使问题是用不同的语言提出的,它也能从法语上下文中提取答案。
多语言问答模型跨语言迁移能力的详细比较可以在专门的 文章中找到。

结论

我们希望这些信息对您有所帮助,并希望您能够积极地将 DeepPavlov 用于您自己的自然语言理解用例。您可以在我们的官方 博客中了解更多关于我们的信息。此外,欢迎使用我们的 演示测试我们基于 BERT 的模型。不要忘记 DeepPavlov 有一个专门的 论坛,欢迎您提出有关框架和模型的任何问题。
Logo of the Moscow Institute of Physics and Technology



下一篇文章
DeepPavlov: An open-source library for end-to-end dialogue systems and chatbots

来自 瓦西里·科诺瓦洛夫

对话系统最近已成为人机交互的标准,聊天机器人几乎出现在每个行业,以简化人机之间的交互。它们可以集成到网站、消息平台和设备中。聊天机器人正在崛起,企业正在选择将例行工作委托给聊天机器人而不是人类……