<audio id="audio" title="109 | 对话系统之经典的对话模型" controls="" preload="none"><source id="mp3" src="https://static001.geekbang.org/resource/audio/5e/20/5edb738406be8317e08cb57b740a0820.mp3"></audio>

在文本分析这个重要的环节里，我们已经分享了Word2Vec模型，包括模型的基本假设、模型实现以及一些比较有代表意义的扩展模型。我们还讨论了基于深度学习的文本分析模型，特别是对序列建模的深度学习利器RNN，包括RNN的基本框架，流行的RNN模型实现，以及RNN在自然语言处理中的应用场景。

今天，我们要来看另外一类和文字相关的人工智能系统——**对话系统**的一些基础知识。

## 浅析对话系统

对话系统在整个人工智能领域、甚至是计算机科学领域都占据着举足轻重的地位。著名的人工智能测试，“图灵测试”，其实就是建立在某种意义的对话系统上的。在经典的图灵测试场景中，一个最主要的论述就是：看一个人和一个机器进行对话，在和这个机器系统的问答过程中，能否猜出这个系统是一个真人还是一个计算机程序系统。从这一点可以看出，即便是在计算机科学的早期，对话系统或者说是智能的对话能力，就已经成为了计算机科学家衡量智能水平的一个重要标准。

实际上，从上个世纪50~60年代开始，研究人员就致力于研发早期的对话系统。即便是在今天看来，在一些简单的应用中，早期的对话系统也表现出了惊人的“智能”。比如，麻省理工大学的约瑟夫·维森鲍姆（Joseph Weizenbaum）教授研发了一款叫“伊丽莎”（Eliza）的早期对话系统。尽管这个对话系统只能对语言进行最肤浅的反馈，但是在“伊丽莎”系统的使用者中，有人真的产生了这个系统有智能的幻觉。这说明对于如何界定“智能”，如何理解对话以及语言能力，这些的确是非常深邃的计算机科学乃至哲学问题。

**早期的对话系统多是基于“规则”（Rule）的系统**。这些系统的一大特征就是，并不只是真正的去“理解”对话，“理解”文字，而是针对某一种模式，或者说是预定好的模板，对对话进行简单的模仿。不过，如果你认为这样基于规则的系统在今天的对话系统中毫无用武之地的话，那就大错特错了。实际上，**通过机器学习的手段辅以规则的方式**，这样的系统能够在绝大多数的场景下表现出惊人的水平。很多机器学习背景的工程师在接触对话系统研发的时候，其实往往有轻视规则系统的这种情况。

从基于统计学习的机器学习崛起以后，研发人员就开始希望利用自然语言处理和机器学习的一系列方法，从根本上来改变对话系统的构建方式，其中有一个核心的想法，就是**真正理解对话的内容，从而达到真正的智能**。在实际的应用中，**真正基于机器学习的系统**在很长时间里都并不能完全代替基于规则的系统，直到最近几年出现了更加复杂的基于深度学习的模型，我们也会在之后的分享中对这样的系统进行一些介绍。

## 对话系统的类别

从方法上，对话系统可以大致分为“**基于规则的系统**”和“**基于机器学习的系统**”。除此之外，从应用场景上，对话系统也可以分为“**基于任务的对话系统**”和“**非任务的对话系统**”。

基于任务的对话系统其实很容易理解，比如我们打电话到航空公司查询订票，打电话到酒店查询订房信息，抑或打电话到餐厅预定晚餐等。这样的对话系统有一大特点，就是我们的对话基本上都有一个明确的目的，或者说我们要完成一个“任务”（Task）。比如对于查询机票而言，通常情况下，我们的任务可以是成功查询到机票信息，或者成功预订了到某个目的地的机票。

对于基于任务的对话系统而言，整个对话的“范畴”是限定好的，很多任务其实都有流程或者叫作“套路”可以参考。因此，从本质上来说，基于任务的对话系统还是相对比较容易的场景。在对话系统发展的历史中，很长时间里，基于规则的系统其实就已经可以对于基于任务的对话系统提供很高质量的服务了。很多用户针对基于规则的系统来应对任务型对话系统，往往会觉得系统缺乏一定的灵活度，但其实已经可以完成任务了。实际上，即便是今天的各类智能对话系统，对于任务型对话系统的支持依然是这些智能系统的核心业务能力。

另外一类对话系统，就是非任务型对话系统，这类系统的一个代表就是“**聊天机器人**”（Chatbot）。聊天机器人，取决于我们构建这类系统的目的，可以非常接近于任务型的对话系统，也可以是非常难以模仿的，真正具有一定语言理解能力的系统。

典型的聊天机器人，需要对一定的**知识库进行建模**。比如，当用户问到今天的天气，喜马拉雅山的高度，现在美国的总统是谁等问题，聊天系统要能从某种先前存储的知识库中提取信息。这一部分的功能其实和**数据库信息查询**很类似。

更加复杂的模式无疑是我们不仅需要对已经有的信息进行直接的查询，还需要进行“**推论**”（Inference）。这就是“智能”的某种体现，往往是能对现有的数据进行简单推导。比如，如果用户问这样的问题：比纽约现在气温高的美国西海岸城市有哪些？这时，就需要理解比较词“高”的含义，并能够把这个词汇的含义转换成对气温数值的比较。从这些林林总总的情况来看，非任务型的对话系统更加难以建模，对研发者的挑战也更加艰巨。

## 对话系统的基本架构

尽管不同的对话系统有不同的目的，但是从大的架构上来看，所有的对话系统都有一些基本共同的组件。

首先，一个对话系统需要有一个模块对人的语音进行识别，转换成计算机能理解的信号。这个模块常常叫作“**自动语音识别器**”（Automatic Speech Recognition），简称**ASR**。比如，现在很多手机终端、或者是智能家居都有一些简单的对话系统可以根据你的指令来进行回应。

第二，在通过了语音识别之后，就是一个“**自然语言理解器**”，也简称为NLU。在这个组件里，我们主要是针对已经**文字化了的输入**进行理解，比如提取文字中的关键字，对文字中的信息，例如数字、比较词等进行理解。

第三，对话系统往往有一个叫“**对话管理器**”，简称是DM的组件。这个组件的意义是能够管理对话的上下文，从而能够对指代信息，上下文的简称，以及上下文的内容进行跟踪和监测。

第四，在任务型的对话系统中，我们还需要一个叫“**任务管理器**”，简称是TM的模块，用于管理我们需要完成的任务的状态，比如预定的机票信息是否完备，酒店的房间预定是不是已经完成等等。

第五，我们需要从管理器的这些中间状态中产生输出的文本，也简称是**NLG**。这个部分是需要我们能够产生语言连贯、符合语法的**有意义的自然语言**。

最后，在一些产品中，我们还需要把自然语言能够用语音的方法回馈给用户，这个组件往往简称为**TTS**。

## 总结

今天我为你介绍了对话系统的一些基础的背景信息。

一起来回顾下要点：第一，我们讲了什么是对话系统，对话系统从方法论上来说有什么流派；第二，我们聊了对话系统的分类；第三，我们分析了对话系统的基本架构。

最后，给你留一个思考题，你认为，让对话系统能够真正智能的最大挑战是什么？

欢迎你给我留言，和我一起讨论。


