为什么要做平台?我认为我们应该从一个基于任务的对话的具体例子开始。在我们的日常工作中,一个非常高频的场景就是预约见面。让我们看看我们内部的office助手是如何实现预约的:我说“帮我预约一个会议”,它会问“你什么时候开会?”告诉它现在是“后天三点”,然后它会问“你要见谁?”我会告诉它我要预约谁,这个时候它会在后台发起服务调用,因为它会去后台获取所有参与者的日程,看我说的这个时间有没有共同空空闲时间,如果没有,它会给我推荐几个时间段。因为我说的那个时间我们没有共同的空空闲时间,所以我改了时间。
我说“上午十一点”,它会问“你会持续多久”,我会告诉它“一个小时”,它会问“会议的主题是什么”,于是我告诉它“我们来讨论一下下周的线上计划”。到目前为止,它收集了所有的信息,最后,它会给我一个总结,以确认是否发送会议邀请。
这是非常典型的任务型对话,符合两个条件。首先,它有一个明确的目标。第二,它通过多轮对话和互动来实现这一目标。像这样的任务型对话,不仅仅是会议,还有考勤、请假、设置会议室或排班等。
如果把视野再放大一点,再看电商行业,电商行业会涉及到开发票、催发货、查物流、改地址、收快递等。,并且还会涉及到很多这样的任务型对话场景;我们再仔细看看电信行业或者整个运营商行业。会有很多基于任务的对话场景,比如查话费,查流量,买套餐,报故障或者改密码。如果再进一步看,比如政务、金融、教育、娱乐、卫生、旅游等。,我们会在各行各业的各种场景中发现这种任务型对话。这是一种刚需和普遍的存在。
当这些场景全部落地到我们小米家的时候,都是由刚刚介绍的阿里小蜜、点小蜜、云小蜜这三个大小蜜来承载的。我们不可能为每一个行业的每一个场景定制一个对话流程,所以我们一直遵循着阿里巴巴一直是一个平台的理念,这也是我们整个智能对话开发平台的起源。这款产品的内部名称是Dialog Studio。
以上主要是介绍为什么要搭建智能对话开发平台。总结一下,就是我们目前面临的业务。我们面临的情况太广泛了。不可能分散那么多人去定制所有的场景,所以我们需要一个平台,让开发者进来,开发各行各业的各种场景对话。
设计理念看第二部分,说说工厂的一些核心设计理念。我觉得整个设计理念可以概括为“一个中心,三个原则”。一个中心以对话为中心,这在大家看来可能有点莫名其妙。为什么在进行对话的时候会强调以对话为中心?
这是有出处的,因为在过去几年的世界性技术实践和今天很多巨头的对话平台中,我们能看到的基本上都是以意图为中心的设计模式,在这里平铺意图,比如你想在音乐领域完成某件事,但你看到的其实是一堆平铺的意图列表,根本看不到对话在哪里。
我们在这个对话工厂的设计上完全反过来了。对话以对话为中心。你在我们的产品界面上看到的不再是孤立的意图,而是有业务逻辑的相关对话过程。在以意图为中心的设计中,你看到的其实是一个局部的视角,你只能实现一些简单的任务,比如控制一个灯,讲一个笑话,或者查询天气。如果你想实现一个复杂的任务,比如开一张发票,或者开一个10086的套餐,其实是很难实现和维护的。当我们改变整个观念,回到以对话为中心的时候,我们就会看到整体的视野,我们可以做复杂的任务,无限的场景。
就像整个对话工厂刚才说的,它是一个平台,做平台会有很多挑战。
第一个挑战是,对于用户来说,使用门槛越低越好;第二个挑战是面对各行各业的各种场景,需要灵活定制;第三个挑战是,所有的用户一定希望你的机器人,你的对话系统能被越来越多的使用,而不是停留在某一个层面。这是我们平台面临的三大挑战。
为了应对这三个挑战,我们提出了在整个平台的设计和实现中应该始终遵循的三个原则。
第一个原则是冷启动要快,其实就是让用户的使用门槛更低;第二个原则是要有灵活定制的能力,只有这样才能满足各行各业各种场景的需求;第三是要有鲁棒进化的能力,即模型上线后,随着时间的变化和各种数据的不断返回,模型效果要不断提高。
在这三个原则中,冷启动其实就是把用户使用的各种能力和数据尽量变成一种预设的能力。简单来说,平台方做的越多,用户做的越少;第二个是关于灵活定制,需要我们抽象出整个对话平台的基本元素。你抽象的越好,你的平台的适应性就越好,就像经典力学只需要三定律一样。三是鲁棒进化,就是深化模型和算法,语言理解的模型,对话管理的模型,数据闭环,主动学习,可以在这些方面做深度。
以上都是一些思路和原则。接下来我来介绍一下在实施过程中是怎么做的。
核心技术说到技术,因为我们做的是平台,涉及的技术很广,而且是全栈技术,从算法到工程到前端到交互的所有技术都会涉及到。我将提取算法的核心部分给大家介绍一下。
对话工厂首先用于对话。人机对话有两个主体,一个是人,一个是机器,人和人的逻辑。人的逻辑的表现是什么?到现在主要是通过语言,所以我们需要一个语言理解服务来承载这一块;机器有机器的逻辑,今天机器的逻辑还是用代码来表达,所以我们需要一个函数计算的服务;在人机对话的过程中,这个对话过程需要有效的管理,所以我们需要一个对话管理模块。整个对话工厂的三大核心模块是语言理解、对话管理和函数计算。
第一个模块是语言理解。
我们先来看看这张图。在整个画面中,横轴是意图的多样性,纵轴是频率。这个有点抽象。我举一个具体的例子。比如我要开发票,这是一个意向。如果我们抽样10万条这种意向的用户语句,对这些语句做一个频率统计,“发票”这个词可能排在第一位,可能出现2万次,其他排在第二位。可能出现了8000次。这些都是一些高频语句,有些语句很长。比如“我昨天在你店里买了一条红裙子,请帮我开个发票。”这句有因果的话在整个语句中是一条长尾,可能只出现一两次。
经过我们的统计,整个意向声明的多样性分布符合幂律分布。这个特点让我们在技术上进行有效的针对性设计。首先,对于这个高频部分,我们可以应用一些规则,比如上下文无关语法,可以更好的覆盖这一块。而基于规则的方法,众所周知,规则没有泛化能力,这时候就需要应用一个匹配模型,计算一个相似度来辅助规则。这两块加在一起可以更好的解决我们的高频确定性部分。对于长尾的这部分多样性,还是有监督分类模型来收集或者标注大量的数据,并做好这一点。在规则和分类模型之间,我们做了一些工作,即迁移学习模型。为什么要引入这种模式?我们来看下一张图。
在冷启动阶段,用户输入样本时,不会输入太多,可能会输入几十个样本。这个时候按照刚才的幂律分布和二八原理,它的效果可能是70%以上,不可能更高了。但是对于用户的期待,如果你想上线,想很好的满足他的用户需求,其实你希望模型效果在90%以上。想要达到这个效果,需要复杂的模型,需要标注大量的数据。所以实际上是有差距的,我们引入迁移学习模型。
具体来说,我们将胶囊网络与少拍学习相结合,提出了一种叫做归纳网络的网络结构,这就是归纳网络。整个网络结构有三层,一是编码层,二是感应层,三是关系层。
第一层负责将每类的每个样本编码成一个向量;第二层是核心层,即诱导层,利用胶囊网络的一些方法,将多个同类向量诱导成一个向量;然后第三层,关系层,计算用户的新句子和每一类的归纳向量之间的关系,输出它们的相似度得分。如果想要一个分类结果,我们输出一个一热,如果不想要一热,我们输出一个关系分,这是整个归纳网络的网络结构。
这个网络结构提出后,我们在学术界的少射学习的数据集上取得了比较大提升的最先进的效果,是目前最好的,同时我们把整个网络结构放到了我们的产品中,这就是语言理解。
第二个是对话管理。
正如我刚才所说,如果平台要有足够的适应性,对话管理必须在抽象方面做得很好。对话管理是做什么的?对话管理就是管理对话,那么什么是对话呢?对话的最小单位是一轮,一个回合。如果我们进去看,一个话轮分为两部分,一部分叫对话输入,一部分叫对话输出。在输入和输出之间,有一个对话的过程,就像两个人在互相交流。我请你回答,其实你在回答之前有一个思考的过程。不加思考的回答,你的回答是没有质量的,所以会有一个中间的对话过程。
我们把对话抽象到这个程度之后,整个平台就有了三个节点,一个叫触发节点,一个叫功能节点,一个叫回复节点。
触发节点与用户的对话输入相对,功能节点与对话处理相对,回复节点与对话输出相对。有了这层抽象,无论你是什么行业,什么样的对话过程,都可以通过连接把你的业务流通过这三个节点画出来。
我们举两个例子。我们来看一个简单的。你需要查一下天气。很简单。首先,使用一个触发节点来触发天气过程。中间有两个功能节点。一个是调整中央气象台的界面,得到结果。另一种是对结果进行分析和封装,并通过回复节点以用户可读的形式回复给用户。这里稍微解释一下,增加了一个填槽节点。槽填充节点是什么意思?正是在基于任务的对话中,几乎所有的任务都需要收集用户的信息。例如,如果你想查询天气,你需要问时间和地点。这被称为槽填充。因为槽位填充是如此的普遍和常见,符合我们冷启动快速预置的思路。所以通过三个基本节点,我们自己把它构建成一个填槽的模板,在需要填槽的时候,把一个填槽节点拖出页面。
我们来看一个复杂的场景。这是在线教育的一个出站场景。家里有孩子的可能都知道,这种在线教育特别受欢迎。上课前半小时,机器人会主动给用户打电话,指导软件下载,怎么登录,登录后怎么进教室。所有这些过程都可以由机器人来引导。
通过这两个例子,我们可以看到,简单和复杂的场景都可以通过这三个抽象节点的连接来实现。有时候我们在开玩笑的时候,会说这整个连接叫做人生二、二、三、三的对话。
说完抽象,我们再来看具体的对话管理技术。在实现上,这张图和你刚才看到的关于语言理解的图是一模一样的,因为很多东西的分配其实都遵循着共同的规律,不同的是意图被对话代替了。
比如我们收集10万个天气检查样本,对这些用户的语句做一个频率统计,大概就是这样一条曲线,分两步就可以完成。例如,如果我们检查天气,我们将填充该槽一段时间,然后填充一个位置,然后返回一个结果。这个过程可能完成2万次;中间可能会有一些问A答B的情况,可能会有各种各样的B,所以整个对话实际上遵循一个幂律分布。
对于高频确定的部分,可以用状态机来解决,但是状态机也面临一个问题。它没有很好的容错能力。问A答B的时候,机器不知道接下来怎么答。在这种情况下,有必要引入一种类似人类的能力来补充状态机的能力。状态机加入类人能力后,高频对话基本可以解决。目前,关于长尾的对话是整个学术界或业界的难题。比较好的解决方法是上线后引入在线互动学习,在对话的过程中不断学习与用户的对话。状态机和在线交互学习其实是有差距的,因为状态机本身没有学习能力,所以需要引入强化学习。接下来,我将介绍一些关于类人能力和增强学习的工作。
先看人形能力。我们可以把人说的话分为三类:第一类是用户说的话很清楚,只有一个意思,机器其实是可以理解的;二台机器根本不知道自己在说什么,也就是未知;还有一种是用户表达的意思是可以理解的,但是是模棱两可的,可能包含两种意图和三种意图,也就是不确定性。确定性,状态机其实可以很好的捕捉和描述,类人能力主要集中在拒绝和不确定性。
对于拒绝识别这一块的例子,比如在线英语,机器人打来电话,问现在不方便调试设备。这时候从设计的角度来说,希望用户回答方便或者不方便都是可以的,但是一旦用户回答了一个比较个性化的句子,比如“诶,我刚扫完地,一会儿可能有人来”,我们的语言理解模块就很难捕捉到这是什么意思了。这时候就需要引入一种个性化的否认,比如“你好,对不起,我刚才没听明白你的话。你现在调试方便吗?如果你不方便,我过会儿给你回电话?”这是谈话的底层和对未知的处理。
我们来看看第二个澄清。用户说的一句话有歧义怎么办?通过大量的数据分析,我们发现这种模糊性主要出现在两种情况下。一种是用户在一个段落中混合多个意图来表达;第二是用户在表达一个意向之前做了很长时间的准备。对于这两个长句的当前语言理解,给出了意图的概率分布。我们把这个概率分布放入对话管理模块后,需要让用户进行一轮澄清。比如这是移动领域的一个例子。这句话有三种意图,是问费用明细,是问套餐,还是问合同的低保标准。就把这三个问题抛给用户澄清一下。
技术上是如何实现的?让我们来看看这个图表。开发者负责用流程图把对话流程描述清楚,然后澄清这其实是我们系统的一个内置能力。何时澄清由低端的两个引擎中的能力决定。第一块是错误检测,用于检测用户当前的语句是否需要触发澄清。一旦它觉得需要触发澄清,就会交给下一个模块。什么样的澄清以及如何产生澄清?
再看一下我们在增强学习方面的工作。在对话管理模型里面,经典的分成两个模块,一个是 neural belief tracker,用来做对话状态追踪的,另一个是 policy network,用来做行为决策的。在整个框架下,要去训练这个网络的时候,有两种训练方式,一种是端到端的去训练,用增强学习去训练,但这种方式一般它的收敛速度会比较慢,训练出的结果也不好;另外一种方式是先分别做预训练,这个时候用监督学习训练就