【人机对话】对话机器人技术简介:问答系统、对话系统与聊天机器人

article/2025/11/11 8:42:20

点击上方,选择星标置顶,每天给你送干货

阅读大概需要16分钟

跟随小博主,每天进步一丢丢

来自:AI算法之心

作者:段清华
个人主页:http://qhduan.com
Github链接: https://github.com/qhduan/

原文链接,点击文末阅读全文直达:https://github.com/qhduan/ConversationalRobotDesign

备注:

  • 一些地方论文格式写的是(作者, 论文标题, 年份)

  • 部分地方的说法和示例可能还有待推敲

对话机器人技术简介

自从iPhone 4S开始内置Siri,到现在各种智能音箱,或者扎克伯格说自己做的智能管家, 我认为都算是对话机器人的一类。

以苹果的Siri和亚马逊的Echo为例,它实际上是一套非常复杂的智能系统,而对话机器人是其中一个界面。有些文献或者商业机构把这部分称为Conversational UI(对话界面),也就是说我们通过对话来与机器沟通。

遗憾的是,本文和本文的后续文章,都不可能说清楚怎么完整的做出一个Siri或者Echo, 它们的背后都是由成百数千名工程师、学者,在无数的各种资源支持下,动用几十个、上百个很多不同的工程技术的叠加组合而成的。

本文会探讨各种简单的对话机器人技术,而这些技术,每个往往只能完成一个及其特定的功能。

岔开话题的话,在科学上,“怎么实现一个机器人”,是一个太宽泛的问题,往往此类问题都会被分解为若干个小问题。例如:怎么让实现让机器人能回答单个问题?怎么实现让机器人能回答连续的问题?怎么让机器人帮我买咖啡?而一个学术领域往往是一个子问题的最新、最优解,而工程上我们往往需要结合不同领域的成果构建一个可用系统。

机器人的作用之一是回答问题(Question Answering)

一个最简单的问答系统

最简单的问答系统就是当我们有足够多的问答数据,例如:

中国的首都是哪?
北京。

当数据足够多的时候,一个最简单的问答实现,就是去匹配问题的相似度。

例如用户问:中国的首都

假设我们在python中计算编辑距离的话,会发现“中国的首都”这个问题和 我们数据库中已有的问题“中国的首都在哪”很相似(距离只有2,可以粗暴理解为只差两个字)。

>>> from nltk.metrics import distance
>>> distance.edit_distance('中国的首都', '中国的首都在哪')
2

那么我们直接给用户这个问题的答案就好了,就可能有足够高的成功率。

当然这个看上去很简单粗暴的解决方案有很多问题,例如:

  • 准确率取决于相似度算法;

  • 很难设置相似度算法的阈值;

  • 数据库要求比较大;

  • 扩展性比较差;

但是实际上在真实世界中,往往必须有一部分上这个算法,因为这个算法同样有优势:

1、不需要训练,假设你的领导要你给线上产品添加一个问答的时候,他并不喜欢:“我的深度学习模型训练5个小时之后,这个答案就上线了”,这样的回答;
2、自定义问题成本低;
3、非常容易解释;
4、对于完全匹配的问题可以绝对准确,如果是其他的概率模型的话,就必然有可能不准确,而简单的模型不会出错;

更好的回答问题,怎么回答“中国的首都?”

简单的来说,可以分为“有数据”的问答系统,和“没数据的问答系统”。

有数据的是指,我们已经有一些已经结构化的数据,或者说知识。例如我们的问答系统就想回答关于国家与城市的问题, 那么我们可以假设自己已经有了很多关于国家、城市、国家与城市之间关系的知识。

知识图谱建模与查询

“有数据”的问答系统是指,例如你有一堆可以查询的知识。一种常见的知识存储方法,就是三元组:

(中国,有首都,北京)
(北京,是某国的首都,中国)(英国,有首都,伦敦)
(伦敦,是某国的首都,英国)

在上面的前两个三元组中出现了两个实体(entity),分别是北京和中国。总过出现了两个关系,分别是“由首都”和“是某国的首都”。

从字面意义上来讲,他们可以解决“中国的首都是哪?”和“北京是哪个国家的首都?”这两个问题, 也就是根据一个关系和一个实体,查询另一个实体。当然也可以解决“北京和中国的关系”这样的问题,也就是根据已知的两个实体,查询他们的关系。

从学术上来讲,这个领域叫做 Knowledge-Based Question AnsweringKB QA)也就是我们有了知识, 需要在上面构建一个问答系统。

题外话,上哪能弄到这些知识呢?一般来说很多问题是在其他领域工作中,已经有了类似数据的积累。或者是利用别人收集的数据,例如一些开放的中文知识图谱,例如英文世界的freebase。还有或者就自己尝试制造这样的数据,例如从维基百科、从百度百科中获取。或者……发挥想象力。

在知识图谱建模的领域,有一种称为SPARQL的语言,类似关系数据库查询的SQL语言, 例如我们要查询(中国,有首都,北京) 中的北京,则SPARQL可以写为:

Select ?x where {中国, 有首都, ?x
}

也就是问题转换为,如何把一句自然语言“中国的首都是哪?”,转换为上面的SPARQL语句?

例如现在的一些方向是利用统计机器学习的翻译任务,完成从“自然语言”到“SPARQL”语言的机器翻译任务,就如同中英翻译等自然语言之间的翻译一样,同样也可以做到的。但是根据语料数据、SPARQL复杂度等等问题,也会有其他各种问题。

当然也有不依赖SPARQL作为中间件的查询系统,例如有的文献设计了一套在知识图谱中逐渐搜索(探索)的系统;以这个问题为例,起始点可以是实体“中国”,中国这个实体可能有很多关系,例如有首都、有文化、有省份、有xxx,然后搜索下一步最合理的关系“有首都”;最后探索到答案“北京”,判读任务完成。

更多细节本文不再讨论。

没数据的问答系统

IR-based 问答系统 (IR: Information Retrieval)

此类问答系统不需要提前构建知识,而是根据问题去检索答案(例如从搜索引擎上)。

此类问答系统从某种意义上类似人的搜索方式,例如我们想知道“中国的首都是哪”, 可能会去搜索引擎中搜索这个问题,而答案很可能会出现在搜索结果中, 我们知道这个答案的类型很可能是“某个城市”,所以我们会在搜索引擎给我们的结果中, 寻找一个城市名。

而机器也可以完成类似过程,首先根据问题来尝试判断答案类型,这里同样也可以判断结果类型为城市。然后机器可能需要对问题进行重构,也就是寻找一个搜索问句,能找到答案的几率最大, 例如这个问题可能被重构为:“中国 首都 城市”。(最后添加了这个词城市,是因为我们假设可以准确判断出答案类型)

然后机器去自有的非结构化文档(没有知识图谱化的文档,例如各种纯文本文章),从中寻找最接近我们重构后问题的段落。
或者去搜索引擎、百科网站等等,搜索答案、或者检索问题相关的段落。

定位到这个段落后,根据答案类型(这里是城市),尝试从这个段落中筛出答案。例如我们去搜索引擎搜索“中国的首都”,很可能第一个答案段落中的第一个出现的城市名就是我们所需要的答案。

怎么让机器人帮我买咖啡(Dialogue System)

这里的对话系统特指** Task-Oriented Dialogue System**, 也就是让机器人帮助实现一种特定任务的系统, 有一文献提到的 General Dialogue System 的系统,往往指类似 Chit Chat 的系统。

一般此类对话系统的研究都基于如何让机器人在有限步骤内完成可以完成的任务的系统,并且结果往往定位到一个单一实体。此类系统的一个隐含假设往往是通过电话、文字、语音来进行人机交互,也就是没有什么“点击按钮”,“从多个选项选择”,之类的交互方式。当然在一些类似对话系统演变的工程实践中,是有类似的实现的。

因为这个关于“必须文字交互”的假设,所以实际上有些问题并不适合基于这种假设的对话系统完成。例如你在一些手机软件中搜索餐厅,结果可能会返回多家餐厅(餐厅本身即实体),他们都有名称、地址、电话等等信息(这些也可以称为餐厅这个实体的属性,当然也可以是与餐厅这个实体有关的其他实体)。而你想要通过语音、朗读的文字来获得这个列表,就显得很愚蠢了,不会有人想听机器人读5分钟搜索结果的20家餐厅然后决策吧?所以此类系统往往最后是推荐单一实体,例如结果排名最高的餐厅,如果你需要更换,可以跟系统说换一下餐厅。

一个典型的对话系统的交互过程是这样的:

用户:你好(User Dialog Act:greeting)
机器:你好,我可以帮助你搜索并预订餐厅(Sys Dialog Act:greeting)
用户:我想要找一家在中央公园2.0附近的意大利餐厅(User Dialog Act:inform(地址=中央公园2.0,口味=意大利))
机器:请问你想要在中央公园2.0附近什么价位的意大利餐厅?(Sys Dialog Act:request(价位))
用户:普通的就好(User Dialog Act:inform(价位=普通))
机器:我知道那里有一家柯南家的老意大利料理餐厅(Sys Dialog Act:inform(名称=柯南家的老意大利料理))
用户:换一个(User Dialog Act:alter())
机器:我知道那里有一家意大利油泼面餐厅(Sys Dialog Act:inform(名称=意大利油泼面))
用户:它家的价格怎么样?(User Dialog Act:request(价位))
机器:意大利油泼面的价位是普通(Sys Dialog Act:inform(价位=普通))
用户:就这家吧,帮我预订(User Dialog Act:order())
机器:请问有几个人?(Sys Dialog Act:request(人数))
用户:单身狗(User Dialog Act:inform(人数=1))
机器:真的就1个人吗?(Sys Dialog Act:confirm(人数=1))
用户:是的(User Dialog Act:confirm())
机器:已经预定成功(Sys Dialog Act:order_success())
用户:好的,再见(User Dialog Act:bye())
机器:再见,欢迎下次使用(Sys Dialog Act:bye())

Dialog Acts 如果是用户发起的(User Dialog Act),那么它是一种处理后的用户意图的抽象表达,是一种形式化的意图描述。

The dialog act expresses an important component of the intention of the speaker (or writer) in saying what they said

系统发起的行为(Sys Dialog Act),是根据用户行为,上下文信息等等综合得出的, 下一步所要进行的操作的抽象表达,这个抽象表达后续会送入NLG部件,生成自然语言。

Asking questions, giving orders, or making informational statements are things that people do in conversation, yet dealing with these kind of actions in dialogue what we will call dialog acts is something that the GUS-style frame-based dialog systems

GUS对话系统,是 Genial Understander System 的缩写,可以追溯到1977年的论文(Daniel G. Bobrow, GUS, A Frame-Driven Dialog System, 1977)

常见的不同意图有:

用户的greeting:问好
用户的inform:用户提供一个信息,例如想要的餐厅的地址
用户的request:询问一个信息,例如当前结果餐厅的电话
用户的confirm:确认信息正确(例如上一条是机器问你对不对)
用户的bye:结束对话
机器的greeting:问好,也可以是自我介绍
机器的inform:提供机器知道的信息,例如当前结果餐厅的信息
机器的request:机器必须有足够的信息才能完成任务,如果欠缺一些必须信息,例如餐厅地址、口味,则会向用户询问
机器的confirm:根用户确认信息是否正确
机器的bye:结束对话

上文还出现了一些可能的特殊意图,例如:

用户的order:确认订餐
用户的alter:更换检索结果
系统的order_success:反馈订餐成功

整个对话系统,就是为了完成某个特定任务,这个任务所需要的特定条件需需要由用户提供(例如帮助买咖啡需要咖啡品种,热或冷等信息),当信息足够的时候,机器就能完成相应任务。

这个过程总结就是:

用户说了什么 =》
分析用户意图 =》
生成系统的对应意图(操作)=》
用户听到了系统的反馈 =》
用户说了什么(第二轮)=》 …………

当然根据任务复杂度、和其他系统结合等等问题, 对话系统本身也有各种的不同准确度与实现方式。

让机器人陪我,聊天,闲聊(Chit Chat、Chatbot)

聊天机器人往往是没有一个明确目的,或者目的比较模糊的系统。有别于问答系统和对话系统,前两者的一个期望是用户尽可能得到信息后离开,快速找到想要的回答或者快速完成任务,是尽可能在减少与用户的交流时间。而聊天机器人往往设计上需要尽可能的占用用户时间,尽可能的延长与用户聊天、陪伴的时间,或者尽可能的再次让用户使用。

聊天机器人本身也可以是有一定目的的,不过是比较宽泛的目的。例如最近融资成功的woebot,它的目的是可以一定程度上跟踪用户心理状态、帮助用户调整自己的心理状态等等,有一定程度的心理医学性质。

最开始的希望通过图灵测试的机器人系统都有类似闲聊机器人的特征,例如Eliza(1964),或者Alicebot(1995)。它们主要通过模板特征实现,也就是人工定义对话模板,产生类似智能的效果。

这样的机器人模板其实可以很多,例如Alicebot有超过六万条AIML模板来覆盖绝大部分日常对话。AIML,即人工智能标记语言,是用来通过定义模板实现机器人(闲聊)的一种方法。

模板方法是机器人相关实现的最重要的方法(没有之一),实际上在绝大多数的对话系统中都依然存在(Siri,小冰),并且在一些学术文献上被证明与其他系统相比依然拥有更好的效果(例如与 Neural Conversation 模型相比)。

与模板方法相对的,是基于深度学习的 Neural Conversation 模型,是一种基于神经机器翻译技术演变而来的对话生成模型。类似机器翻译,例如一句英文翻译为一句中文,对话中,上一句对话也可以“翻译”到下一句对话;类似的还有作诗机,上一句诗“翻译”出下一句诗。

本质是根据统计学方法进行的一种文本生成,这种文本生成往往会生成语法正确的句子。但语义、逻辑、一致话、发散性等地方会有问题。例如:

人格不一致:

Q:你今年几岁
A:我5岁了Q:你今年多大?
A:我马上就满18了

语法正确但语义有问题:

Q:你想做我的女朋友吗
A:我是我的女朋友

发散性差,本质机器倾向于回答简单又不容易出错的回答,相当于机器学会了一种投机取巧的方法:

Q:你喜欢我吗
A:我不知道Q:今天天气不错
A:我不知道Q:你是谁啊?
A:我不知道

投稿或交流学习,备注:昵称-学校(公司)-方向,进入DL&NLP交流群。

方向有很多:机器学习、深度学习,python,情感分析、意见挖掘、句法分析、机器翻译、人机对话、知识图谱、语音识别等。

记得备注呦


http://chatgpt.dhexx.cn/article/aJa4HQKh.shtml

相关文章

数据可视化工具是什么

智能手机的普及,互联网使用的增长,机器学习的快速发展,以及云计算技术和物联网的不断采用,都在推动全球数据可视化市场。此外,对智能工厂的日益倾向,以及视觉分析、信息可视化和科学可视化在小型和大型组织…

如何进行数据可视化图表设计?

如何进行数据可视化图表设计? 对数据人来说,数据可视化是分析理解数据,并最终呈现数据的必修课。本文从以下几个点来说明,如何进行数据可视化图表设计。1、数据背后的故事2、充分理解数据3、多种图表类型设计指南 1数据背后的故…

优秀的数据可视化,原来是这样做的!

大数据时代,数据驱动决策。处理不好庞大、复杂的数据,其价值将大打折扣。 可以想象一本没有图片的教科书。没有图表、图形或是带有箭头和标签的插图或流程图,那么这门学科将变得更加难以理解。人类天生就是视觉动物,而视觉效果对于…

数据可视化是什么,数据可视化怎么做最好?

数据可视化都有一个共同的目的,那就是准确而高效、精简而全面地传递信息和知识。可视化能将不可见的数据现象转化为可见的图形符号,能将错综复杂、看起来没法解释和关联的数据,建立起联系和关联,发现规律和特征,获得更…

如何完美实现数据可视化?

为什么要可视化数据? 在工作中,无论你在哪个场景,你都会接触到数据,需要表达出来。数据可视化的作用是通过结合图表和数据来更好地传达业务信息。目前,大多数公司正在逐步从传统的流程管理过渡到基于数据的管理。数据可视化可以…

程序员如何轻松实现数据可视化?

这里以Web前端为例,简单介绍一下程序员是如何实现前端数据可视化的,主要内容如下: Highcharts.js 这是一个纯粹的JavaScript可视化库,完美支持移动端,可以快速的为Web网站添加具有交互性的图表(包括曲线图…

好看的数据可视化图片是怎样做的?

好看的数据可视化图片是怎么样做的?这里我将介绍如下几个知识点,相信掌握如下数据可视化技巧和知识,一定可以让你的图表焕然一新,令人眼前一亮~ 图表制作规范:图表选取,突出显示重点数据,消除图…

同一个ip,不同端口号,session失效

背景 我有两个工程projectA、projectB,projectA放在TomcatA中,projectB放在TomcatB中,TomcatA、TomcatB在一台server上。 工程都映射的根路径,不用project名字就可以访问,如下 http://ip1:7777/ http://ip1:8080/ …

用Python做【游玩攻略】之上海四日游,假期旅游不用愁啦~

导语: 哈喽铁汁们~这不马上元旦吗小假期有准备来个短期旅行(疫情期间还是注意安全尽量不出门)却还没做游玩攻略的友友们这期可不能错过了噢~ 这期呢我们就先“去一趟”上海吧~ ​​ 人们通常戏称上海为魔都。那么上海魔在哪里呢?这里的魔主…

包学习(一款安卓端小学到高中全部课程精讲APP)

简介 【包学习】是一款拥有小学至高中九个学年的全套学习资料的APP,名校名师重点、难点精讲 软件简单介绍 软件分为首页、必刷课、动态教辅、在学、我的五大模块。 进入软件会让你选择对应的年级,小编这里就以高三年级课程给大家截图演示&#xff0…

学堂在线课程字幕下载

事情起因 学堂在线 工程伦理课程 在线学习,没有课件, 考试的时候可能会不方便,做一解决此类问题 字幕下载 合成为Txt 文件或者word 文件以供学习使用 事情经过 首先想到的是自己写一个爬虫 怕区相应的字幕, 发现是文本形式存储和, 很好做, 但是涉及到登录的cookie信息, 暂时…

课堂派资料PDF文件下载

课堂派资料PDF文件下载 前排提示,本文没有什么技术含量,大佬轻喷 因为暂时要上网课,但是年前走得着急其实是懒 ,课本没有带回来,所幸有的老师会发一些课本、习题的PDF到课堂派的“资料”里。但是有的时候会限制不让下…

Python程序开发案例教程PDF,python程序开发案例教程

大家好,本文将围绕Python程序开发案例教程黑马程序员电子版书展开说明,Python程序开发案例教程黑马课后答案是一个很多人都想弄明白的事情,想搞清楚Python程序开发案例教程pdf黑马程序员需要先了解以下几个事情。 1、python软件开发的案例有哪…

文章润色器-文章润色的软件

文章修改润色软件 在如今信息化时代,我们的工作常常涉及到处理或编辑一些文件和文章,其中一项重要的工作是对文章的润色和修改。为了高效地完成这项任务,越来越多的人开始借助文章修改润色软件进行文章修改和润色。本文将介绍一款专业的文章…

ChatGPT vs. 之前版本:性能与表现的对比

🌷🍁 博主 libin9iOak带您 Go to New World.✨🍁 🦄 个人主页——libin9iOak的博客🎐 🐳 《面试题大全》 文章图文并茂🦕生动形象🦖简单易学!欢迎大家来踩踩~&#x1f33…

数据之美----雪球网股票组合分析

简介 因为工作需要,爬了几个大型的网站,练就一身爬取数据和分析数据的功夫。所以,在无聊的时候写了个爬取系统。主要功能是爬取雪球组合的数据,并进行分析,得出一些有价值有潜力的股票代码。实盘到没有测试&#xff0c…

新浪股票接口获取历史数据

这两天做了一个调用新浪股票接口获取实时以及历史股票数据的应用,因为新浪没有公开关于其接口的官方文档,所以通过各种百度差了很多关于新浪股票接口的使用,不过大家基本都是转载或者直接复制,对于实时数据的获取讲的很详细&#…

我问了 ChatGPT 一个问题:我生活在哪个世纪?

我问了 ChatGPT 一个问题:我生活在哪个世纪? ChatGPT 算得上最近科技圈最火的一个话题之一了。如是我也想赶时髦,体验一把 ChatGPT。 访问:https://chat.openai.com/,给了我一个: why? 在 net 上逛了逛…

扎克伯格是学计算机的吗,扎克伯格是犹太人吗?他毕业于哪个院校?

提起扎克伯格大家都十分熟悉,即便不熟悉也应该听说过他的名字,他是某社交网站的创始人,在国外有不少人使用,所以许多人对他都有一定的了解。他曾在三十岁的时候,就拥有了六百亿美金的资产,更是被称为“第二…

【latex论文】IEEE论文模板的使用教程

1. 模板下载 conference:https://www.ieee.org/conferences/publishing/templates.html transaction:https://ieeeauthorcenter.ieee.org/create-your-ieee-article/use-authoring-tools-and-ieee-article-templates/ieee-article-templates/ 2. 模板…