介绍柏拉图研究对话系统:一个灵活的对话AI平雷竞技是骗人的台

介绍柏拉图研究对话系统:一个灵活的对话AI平雷竞技是骗人的台

智能会话代理在过去的几十年里有了显著的发展,从关键字识别交互式语音响应(IVR)系统到正在成为日常生活中不可分割的一部分的跨平台智能个人助理。

随着这种增长,需要直观、灵活和全面的研发平台,这些平台可以作为开放的测试平台,帮助评估新算法,快速创建原型,并可靠地部署会话代理。雷竞技是骗人的

在Uber AI,我们开发了柏拉图研究对雷竞技是骗人的话系统这是一个用于构建、培训和部署对话AI代理的平台,使我们能够对对话AI进行最先进的研究,并快速创建原型和演示系统,并促进对话数据收集。雷竞技是骗人的我们设计了柏拉图通过提供清晰易懂的设计,集成现有的深度学习和贝叶斯优化框架(用于调优模型),并减少编写代码的需要,为对话AI方面背景有限的用户和该领域经验丰富的研究人雷竞技是骗人的员提供便利。

已经有大量的努力为一般研究或特定的用例开发这样的平台,包括雷竞技是骗人的奥林匹斯山PyDialParlAI,虚拟人工具包拉莎DeepPavlovConvLab等等。在评估是否利用这些工具时,我们发现许多工具要求用户熟悉平台特定的源代码,关注特定的用例,既不灵活也不支持其他工具,并且需要许可证才能使用。

Plato被设计用来解决这些需求,可以用于为各种用例创建、训练和评估会话AI代理。它支持通过语音、文本或结构化信息进行交互(换句话说,对话的行为),并且每个会话代理可以与人类用户、其他会话代理(在多代理设置中)或数据进行交互。也许最重要的是,Plato可以围绕会话代理的每个组件的现有预训练模型,并且每个组件可以在线(在交互过程中)或离线(从数据中)进行训练。

如何柏拉图研究对雷竞技是骗人的话系统工作吗?

从概念上讲,会话代理需要通过各种步骤来处理它作为输入接收的信息(例如,“今天天气怎么样?”),并产生适当的输出(“有风,但不太冷。”).与标准体系结构的主要组件(参见图1)相对应的主要步骤是:

  • 语音识别(将语音转录为文本)
  • 语言理解(从文本中提取意义)
  • 状态跟踪(关于到目前为止所说和所做的信息的汇总)
  • API调用(搜索数据库、查询API等)
  • 对话策略(生成agent响应的抽象含义)
  • 语言生成(将抽象意义转化为文本)
  • 语音合成(将文本转换为语音)

Plato的设计尽可能模块化和灵活;它支持传统的和定制的对话AI架构,重要的是,它支持多方交互,其中多个代理(可能具有不同的角色)可以相互交互,并发训练,并解决分布式问题。

下面的图1和图2描述了与人类用户和模拟用户交互时的柏拉图对话代理体系结构示例。与模拟用户交互是研究界常用的启动学习的方法(例如,雷竞技是骗人的在与人类互动之前,学习一些基本的行为).每个单独的组件都可以使用任何机器学习库在线或离线进行训练(例如,路德维希TensorFlow,或PyTorch)是一个普遍的框架。路德维希优步的开源深度学习工具箱是一个不错的选择,因为它不需要编写代码,而且与Plato完全兼容。

图1:Plato的模块化架构促进了组件的在线或离线训练,并且可以被定制或预先训练的模型所取代。(图中灰色的组件不是柏拉图的核心组件。)
图2:使用模拟用户而不是真人用户,如图1所示,我们可以为Plato的各种组件预先训练统计模型。然后,这些可以用来创建一个会话代理原型,该原型可以与人类用户交互,以收集更多的自然数据,这些数据随后可以用于训练更好的统计模型。(图中灰色的组件不是柏拉图的核心组件。)

除了单代理交互之外,Plato还支持多代理对话,其中多个Plato代理可以相互交互并相互学习。具体来说,柏拉图将生成会话代理,确保输入和输出(每个代理听到而且)适当地传递给每个代理,并跟踪对话。

这种设置可以促进多智能体学习的研究,在多智能体学习中,雷竞技是骗人的智能体需要学习如何生成语言来执行任务,也可以促进多方交互子领域的研究(对话状态跟踪、轮流等)。对话原则定义了每个主体可以理解的内容(实体或意义的本体;例如:价格、位置、偏好、菜肴类型等)和它能做什么(询问更多信息、提供一些信息、调用API等)。代理可以通过语音、文本或结构化信息(对话行为)进行通信,每个代理都有自己的配置。下面的图3描述了这种体系结构,概述了两个代理和各种组件之间的通信:

图3:Plato的体系结构允许同时训练多个代理,每个代理都有可能不同的角色和目标,并且可以促进在诸如多方交互和多代理学习等领域的研究。雷竞技是骗人的(图中灰色的组件不是柏拉图的核心组件。)

最后,Plato通过图4所示的通用代理体系结构支持自定义体系结构(例如,将NLU拆分为多个独立组件)和联合训练组件(例如,文本到对话状态、文本到文本或任何其他组合):

图4:Plato的通用代理体系结构支持广泛的定制,包括联合组件、语音到语音组件和文本到文本组件,所有这些组件都可以串行或并行地执行。

这种模式脱离了标准的会话代理体系结构,支持任何类型的体系结构(例如,联合组件、文本到文本或语音到语音组件,或任何其他设置),并允许将现有的或预先训练的模型加载到Plato中。

用户可以定义自己的体系结构和/或将自己的组件插入Plato,只需提供Python类名和该模块的包路径,以及模型的初始化参数。所有用户需要做的就是按执行顺序列出模块,而Plato负责其余的工作,包括包装输入/输出、链接模块和处理对话。Plato支持模块的串行和并行执行。

Plato还通过对会话AI架构或单个模块参数的贝叶斯优化提供支持组合结构的贝叶斯优化(中行)。

柏拉图的对话代理

在这个版本的Plato (v. 0.1)中不需要实际安装,因为它允许用户修改部分代码或扩展现有用例以获得更大的灵活性。然而,Plato确实依赖于一些外部库,需要安装这些库。按照以下两个步骤完成该过程:

注意:柏拉图研究对话系统是雷竞技是骗人的由Python 3

  1. 克隆存储库:

git克隆
git@github.com: uber雷竞技是骗人的-research / plato-research-dialogue-system.git

  1. 安装要求:

MacOS:

酿造安装portaudio
PIP install -r requirements.txt

对于Ubuntu / Debian:

Sudo apt-get install python3-pyaudio
PIP安装-r requirements.tx

Windows:

PIP install -r requirements.txt

要支持语音,就必须安装PyAudio,它有许多在开发人员的机器上可能不存在的依赖项。如果上面的步骤不成功,则帖子在PyAudio安装错误中包含如何获取这些依赖项并安装PyAudio的说明。

其他常见安装问题的解决方案可以在CommonIssues.md

  1. 运行柏拉图研究对话系雷竞技是骗人的统!

有关配置文件和如何运行Plato代理的快速介绍,请参阅下面的内容。

柏拉图运行代理

要运行Plato对话代理,用户必须使用适当的配置文件运行以下命令(参见Examples/simulate_agenda)。Yaml是一个示例配置文件,其中包含大量关于环境和要创建的代理及其组件的设置):

python runPlatoRDS.py -config < yaml配置文件的路径>

下面列出了一些示例模式和配置:

运行一个柏拉图代理
  • 在Cambridge Restaurants域中使用基于议程的用户模拟器运行模拟:

python runPlatoRDS.py -config Examples/config/simulate_agenda.yaml

  • 在Cambridge Restaurants域中使用基于议程的模拟器运行基于文本的交互:

python runPlatoRDS.py -config Examples/config/simulate_text.yaml

  • 在Cambridge Restaurants域中使用基于议程的模拟器运行基于语音的交互:

python runPlatoRDS.py -config Examples/config/simulate_speech.yaml

运行多个Plato代理

柏拉图的一个主要特征是允许两个主体相互作用。每个代理可以有不同的角色(例如,系统而且用户),不同的目标,并收到不同的奖励信号。如果代理是合作的,其中一些可以被分享(例如,什么构成了成功的对话)。(未来,我们计划构建对Plato的支持,以支持同时在两个以上的代理之间进行交互。)

例如,要在基准Cambridge Restaurants域中运行多个Plato代理,我们运行以下命令来训练代理的对话策略并测试它们:

培训阶段

python runPlatoRDS.py -config Examples/config/CamRest_MA_train.yaml

测试阶段

python runPlatoRDS.py -config Examples/config/CamRest_MA_test.yaml

运行通用柏拉图代理

本文中的大部分讨论和示例都围绕传统的会话代理展开体系结构.然而,柏拉图不需要遵循这个管道;它的通用代理支持任何范围的自定义模块,从将自然语言理解拆分为许多组件,到让多个组件并行运行,再到只有单一的文本到文本模型。

泛型代理允许用户将自定义模块作为Python类对象加载。对于配置文件中列出的每个模块,Plato将使用给定的路径和参数实例化类。然后,在每个对话回合中,通用代理将依次调用每个模块(按照其配置文件中提供的顺序),并将当前模块的输出传递给列表中的下一个模块。通用代理将返回最后一个模块的输出。

以下是在通用模块模式下运行单个柏拉图代理或多个柏拉图代理的两个示例:

  • 单一通用代理,用于实现自定义架构或使用现有的、预先训练的统计模型:

python runPlatoRDS.py -config Examples/config/ simulate_agena_generic .yaml

  • 多个通用代理,与上面相同,但适用于多个代理(假设您已经训练过对话策略例子/ config / CamRest_MA_train.yaml):

python runPlatoRDS.py -config Examples/config/MultiAgent_test_generic.yaml

培训从数据

Plato支持使用任何深度学习框架,以在线(在交互过程中)或离线(从数据中)的方式训练代理的内部组件。几乎任何模型都可以加载到柏拉图,只要柏拉图的接口输入/输出是尊重的;例如,如果一个模型是一个自定义NLU,它只需要继承柏拉图的NLU抽象类,实现必要的函数,并将数据打包/解包到自定义模型中或从自定义模型中取出。

柏拉图内部经验

为了便于在线学习、调试和评估,Plato对其内部进行了跟踪经验在一个名为“对话情节记录器”的结构中,它包含了关于以前的对话状态、采取的行动、当前的对话状态、接收到的话语和发出的话语、收到的奖励的信息,以及其他一些结构,包括一个自定义字段,可用于跟踪上述类别中不能包含的任何其他内容

在对话结束时或在指定的间隔内,每个会话代理将调用培训()功能的各个内部组成部分,传递对话经验作为训练数据。然后每个组件选择它需要进行训练的部分。

要使用在Plato内部实现的学习算法,任何外部数据,例如DSTC2数据,应该解析成这个柏拉图经验,以便它们可以被相应的组件在训练中加载和使用。

或者,用户可以解析数据并在Plato之外训练他们的模型,当他们想将其用于Plato代理时,只需加载经过训练的模型。

在线培训

在线培训非常简单,只需在用户希望培训的每个组件的配置中将“培训”标志翻转为“True”。

要从数据进行训练,用户只需要从数据集中加载他们解析的经验。作为Plato中的离线训练示例,我们将使用DSTC2数据集,该数据集可以从第二届对话状态追踪挑战网站

runDSTC2DataParser.py脚本将解析DSTC2数据并将其保存为柏拉图经验。然后,它将加载这些经验,并训练一个受监督的策略:

python runDSTC2DataParser.py -data_path /dstc2_traindev/data/ . python

经过训练的策略可以使用以下配置文件进行测试:

python runPlatoRDS.py配置
例子/ config / simulate_agenda_supervised.yaml

注意:用户可以将过去的交互或数据中的经验加载到Plato中,然后用强化学习或其他学习方法继续训练他们的模型。

和柏拉图和路德维希一起训练

发布的乳房,路德维希是一个开源的深度学习框架,允许用户训练模型而不需要编写任何代码。用户只需要将数据解析为CSV文件,创建Ludwig配置文件,然后在终端中简单地运行一个命令。用YAML编写的Ludwig配置文件描述了神经网络的体系结构(要从CSV文件中使用哪些特性)和其他参数。

在前一节中,runDSTC2DataParser.py实际上生成了一些可以用来训练自然语言理解和生成的CSV文件,这些文件可以在:数据/数据.作为一个例子,我们将看到如何训练系统端自然语言生成器。为此,用户需要编写一个yaml配置文件,如下所示:

Input_features:
名称:nlg_input
类型:序列
编码器:rnn
cell_type: lstm

Output_features:
名称:nlg_output
类型:序列
解码器:发电机
cell_type: lstm

培训:
时代:20
learning_rate: 0.001
辍学:0.2

训练他们的模型:

/config/ludwig_nlg_train.使用实例yaml -data_csv

数据/数据/ DSTC2_NLG_sys.csv -output_directory模型/ CamRestNLG / Sys /

下一步是加载Plato中的模型。用户应该访问simulate_calenda_nlg。yaml配置文件,并在必要时更新Ludwig模型的路径:

...

NLG:
nlg: CamRest
model_path: < PATH_TO_YOUR_LUDWIG_MODEL > /模型

...

并测试模型是否有效:

python runPlatoRDS.py配置
例子/ config / simulate_agenda_nlg.yaml

记住路德维希会创造一个新的experiment_run_i目录,因此用户需要确保Plato的配置文件中的模型路径是最新的。

Ludwig还提供了一种在线训练模型的方法,因此在实践中,用户只需编写非常少的代码就可以在Plato中构建、训练和评估一个新的深度学习组件。

为Plato代理生成新域

为了为面向任务的应用程序(如槽填充)构建会话代理,用户需要一个项目数据库和描述其领域的本体。Plato提供了一个用于自动化此过程的脚本。

让我们举个例子,一个用户想要为一个在线花店构建一个会话代理,在一个CSV文件中有以下项目:

item_id、类型、颜色、价格、场合
1、玫瑰红色,1
2、玫瑰、白2周年
3、玫瑰、黄色2庆祝
4、礼来、白5
5、兰花、粉红、30日
6、大丽花、蓝色、15日

用户只需调用createSQLiteDB.py自动生成一个DB SQL文件和一个JSON本体文件。用户可以在配置文件中指定可告知的、可请求的和可系统请求的插槽,如下所示:

- - - - - -

一般:
csv_file_name:数据/数据/ flowershop.csv
db_table_name: estore
db_file_path:本体/本体/ flowershop.db
ontology_file_path:本体/本体/ flowershop.json

本体:
Informable_slots:[类型,价格,场合]

requestable_slots(价格、颜色):

system_requestable_slots(价格、次):

注意:“ONTOLOGY”部分是可选的。如果没有提供,脚本将假定所有槽都是可告知的、可请求的和可系统请求的。

然后运行脚本:

python createSQLiteDB.py配置
例子/ config / create_flowershop_DB.yaml

一个flowershop-rules.json和一个flowershop-dbase.db现在可以在域/域

我们现在可以简单地用虚拟组件运行Plato,并与一个简单的代理交互,作为一个健全检查:

python runPlatoRDS.py配置
例子/ config / flowershop_text.yaml

为Plato代理生成新模块

根据模块的功能,有两种创建新模块的方法。如果一个模块实现了一种执行NLU或对话策略的新方法,那么用户应该编写一个继承自相应抽象类的类。

然而,如果一个模块不适合单个代理的基本组件之一,例如,它执行命名实体识别或从文本预测对话行为,那么用户必须编写一个直接继承自ConversationalModule的类,这样就只能由通用代理使用。

从抽象类继承

用户需要创建从相应的Plato抽象类继承的新类,并实现抽象类定义的接口和他们希望的任何其他功能。这个类应该有一个唯一的名称(例如' myNLG '),用来在解析配置文件时将它与其他选项区分开来。在Plato的这个版本中,除非使用通用代理,否则用户将需要手动添加一些解析配置文件的条件(例如在conversation Agent、dialog Manager等中)。

构建一个新模块

要构造新模块,用户必须将其代码添加到从会话模块继承的新类中。然后,通过在配置中提供适当的包路径、类名和参数,他们可以通过通用代理加载模块。

...
MODULE_i:
包:myPackage.myModule
类:myModule里
参数:
model_path:模型/ myModule里/参数/
...
...

用户有责任保证新模块能够适当地处理前面模块的输出,并且新模块的输出可以适当地被下面的模块使用,如其通用配置文件中所提供的那样。

下一个步骤

Uber AI的一雷竞技是骗人的个研究项目Plato被用来促进工作将于SIGDial 2019关于同时训练两个会话代理,它们通过自我生成的语言相互交谈。在这项工作中,我们利用柏拉图轻松地训练一个会话代理如何询问餐厅信息,另一个代理如何提供这些信息;随着时间的推移,他们的对话变得越来越自然。

我们相信Plato有能力在深度学习框架中更无缝地训练会话代理,从Ludwig和TensorFlow到PyTorch、Keras和其他开源项目,从而在学术和行业应用中改善会话AI技术。

的详细信息柏拉图研究对雷竞技是骗人的话系统通过阅读我们的完整的文档

柏拉图研究对雷竞技是骗人的话系统源代码在非商业许可下共享,仅用于研究目的。

如果你对我们的研究很感兴趣,可以考虑申请我们的职位雷竞技是骗人的超级人工智能

特别感谢皮耶罗·莫利诺、迈克尔·皮尔斯和戈汗·图尔的贡献和支持。

评论
前一篇文章 2019年MoneyCon: Uber举办第一届金融科技工程会议
下一篇文章 让Apache Spark为所有的Uber轻松实现
Alexandros Papangelis
Alexandros Papangelis是Uber AI的高级研究雷竞技是骗人的科学家,是conversation AI团队的成员;他的兴趣包括统计对话管理、自然语言处理和人机社会交互。在加入Uber之前,他在东芝欧洲研究院工作,领导剑桥研究实验室的统计口雷竞技是骗人的语对话团队。在加入东芝之前,他是CMU Articulab的博士后,与Justine Cassell合作设计和开发下一代具有社交技能的虚拟代理。他获得了德克萨斯大学阿灵顿分校的博士学位,伦敦大学学院的理学硕士学位,雅典大学的理学学士学位。
Yi-Chia王
Yi-Chia Wang是Uber 雷竞技是骗人的AI的研究科学家,专注于对话AI。她获得了卡内基梅隆大学计算机科学学院语言技术研究所的博士学位。她的研究雷竞技是骗人的兴趣和技能是结合语言处理技术、机器学习方法和社会科学理论,对大规模数据进行统计分析,并建模人-人/人-机器人行为。她在顶级会议/期刊上发表了20多篇同行评议论文,并获得了CHI荣誉奖、CSCW最佳论文奖和AIED最佳学生论文提名等奖项。
马赫迪Namazifar
Mahdi Namazifar是Uber NLP和会话AI团队的技术主管。
钱德拉Khatri
Chandra Khatri是Uber AI专注于对话雷竞技是骗人的式AI的高级研究科学家。目前,他感兴趣的是使AI系统更智能和可扩展,同时解决与理解和推理相关的基本挑战。在加入Uber之前,他是亚马逊Alexa的首席科学家,并负责Alexa Prize Competition的科学赛段,这是一项旨在推动对话式人工智能状态的大学竞赛。在参与Alexa之前,他是eBay的研究科学家,在那里他领导了电子商务领雷竞技是骗人的域的各种深度学习和NLP项目。

没有可显示的帖子