精华内容
下载资源
问答
  • 使两个机器人的相互对话生成语料,文本大小为1.03m,用于闲聊机器人的训练数据,使用 # 作为两个多轮对话之间的分隔符
  • 主题感知的多轮对话生成模型,申宇飞,徐蔚然,多轮对话系统中存在的上下文内容不相关、对话主题不连续等问题仍旧比较突出,生成与对话语境一致的回复成为对话系统的核心挑战之
  • 聊天支持用户并发及自定义的多轮对话场景。 如果您有如下需求,欢迎选择 想从0开始Swift建造自己的聊天机器人 想了解自然语言处理与机器学习算法在问答中的应用 想智能化生活工作,提升效率 对知识图谱以及KBQA...
  • 一篇多轮对话方面的论文 一篇多轮对话方面的论文 一篇多轮对话方面的论文 一篇多轮对话方面的论文 一篇多轮对话方面的论文
  • ConvQA_CN 基于抽取式模型和生成式模型解决多轮对话式机器阅读理解任务
  • Chat - 基于自然语言理解与机器学习的聊天机器人,支持用户并发及自定义多轮对话
  • 对话系统旨在让用户和系统之间更加自然的对话,让系统记住用户历史话语。...网络上开源的对话系统架构不,以OpenDial和Alex较为成熟。本文采用Alex的方式。 Alex 系统是由位于捷克的查理大学使用Python 2开发。
  • 智能对话系统之多轮对话

    千次阅读 2019-09-10 15:58:48
    序言 以一周前的一条微博作为开始。...对于一个对话系统而言,我微博中所指的『后续服务』,就是上图中的 DST(对话状态维护)以及 Policy(动作候选排序),或者统一的称其为 DM(Dialogue Mannagem...

    序言

     

    以一周前的一条微博作为开始。一周前我讲:相对的,自然语言解析技术已经逐渐不再成为各家广义智能助理产品的核心竞争力,识别用户意图之后所提供的服务开始成为对话机器人差异化的核心

    百度:对话系统的组成

    对于一个对话系统而言,我微博中所指的『后续服务』,就是上图中的 DST(对话状态维护)以及 Policy(动作候选排序),或者统一的称其为 DM(Dialogue Mannagement,对话管理)。也即,当接收到 NLU 模块的输出、其他场景及用户特征信息之后,判断系统应该跳转到什么状态,以及执行什么样的动作。

    从产品的角度,DM 是对话机器人封闭域多轮对话体验的核心,正是一次次 DST + Policy 形成了人机间的多轮对话体验。(我个人倾向于将识别用户意图之后,为了获取必要信息,与用户进行的有目的的多轮对话称为封闭域多轮对话,区别于识别用户意图之前,为了利用上文信息,所采用的『上下文替换』、『主体补全』等技术,aka 开放域多轮对话。下文提到的『多轮对话』,均指封闭域多轮对话。)

    既然多轮对话在对话机器人类产品体验中扮演着如此重要的角色,我便倾向于开始思考:一个架构完备的多轮对话体系应该是什么样的。也即多轮对话系统中需要至少包含哪些模块,才能为用户提供一种与人人对话相去不远的人机对话体验。

    多轮对话定义

    我有个习惯,就是在构造一个复杂系统之前,先从纷繁的细节之中跳出,尝试抽象的描述整个系统,及系统中的各个模块,也即为它们『下定义』。这能帮助你在多种可行方案中做出选择,也即帮你明确:什么该做,什么不该做,什么该谁做

    基于以上思想,我尝试先给出几个我个人对于多轮对话体系定义问题的回答:

    基本定义:什么是多轮对话?
    (封闭域)多轮对话是一种,在人机对话中,初步明确用户意图之后,获取必要信息以最终得到明确用户指令的方式。多轮对话与一件事情的处理相对应。

    补充说明:所谓『必要信息』一定要通过与用户的对话获取吗?
    不一定,即便是人与人之间的交流,对话本身所包含的信息也只占总传递信息量的一小部分,更多信息来源于说话人的身份、当前的时间/地点等一系列场景信息。所以多轮对话的信息获取方式也不应当只局限于用户所说的话。

    补充说明:多轮对话一定在形式上表现为与用户的多次对话交互吗?
    不一定,如果用户的话语中已经提供了充足的信息,或者其它来源的补充信息已经足够将用户的初步意图转化为一条明确的用户指令,那就不会存在与用户的多次对话交互。

    以上是针对多轮对话整体定义问题的回答,每个模块的相关定义会在下文各个模块的讲解中尝试给出。

    基本定义:什么是槽?
    槽是多轮对话过程中将初步用户意图转化为明确用户指令所需要补全的信息。一个槽与一件事情的处理中所需要获取的一种信息相对应。

    补充说明:多轮对话中的所有的槽位都需要被填充完整吗?
    不一定,以如下对话为例:

    我:『去萧山机场多少钱』
    出租车司机:『70』

    对话中的『70』,应当被理解为70元人民币,而不必再去追问:『你说的是人民币、美元、日元还是港币?』。这类信息应当以默认值的形式存在,也即槽有必填非必填之分,与上文所说的『信息未必需要通过与用户的对话获取』相对应。

    词槽与接口槽

    上文反复的提到,对话内容并不是获取信息的唯一方式,用户身份以及当前场景也包含着大量值得被利用的隐含信息。所以,与此相对的,一个完备的多轮对话体系应当同时具备从用户话里以及话外获取信息的能力。

    我个人将利用用户话中关键词填写的槽叫做词槽,利用用户画像以及其他场景信息填写的槽叫做接口槽

    举个例子,我讲『我明天要坐火车去上海』。其中,分别将『明天』、『上海』填入名为『出发时间』、『目的地』的词槽中,而我当前所在的位置,则填入到了名为『出发地』的接口槽中。

    槽组与槽位

    我个人将利用用户话中关键词填写的槽叫做词槽,利用用户画像以及其他场景信息填写的槽叫做接口槽

    举个例子,我讲『我后天要坐火车去上海』。其中,分别将『后天』、『上海』填入名为『出发时间』、『目的地』的词槽中,而我当前所在的位置,则填入到了名为『出发地』的接口槽中。

    不知道上文错的如此离谱的结论有没有引起你的注意 :)

    仔细读一遍上面举的例子,就会发现一个很严重的矛盾点:难道『出发地』这个槽不能由用户指定?用户完全可以说『我后天要坐火车从北京去上海』,那它是词槽还是接口槽?而且更进一步的,难道只能用『我当前所在的位置』来填入『出发地』这个槽中?比如,如果能读到我的日程表,发现我明天会去杭州,那是不是就应该用『杭州』而不是『我现在所在的位置』来填『出发地』这个槽了?

    从中我们能发现什么呢?同一个槽,可能会存在多种填槽方式

    我将可能包含多种填槽方式的称为槽组,槽组下面可能存在任意多个槽位,也即任意多种填槽方式,而每个槽位又都对应着『词槽』与『接口槽』两种槽位类型之一。

    本质上来讲,槽组(也即上文中提到的『槽』),对应着一种信息,而几乎不会有哪种信息的获取方式只有一种。所以一个『槽』会同时对应多种填槽方式也就是自然而然的了。

    依照上文,同一种信息会有多种获取方式,也即同一个槽组会对应多种填槽方式(槽位)。那不同填槽方式之间必然会存在优先级的概念。

    就如同上文『订票』的例子,『出发地』槽包含三种填写方式,一种词槽、两种接口槽,自然的,词槽的优先级最高,『日程表中隐含的出发地』次之,『我当前所在的位置』再次。

    如果将其与前文提到过的必填/非必填结合起来,其填槽过程应当遵循以下步骤:

    • 尝试填写词槽
    • 若失败,尝试填写第一接口槽『用户日程表中隐含的出发地』
    • 若失败,尝试填写第二接口槽『用户当前所在位置』
    • 若失败,判断是否该槽必填
    • 若必填,反问用户,重填词槽
      *若非必填,则针对该槽组的填槽过程结束

    我们需要知道,必填/非必填在逻辑上与槽组而不是槽位平级,只有信息才会分为必要/非必要,填槽方式不做这种区分。而且是否必填实际上与接口槽无关,只取决于是否需要与用户进行交互。

    澄清话术

    槽组也即与一种信息平级的概念还有一个,叫做澄清话术

    澄清话术是对话机器人希望获取某种信息时所使用的问句。比如『目的地』对应的澄清话术就是『您想从哪出发呢?』,『出发时间』对应的澄清话术就是『您想什么时间出发呢?』。

    显而易见的,澄清话术与槽组而不是槽位平级。

    槽的填写

    上文讲到,一个槽组可能会有多个槽位,槽位存在词槽接口槽之分。

    先说词槽。

    词槽信息的抽取其实还是有些麻烦的,不过这属于解析的问题,不在本文探讨的范围内,这里只是简单提一下,举两个例子:

    • 用户表达『不』,可能会有『不行』、『不是』、『算了』、『没有』等一系列说法。
    • 用户话中有多个符合条件的关键词,我们整套多轮对话中有多个槽,每个槽填一个还是多个值?哪个槽与哪个词对应?

    同义词典、规则、双向LSTM+CRF,各有各的方法。

    再说接口槽。

    接口槽与词槽相比,额外存在一个问题,就是:接口返回的结果就是用户需要的结果吗?

    这里需要分成两种情况来讨论,一种是:我们明确知道接口的返回值可以直接填入槽位(不是槽/槽组)中,不需要向用户确认

    特别的,这里还要明确一点,即便是上述情况,也并不意味着当前槽/槽组只有该特定接口槽这一个槽位。有两种情况存在:一种是该槽组下只有这一个槽位,该接口的返回值直接填入槽位中,也相当于填入了槽/槽组中;或者该槽位下有多个槽位,接口槽的填入值并不一定最终作为槽/槽组的填入值。

    另一种是:我们知道接口的返回值只能作为参考,需要用户的协助才能进行槽位的填写

    这种情况下,需要提供选项,让用户最终决定该槽位的填入值,与词槽一样,这里同样需要处理单值/多值的问题。单值/多值在逻辑上与槽组平级。

    此外,这里还要注意一个否认选项的问题,比如我对阿里小蜜说,我忘记密码了,它会通过接口拿到我的当前账号,然后将其提供选项给我,问『你是忘记了哪个账号的密码?』,不过,除了我当前账号之外,还有一个选项也被提供出来了,就是『不,不是这个账号』。

    这代表了一类问题的存在,用户的意图并不一定包含在接口的全部返回值之中。所以就必然会有这样一种类似『不要/不是/不』的选项,我将其叫做否认选项

    用户选择否认选项后,即意味着该槽位的填写失败了,需要填入一个特殊值代表失败。用户选择否认选项的失败,可以与接口调用失败等其它意外情况合并处理,因为这都意味着该槽位填写失败,意味着该种信息获取方式未能成功获取信息

    如果该槽组下只有这一个槽位,这个特殊的失败表征值就应当作为整个槽组的填入值,如果还有其他槽位值,则根据槽位间优先级最终确定槽组填入值。

    平级槽和依赖槽

    上面说到底都在讲一个槽组的填写,也即一种信息的获取,但多轮对话的目的是将初步用户意图转化为明确用户指令,这其中所需要的信息通常都不只有一种。

    谈完了槽组与槽位之间的关系,接下来谈一下槽组与槽组之间的关系,也即信息与信息之间的关系。

    为了便于理解,我先举两个例子来代表两种多轮对话中所包含的极端情况。

    第一种:订车票,你需要知道用户出发的时间、地点、目的地、座位种类。这四个槽组之间,没有任何依赖关系。换言之,你只需要确定好这四个槽组中必填槽组之间的澄清顺序,接收到用户问句后,对还未填充完成的必填槽组依次进行澄清即可。我将这四个槽组之间的关系称为平级槽关系

    另一种,不知道读者玩没玩过橙光,或者其它多结局的剧情类游戏。它们的特点是什么呢?每一个选择都会有影响到后续剧情发展也即 每个槽组的填写结果会影响其它槽组的填写。换言之,部分槽组依赖前序槽组的填写结果,在其依赖的前序槽组填写完成之前,该槽组都无法进行填写。我将槽组间的这种关系称为依赖槽关系

    这种情况下,整个多轮对话过程就形成了一棵树,极端情况下,这棵树是的。树上的每个节点放置着一个会对后续对话走向产生影响的槽组

    槽关系的选择要根据实际业务场景来确定。

    如果错将平级槽采用依赖槽关系来管理,就会出现信息的丢失。比如 A、B、C,三者本为平级槽关系,但却将其用 A->B->C 的依赖槽关系来管理,那即便用户问句中包含填写 B、C 槽组的信息,也可能会由于 A 槽组的未填写而造成 B、C 槽组的填写失败。

    如果错将依赖槽采用平级槽的关系来管理,就会出现信息的冗余,比如 A、B、C三者的关系为 A、A1->B、A2->C,那即便用户将值 A1 填入槽组 A 后,却仍然需要向用户询问本不需要的 C 槽组的填写信息。

    上述两种情况属于全平级槽关系全依赖槽关系的特殊情况,在实际的业务场景中,这两种关系会是同时存在的,不同槽组间,既有平级槽关系,又有依赖槽关系。

    实际业务场景中,完整的多轮对话过程通常会以的形式存在,每个节点存在一个或多个槽组,用于获取一种或多种信息,节点间的槽组为依赖关系,节点内的槽组为平级关系

    上文将多轮对话定义为一件事情的处理,槽组/槽定义为一种信息的获取,槽位定义为信息的一种获取方式。这里我倾向于将多轮对话树结构中的一个节点定义为处理事情的一个步骤

    一件事情的处理包含多个步骤,每个步骤中需要补全一种或多种信息,每种信息存在一种或多种获取方式。

    上述定义和组里算法大佬的定义有些分歧,不过谁让这是我的文章呢 :) 就按我的来。

    填槽意义

    结合上文,我们需要了解到,填槽的意义有两个:作条件分支多轮对话作信息补全用户意图。换言之,填槽不仅是补全用户意图的方式,而且前序槽位的填写还会起到指导后续信息补全走向的作用。

    准入条件

    上文我们讲到,完整的多轮对话过程通常会以的形式存在,树中包含多个节点,代表处理这件事情的一个步骤

    而每个节点,都应当有其特别的准入条件。树的根节点往往需要限制 NLU 模块的输出,也即明确什么样的用户意图将会由该棵多轮对话树来处理;树的中间及叶子节点往往需要根据前序槽组的填槽结果以及其他背景信息进行条件限制。(如果将所有信息,比如 NLU 模块输出,或是其他背景信息都看做前序槽组的填写结果,那就能得到统一的槽组-条件-槽组-条件······形式,槽组用于获取信息,条件用于信息限制

    我尝试从两个角度来描述一套完备的准入条件体系。

    一个是多条件的组织形式,准入条件在逻辑上应该支持条件间的与或非,百度的 UNIT 平台提供了一种相对成熟的组织形式,将准入条件整体划分为条件条件组,条件包含在条件组中,组内条件间是关系,条件组之间是关系(当然这里的且与或可以根据自身业务情况对调),条件本身支持关系。

    一个是单条件的限制能力,准入条件应当同时支持对前序槽组填写值、填写方式、填写状态进行限制。也即需要有针对值的条件针对类型的条件针对状态的条件。简单的讲,状态就是『填了吗』,类型就是『谁填的』,值就是『填了什么』。

    不同业务场景下我们会需要不同角度的限制条件。比如,上文中提到填槽的意义包含两种:作条件分支多轮对话作信息补全用户意图,如果仅仅作信息,那我们通常就只关心『填了吗』,只要填写完成就进行后续步骤,并不关系『谁填的』以及『填了什么』;但是如果槽组内的填入值会影响后续多轮对话走向,那我们就倾向于通过槽组的填入方式填入值来作多轮对话的分支。

    答案系统

    先明确一个观点,多轮对话树的节点属于对话节点而不是答案节点同一份答案可能会出现在多个对话节点中

    答案系统和多轮过程应当是解耦的,答案系统中的每份答案都应当设置好自己的触发条件。举个例子,若存在 ABC 三个槽,A=A1、B=B3、C=C1 提供答案一,A=A2、B=B1、C=C2 或 A=A3、B=B2、C=C1 提供答案二。

    另外,答案的种类也不应仅局限于文本,富文本、接口、话题切换,都可以视为合理的答案形式。

    话题切换

    话题切换指用户与用户的对话从一个多轮过程切换至另一个多轮过程,话题切换有主动切换被动切换之分。

    上文提到的作为答案的话题切换,就可以理解为主动的话题切换

    被动的话题切换是指,系统发现无法从用户的问句中抽取信息以继续当前的多轮对话,只好将其作为一条全新的问句重新进行解析和话题识别

    话题切换,尤其是主动的话题切换会涉及到一个新问题:槽继承

    举个例子:

    我:『我明天要坐高铁从杭州到北京』
    我:『算了,还是坐飞机吧』

    这种情况下,机器人不应当重复询问『出发地』、『出发时间』和『目的地』。

    除了槽继承,还有一个与之相对的问题叫做槽记忆,这通常适用在被动式的话题切换中。由于解析失误,或者其他原因,使得用户跳出了原话题,当用户在一定时间内重新回到原话题时,不应让用户重复进行填槽,该技术已被用于阿里小蜜,不过他们似乎称之为『多轮状态记忆』。

    举个例子:

    我:帮我订张从杭州到北京的机票。
    VPA:请问您希望哪天出发呢?
    我:明天杭州下雨吗?
    VPA:明天杭州有雷阵雨。
    我:后天呢?
    VPA:后天杭州天气晴。
    我:机票订后天的。
    VPA:好的,已帮你预定后天从杭州到北京的机票。

    状态切换

    我们还需要思考这样一个问题,既然话题可以切换,也即一个多轮过程可以切换到另一个多轮过程,那多轮过程中的对话状态是否可以切换?

    我举两个例子:

    第一个:

    我:帮我订张机票,从杭州出发。
    VPA:请问你想去哪呢?
    我:(发现明天杭州有雷阵雨)换出发地。
    VPA:请问你想从哪出发呢?
    我:上海。

    多轮对话应当允许回到前序节点

    第二个:

    我:我想买个杯子。
    VPA:以下是为您推荐的杯子。(展示结果一)
    我:换一换。
    VPA:以下是为您推荐的杯子。(展示结果二)

    多轮对话应当允许重复进入同一节点



    作者:我偏笑_NSNirvana
    链接:https://www.jianshu.com/p/b0aa00f7095e
    來源:简书
    简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

    展开全文
  • 目录https://bot.chatopera.comChatopera 多轮对话工作机制多轮对话的定义什么场景下使用多轮对话Chatopera 多轮对话知识库意图识别脚本对话多轮对话的检索模块间检索创建脚本对话的话题话题检索顺序对话状态机擦除...

    Chatopera 为开发者提供工具,低代码或无代码上线聊天机器人。

    https://bot.chatopera.com

    本文内容节选自 Chatopera 文档中心:https://docs.chatopera.com/products/chatbot-platform/conversation/mechanism.html

    Chatopera 多轮对话工作机制

    本篇的主要目的是帮助 Chatopera 机器人平台用户从系统的角度理解 Chatopera 的多轮对话解决方案,尤其是刚刚开始认识 Chatopera 服务的新用户,待阅读本篇后,相信大家可以使用 Chatopera 机器人平台快速定制出满足各种需求的聊天机器人。

    多轮对话的定义

    Chatopera 的智能对话机器人解决方案主要面向企业在客户服务、营销和企业内部协作中使用自然语言交互完成信息查询、任务和自动化流程。目前,市场中比较常见的智能对话机器人解决方案主要是一问一答:设定问答对,使用信息检索形式,提供信息查询功能,在 Chatopera 看来,这不是智能对话机器人的体验。

    在 Chatopera,我们认为多轮对话是在一定时间内,一定交互次数内,考虑对话的上下文,每次人发送聊天内容时,机器人具备从上下文情境中分析最合理的回答,准确的为人提供回复。

    什么场景下使用多轮对话

    Chatopera 的智能对话机器人解决方案是工具,用于设计、实现和发布聊天机器人。从价值提供上,Chatopera 所面向的是封闭域聊天,更关注智能对话机器人在生产、消费和制造等领域的聊天机器人应用;在开放域聊天,尤其是以闲聊为主的应用,不是 Chatopera 智能对话机器人的关注点,虽然我们提供了标准的通用的工具,但是作为开放域聊天,在目前还没有好的技术方案,强人工智能还没有成熟,对于实际应用上,还不能大规模的提供价值。

    Chatopera 的多轮对话服务,可以面向不同行业,比如教育、电商、游戏和生产制造等。尤其是客服和企业内部协作中,将以前通过表单、人工等的服务使用自然语言对话的形式实现。应用场景比如智能客服、智能招聘面试、智能提交工单、智能提交请假、智能分析潜在客户意向等。

    Chatopera 多轮对话

    Chatopera 多轮对话解决方案的一个主要目标是以无代码、低代码的形式上线智能对话机器人,为了实现这个目标,Chatopera 将不同形式的问答技术打造为基础模块,提供每个模块的管理工具、APIs,Chatopera 机器人平台用户可以单独使用。在基础模块之上,再融合为一个多轮对话方案。目前,基础模块包括:1)以搜索引擎技术为主的知识库;2)以机器学习为主的意图识别;3)以脚本规则为主的对话脚本。其中,又以脚本规则为中心融合知识库和意图识别,这个融合的产物就是 Chatopera 多轮对话。融合多种问答技术,实现为标准的工具,提供最佳实践,是 Chatopera 机器人平台的主要特色。

    在使用 Chatopera 机器人平台时,理解基础模块的工作原理,并熟悉多轮对话的检索机制,是非常重要的,掌握了这些知识可以帮助您实现具有强大对话能力的智能对话机器人。

    目前,基础模块包括:知识库意图识别脚本对话

    知识库

    通过设定问答对实现问答,对话用户的请求文本和问答对里的标准问或扩展问比较,计算相似度,当相似度高于阀值时,即认定该问答对的答案是对话用户需要的回复。

    在 Chatopera 知识库中,支持扩展问、近义词词典、多答案和答案类型。

    在这里插入图片描述

    意图识别

    通过为每个意图添加说法和槽位,训练机器学习模型。对话用户的文本被分析为某一个意图,如果识别了意图,则计算槽位信息,并且对于没有识别到的槽位进行追问。槽位可以绑定到某个词典,Chatopera 机器人平台提供自定义词典和系统词典。自定义词典包括词汇表词典和正则表达式词典,词汇表词典主要用于处理业务上的关键字段、同义词和专有名词;正则表达式词典则用于识别手机号、身份证号、订单号、邮箱等一些具有规则的信息。系统词典是用机器学习训练的命名实体提取判定的信息,比如人名、地名、组织机构和时间等。

    在这里插入图片描述

    脚本对话

    脚本对话是通过书写 Chatopera 多轮对话脚本语法建立的规则组合实现问答。对话脚本将对话分为匹配器,即和对话用户的输入进行比较的规则;回复,匹配规则后的回复内容,支持文本和函数;上下轮钩子,将规则与规则进行关联。对话脚本中的函数,使用 JavaScript 方式低代码编程,内置函数库,即方便了系统集成,同时也提供大量自然语言处理帮助函数,不需要掌握自然语言处理 NLP 的知识,开发者可以专注的实现业务逻辑。

    在脚本匹配器语法和函数中,融合知识库和意图识别,所以,脚本对话是多轮对话的中心,围绕脚本实现不同问答技术的融合。所以,很多时候,文档和产品中,也用【多轮对话】表述脚本对话,就是这个原因。但是脚本独立构成了一个模块,在 Chatopera 机器人平台内部,实现了对话脚本引擎。

    在这里插入图片描述

    以上为各个问答模块的概述,待阅读本页内容后,可以从左侧导航菜单了解每个模块的使用详情说明。

    多轮对话的检索

    在 Chatopera 多轮对话中,理解检索顺序是熟悉多轮对话原理的关键知识点。首先是基础模块间的检索顺序,然后是对话脚本中的话题的检索顺序。

    模块间检索

    对话用户请求时,多轮对话会先从知识库检索,匹配知识库问答对,当有问答对高于知识库阀值时,机器人回复问答对中的答案内容;未匹配知识库,进入脚本对话,从话题中匹配,匹配上则回复内容;否则则回复兜底回复。有下图关系。

    在这里插入图片描述

    其中,知识库阀值默认为 0.9

    这样的检索完成了知识库和脚本对话的融合,这也是大的框架,关于知识库、脚本对话和意图识别的相互之间的调用关系,后文会有更多介绍。

    创建脚本对话的话题

    聊天机器人的多轮对话主要就是很多对话规则的组合,可以设想这些对话规则组成了一个个的话题,在对话时,可以聊一个话题,可以跳跃到其它的话题。那么,每次获得了聊天用户的文本,机器人进行答案的检索就是选择最合理的话题并找到匹配的规则,计算回复内容。

    在创建好机器人后,下载多轮对话设计器,在多轮对话设计器中,创建话题。

    在这里插入图片描述

    话题里使用脚本实现对话逻辑,用一个简单的例子说明脚本语法非常容易掌握。

    在这里插入图片描述

    + 开始的是匹配器,目前 Chatopera 多轮对话支持通配符匹配器和模糊匹配器;- 开始的是回复,目前支持文本和函数,函数是 JavaScript 脚本;% 开始的是上下轮钩子,用以关联规则。

    使用多轮对话设计器撰写对话脚本的用户体验,经过了多年的打磨,已经非常成熟和稳定。

    在这里插入图片描述

    在多轮对话设计内调试对话,现在对于多轮对话设计器还不需要详细了解,本节内容旨在介绍原理,而话题作为重要的概念,需要先介绍如何创建以及在哪里编辑。

    话题检索顺序

    每个话题包含名字和一些规则,每个规则包括了匹配器和回复,业务上有明确的上下轮依赖的规则使用上下轮钩子进行关联。

    话题检索也是有顺序的,匹配到了某一个话题的规则,后续的话题就被跳过。匹配从高优先级到低优先级进行,最高优先级是【前置话题】,话题名称为系统约定:__pre__;最低优先级是【后置话题】,话题名称为系统约定:__post__。优先级仅低于前置话题的话题是当前话题,就是上一次对话用户匹配到的规则所在的话题;其余的话题根据算法动态的排序。

    在这里插入图片描述

    如果使用了上下轮钩子,则最先匹配携带有上下文钩子(就是 % 上次回复内容)的规则。

    整体上,脚本对话在检索时,检索栈是动态变化的。

    对话状态机

    现在,我们从另一个角度,状态机的角度思考多轮对话,因为是在多个连续的交互中,完成一个对话目标,那么就存在一个状态的问题,状态机是状态可以转移的图,两个状态之间的关系通过状态机约束。比如,某个活动通知的对话状态机如下:

    在这里插入图片描述

    这是个图示,仅为了说明原理。“请求”节点代表每次对话用户发送了文本,“回复”节点代表机器人处理结果,回复文本。因为知识库在检索中最先发生,可以放入一些一问一答的问答对,而一些全局的关键词放入前置话题【__pre__】中,图中右侧方框内,则是由其他话题组成的脚本对话,整个对话构成了状态机。

    这个问题在脚本对话中,尤其需要注意:Chatopera 对话脚本引擎会考虑过去一段时间内,一定对话轮次的历史,机器人会回看这些记录来分析最合理的回复。这个时间长度和轮次的约束,在 Chatopera 机器人平台管理控制台内可以设定,是每个机器人的属性:会话回溯最大时长会话回溯最大轮次

    在这里插入图片描述

    当对话用户的输入匹配到脚本对话的规则时,即是对话到达了一个状态。

    擦除状态

    开发者在多轮对话脚本的函数中,也可以擦除这个状态,这样到下次对话用户再请求时,话题检索的栈回到初始状态,状态机回到原始,这个擦除的方法是在回复或函数中添加 {CLEAR} 前缀,关于这个知识点的使用说明见文档

    使用函数切换状态

    如果想从一个话题,切换到另外一个话题获得回复。那么可以在函数中使用 "topicRedirect(TOPIC_NAME, TOPIC_GAMBIT_ID)"。将 TOPIC_NAME 替换为话题名字,TOPIC_GAMBIT_ID 替换为匹配器。就可以切换到该规则下获得回复。

    topicRedirect 函数的更多介绍,参考文档

    知识库路由

    对于状态机的状态跳转,Chatopera 多轮对话方案中,还有一个高级方法,通过知识库路由对话到对话状态机任意状态。

    在这里插入图片描述

    设定知识库的问答对中的答案,内容使用上述格式,将 TOPIC_NAME 替换为话题名字,TOPIC_GAMBIT_ID 替换为匹配器。就可以切换到该规则下获得回复。

    关于知识库路由的更多介绍,参考文档

    总结

    恭喜您,看到文档的最后,多轮对话是不是简单易学,并且很强大?现在就开始下载多轮对话设计器,并使用 Chatopera 提供的对话模板实现您的智能对话机器人吧!

    下一步

    展开全文
  • MuTual是用于回合对话推理的基于检索的数据集,该数据集是从中文高中英语听力理解测试数据中修改而来的。请参阅我们的论文以获取更详细信息。 我们还提供了一些基准,以促进进一步的研究。 (快来了) 例子 ...
  • 基于自然语言理解与机器学习的聊天机器人,支持用户并发及自定义多轮对话
  • 面向任务的基于深度学习的多轮对话系统与技术.pdf
  • 这是一个使用ReCoSa 中引入的ReCoSa结构的多轮聊天机器人项目:Detecting the Relevant Contexts with Self-Attention for Multi-turn Dialogue Generation 。 该模型使用 self-attention 机制检测相关对话历史,...
  • 多轮对话之对话管理(Dialog Management)

    千次阅读 2019-05-16 15:55:37
    多轮对话之对话管理(Dialog Management)徐阿衡人工智能与机器学习工程师​关注她115 人赞同了该文章开始涉猎多轮对话,这一篇想写一写对话管理(Dialog Management),感觉是个很庞大的工程,涉及的知识又又杂,在...

    多轮对话之对话管理(Dialog Management)

    115 人 赞同了该文章

    开始涉猎多轮对话,这一篇想写一写对话管理(Dialog Management),感觉是个很庞大的工程,涉及的知识又多又杂,在这里只好挑重点做一个引导性的介绍,后续会逐个以单篇形式展开。

    放一张多轮语音对话流程图,理解下 DM 在整个对话流程中处于什么地位。

    简单描述一下这个流程图常见的一种信息流动方式,首先是语音识别 ASR,产生语音识别结果也就是用户话语 u_u ;语义解析模块 NLU 将 u_u 映射成用户对话行为 a_u;对话管理模块 DM 选择需要执行的系统行为a_m;如果这个系统行为需要和用户交互,那么语言生成模块 NLG 会被触发,生成自然语言或者说是系统话语 u_m;最后,生成的语言由语音合成模块 TTS 朗读给用户听。

    这一篇第一部分介绍下对话管理及重要的几个小知识点,第二部分介绍对话管理的一些方法,主要有三大类:

    • Structure-based Approaches
      • Key phrase reactive
      • Tree and FSM
    • Principle-based Approaches
      • Frame
      • Information-State
      • Plan
    • Statistical Approaches
      • 这一类其实和上面两类有交叉…不过重点想提的是:
      • Reinforcement Learning

    方法不等于模型,这里只介绍一些重要概念,不会涉及模型细节。

    Dialog Management

    对话管理(Dialog Management, DM)控制着人机对话的过程,DM 根据对话历史信息,决定此刻对用户的反应。最常见的应用还是任务驱动的多轮对话,用户带着明确的目的如订餐、订票等,用户需求比较复杂,有很多限制条件,可能需要分多轮进行陈述,一方面,用户在对话过程中可以不断修改或完善自己的需求,另一方面,当用户的陈述的需求不够具体或明确的时候,机器也可以通过询问、澄清或确认来帮助用户找到满意的结果。

    总的来说,对话管理的任务大致有下面一些:

    • 对话状态维护(dialog state tracking, DST)
      维护 & 更新对话状态
      t+1 时刻的对话状态 s_{t+1},依赖于之前时刻 t 的状态 s_t,和之前时刻 t 的系统行为 a_t,以及当前时刻 t+1 对应的用户行为 o_{t+1}。可以写成 s_{t+1} \leftarrow s_t+a_t+o_{t+1}
    • 生成系统决策(dialog policy)
      根据 DST 中的对话状态(DS),产生系统行为(dialog act),决定下一步做什么
      dialog act 可以表示观测到的用户输入(用户输入 -> DA,就是 NLU 的过程),以及系统的反馈行为(DA -> 系统反馈,就是 NLG 的过程)
      DA 的具体介绍将在 NLU 系列中展开
    • 作为接口与后端/任务模型进行交互
    • 提供语义表达的期望值(expectations for interpretation)
      interpretation: 用户输入的 internal representation,包括 speech recognition 和 parsing/semantic representation 的结果

    本质上,任务驱动的对话管理实际就是一个决策过程,系统在对话过程中不断根据当前状态决定下一步应该采取的最优动作(如:提供结果,询问特定限制条件,澄清或确认需求…)从而最有效的辅助用户完成信息或服务获取的任务。


    如图,DM 的输入就是用户输入的语义表达(或者说是用户行为,是 NLU 的输出)和当前对话状态,输出就是下一步的系统行为和更新的对话状态。这是一个循环往复不断流转直至完成任务的过程,其中,语义输入就是流转的动力,DM 的限制条件(即通过每个节点需要补充的信息/付出的代价)就是阻力,输入携带的语义信息越多,动力就越强;完成任务需要的信息越多,阻力就越强。

    一个例子

    实际上,DM 可能有更广泛的职责,比如融合更多的信息(业务+上下文),进行第三方服务的请求和结果处理等等。

    Initiative

    对话引擎根据对话按对话由谁主导可以分为三种类型:

    • 系统主导
      系统询问用户信息,用户回答,最终达到目标
    • 用户主导
      用户主动提出问题或者诉求,系统回答问题或者满足用户的诉求
    • 混合
      用户和系统在不同时刻交替主导对话过程,最终达到目标
      有两种类型,一是用户/系统转移任何时候都可以主导权,这种比较困难,二是根据 prompt type 来实现主导权的移交
      Prompts 又分为 open prompt(如 ‘How may I help you‘ 这种,用户可以回复任何内容 )和 directive prompt(如 ‘Say yes to accept call, or no’ 这种,系统限制了用户的回复选择)。

    Basic concepts

    Ground and Repair
    对话是对话双方共同的行为,双方必须不断地建立共同基础(common ground, Stalnaker, 1978),也就是双方都认可的事物的集合。共同基础可以通过听话人依靠(ground)或者确认(acknowledge)说话人的话段来实现。确认行为(acknowledgement)由弱到强的 5 种方法(Clark and Schaefer 1989)有:持续关注(continued attention),相关邻接贡献(relevant next contribution),确认(acknowledgement),表明(demonstration),展示(display)

    听话人可能会提供正向反馈(如确认等行为),也可能提供负向反馈(如拒绝理解/要求重复/要求 rephrase等),甚至是要求反馈(request feedback)。如果听话人也可以对说话人的语段存在疑惑,会发出一个修复请求(request for repair),如

    A: Why is that?
    B: Huh?
    A: Why is that? 

    还有的概念如 speech acts,discourse 这类,之前陆陆续续都介绍过一些了。

    Challenges

    人的复杂性(complex)、随机性(random)和非理性化(illogical)的特点导致对话管理在应用场景下面临着各种各样的问题,包括但不仅限于:

    • 模型描述能力与模型复杂度的权衡
    • 用户对话偏离业务设计的路径
      如系统问用户导航目的地的时候,用户反问了一句某地天气情况
    • 多轮对话的容错性
      如 3 轮对话的场景,用户已经完成 2 轮,第 3 轮由于ASR或者NLU错误,导致前功尽弃,这样用户体验就非常差
    • 多场景的切换和恢复
      绝大多数业务并不是单一场景,场景的切换与恢复即能作为亮点,也能作为容错手段之一
    • 降低交互变更难度,适应业务迅速变化
    • 跨场景信息继承

    Structure-based Approaches

    Key Pharse Reactive Approaches

    本质上就是关键词匹配,通常是通过捕捉用户最后一句话的关键词/关键短语来进行回应,比较知名的两个应用是 ELIZAAIML。AIML (人工智能标记语言),XML 格式,支持 ELIZA 的规则,并且更加灵活,能支持一定的上下文实现简单的多轮对话(利用 that),支持变量,支持按 topic 组织规则等。

    <category>
    <pattern>DO YOU KNOW WHO * IS</pattern> 
    <template><srai>WHO IS <star/></srai></template> 
    </category>
    

    <category>
    <pattern>MOTHER</pattern>
    <template> Tell me more about your family. </template>
    </category>

    <category>
    <pattern>YES</pattern>
    <that>DO YOU LIKE MOVIES</that>
    <template>What is your favorite movie?</template>
    </category>

    附上自己改写的 aiml 地址,在原有基础上增添了一些功能:

    • 支持 python3
    • 支持中文
    • 支持 * 扩展

    Trees and FSM-based Approaches

    Trees and FSM-based approach 通常把对话建模为通过树或者有限状态机(图结构)的路径。 相比于 simple reactive approach,这种方法融合了更多的上下文,能用一组有限的信息交换模板来完成对话的建模。这种方法适用于

    • 系统主导
    • 需要从用户收集特定信息
    • 用户对每个问题的回答在有限集合中

    这里主要讲 FSM,把对话看做是在有限状态内跳转的过程,每个状态都有对应的动作和回复,如果能从开始节点顺利的流转到终止节点,任务就完成了。

    FSM 的状态对应系统问用户的问题,弧线对应将采取的行为,依赖于用户回答。

    FSM-based DM 的特点是:

    • 人为定义对话流程
    • 完全由系统主导,系统问,用户答
    • 答非所问的情况直接忽略
    • 建模简单,能清晰明了的把交互匹配到模型
    • 难以扩展,很容易变得复杂
    • 适用于简单任务,对简单信息获取很友好,难以处理复杂的问题
    • 缺少灵活性,表达能力有限,输入受限,对话结构/流转路径受限

    对特定领域要设计 task-specific FSM,简单的任务 FSM 可以比较轻松的搞定,但稍复杂的问题就困难了,毕竟要考虑对话中的各种可能组合,编写和维护都要细节导向,非常耗时。一旦要扩展 FSM,哪怕只是去 handle 一个新的 observation,都要考虑很多问题。实际中,通常会加入其它机制(如变量等)来扩展 FSM 的表达能力。

    Principle-based Approaches

    Frame-based Approaches

    Frame-based approach 通过允许多条路径更灵活的获得信息的方法扩展了基于 FSM 的方法,它将对话建模成一个填槽的过程,就是多轮对话过程中将初步用户意图转化为明确用户指令所需要补全的信息。一个槽与任务处理中所需要获取的一种信息相对应。槽直接没有顺序,缺什么槽就向用户询问对应的信息。


    Frame-based DM 包含下面一些要素:

    • Frame: 是槽位的集合,定义了需要由用户提供什么信息
    • 对话状态:记录了哪些槽位已经被填充
    • 行为选择:下一步该做什么,填充什么槽位,还是进行何种操作
      行为选择可以按槽位填充/槽位加权填充,或者是利用本体选择

    基于框架/模板的系统本质上是一个生成系统,不同类型的输入激发不同的生成规则,每个生成能够灵活的填入相应的模板。常常用于用户可能采取的行为相对有限、只希望用户在这些行为中进行少许转换的场合。

    Frame-based DM 特点:

    • 用户回答可以包含任何一个片段/全部的槽信息
    • 系统来决定下一个行为
    • 支持混合主导型系统
    • 相对灵活的输入,支持多种输入/多种顺序
    • 适用于相对复杂的信息获取
    • 难以应对更复杂的情境
    • 缺少层次

    槽的更多信息可以参考填槽与多轮对话 | AI产品经理需要了解的AI技术概念

    Agenda + Frame(CMU Communicator)

    Agenda + Frame(CMU Communicator) 对 frame model 进行了改进,有了层次结构,能应对更复杂的信息获取,支持话题切换、回退、退出。主要要素如下:

    • product
      树的结构,能够反映为完成这个任务需要的所有信息的顺序
      相比于普通的 Tree and FSM approach,这里产品树(product tree)的创新在于它是动态的,可以在 session 中对树进行一系列操作比如加一个子树或者挪动子树
    • process
      • agenda
        相当于任务的计划(plan)
        类似栈的结构(generalization of stack)
        是话题的有序列表(ordered list of topics)
        是 handler 的有序列表(list of handlers),handler 有优先级
      • handler
        产品树上的每个节点对应一个 handler,一个 handler 封装了一个 information item

    从 product tree 从左到右、深度优先遍历生成 agenda 的顺序。当用户输入时,系统按照 agenda 中的顺序调用每个 handler,每个 handler 尝试解释并回应用户输入。handler 捕获到信息就把信息标记为 consumed,这保证了一个 information item 只能被一个 handler 消费。

    input pass 完成后,如果用户输入不会直接导致特定的 handler 生成问题,那么系统将会进入 output pass,每个 handler 都有机会产生自己的 prompt(例如,departure date handler 可以要求用户出发日期)。

    可以从 handler 返回代码中确定下一步,选择继续 current pass,还是退出 input pass 切换到 output pass,还是退出 current pass 并等待来自用户输入等。handler 也可以通过返回码声明自己为当前焦点(focus),这样这个 handler 就被提升到 agenda 的顶端。为了保留特定主题的上下文,这里使用 sub-tree promotion 的方法,handler 首先被提升到兄弟节点中最左边的节点,父节点同样以此方式提升。


    系统还能处理产品树中节点之间的依赖关系。典型的依赖关系在父节点和子节点之间。通常父节点的值取决于其子节点。每个节点都维护一个依赖节点的列表,并且会通知依赖节点值的变化,然后依赖节点可以声明自己是无效的并成为当前对话的候选主题。

    给一个例子,能够回应用户的显式/隐式话题转移(A1-A3, U11),也能够动态添加子树到现有的 agenda(A8-A10)。

    具体还是看论文吧
    AN AGENDA-BASED DIALOG MANAGEMENT ARCHITECTURE FOR SPOKEN LANGUAGE SYSTEMS

    Information-State Approaches

    Information State Theories 提出的背景是:

    • 很难去评估各种 DM 系统
    • 理论和实践模型存在很大的 gap
      理论型模型有:logic-based, BDI, plan-based, attention/intention
      实践中模型大多数是 finite-state 或者 frame-based
      即使从理论模型出发,也有很多种实现方法

    因此,Information State Models 作为对话建模的形式化理论,为工程化实现提供了理论指导,也为改进当前对话系统提供了大的方向。Information-state theory 的关键是识别对话中流转信息的 relevant aspects,以及这些成分是怎么被更新的,更新过程又是怎么被控制的。idea 其实比较简单,不过执行很复杂罢了。理论架构如下:

    介绍下简单的一些要素
    Statics

    • Informational components
      包括上下文、内部驱动因子(internal motivating factors)
      e.g., QUD, common ground, beliefs, intentions, dialogue history, user models, etc.
    • Formal representations
      informational components 的表示
      e.g., lists, records, DRSs,…

    Dynamics

    • dialog moves
      会触发更新 information state 的行为的集合
      e.g., speech acts
    • update rules
      更新 information state 的规则集合
      e.g., selection rules
    • update strategy
      更新规则的选择策略,选择在给定时刻选用哪一条 update rules

    意义在于可以遵循这一套理论体系来构建/分析/评价/改进对话系统。基于 information-state 的系统有:

    • TrindiKit Systems
      –  GoDiS (Larsson et al) – information state: Questions Under Discussion
      –  MIDAS – DRS information state, first-order reasoning (Bos &Gabsdil, 2000)
      –  EDIS – PTT Information State, (Matheson et al 2000)
      –  SRI Autoroute –Conversational Game Theory (Lewin 2000)
    • Successor Toolkits
      –  Dipper (Edinburgh)
      –  Midiki (MITRE)
    • Other IS approaches
      –  Soar (USC virtual humans)
      –  AT&T MATCH system

    Plan-based Approaches

    一般指大名鼎鼎的 BDI (Belief, Desire, Intention) 模型。起源于三篇经典论文:

    • Cohen and Perrault 1979
    • Perrault and Allen 1980
    • Allen and Perrault 1980

    基本假设是,一个试图发现信息的行为人,能够利用标准的 plan 找到让听话人告诉说话人该信息的 plan。这就是 Cohen and Perrault 1979 提到的 AI Plan model,Perrault and Allen 1980 和 Allen and Perrault 1980 将 BDI 应用于理解,特别是间接言语语效的理解,本质上是对 Searle 1975 的 speech acts 给出了可计算的形式体系。

    官方描述(Allen and Perrault 1980):

    A has a goal to acquire certain information. This causes him to create a plan that involves asking B a question. B will hopefully possess the sought information. A then executes the plan, and thereby asks B the question. B will now receive the question and attempt to infer A’s plan. In the plan there might be goals that A cannot achieve without assistance. B can accept some of these obstacles as his own goals and create a plan to achieve them. B will then execute his plan and thereby respond to A’s question.

    重要的概念都提到了,goals, actions, plan construction, plan inference。理解上有点绕,简单来说就是 agent 会捕捉对 internal state (beliefs) 有益的信息,然后这个 state 与 agent 当前目标(goals/desires)相结合,再然后计划(plan/intention)就会被选择并执行。对于 communicative agents 而言,plan 的行为就是单个的 speech acts。speech acts 可以是复合(composite)或原子(atomic)的,从而允许 agent 按照计划步骤传达复杂或简单的 conceptual utterance。

    这里简单提一下重要的概念。

    • 信念(Belief)
      基于谓词 KNOW,如果 A 相信 P 为真,那么用 B(A, P) 来表示
    • 期望(Desire)
      基于谓词 WANT,如果 S 希望 P 为真(S 想要实现 P),那么用 WANT(S, P) 来表示,P 可以是一些行为的状态或者实现,W(S, ACT(H)) 表示 S 想让 H 来做 ACT

    Belief 和 WANT 的逻辑都是基于公理。最简单的是基于 action schema。每个 action 都有下面的参数集:

    • 前提(precondition)
      为成功实施该行为必须为真的条件
    • 效果(effect)
      成功实施该行为后变为真的条件
    • 体(body)
      为实施该行为必须达到的部分有序的目标集(partially ordered goal states)

    计划推理(Plan Recognition/Inference, PI):
    根据 B 实施的行为,A 试图去推理 B 的计划的过程。

    • PI.AE Action-Effect Rule(行为-效果规则)
    • PI.PA Precondition-Action Rule(前提-行为规则)
    • PI.BA Body-Action Rule(体-行为规则)
    • PI.KB Know-Desire Rule(知道-期望规则)
    • E1.1 Extended Inference Rule(扩展推理规则)

    计划构建(Plan construction):

    • 找到从当前状态(current state)达到目标状态(goal state)需要的行为序列(sequence of actions)
    • Backward chaining,大抵是说,试图找到一个行为,如果这个行为实施了能够实现这个目标,且它的前提在初始状态已经得到满足,那么计划就完成了,但如果未得到满足,那么会把前提当做新的目标,试图满足前提,直到所有前提都得到满足。(find action with goal as effect then use preconditions of action as new goal, until no unsatisfied preconditions)
      backward chaining 在 NLP 笔记 - Meaning Representation Languages 中提到过。

    还有个重要的概念是 speech acts,在 NLP 笔记 - Discourse Analysis 中提到过,之后会细讲。

    更多见 Plan-based models of dialogue

    值得一提的是,基于 logic 和基于 plan 的方法虽然有更强大更完备的功能,但实际场景中并不常用,大概是因为大部分的系统都是相对简单的单个领域,任务小且具体,并不需要复杂的推理。

    Statistical Approaches

    RL-Based Approaches

    前面提到的很多方法还是需要人工来定规则的(hand-crafted approaches),然而人很难预测所有可能的场景,这种方法也并不能重用,换个任务就需要从头再来。而一般的基于统计的方法又需要大量的数据。再者,对话系统的评估也需要花费很大的代价。这种情况下,强化学习的优势就凸显出来了。RL-Based DM 能够对系统理解用户输入的不确定性进行建模,让算法来自己学习最好的行为序列。首先利用 simulated user 模拟真实用户产生各种各样的行为(捕捉了真实用户行为的丰富性),然后由系统和 simulated user 进行交互,根据 reward function 奖励好的行为,惩罚坏的行为,优化行为序列。由于 simulated user 只用在少量的人机互动语料中训练,并没有大量数据的需求,不过 user simulation 也是个很难的任务就是了。

    对话仿真的整体框架如下图:


    参考链接:
    多轮对话 multi-turn dialog for task-oriented system
    Dialog Management in Bot Framework
    AN AGENDA-BASED DIALOG MANAGEMENT ARCHITECTURE FOR SPOKEN LANGUAGE SYSTEMS
    The Information State Approach to Dialogue Management
    Plan-based models of dialogue
    对话管理的一些思考
    填槽与多轮对话 | AI产品经理需要了解的AI技术概念


    博客: shuang0420.com

    公众号: xu_a_heng

    欢迎关注公众号:
    展开全文
  • 填槽与多轮对话

    千次阅读 2019-01-21 20:27:18
    对于一个对话系统而言,上图中的 DST(对话状态维护)以及 Policy(动作候选排序),或者统一的称其为 DM...产品角度,DM 是对话机器人封闭域多轮对话体验的核心,正是一次次 DST + Policy 形成了人机间的轮...

    对于一个对话系统而言,上图中的 DST(对话状态维护)以及 Policy(动作候选排序),或者统一的称其为 DM(Dialogue Mannagement,对话管理)。也即,当接收到 NLU 模块的输出、其他场景及用户特征信息之后,判断系统应该跳转到什么状态,以及执行什么样的动作。

    产品角度,DM 是对话机器人封闭域多轮对话体验的核心,正是一次次 DST + Policy 形成了人机间的多轮对话体验。(注:倾向于将“识别用户意图之后,为了获取必要信息,与用户进行的有目的的多轮对话”称为封闭域多轮对话,区别于识别用户意图之前,为了利用上文信息,所采用的『上下文替换』、『主体补全』等技术,也即开放域多轮对话。下文提到的『多轮对话』,均指封闭域多轮对话。)

    既然多轮对话在对话机器人类产品体验中扮演着如此重要的角色,那么一个架构完备的多轮对话体系应该是什么样的。也即,多轮对话系统中,至少需要包含哪些模块,才能为用户提供一种与人人对话相去不远的人机对话体验。

    一、多轮对话

    多轮对话定义

    基本定义:什么是多轮对话? (封闭域)多轮对话是一种,在人机对话中,初步明确用户意图之后,获取必要信息以最终得到明确用户指令的方式。多轮对话与一件事情的处理相对应。

    补充说明1:所谓『必要信息』一定要通过与用户的对话获取吗? 不一定,即便是人与人之间的交流,对话本身所包含的信息也只占总传递信息量的小部分,更多信息来源于说话人的身份、当前的时间/地点等一系列场景信息。所以多轮对话的信息获取方式,也不应当只局限于用户所说的话。

    补充说明2:多轮对话一定在形式上表现为与用户的多次对话交互吗? 不一定,如果用户的话语中已经提供了充足的信息,或者其它来源的补充信息已足够将用户的初步意图转化为一条明确的用户指令,那就不会存在与用户的多次对话交互。

    以上,是针对多轮对话整体定义问题的回答,每个模块的相关定义会在下文尝试给出。

    二、槽

    1、槽(slot)

    基本定义:什么是槽? 槽是多轮对话过程中将初步用户意图转化为明确用户指令所需要补全的信息。一个槽与一件事情的处理中所需要获取的一种信息相对应。

    补充说明:多轮对话中的所有的槽位都需要被填充完整吗? 不一定,以如下对话为例——

    我:『去萧山机场多少钱』 

    出租车司机:『70』

    对话中的『70』,应当被理解为70元人民币,而不必再去追问:『你说的是人民币、美元、日元还是港币?』。这类信息应当以默认值的形式存在,也即槽有必填非必填之分,与上文所说的『信息未必需要通过与用户的对话获取』相对应。

    2、词槽与接口槽

    上文反复的提到,对话内容并不是获取信息的唯一方式,用户身份以及当前场景也包含着大量值得被利用的隐含信息。所以,与此相对的,一个完备的多轮对话体系应当同时具备从用户话里以及话外获取信息的能力。

    可以将“利用用户话中关键词填写的槽”叫做词槽,“利用用户画像以及其他场景信息填写的槽”叫做接口槽

    举个例子,我讲『我明天要坐火车去上海』。其中,分别将『明天』、『上海』填入名为『出发时间』、『目的地』的词槽中,而我当前所在的位置,则填入到了名为『出发地』的接口槽中。

    3、槽组与槽位

    可以将“利用用户话中关键词填写的槽”叫做词槽,“利用用户画像以及其他场景信息填写的槽”叫做接口槽

    举个例子,我讲『我后天要坐火车去上海』。其中,分别将『后天』、『上海』填入名为『出发时间』、『目的地』的词槽中,而我当前所在的位置,则填入到了名为『出发地』的接口槽中。

    不知道上文错的如此离谱的结论,有没有引起你的注意:

    仔细读一遍上面举的例子,就会发现一个很严重的矛盾点:难道『出发地』这个槽不能由用户指定?用户完全可以说『我后天要坐火车从北京去上海』,那它是词槽还是接口槽?而且更进一步的,难道只能用『我当前所在的位置』来填入『出发地』这个槽中?比如,如果能读到我的日程表,发现我明天会去杭州,那是不是就应该用『杭州』而不是『我现在所在的位置』来填『出发地』这个槽了?

    从中我们能发现什么呢?同一个槽,可能会存在多种填槽方式

    我将可能包含多种填槽方式的称为槽组,槽组下面可能存在任意多个槽位,也即任意多种填槽方式,而每个槽位又都对应着『词槽』与『接口槽』两种槽位类型之一。

    本质上来讲,槽组(也即上文中提到的『槽』),对应着一种信息,而几乎不会有哪种信息的获取方式只有一种。所以一个『槽』会同时对应多种填槽方式也就是自然而然的了。

    依照上文,同一种信息会有多种获取方式,也即同一个槽组会对应多种填槽方式(槽位)。那不同填槽方式之间必然会存在优先级的概念。

    就如同上文『订票』的例子,『出发地』槽包含三种填写方式,一种词槽、两种接口槽,自然的,词槽的优先级最高,『日程表中隐含的出发地』次之,『我当前所在的位置』再次。

    如果将其与前文提到过的必填/非必填结合起来,其填槽过程应当遵循以下步骤:

    • 尝试填写词槽
    • 若失败,尝试填写第一接口槽『用户日程表中隐含的出发地』
    • 若失败,尝试填写第二接口槽『用户当前所在位置』
    • 若失败,判断是否该槽必填
    • 若必填,反问用户,重填词槽 *若非必填,则针对该槽组的填槽过程结束

    我们需要知道,必填/非必填在逻辑上与槽组而不是槽位平级,只有信息才会分为必要/非必要,填槽方式不做这种区分。而且是否必填实际上与接口槽无关,只取决于是否需要与用户进行交互。

    4、澄清话术

    槽组(也即与一种信息)平级的概念还有一个,叫做澄清话术

    澄清话术是对话机器人希望获取某种信息时所使用的问句。比如『目的地』对应的澄清话术就是『您想从哪出发呢?』,『出发时间』对应的澄清话术就是『您想什么时间出发呢?』。

    显而易见的,澄清话术与槽组而不是槽位平级。

    5、槽的填写

    上文讲到,一个槽组可能会有多个槽位,槽位存在词槽接口槽之分。

    先说词槽。

    词槽信息的抽取其实还是有些麻烦的,不过这属于解析的问题,不在本文探讨的范围内,这里只是简单提一下,举两个例子:

    • 用户表达『不』,可能会有『不行』、『不是』、『算了』、『没有』等一系列说法。
    • 用户话中有多个符合条件的关键词,我们整套多轮对话中有多个槽,每个槽填一个还是多个值?哪个槽与哪个词对应

    同义词典、规则、双向LSTM+CRF,各有各的方法。

    再说接口槽。

    接口槽与词槽相比,额外存在一个问题,就是:接口返回的结果就是用户需要的结果吗?

    这里需要分成两种情况来讨论,一种是:我们明确知道接口的返回值可以直接填入槽位(不是槽/槽组)中,不需要向用户确认

    特别的,这里还要明确一点,即便是上述情况,也并不意味着当前槽/槽组只有该特定接口槽这一个槽位。有两种情况存在:一种是该槽组下只有这一个槽位,该接口的返回值直接填入槽位中,也相当于填入了槽/槽组中;或者该槽位下有多个槽位,接口槽的填入值并不一定最终作为槽/槽组的填入值。

    另一种是:我们知道接口的返回值只能作为参考,需要用户的协助才能进行槽位的填写

    这种情况下,需要提供选项,让用户最终决定该槽位的填入值,与词槽一样,这里同样需要处理单值/多值的问题。单值/多值在逻辑上与槽组平级。

    此外,这里还要注意一个否认选项的问题,比如我对阿里小蜜说,我忘记密码了,它会通过接口拿到我的当前账号,然后将其提供选项给我,问『你是忘记了哪个账号的密码?』,不过,除了我当前账号之外,还有一个选项也被提供出来了,就是『不,不是这个账号』。

    这代表了一类问题的存在,用户的意图并不一定包含在接口的全部返回值之中。所以就必然会有这样一种类似『不要/不是/不』的选项,我将其叫做否认选项

    户选择否认选项后,即意味着该槽位的填写失败了,需要填入一个特殊值代表失败。用户选择否认选项的失败,可以与接口调用失败等其它意外情况合并处理,因为这都意味着该槽位填写失败,意味着该种信息获取方式未能成功获取信息

    如果该槽组下只有这一个槽位,这个特殊的失败表征值就应当作为整个槽组的填入值,如果还有其他槽位值,则根据槽位间优先级最终确定槽组填入值。

    6、平级槽和依赖槽

    上面说到底都在讲一个槽组的填写,也即一种信息的获取,但多轮对话的目的是将初步用户意图转化为明确用户指令,这其中所需要的信息通常都不只有一种。

    谈完了槽组与槽位之间的关系,接下来谈一下槽组与槽组之间的关系,也即信息与信息之间的关系。

    为了便于理解,举两个例子来代表两种多轮对话中所包含的极端情况。

    第一种:订车票,你需要知道用户出发的时间、地点、目的地、座位种类。这四个槽组之间,没有任何依赖关系。换言之,你只需要确定好这四个槽组中必填槽组之间的澄清顺序,接收到用户问句后,对还未填充完成的必填槽组依次进行澄清即可。我将这四个槽组之间的关系称为平级槽关系

    另一种,不知道读者玩没玩过橙光,或者其它多结局的剧情类游戏。它们的特点是什么呢?每一个选择都会有影响到后续剧情发展也即 每个槽组的填写结果会影响其它槽组的填写。换言之,部分槽组依赖前序槽组的填写结果,在其依赖的前序槽组填写完成之前,该槽组都无法进行填写。我将槽组间的这种关系称为依赖槽关系

    这种情况下,整个多轮对话过程就形成了一棵树,极端情况下,这棵树是的。树上的每个节点放置着一个会对后续对话走向产生影响的槽组

    槽关系的选择要根据实际业务场景来确定。

    如果错将平级槽采用依赖槽关系来管理,就会出现信息的丢失。比如 A、B、C,三者本为平级槽关系,但却将其用 A->B->C 的依赖槽关系来管理,那即便用户问句中包含填写 B、C 槽组的信息,也可能会由于 A 槽组的未填写而造成 B、C 槽组的填写失败。

    如果错将依赖槽采用平级槽的关系来管理,就会出现信息的冗余,比如 A、B、C三者的关系为 A、A1->B、A2->C,那即便用户将值 A1 填入槽组 A 后,却仍然需要向用户询问本不需要的 C 槽组的填写信息。

    上述两种情况属于全平级槽关系全依赖槽关系的特殊情况,在实际的业务场景中,这两种关系会是同时存在的,不同槽组间,既有平级槽关系,又有依赖槽关系。

    实际业务场景中,完整的多轮对话过程通常会以的形式存在,每个节点存在一个或多个槽组,用于获取一种或多种信息,节点间的槽组为依赖关系,节点内的槽组为平级关系

    上文将多轮对话定义为一件事情的处理,槽组/槽定义为一种信息的获取,槽位定义为信息的一种获取方式。这里我倾向于将多轮对话树结构中的一个节点定义为处理事情的一个步骤

    一件事情的处理包含多个步骤,每个步骤中需要补全一种或多种信息,每种信息存在一种或多种获取方式。

    7、填槽意义

    结合上文,我们需要了解到,填槽的意义有两个:作条件分支多轮对话作信息补全用户意图。换言之,填槽不仅是补全用户意图的方式,而且前序槽位的填写还会起到指导后续信息补全走向的作用。

    8、准入条件

    上文我们讲到,完整的多轮对话过程通常会以的形式存在,树中包含多个节点,代表处理这件事情的一个步骤

    而每个节点,都应当有其特别的准入条件。树的根节点往往需要限制 NLU 模块的输出,也即明确什么样的用户意图将会由该棵多轮对话树来处理;树的中间及叶子节点往往需要根据前序槽组的填槽结果以及其他背景信息进行条件限制。(如果将所有信息,比如 NLU 模块输出,或是其他背景信息都看做前序槽组的填写结果,那就能得到统一的槽组-条件-槽组-条件······形式,槽组用于获取信息,条件用于信息限制

    我尝试从两个角度来描述一套完备的准入条件体系。

    一个是多条件的组织形式,准入条件在逻辑上应该支持条件间的与或非,百度的 UNIT 平台提供了一种相对成熟的组织形式,将准入条件整体划分为条件条件组,条件包含在条件组中,组内条件间是关系,条件组之间是关系(当然这里的且与或可以根据自身业务情况对调),条件本身支持关系。

    一个是单条件的限制能力,准入条件应当同时支持对前序槽组填写值、填写方式、填写状态进行限制。也即需要有针对值的条件针对类型的条件针对状态的条件。简单的讲,状态就是『填了吗』,类型就是『谁填的』,值就是『填了什么』。

    不同业务场景下我们会需要不同角度的限制条件。比如,上文中提到填槽的意义包含两种:作条件分支多轮对话作信息补全用户意图,如果仅仅作信息,那我们通常就只关心『填了吗』,只要填写完成就进行后续步骤,并不关系『谁填的』以及『填了什么』;但是如果槽组内的填入值会影响后续多轮对话走向,那我们就倾向于通过槽组的填入方式填入值来作多轮对话的分支。

    三、答案系统、话题切换和状态切换

    1、答案系统

    先明确一个观点,多轮对话树的节点属于对话节点而不是答案节点同一份答案可能会出现在多个对话节点中

    答案系统和多轮过程应当是解耦的,答案系统中的每份答案都应当设置好自己的触发条件。举个例子,若存在 ABC 三个槽,A=A1、B=B3、C=C1 提供答案一,A=A2、B=B1、C=C2 或 A=A3、B=B2、C=C1 提供答案二。

    另外,答案的种类也不应仅局限于文本,富文本、接口、话题切换,都可以视为合理的答案形式。

    2、话题切换

    话题切换指用户与用户的对话从一个多轮过程切换至另一个多轮过程,话题切换有主动切换被动切换之分。

    上文提到的作为答案的话题切换,就可以理解为主动的话题切换

    被动的话题切换是指,系统发现无法从用户的问句中抽取信息以继续当前的多轮对话,只好将其作为一条全新的问句重新进行解析和话题识别

    话题切换,尤其是主动的话题切换会涉及到一个新问题:槽继承。举个例子——

    我:『我明天要坐高铁从杭州到北京』 

    我:『算了,还是坐飞机吧』

    这种情况下,机器人不应当重复询问『出发地』、『出发时间』和『目的地』。

     

    除了槽继承,还有一个与之相对的问题叫做槽记忆,这通常适用在被动式的话题切换中。由于解析失误,或者其他原因,使得用户跳出了原话题,当用户在一定时间内重新回到原话题时,不应让用户重复进行填槽,该技术已被用于阿里小蜜,不过他们似乎称之为『多轮状态记忆』。

    举个例子——

    我:帮我订张从杭州到北京的机票。 

    VPA:请问您希望哪天出发呢? 

    我:明天杭州下雨吗? 

    VPA:明天杭州有雷阵雨。 

    我:后天呢? 

    VPA:后天杭州天气晴。 

    我:机票订后天的。 

    VPA:好的,已帮你预定后天从杭州到北京的机票。

    3、状态切换

    我们还需要思考这样一个问题,既然话题可以切换,也即一个多轮过程可以切换到另一个多轮过程,那多轮过程中的对话状态是否可以切换?

    举两个例子——

    第一个:

    我:帮我订张机票,从杭州出发。

    VPA:请问你想去哪呢? 

    我:(发现明天杭州有雷阵雨)换出发地。 

    VPA:请问你想从哪出发呢? 

    我:上海。

    多轮对话应当允许回到前序节点

    第二个:

    我:我想买个杯子。 

    VPA:以下是为您推荐的杯子。(展示结果一) 

    我:换一换。 

    VPA:以下是为您推荐的杯子。(展示结果二)

    多轮对话应当允许重复进入同一节点

    展开全文
  • 多轮对话——检索式

    千次阅读 2019-06-21 14:12:15
    针对近几年检索式多轮对话论文阅读和整理且基本在github有开源代码
  • 天气查询机器人:多轮对话示例程序
  • 对话机器人,包含了看图说话,单轮对话和多轮对话,使用tensorflow 2.0 pytorch 1.3.1 GPT-2 开发环境 - flask==1.0.2 - tensorflow==2.0.0 - pytorch==1.3.1 - sklearn==0.19.2 - scipy==1.4.1 - numpy==1.18.5 - ...
  • 多轮对话系统

    千次阅读 2018-08-09 10:14:15
    主要包含的模块有:wake up、 ASR 、NLU、 DM 、NLG 、TTS 关键技术: (1)wake up:匹配到唤醒词后进入工作状态。...针对预定电影票的多轮对话系统: https://github.com/xiaoqian19940510/TC-Bot
  • 欢迎关注【百度NLP】官方微信公众号,及时获取更自然语言处理领域的技术干货!...Domain Conversation Generation》进行解读,该论文提出用图的形式捕捉对话转移规律作为先验信息,用于辅助开放域多轮对话
  • rasa搭建多轮对话系统(一)

    千次阅读 2019-07-12 20:58:03
    story文件定义了聊天流程模板,多轮对话按照模板进行对话,story中有意图和行为,意图决定了返回什么行为。 domain则是定义了意图有哪些,行为有哪些,行为的具体内容是什么。 story、domain、nlu文件之间的关系...
  • 多轮对话改写

    2020-12-31 22:45:41
    1、什么是改写 ...《Transformer多轮对话改写实践》博客一文中介绍道,可以通过3种策略来实现;比较生成文本和参考文本之间重叠的一元字数,二元字数;根据最长公共子序列得出; 3、参考论文和github ...
  • 文 | 苏剑林 编 | 兔子酱 前段时间刷Arixv的时候,发现清华大学开源了一个大规模的中文闲聊语料库LCCC,从开源的文件上来看,这可能是目前开源的数量最大、质量最好的闲聊语料库了,而且还包含了部分多轮对话聊天,...
  • 上一篇内容带大家入门rasa,但是...这是可以实际应用的多轮对话项目demo,要想真正应用到实际项目中这些还是远远不够的,后面会慢慢介绍 在实体识别 意图识别等可优化的地方,gpu利用率低等问题。请关注后续内容。
  • 百度UNIT 机器人多轮对话技能创建以及API调用

    千次阅读 热门讨论 2019-03-01 11:10:13
    百度UNIT 机器人多轮对话技能创建以及API调用 基于百度UNIT2.0 版本,实现简单的轮人机对话功能 创建机器人必备条件 确定有哪些技能 例如:查询天气、订票、讲故事等,以畅越冰激凌套餐营销话术为例 ...
  • 任务型多轮对话

    2020-01-15 13:17:20
    语音识别是一个门学科交叉的学科。首先,我们知道声音实际上是一种波。常见的mp3、wmv等格式都是压缩格式,必须转成非压缩的纯波形文件来处理,比如Windows PCM文件,也就是俗称的wav文件。wav文件里...
  • NLP多轮对话研究

    万次阅读 2018-09-10 20:41:15
    NLP学习 今天都在学习NLP的内容,现将今天学习和阅读过的一些不错的...语法与句子的结构,基于多轮对话俩进行分析合并,填充句子结构,并基于句子结构来分析其语义和意图 参考资料 NLP杂谈(一):chatbot与轮...
  • 槽 词槽 多轮对话

    2019-07-18 17:10:32
    参考:https://www.jianshu.com/p/28df2c96695a
  •     最近2019年新鲜的ACL论文出来了,发现了一篇关于多轮对话模型的文章还不错,其题目为:Improving Multi-turn Dialogue Modelling with Utterance ReWriter。文章单位:微信人工智能模式识别中心(腾讯)。...
  • 行业分类-物理装置-多轮对话方法和装置.zip

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 22,961
精华内容 9,184
关键字:

多轮对话