深入浅出对话系统——任务型对话系统技术框架

article/2025/10/21 15:37:40

任务型对话系统架构

在这里插入图片描述
比如,这是一个任务型订票系统的对话例子。

如果要我们实现一个这样的对话系统,其中有三个最大的难点:理解用户输入、记住对话历史信息、知道要问什么。

首先是要能理解用户的输入,知道用户想什么;其次需要维护一个历史状态。因为用户一般不会在一句话中说清楚自己的所有需求,因此需要记住用户所说的关键信息,知道哪些信息提供了,哪些没有提供;最后通过提问题得到未提供信息的答案。

这三个难点可归纳为理解用户、追踪状态和生成下个动作。

任务型对话系统的目标是帮助用户实现他们想做的事情,有一个评测指标是在完成任务的前提下,对话的轮数越少越好。

下面我们来了解一下任务型对话系统中关键的术语。

常用术语

模式(schema): 预定义好的结构化表示,涵盖了任务导向对话所能处理的关键信息。
以订票系统为例,我们需要知道出发地、到达地、出发时间、乘客姓名等。在Python中,可以以字典的形式存储。Key就是这些信息,Value维护了所有可能的Key的取值(或者一个取值规则)。
意图(intent):用户想要进行的操作。
所谓理解用户输入,就是识别用户的意图。
槽(slot):其实就是模型中Key的概念。
比如订机票中,出发地和到达地就是两个Slot。得到每个Slot对应的值就可以完成对话任务。该过程也称为填槽。
领域(domain):预先设计好的意图和槽的集合。
比如订机票和订酒店就可以通过两个领域来维护。

下面是一些领域的例子:

在这里插入图片描述

特点

任务型对话系统的特点/难点:

  1. 领域强相关的
    • 缺乏训练数据
  2. 最终目标:帮助用户做些事情。模型必须理解用户想要什么。
  3. 尽量简介高效

在这里插入图片描述
我们再来回顾下任务型对话系统的概述。本文将详细介绍其中的三大模块:自然语言理解、对话管理、对话生成。
这三个模型分别用于解决上面探讨的三个难点:理解用户输入、追踪状态和生成下个动作。

自然语言理解(NLU)模块接收用户(非结构化字符串)的输入,输出结构化的语义帧表示。比如领域、意图和(语义)槽。
对话管理(DM)模块通过状态追踪(DST)来记录关键信息,它的输入是NLU模块的输出,它的输出是对话的策略(是问问题呢,还是做点什么)。其内部会维护一个对话状态。
自然语言生成(NLG)模块根据DM模块输出的对话动作,生成用户能理解的自然语言。但大多数通过基于规则的模板实现。

自然语言理解模块

自然语言理解模块是用户输入进入系统后接触的第一个模块。可分为三个子模块:领域识别、意图识别、语义槽填充。

比如 Show me morning flights from Boston to San Francisco on Tuesday 这句话进入自然语言理解模块后可以得到:

  1. 领域识别
    • 领域:订机票
  2. 意图识别
    • 意图:查询航班
  3. 语义槽填充
    • 出发地: Boston
    • 出发日期: Tuesday
    • 出发时间: morning
    • 到达地: San Francisco

下面看更多的例子,包含三个领域。
在这里插入图片描述

从上图可以看到,这三个子模块也是通过Pipeline的方式运作的,即首先进行领域识别,然后是意图识别,最后才做语义槽填充。

我们知道,领域识别和意图识别本质上都是分类任务,语义槽填充属于序列标注任务。

现在一般使用深度学习来做自然语言理解。

深度学习在意图/领域识别中的发展过程:
在这里插入图片描述
随着自注意的出现,后来常用基于预训练模型的文本分类器。

而在语义槽填充中:
在这里插入图片描述
在BERT出来之前,最火的选择就是LSTM+CRF来实现序列标注。

对话管理模块

我们上面知道对话管理模型结构化的语义帧,输出对话动作。其维护了两个子模块——状态追踪(DST)和策略优化(DPO)。

我们先来看一下对话状态追踪。首先要知道什么是对话状态。

对话状态追踪

**对话状态(Dialogue State)**是对话到当前位置为止,用户所提供的哪些关键信息。
具体实现可以理解为Python中的字典。Key是Slot,Value是用户目前位置提供的值。

来看一个例子,从中可以看到对话状态的更新:
在这里插入图片描述
对话状态追踪即对话状态估计。
在上面的例子中,对话状态挺明确的,为什么说是对话状态估计?

因为虽然我们这里的例子很简单,但实际上真实系统上,我们很难找到这么清晰的例子。用户总能想到我们无法处理的意图,或者说用户总有一些我们意想不到的举措。为了满足这些举措,我们需要设计很多的对话动作,很多的槽,并且每个槽有很多不同的取值。最终导致我们对话状态空间非常庞大。
在这里插入图片描述
在用户表述不清楚的情况下,我们很难更新对话状态。所以我们需要进行对话状态估计。
那么我们过去一般是如何解决这个问题呢。

在这里插入图片描述
通过马尔科夫决策过程(Markov Decision Process)。提出者认为对话管理模块在和用户交互的过程中,遵循了上面的流程。
具体为:用户说了一句话 a u a_u au,为用户的真实动作。通过语音转文字,得到 a ~ u \tilde{a}_u a~u,为系统观察到的用户行为。这里就可能和用户的真实意图有偏差。模型根据这个观察到的行为,需要产生对于当前对话状态的估计 s ~ m \tilde{s}_m s~m,然后通过对话策略模块生成下一步动作 a m a_m am。接着,通过文字转语音得到系统输出的动作 a ~ m \tilde{a}_m a~m。用户根据系统输出,认为自己已经提供了哪些关键信息 s u s_u su,和DM中维护的对话系统认为用户已经提供的关键信息 s ~ m \tilde{s}_m s~m很有可能不同。

而现在在学术界和比赛中把它当成文本生成任务。
在这里插入图片描述
将当前对话历史得到的对话状态打包成字符串,然后通过自回归的语言模型学习。
对于新的对话历史怎么得到状态呢,也是将其打包成字符串,喂给语言模型,然后让语言模型以字符串的方式输出键值对。

https://arxiv.org/abs/2012.03539
https://github.com/salesforce/simpletod
但在商业化应用中只是通过基于对话流的方式,会遍历所有可能的对话状态。

对话策略

在这里插入图片描述

对话策略就是根据当前的对话状态决定对话系统下一步的动作。

具体做法为,将对话策略看成函数 π \pi π
在这里插入图片描述
它接收的输入为当前的对话状态 s s s,输出为对话动作 a a a。通过多轮的对话交互,就可以得到一系列动作序列 A A A

对话策略过去是通过有限状态机的方式实现的。

在这里插入图片描述
即系统会遍历所有可能的状态,在不同的状态下有不同的决策。在不同的决策中使用规则的方式决定下一步动作。
以订票为例。首先会问出发地,然后问目的地、出发时间。中间会问要不要订返程票,根据答案的不同流程会不同。

而更有趣的做法是把它看成强化学习过程:
在这里插入图片描述

但实际应用中,我们仍然采用的是基于有限状态机的方式。

甚至我们也可以为开放领域的聊天机器人设定一些对话管理过程:
在这里插入图片描述

对话生成模块

自然语言生成模块主要用于根据对话动作生成文本回复。
最简单的方式就是通过模板来实现。

在这里插入图片描述
即为每个对话动作配置一些问题模板。

后来,大家发现可以把生成模板的过程写得更花俏一点。
在这里插入图片描述
主要是对生成模板的过程进行细分,比如上图终端Text Planner、Sentence Planner和Realizer。

随着深度学习的发展,有人也尝试通过语言模型来生成。
在这里插入图片描述

但是在工业界,还是通过基于模板的方式。因为它简单、可控。

任务型对话系统的评价方法

整体评价

分为两个方面:

  • 客观指标
    • 对话成功率
      • 通常在对话结束后得到(任务是否被解决)
    • 平均对话轮次数
      • 任务型对话追求简短的轮次完成对话任务(完成任务所需)
  • 主观指标
    • 用户满意度
      • 多类别分值问题
      • 通常需要人工标注
    • 场景及用户体验相关的评价指标

自然语言理解的评价

对于自然语言理解模块,它分为三个子模块:领域识别、意图识别和槽值填充。
前两个是分类任务,最后一个是序列标注任务。
对于领域识别,我们认为是一个多分类任务,所以用准确率来评价;
对于意图识别,也是一个多分类任务,也可以用准确率来评价。
对于槽值填充,作为序列标注任务进行评价,使用F1分数:加权平均所有不同的槽值类型上的F1分数。

对话管理的评价

同理,也会将它的两个子模块分别拿出来评价。

  • 对话状态追踪
    • 单轮对话句子的动作识别
    • 多轮对话片段的状态信息识别
      • 例如: 主题、对话行为、对话类型
  • 对话策略优化
    • 对话成功率(对话系统的整体性能)
    • 对话奖励函数评价

自然语言生成的评价

对NLG模块的评价也可以分为两部分。

  • 客观评价指标
    • 字符串级评价指标
      • BLEU、METEOR、ROUGE
    • 语义级评价指标
      • 嵌入指标
        • Vector Extrema、Greedy Matching、Embedding Average
  • 主观评价指标
    • 相关性
    • 流畅度
    • 多样性

参考

  1. 贪心学院课程

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

相关文章

一文读懂智能对话系统

来源:机器学习算法全栈工程师 作者:蒙康 编辑:王抒伟 本文共6050字,建议阅读10分钟。本文带大家理解智能对话系统的研究方法以及未来趋势。 笔者在最近的研究中发现了一篇非常好的有关对话系统的论文,《A Survey on Di…

对话系统 | (8) 任务型对话系统概述

本篇博客主要参考/节选中科院自动化所王唯康博士的博士论文《任务型对话系统中对话管理方法研究》。 文章目录 1. 概述2. 基于管道的任务型对话系统2.1 语言理解模块2.2 对话管理模块2.3 语言生成模块 3. 端到端的任务型对话系统3.1 基于检索的任务型对话系统3.2 基于生成的任务…

对话系统 | (4) 任务型对话系统基础

本篇博客内容主要来自第十四届中国中文信息学会暑期学校暨中国中文信息学会《前沿技术讲习班》— 张伟男、车万翔《任务型对话系统》 PPT下载链接 文章目录 1. 任务型对话系统概述2. 任务型对话系统关键技术自然语言理解对话管理对话状态追踪对话策略优化 自然语言生成端到端…

前沿重器[21] | 聊聊对话系统:概述

前沿重器 栏目主要给大家分享各种大厂、顶会的论文和分享,从中抽取关键精华的部分和大家分享,和大家一起把握前沿技术。具体介绍:仓颉专项:飞机大炮我都会,利器心法我还有。 近期,我再次总结了我的历史文章…

Xenko C#开源游戏引擎

Xenko是一款用于渲染和 VR 的开源 C# 游戏引擎。该引擎具有高度模块化,旨在为游戏制作者提供更大的开发灵活性。Xenko 附带一个编辑器,允许您以直观和直观的方式创建和管理游戏或应用程序的内容。 官方网站:https://xenko.com/ g…

开源游戏引擎整合

2D: Allegro.cc - Main http://www.allegro.cc/ 老牌子了,和SDL同时是很经典两个EG开发组件,最近貌似在和PY进行联合? ClanLib - ClanLib Game SDK http://www.clanlib.org/ CLANLIB是以前听过最复杂最丰富的SDK,看看链接 http://…

开源游戏java引擎_基于Java的开源3D游戏引擎jMonkeyEngine

jMonkeyEngine简介 jMonkeyEngine是一款纯Java语言编写的游戏引擎,继承了Java应用跨平台的特性,而且是开放源代码的,遵循BSD开源协议,BSD开源协议用一句简单的话概括就是你可以用它做任何你想做的事情而不必担心版权问题。 这款游戏引擎在商业游戏中使用的不多,但是笔者觉…

<2021SC@SDUSC> 开源游戏引擎 Overload 代码模块分析 之 OvTools(七)—— 终篇总结

2021SCSDUSC 开源游戏引擎 Overload 代码模块分析 之 OvTools(七)—— 终篇总结 目录 前言回顾1、Eventing2、Filesystem3、Time4、Utils 总结下一个计划 前言 本篇是开源游戏引擎 Overload 模块 OvTools 的最后一篇了。本篇,笔者将对 OvToo…

<2021SC@SDUSC> 开源游戏引擎 Overload 代码模块分析 之 OvGame (一)—— 概况与 .rc 文件

2021SCSDUSC 开源游戏引擎 Overload 代码模块分析 之 OvGame(一)—— 概况与 .rc 文件 目录 前言OvGame 模块大纲.rc 文件 计划 前言 上一篇,笔者对 Overload 的 OvTools 分析总结完毕,想了解的可前往总结与链接集合自选查看。而…

开源游戏引擎详解

2D: Allegro.cc - Main http://www.allegro.cc/ 老牌子了,和SDL同时是很经典两个EG开发组件,最近貌似在和PY进行联合? ClanLib - ClanLib Game SDK http://www.clanlib.org/ CLANLIB是以前听过最复杂最丰富的SDK,看看链接 http://…

<2021SC@SDUSC> 开源游戏引擎 Overload 代码模块分析 之 OvGame(八)—— 终篇总结

2021SCSDUSC 开源游戏引擎 Overload 代码模块分析 之 OvGame(八)—— 终篇总结 目录 前言回顾1、.rc2、Utils3、Debug4、Core5、Main.cpp 总结 前言 本篇是开源游戏引擎 Overload 模块 OvGame 的最后一篇了。本篇,笔者将对 OvGame 做一个简单…

WickedEngine 开源游戏引擎

GitHub:https://github.com/turanszkij/WickedEngine WordEngEnter是开源跨平台C游戏引擎,支持DX12和Vulkan渲染器的光线跟踪和路径跟踪。Wicked engine既可以作为构建自己游戏引擎的底层框架,也可以作为自己的完全功能引擎,它增强…

Storm-Engine 基于 C++ 的开源游戏引擎

Storm Engine 是《海狗》和《加勒比海盗》等游戏背后的游戏引擎,该游戏引擎已在 GPLv3 许可下开源。源代码仅包括游戏引擎,并不包括上述游戏的源代码 支持的游戏 海狗加勒比海盗海盗时代 构建项目 需要安装 Conan 并将其添加到%PATH%环境变量中。此外…

阿里自主研发的互动游戏引擎Hilo开源啦!【内有详解】

Hilo,一套HTML5跨终端的互动游戏解决方案。Hilo支持了多届淘宝&天猫狂欢城等双十一大型和日常营销活动。内核极简,提供包括DOM,Canvas,Flash,WebGL等多种渲染方案,满足全终端和性能要求。支持多种模块范…

R语言基础教程1

文章目录 安装运算符判断函数递归 安装 根据自己的操作系统,下载R语言环境后,安装,并将安装路径加入到环境变量,即可从命令行进入R环境 >rR version 4.2.2 (2022-10-31 ucrt) -- "Innocent and Trusting" Copyrigh…

R、Rstudio的下载和安装教程

R是用于统计分析、绘图的语言和操作环境。R是属于GNU系统的一个自由、免费、源代码开放的软件,它是一个用于统计计算和统计制图的优秀工具。RStudio是R的集成开发环境,使用R的UI界面Rstudio进行R编程的学习会更加方便。显然,安装Rstudio之前需要先进行R环境安装。R的下载地址…

R/RStudio详细安装流程

一、需要安装的内容 安装的是最新的R 4.2.2,如果电脑本身安装了旧版本的,需要先卸载,重新按照以下流程安装 安装的位置建议在C盘以外的盘,建一个R的目录,存放所有的安装程序,这样不会占用C系统盘的位置 所有…

MacOS下安装R语言和RStudio教程(超完整)

MacOS下安装R语言和RStudio教程 一、前提二、R语言安装三、RStudio安装到此,安装全部完成。四、可能会遇到的问题:关于macOS:在Mac上安装R-警告消息:使用“ C”设置LC_CTYPE失败错误是:解决办法: 五、在RSt…

R及RStudio软件安装教程

R是比较常用的数据处理和分析软件,该如何安装呢?下面就手把手教给大家。 主要包括两部分软件的安装,一是安装R,提供R环境;二是安装RStudio,可以更方便快捷撰写R代码。 首先先安装R软件 安装网址&#xf…

R语言4.04安装教程

R for Windows是一个免费的用于统计计算和统计制图的优秀工具,是R语言开发工具。它拥有数据存储和处理系统、数组运算工具(其向量、矩阵运算方面功能尤其强大)、完整连贯的统计分析工具、优秀的统计制图等功能。提供的图形界面,可…