智能语音平台:技能搭建与多轮交互

AI时代,如何更快入行抢占红利得高薪?前阿里巴巴产品专家带你15天入门AI产品经理。了解一下>

通过本文内容,你将了解在搭建智能语音平台的过程中,如何搭建一个技能以及支持不同的意图,他们的本质和边界是什么?

接下来我将从这几方面进行展开:

  1. 了解语音全流程框架
  2. 意图的组成部分
  3. 多轮交互

一、语音全流程框架图

首先,简单说一下语音交互的全流程的概念:

ASR(Automatic Speech Recognition):接收音频返回字符串,可以根据不同的场景模式来定制ASR,比如智能冰箱语音ASR要更多的优化菜品种类等相关词语的识别,车载语音ASR就要更加关注有声内容的识别以及控制相关的词语识别。

例如:冰箱食材管控技能,说法“枣吃完了”,但是误识别成了“早吃完了”,就需要针对食物种类识别进行加强优化。

NLU(Natural Language Understanding):通过一系列手段从识别出来的句子中抽取关键词,进行语义标识。

例如:“枣吃完了”,“枣”就代表食物种类,“吃完了”就代表食物数量为0。

DM(Dialog Management):为对话系统的主体,控制着对话的架构和结构,从ASR/NLU组件接受输入,维护一些状态,与任务管理器(知识库)交互,并将输出传递给NLG/TTS模块。

例如:“枣吃完了”,首先需要把冰箱里面的枣的数量置为0,“再去苏宁小店买2斤”,然后依据上文的输出以及本轮的输入去补全词槽,根据上文的食物种类“枣”,然后提取“苏宁小店”,“2斤”,“买”结合起来自动在苏宁小店购买2斤枣,这就是DM需要完成的事情。

二、意图的组成部分

2.1 基础概念

意图:用户的每一轮对话,都可以认为是一个意图,如“北京市今天天气怎么样”就对应着意图【查询天气】。

语意槽:即从用户说法中提取出的关键字,如“我要去上海”,语意槽就是#地址#,取值“上海”。

2.2 意图的必要和必填参数

语音输入怎么触发意图,把相关的意图说法尽可能对应上设定的意图,把不相关的说法阻挡,本质上就是一个边界问题。

首先,跟着我来思考一下想要去上海旅游的话,应该怎么表达?

A:我想去旅游。

B:明天我想去上海旅游。

C:明天我想从北京去上海旅游。

D:我想飞到上海旅游。

句式A:有两个必要信息,“去”,“旅游”。

句式B:有两个必要信息,“去”,“旅游”;非必要信息“上海”“明天”(为什么明天和上海相比另外两个信息而言是非必要呢?因为没了非必要信息,两个必要信息也能明白意图,但是没了两个必要信息的其中一个,就不能理解意图)。

句式C:有两个必要信息,“去”,“旅游”;非必要信息“明天”,“北京”,“上海”。

句式D:有两个必要信息,“飞到”,“旅游”,非必要信息“上海”。

为什么定义“去”和“旅游”是必要信息呢?

如果你单说旅游的话,可能有旅游杂志,旅游景点,旅游指南等多种意图,但是如果你加上了“去”,那就代表你想去旅游,是一个出行计划类意图。

如果你单说去的话,可能有去吃饭,去购物,去旅游等多种意图,但是如果你加上了“旅游”,那就代表你想去旅游,是一个出行计划类意图。

为什么定义“上海”,“北京”“明天”是必填信息呢?

触发了去旅游的意图后,需要有出发地点、目的地,以及时间等必填参数才能完成服务,所以“目的地”“出发地”“时间”成为意图的两个“必填槽位”。

必要参数下面的“必要”和“必填”他们要解决的问题在本质上是不一样的。

  • “必要”是针对某说法能够匹配到某个意图,它的本质是“边界判断”,作用是对意图进行分类和句式匹配。
  • “必填”是在意图已经确定的情况下,去请求后续服务的“必填参数”。

我们可以总结如下,一句话的信息可以按照“信息类型”和“必要要素”来划分:

  1. 必填槽位信息,比如“上海”“北京”
  2. 必要意图信息,比如“去”“旅游”
  3. 非必填槽位信息
  4. 非必要意图信息

所以,在配置意图句式的模块,对于是否触发意图这个边界而言,“必要要素”是可以不含有解析框架中的任何槽位的,但是必须包含必要意图信息。

但是,对于一条完整的意图句式,一定要包含必要意图和必要槽位两个信息,必要槽位的信息可以有默认设置。

2.3 意图句式

我们再来看一下这几个例句:

A:我想去旅游

B:明天我想去上海旅游

C:明天我想从北京去上海旅游

D:我想飞到上海旅游

A和B的区别在于:仅仅在“去{上海}旅游”之间加了一个地名。

B和D的区别在于:“去”和“飞到”的表达差别。

这样我们就可以得出一个结论:在一个句式中,我们把必要意图信息按照顺序排列好的基础边界句式,只要符合这个边界的句式,全部可以匹配到这个意图。

后续的工作就是把一些“非必要信息”配置上去以覆盖更多的句式,比如必要意图信息“去”“旅游”,非必要意图信息“上海”,“明天”,就可以组成句式如:

  • {时间}去旅游。
  • 去{地名}旅游。
  • {时间}去{地名}旅游。
  • {时间}飞{上海}旅游。

在原有必要要素组成的基础句式基础上面,我们可以增加非必要要素的配置、排列组合和词库等,衣服和这个边界的更多句式。

在思必驰平台上线的食材管理意图里,自定义的一些句式说法:

三、多轮对话

多轮对话现在普遍的划分方式,分为“线性”多轮和“非线性”多轮。

从功能层面上讲:

  • 线性多轮是在必填槽位缺失,通过系统主动发起追问的方式,去获得缺失的槽位;
  • 非线性多轮是需要联系上文才能获得用户完整意图的问题;

3.1 线性多轮定位与边界

线性多轮解决问题得边界,是在一个意图的对话中,命中了必要意图信息,但是触发之后,却缺失了意图所请求服务必要要素(必填槽位信息)。

“必填槽位信息”是已经事先被定义好的,线性多轮的存在位置,就是为了弥补这个缺失。

举例:导航意图

必要完整要素:帮我导航到目的地(必要意图要素+必填槽位要素)

用户:“帮我导航”

反馈:“您要去哪里?”

用户:“天安门”

反馈:“正在为您导航到天安门”

当触发到必要意图的时候,但是没有必填槽位,就反馈寻找必填槽位信息,如果接下来的输入是所需要的必填槽位,就请求服务,如果对应不上必填槽位信息,就正常执行即可。

3.2 非线性多轮-意图内非线性多轮边界问题

首先跟我来思考一下,日常生活中的对话。

周末无聊,你想看黄渤主演的综艺节目来打发无聊时光,这时候你就可以跟女朋友说:“你给我找找综艺节目。”

然后,女朋友兴高采烈的给你搜罗着各类综艺,问你:“你想看搞笑的?智力的?还是什么?”

你跟女朋友说:“我想看黄渤参与的。”

这时候,女朋友就给你找出了黄渤参与的综艺类节目。然后,我们把对话置于智能语音助手上面就得出如下情况:

人:“我想看综艺。”

机:“为您找到以下综艺。”

人:“看黄渤参与的。”

机:“为您找到黄渤参与的综艺节目。”

通过以上的例子,我们可以得出:在用户第一轮对话后,我们可以知道了用户的意图(看综艺)。第二轮给出主演人的非必填槽位,那么在看综艺的这个意图上面是可以增加主演人的非必填槽位的,我们就可以去补充上意图的槽位,去相应用户的需求。

边界:需要联系上文的意图,如果接下来对话涉及到的槽位信息可以替换或补充上文的槽位,就可以获得用户的完整意图信息。

得到这个边界之后,我们在配置必要因素的时候,应该考虑:

  1. 意图中的哪些槽位是可以改变的?比如:我想看综艺,也可以是我想看黄渤的综艺,又或者是我想看黄渤最新的综艺。
  2. 哪些意图是可以做槽位改变的?比如:我想看综艺就可以有槽位的改变,我想去旅行对目的地,出发地的槽位进行改变,但是播控等一些简单基础意图就不需要了。比如:播放,声音大一点等都是单独执行的命令,没有必要增加其他的槽位信息。

3.3 非线性多轮-跨意图非线性多轮边界问题

接下来,继续跟我进入一个场景:

假如你想带你的女朋友去北京旅游,为了向女朋友展示你的体贴和细致,你想提前制定一下旅游计划,比如:你在大众点评筛选地点北京,人数2人,类别吃饭,然后给你推荐了许多吃饭地点。

如果这时候你点击类别的景点,他就会为你筛选出来适合2个人在北京旅游的景点,这时候你不用再去输入北京和人数了。

如果我们把操作对话置于智能语音助手上面就得出如下情况:

人:“帮我查查北京适合2人的吃饭地点”

机:“为您找到以下地点”

人:“那旅游景点有哪些呢?”

机:“为您找到以下旅游景点”

我们来看一下我们这两次的对话,第一个需求是吃饭的地点,第二个需求是旅游景点,很显然是不同的意图表达,但是地点北京和人数都是一致的,也就是说槽位信息是一样的。

假如你第二轮对话把“那旅游景点有哪些呢?”改成“那明天呢?”,如果把“北京”,“2人”和“那明天呢”组合在一起,是不能构成完整的信息表达的。

“跨意图非线性多轮”问题的边界:联系上文,上一个意图的槽位信息可以为下一个意图所用,才能获得用户完整意图信息。

现在普遍的实现,失去配置一个意图的“输入前置语境”和“输出语境”,来限定某个意图在第二轮的触发。

比如:在“查饭店”这个场景中,两个intent分别为“查饭店”和“查景点”。那么,在“查景点”这个跨意图的配置中,前置输入语境条件就是“查饭店”这个intent,触发“查景点”这个意图的必要要素就是“旅游景点”这四个字,然后槽位就是继承自“查饭店”的槽位。“旅游景点”的前置输入语境条件也可以是“查酒店”“查出行方式”等其他可以继承使用的槽位的意图。

可以得知:如果我们在第一轮交互的时候,如果用户仅仅问“那旅游景点有哪些呢?”要么就不会出发意图,要么就是需要“线性多轮”或其他方式去补充必填槽位。而通过“跨意图非线性多轮”的配置,在符合前置语境的条件的情况下,是可以匹配上“查景点”这个意图,并且可以通过上文的槽位继承的方式形成“完整用户意图”去请求后续的服务。

总结

 

本文由 @ walle 原创发布于人人都是产品经理。未经许可,禁止转载

题图来自Unsplash,基于CC0协议

给作者打赏,鼓励TA抓紧创作!
评论
欢迎留言讨论~!
  1. 写的很好

    回复
    1. 谢谢

      回复
  2. 欢迎大家评论啊,有什么地方晦涩难懂的,可以留言,争取给大家最好的阅读体验,

    回复
圈子
关注微信公众号
大家都在问