前面两篇说了用户意图拆分与识别,和基于此设计的多轮对话流程。这一篇接下去讲自然语言处理(NLP)中实体信息的抓取和在产品中的应用,也是如何搭建一个智能客服系列的第三篇。

你或许思考过,AI是怎么听懂人说话的呢?当我在商场,跟商场的机器人说我要去三楼,它是怎样听懂我的意思的呢?当我说去NARS,它怎么知道NARS是什么,是在哪里?那么就要说叨说叨实体(entity)了。

首先,实体信息是什么意思呢?它表示关键性的信息,通常可以分为两种,一是与业务基本无关的,可以算作通识的信息,比如手机号,邮箱,日期,时间;二是与业务相关的,根据实际场景定制的。

怎么理解呢?举个栗子,第一个场景,当你需要预订一张机票,假设你会这样说:

帮我订张明天的机票,从北京去上海,下午起飞的那种,我电话13344445555,行程单发我邮箱yuanquaner@pmcaff.com
好的,已为您找到如下符合条件的航班……

在这个场景中,‘明天’和‘下午’就是时间信息,‘北京’和‘上海’是地点信息,‘13344445555’是手机号。因为这些信息可以说是通识,不随业务而改变,所以一般会内置到算法中去,识别并做对应的转换。在上面的场景中,AI端会先识别出日期和时间,然后把‘明天’转换为‘2020年3月27日’,‘下午’转换为‘14:00-18:00’,再与其他信息合并,由数据端向航空公司发起请求,再告诉你返回的结果,即符合条件的航班列表。

这个识别环节听起来是简单的,因为人类在语言学习的过程中已经能够条件反射出什么是日期,什么是手机号,什么是地点。但是对AI而言,起初这些东西都是一样的字而已,需要大量的算法来区分与提取到这些信息。这里的识别率与算法设计时对语言理解的丰富度息息相关。比如说,一开始是对‘明天’‘昨天’做了识别,而忽略了‘前一天’‘后一天’的表达;或者一开始做了‘2020年2月2日’,而忽略了‘2020年二月二日’的表达,就会直接拉低识别率,具体的表现就是……智障率升高。

转换这一步中,有个很有意思的点。人们用自然语言表达日期时间等信息时,其实是不完全符合标准逻辑的。比如说,当你在晚上00:10分跟智能助手说,“订个明天的闹钟”,这里的“明天”大概率已经是算“今天”了。当你在2020年1月里,跟智能助手说,“查查12月的账单”,你其实是在讲2019年的12月。这些语言表达习惯都应该考虑进去,才能让智能助手“感觉像个人”。Siri在这里做的很好,订闹钟的场景,它会再确认一句“请问你是说订今天早上8点的闹钟吗?”

收回来说第二个场景,结合业务出现的实体。继续举栗子,当你要买一杯奶茶,你通过智能助理完成这个操作,那么对话应该是这样的:

我要一杯奶茶,一点点的,大杯四季奶青,全糖,加一份红豆,不加冰。
好的,已下单。

这里面,‘一点点’是奶茶品牌,‘四季奶青’是奶茶商品名,‘大杯’是份量,‘全糖’是糖度……由于它们是完全依托于业务的表达,离开这个场景则这些词不再有意义。比如你在跟别人聊天气的时候突然说一句“一点点哦”,对方是听不懂的。它不像“北京”这种词,北京永远是北京。所以这种信息就是我说的,要根据实际场景定制的。也就是说,我需要告诉AI,什么是奶茶品牌,什么是奶茶商品名,什么是份量……

怎么告诉它呢?一般有三种途径:字符串匹配,正则表达式,标注

字符串匹配,即定义一个实体信息的合集,适用于固定出现的字段。说起来比较晦涩,我用伪代码(因为不会写真代码)形式写一下就清楚了。在买奶茶的场景中,对奶茶品牌和商品名等实体信息的定义可以这样写:

"奶茶品牌" = [ '一点点', '喜茶', '乐乐茶', '奈雪的茶' ]
"份量"
= [ '大杯', '中杯', '小杯' ]
"商品名" = [ '四季奶青', '红茶玛奇朵', '芝士芭蕾' ]

这样,当用户说到了其中一个项,AI就可以知道对方在讲什么了。

正则表达式,即定义一个实体信息出现的规则,适用于有规律出现的信息。以车牌号为例,常见的形式为省份缩写(一个汉字)+一位字母+五位数字,依然用伪代码的形式表达,如下:

"车牌号" = [京沪鲁浙……津豫赣]{1}[A-Z]{1}[0-9]{5}  
#意思是从省份缩写中的一个字+一个大写字母+5个阿拉伯数字

同理地,我们可以用这种方式定义其他有规律的词汇,像设备批号,身份证号,手机号,订单号,诸如此类。

讲到这里,你可能想说,这两种办法一点都不AI嘛。那么……朋友你说的没错我也这么认为!不过途径只是途径,AI也不是目的,而是为了实现最终与人对话的效果。所以来看很AI的第三种吧。

标注,即对表达某一个意思的语句进行标注,从而让机器学习到某一个意思,适用于不固定也不规律的表达。以笔者工作里的一个场景来说,有车贷或房贷的用户,经常会来咨询,自己还完了多少钱,自己还剩多少钱要还。那么我稍微整理了一些出现过的表达方式,如下:

我已经付掉多少贷款了?
我还完了多少贷款?
有多少贷款是还上了的?
我已经还了多少款?
我的贷款还清了多少了呢我还有多少钱要还啊?
还剩多少贷款要付?
还有多少贷款得付?
我还要付多少钱呀

很明显地,这些表达即不会用固定的名词,也没有可以写成正则表达式的清晰规律。但是可以用语义上清楚地看出来用户在问什么,所以,这里采用标注的形式,把意思标出来。我们定义还完了多少钱的概念为="已还",还剩多少钱要还的概念为="剩余",括号起来的为标注的位置:

我已经[付掉多少贷款]了?——"实体"="已还"
我[还完了多少]贷款?——"实体"="已还"
有[多少贷款是还上了]的?——"实体"="已还"
我已经[还了多少款]?——"实体"="已还"
我的贷款[还清了多少]了呢——"实体"="已还"
我[还有多少钱要还]啊?——"实体"="剩余"
还[剩多少贷款要付]?——"实体"="剩余"
还[有多少贷款得付]?——"实体"="剩余"
我[还要付多少]钱呀——"实体"="剩余"

在完成了大量以上类型的标注后,当用户再问到相同的问题,AI大概率上就能识别到对应的实体信息,那么就可以继续“像个人一样”地进行对话了。

在实际的落地场景中,提取的途径并不是唯一的,也不一定是固定的。具体采用哪种方式来实现需求,是基于PM对技术方法的了解和对业务背景的熟悉而做判断。究其根本,一切都还是为了用户需求而服务。

好了今天的内容就到这里~下一篇主题是怎样让AI更像人——伪装的智能感。

感谢阅读。

点赞(301) 打赏

评论列表 共有 0 条评论

暂无评论
立即
投稿

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部