早期闲聊机器人主要是通过模板实现,也就是规则,比较有代表性的语言是AIML,即人工智能标记语言,是一种基于XML的方言。
例如:
WILL YOU HAVE SEX *
reference:https://github.com/mz026/aiml-en-us-foundation-alice.v1-0/blob/master/sex.aiml
结束
检索式类似模板式,只是使用类似搜索引擎或者某种数据相似读的方法从大量数据库找到对话答案,或者说下一句回复。
本质上是学习一个函数,针对上下文,寻找已有数据库中最匹配当前上下文的回复,当前也有一些基于检索机器人的研究应用了最新的深度学习模型,如BERT等。
reference:https://arxiv.org/pdf/1911.02290.pdf
现在训练还有诸多难点,其实效果很难在现实中应用。
总体来说应该作为对检索和其他模式的补充
工业应用检索依然是主流,无论是从前几年的Alexa Prize还是最新的小冰的介绍,都还是如此。
在检索模型上增加各种功能模块应该是主流,如小冰的“比喻能力”,其实可以认为是一个基于规则的、基于搜索的模型。
reference:《「爱情就像脂肪,是点点滴滴的积累」,微软小冰造句天马行空,三大首席科学家万字解密背后技术原理》https://mp.weixin.qq.com/s?__biz=MzI5NTIxNTg0OA==&mid=2247499247&idx=1&sn=31cd01a61e87e3e755cc85b92bc9c9bf&chksm=ec544a68db23c37e1b9369efb88ea8d5dc1834e7d499f8c7474695f78b3a1e911ff9bb84563c&mpshare=1&scene=1&srcid=1129vQBGgMoAQpIiReM5NYja&sharer_sharetime=1574961765740&sharer_shareid=d1eb5503b89c5eaa53654bcc0ebe78d1&pass_ticket=DtG2XnJnrqRoW7BWgeALYiQpj%2BpgL13If%2FT6eUujb5SLeMYZWc6gFgpOL%2BwS1q8C#rd
和检索式闲聊完全不一样。
直接从文章中检索答案,大概过程是:定位答案的可能类型,搜索文章,确定段落,搜索答案。
例如人问:中国最大的城市
那我们可以知道,答案是一个城市,或者说一个地点(location)
然后我们把这句话拿到搜索引擎中,很可能得到如“北京是中国最大的城市”这样的句子,因为我们知道答案类型是“地点”,所以这句话唯一的地点"北京"就会被返回。
这个反而是检索式闲聊比较像,主要是寻找最优回复。
一般这个知识库是语义网或者知识图谱,或者结构化数据库。
例如对于简单的问题,如主谓宾缺一的问题,可以识别有的两个,然后去数据库中匹配。小蜜如何做问答的?
谁简单用谁,尽量不考虑基于知识库的问答
我们其实可以把任务机器人简单分成两部分:语言理解,对话管理。
语言理解顾名思义是理解用户,一般也就是人类的语言的含义,这一步的目的是将自然语言符号化,只有符号化的事物才能进行推理。
对话管理,可以认为是根据我们对这一句的理解,上一句的理解,上上句的理解,其他上下文信息等等,共同决策机器人应当回复什么。
当然传统上一些流程图可能会分为
LU,DST,DP,LG等几个部分,但是其实除了LU比较明确,其实后几个部分在大部分系统实现中是很模糊的。
也就说大部分机器人可以认为是如下公式:
(意图i, 关键实体i) = 语言理解(用户输入i)
回复 = 对话管理(意图0, 关键实体0,意图1, 关键实体1,…,意图n, 关键实体n,其他上下文)
意图:一句话的具体含义的抽象,例如“你好”、“你好吗”、“hello”的抽象可能都是“问候”
关键实体:一般是任务必要的属性,例如时间、地点、人物等
其他上下文:例如对话外的属性,例如正在对话的人的性别、爱好、年龄等
这里0到n指n轮的对话,理论上决策应该根据所有跟用户的对话一起判断。
NLU很简单,所有人的实现都很“简单”,意图识别和语义槽识别都很“简单”,这里的简单是指这些都是当前比较完善的NLP问题,一般没有太大难度。
1.1. 如果意图是查天气意图
去做什么 1.5.
否则
去做什么
BotFramework是如何做对话管理的
RasaCore如何做对话管理的?
数据驱动
缺点很明显,上下文加入不灵活,有问题需要修改数据,现在数据标注也越来越复杂了,看似能解决很多问题,但是实际上太复杂的问题也解决不了。
基于规则的对话管理还是主流,主要其实是在于“灵活性”