多轮问答引擎

随着科技的发展,人工智能技术的应用为人们的日常生活带来了各种便利。比如,当前的智能问答可以实现用户与机器或系统之间的交流。然而,当前的智能问答多是一问一答的形式。即,用户向机器或系统提出问题,机器或系统给出针对该问题的回复。例如,用户说“我买了件衣服,是否可以退?”,针对这个问题的回复是带有条件(比如,是否拆包;是否水洗)的;如果没有“拆包”,则回复是“没有拆包是可以直接申请退货的”,如果“拆包”了,且没有“水洗”,则回复是“拆包了但没有水洗,7天内也是可以直接申请退货的”,如果“拆包”了,而且“水洗”了,则回复是“衣服水洗过是不能退货的”;此时,针对用户的问题,机器或系统给出的回复如下:“您好,如您购买的衣服1)没有拆包,请直接申请退货;2)如果拆包了,但没有水洗,7天内也是可以直接申请退货的;3)如果拆包了且水洗了,则不能退货”。

由此可见,在“一问一答”的模式下,针对用户的一个问题,会给出一个答案,并把所有条件下的不同处理方式都一次性回复给用户;上述模式对于用户而言,需要阅读并理解大量内容,然后才能结合实际情况找到所需的答案,繁琐且不直观,导致用户体验不佳。本文提出一种多轮问答的模式,试图在明确用户的意图情况下,直接给出最精准的答案。

1. 算法描述

本节描述了一种智能问答的实现方法,包括:获取第一输入信息;对所获取的第一输入信息进行识别,确定预定问题,其中,预定问题是指不同条件组合下对应不同答案的问题,每个条件组合中包括一个或多个条件;开始进行对于所确定的预定问题的第一轮问答;在每一轮问答中分别进行以下处理:输出对于所确定的预定问题的一个未知条件的提问,获取用户答复的条件;根据预定的条件组合和答案之间的对应关系,判断已获取的条件的组合是否存在对应的答案;如果存在,则输出已获取的条件的组合所对应的答案;如果不存在,则进行下一轮问答。

1.1 获取第一输入信息

对所获取的第一输入信息(question)进行识别,确定预定问题,其中,所述预定问题是指不同条件组合下对应不同答案的问题,每个条件组合中包括一个或多个条件。通过计算所述第一输入信息与预定文件中的每个预定问题之间的语义相似度;确定与所述第一输入信息之间的语义相似度满足预定范围的预定问题。进而开始进行对于所确定的预定问题的第一轮问答。在每一轮问答中分别进行以下处理:输出对于所确定的预定问题的一个未知条件的提问,获取用户答复的条件;根据预定的条件组合和答案之间的对应关系,判断已获取的条件的组合是否存在对应的答案;如果存在,则输出已获取的条件的组合所对应的答案;如果不存在,则进行下一轮问答。

其中,当确定出与所述第一输入信息之间的语义相似度满足预定范围的预定问题为多个时,从所确定出的多个预定问题中,选择与所述第一输入信息最匹配的预定问题。所述预定文件中包括一个或多个键值key-value对,在每个键值对中,键key用于存储预定问题,值value用于存储与预设问题对应的对话标识。根据所确定的预定问题对应的对话标识,从预先设置的对话文件中确定所述对话标识对应的对话任务,根据所述对话任务,进行所确定的预定问题的第一轮问答。

该部分使用的主要技术包括利用paraphrase模型对question进行embedding,继而计算与候选预定问题的embedding计算相似度。

1.2 获取第二输入信息

在每一轮问答中,在输出对于所确定的预定问题的一个未知条件的提问之后, 通过预先设置的CFG Grammar,获取用户答复的条件(attribute understanding)。

当获取到用户输入的无效信息时,输出对于所确定的预定问题的所述未知条件的提问。若输入命中其他预定问题时,则处理新的预定问题。在连续N次输出对于所确定的预定问题的同一个未知条件的提问之后,获取到用户输入的无效信息时,输出预定提示信息,其中,N为正整数。

当识别到所获取的第二输入信息为新的预定问题时,输出对于所识别的预定问题的一个未知条件的提问,其中,所述预定问题是指不同条件组合下对应不同答案的问题,每个条件组合中包括一个或多个条件;

当识别到所获取的第二输入信息为所识别的预定问题的条件时,根据所述预定问题的条件组合和答案之间的对应关系,判断已获取的条件的组合是否存在对应的答案;如果存在,则输出已获取的条件的组合所对应的答案;如果不存在,则输出所述预定问题的一个未知条件的提问。

1.3 输出答案

在所述接收模块接收到用户输入的预定问题后,输出所述预定问题的一个未知条件的提问;其中,所述预定问题是指不同条件组合下对应不同答案的问题,每个条件组合中包括一个或多个条件;

在输出所述预定问题的一个未知条件的提问后,在所述接收模块接收到用户答复的条件后,输出所述预定问题的已获取的条件的组合所对应的答案,或者,输出所述预定问题的另一个未知条件的提问。

  该部分使用的主要技术为Dialogue management技术。

多轮问答引擎

1.4 Intent refiner

在系统给出未知条件的提问时,用户有可能会发起新的问题;同时用户在发起新问题时也可能说出了部分或全部条件,此时Intent refiner会来做预定问题及条件的merge。

2. 实例说明

本实例以电商客服场景下的智能问答过程为例。本实例中,以预定问题为“我要提醒发货”为例说明针对这个问题的问答过程。针对这个问题,在购买途径为普通购买条件下,对应的答案为:下单后会在24小时为您发货,建议耐心等候;在购买途径为活动页条件下,对应的答案为:活动商品下单后两天内为您发货,建议耐心等候。

2.1 预置问题文件

本实例中,预先设置的预定文件(下面可以记为QA-pairs文件)如表1所示。

表1

ID KEY VALUE
1 我要提醒发货 {"domain":"QA","intent":"qa-001"}
2 帮我提醒下发货 {"domain":"QA","intent":"qa-001"}
3 我要退货 {"domain":"QA","intent":"qa-002"}
4 买了个东西,想把它给退了 {"domain":"QA","intent":"qa-002"}

QA-pairs文件为键值(key-value)对,key为预定问题,value为对应预定问题的结构化数据,value可以为json string格式,然而,对此并不限定。Id为键值对的标号。

其中,json string格式指JavaScript 对象表示法(JavaScript Object Notation)的字符串格式。

例如,当用户的输入信息为“要提醒发货”时,根据语义相似度计算过程,可以确定用户的输入信息和表1中的Id1“我要提醒发货”最匹配,则可以得到用户的输入信息对应的value为:

     {"domain":"QA","intent":"qa-001"};

其中,"domain":"QA"表示问答场景,"intent":"qa-001"表示Id1的预定问题对应的对话标识为qa-001。

比如,表1中Id=1和Id=2都是说提醒发货,它们对应的value的意图(intent)都是qa-001;Id=3和Id=4都是说退货,它们对应的value的intent都是qa-002。可以理解为,提醒发货对应的对话标识为qa-001,退货对应的对话标识为qa-002。qa-001和qa-002分别可以对应到对话中不同的对话任务(task)。

2.2 多轮条件理解

本实例中,预先设置的Semantic Grammars如下所示:

<purchase_way>=([我买的][是](活动[页]|普通){purchaseWay}商品){Domain.QA};

<order_status>=([我的]订单状态是(等待付款|交易关闭|售后中|售后完成|交易完成|已发货){orderStatus}){Domain.QA};

比如,当用户回答说“我买的是活动商品”时,Grammar引擎会命中这一条语法,命中后输出的结构化内容如下所示:

{"domain":"QA","slots":{"购买途径":"活动"}};

其中,"domain":"QA"表示问答场景,"slots":{"购买途径":"活动"}表示一个条件:购买途径为全球购。

2.3 对话管理Script

本实例中,预设的对话文件描述多个对话任务指示的对话流(task flow)。每个对话任务可以体现相应的预定问题的条件组合和答案之间的对应关系。其中,预先设置的对话文件如下所示:

<Task name="qa-001" entry="qa-001_init">
  <Steps>
    <Step name="qa-001_init">
      <Item>
        <ConditionGroup>
          <Condition func="domain" expected="QA" />
          <Condition func="intent" expected="qa-001" />
        </ConditionGroup>
        <Action goto="ask_purchase_way" />
          </Item>
        </Step>
        <Step name="ask_purchase_way">
          <Item>
            <ConditionGroup>
              <Condition func="accessTime" params="ask_purchase_way,>=,3" />
            </ConditionGroup>
            <Action display="ShowText" goto="@end" />
            <LG type="spoken">真的很抱歉,重头再来吧。</LG>
          </Item>
          <Item>
            <ConditionGroup>
              <Condition func="slot" params="purchaseWay" expected="活动页" />
            </ConditionGroup>
            <Action display="ShowText" goto="@end" />
            <LG type="spoken">活动商品下单后两天内为您发货,建议耐心等候。</LG>
          </Item>
          <Item>
            <ConditionGroup>
              <Condition func="slot" params="purchaseWay" expected="普通" />
            </ConditionGroup>
            <Action display="ShowText" goto="@end" />
            <LG type="spoken">下单后会在24小时为您发货,建议耐心等候。</LG>
          </Item>
          <Item>
          <Action display="ShowText" />
            <LG>你是普通购买还是活动页的商品?</LG>
          </Item>
        </Step>
      </Steps>
</Task>

上述举例的对话文件中包括一个对话任务,其中,Task表示对话任务,Step表示步骤,Condition表示条件,ConditionGroup表示包括一个或多个条件的条件组合;Action表示执行的动作;Item表示条款,说明一个对话中的多种执行情况;LG表示输出的语言,本实例中,以自然语言生成。

2.4 过程说明

结合本实例中预先设置的预定文件、Semantic Grammars以及对话Script,举例说明问答过程。

用户的输入信息为“我要提醒发货”,根据预定文件(表1),通过释义技术对输入信息进行识别,可以得到结果为{"domain":"QA","intent":"qa-001"},满足对话文件中的Step为qa-001_init中第一组Condition,因此,可以执行以下Action:,进入到,并命中下面的无条件组:

            <Item>
                <Action display="ShowText" />
                <LG>你是普通购买还是活动页的商品?</LG>
          </Item>

于是,执行,输出“你是普通购买还是活动页的商品?”。

在一种情况下,针对“你是普通购买还是活动页的商品?”,用户的输入信息为“我买的是活动商品”,通过Semantic Grammars引擎对输入信息进行理解,可以得到结果为{"domain":"QA","slots":{"购买途径":"活动页"}},此时,对话还在中,命中条件,于是执行结束该任务,并输出“活动商品下单后两天内为您发货,建议耐心等候”。

在另一种情况下,针对“你是普通购买还是活动页的商品?”,用户随便输入“哈哈哈哈”, 通过Semantic Grammars引擎无法理解此时的输入信息,此时,对话还在中,命中最后一个无条件组,执行,输出“你是普通购买还是活动页的商品?”;如果用户继续随便说,则会导致在的停留次数大于或等于3,则会命中,此时,执行结束,并输出“真的很抱歉,重头再来吧。”

在另一种情况下,针对“你是普通购买还是活动页的商品?”,用户输入“我要退货”,根据预定文件对输入信息进行识别,可以得到结果为{"domain":"QA","intent":"qa-002"},则会进入到qa-002的对话任务(task)中,从而打断。

上述对话过程仅为举例。于实际应用中,可以根据实际情况设置对话任务和对话文件。

本实施通过对话管理方式,让机器模拟使用自然人的对话方式,从而提高用户体验。

上一篇:【webpack】webpack-dev-server生猛上手——让我们来搭一个webpack的微服务器吧!


下一篇:[流媒体]实例解析MMS流媒体协议,下载LiveMediaVideo[2]