仅代表个体调研结果,非官方素材,内容仅供参考。在此特别感谢小达同学的分享交流。
智能问答实现方案有多种:
问答对、推理问答(知识图谱)、任务型、闲聊型等,不同的系统实现不同。也可以多个搭配使用,通过判断用户意图或者通过概率等分发到对应的系统进行回答任务(所以这里还有个意图识别的过程需要做)。
比如用户提问 “你好,今天天气怎么样”,就可以分发到闲聊型系统。输入“新手玩家攻略”,就分发到问答对或者知识图谱的系统进行答复。
1、问答对系统:
其实就是检索似问答或者匹配问答,事先拥有QA库,当用户输入问题时,找到QA库中最相似那个问题,然后将答案回复给用户进行答复。
问答对系统包含:预处理,召回,相似度计算,排序,答案生成,用户反馈,模型更新
预处理: 对用户的请求进行,文字纠错,同义词替换等
召回:假如数据库拥有10w个问题,当用户输入一个问题时,如果将该问题与数据库每个问题进行相识度计算的话,效率很低效。 所以要事先比如从 elasticsearch中粗略的召回100个问题,然后将该问题与这100问题一个一个进行相识度计算,
Es进行召回的时候一般没有语义,匹配到文字就会召回,所以可以使用Faiss或者annoy工具做向量索引,就能做语义层面的召回了
相似度计算:基于深度学习模型bert或者上步中的Faiss,annoy也可以做
排序:根据相似度排序,拿第一个或者多个回复给用户
用户反馈:判断有没有实质解决用户问题,以及用户的历史提问,后续进行模型更新
模型更新:替换QA库中的问题,或者对预处理,召回,相识度计算进行优化
参考链接:https://zhuanlan.zhihu.com/p/50799128
2、推理问答:
推理问答是基于知识图谱的,知识图谱是一种数据结构,它由三元组实体,关系,属性组成,形式为<实体, 关系, 实体>或者<实体, 属性, 属性值>
<实体, 关系, 实体>
例如:
<丽江,属于,云南>
<大理,属于,云南>
<洱海,属于,大理>
<小秦,住在,丽江>
<小明,住在,大理>
<小明,朋友,小秦>
<实体, 属性, 属性值>
例如:
<姚明,国籍,中国>
<姚明,性别,女>
推理问答包含2个主要部分 1:自然语言理解 2:知识管理
大概的意思是当用户提问“丽江属于哪里。。。”,自然语言理解模块(需要提前基于深度学习训练等)会解析出实体(丽江)以及关系(属于) 最终转换成 一条知识图谱可以理解的查询语句例如(select province from area='丽江')
比起问答对系统,知识图谱的优势可以推理复杂的问题,比如“小明的朋友小秦住在哪个省份”,知识图谱会进行一步步推理,先推理出住在丽江,在推理出丽江属于云南。而问答对的数据库需要有小明的朋友小秦住在哪个省份这个问题才能解答出。
乍一看问答对实现更简单,但是如果小明的朋友有1000个,那我就要记录1千个QA对,如果实体与实体之间关系更复杂 比如 小明的朋友小秦的朋友小红住在哪,可以想象拿 问答对系统处理的话,数据库要枚举非常多的问题,还有一点就是假如哪天小明改名字,要更新数据库中所有有关小明名字的问答对。
3、任务型问答
任务型问答一般有特定的业务场景,比如订电影票,列出所有订电影票需要的制定成一个模版如:
机器人要在和客户的对话过程中把这些模版的信息都填充完毕,或者有可以根据用户地理位置等信息推断出模版需要添的,等填充完毕后就生成回答回复给用户
4、闲聊型问答
一般接入开放的接口,自己实现要训练庞大的语料库。比如现在的chagpt就属于生成式的大模型,可以支持闲聊同时具备了一定的推理能力。
总结:
智能问答系统有多种不同实现,可以选择其中一种,也可以选择多种根据用户意图进行切换
问答对系统适合公司业务的产品介绍,以及一些专业领域知识的介绍,无法做困难的解答
推理问答系统构建了实体与实体的关系,以及实体的属性,可以做两个实体间距离比较“远的“的推理