发布于:2021-02-03 10:50:20
0
365
0
作为一名程序员,我想通过创建自己的聊天机器人来学习如何开发聊天机器人。我重点介绍了开发bot的以下组件:自然语言理解(NLU)组件、对话框管理器(DM)、自然语言生成(NLG)组件以及模块化或端到端方法。
要构建一个成功的聊天机器人,请考虑用户的观点。首先,用户向bot写入一些内容。bot处理消息并生成响应。然后,将响应发送回用户。
这些步骤无限期地重复,直到对话者之一决定完成。让我们对上面描述的会话过程进行更深入的挖掘,并对其进行更详细的分析,以了解其实际的复杂性。
在本文中,我将向您展示制作聊天机器人所涉及的元素,以及每个步骤涉及的细节。聊天机器人在很多场合和商业中都有使用,知道如何实现一个聊天机器人对你的开发生涯非常重要。
构建聊天机器人所涉及的元素
当用户写东西时,bot需要处理它。由于机器人不懂人类的语言,我们需要一种方法将我们的自然语言和非结构化语言翻译成任何可以被机器处理和理解的结构化数据。
这一步被称为自然语言理解(NLU)。从用户消息到结构化数据的转换称为“语义框架”。
一旦处理了用户消息并生成了语义框架,bot就可以分析这些结构化数据,以寻找下一步要采取的最佳操作,包括生成响应。
在此步骤中,bot可能需要记住会话中的数据,因此它不会一次又一次地问相同的问题。这个过程由一个名为对话框管理器(dialogmanager,DM)的组件执行,它跟踪会话状态并选择与特定策略有关的操作。
最后,bot选择的动作包括对用户的响应或要生成的该响应的数据。这些数据被传递到一个组件,该组件处理并将其转换为显示给用户的人类语言响应。这个过程被称为自然语言生成(NLG)。
这些是构建bot过程中涉及的元素。让我们逐一谈论它们。
NLU组件
如前所述,NLU组件从用自然语言编写的消息中生成语义框架。这个框架通常由一个意图(用发送的消息表示用户的意图)和一组表示用户在消息中给出的数据的实体组成。
例如,“我想订一个从马德里到哥本哈根的航班”可以翻译成下图中的结构:
为了完成这种翻译,可以使用经典的自然语言处理(NLP)方法或更高级的深度学习(DL)方法。
通常,当数据很少或没有数据时使用经典方法,因为DL方法需要大量数据才能很好地执行。然而,在这种情况下,随着预训练模型的出现,人们可以选择DL方法并使用定制数据对模型进行微调,即使可用数据很少。
对话框管理器
这一部分是最关键的,因为对话的成败很大程度上取决于它的肩膀。当然,谈话过程中隐含的所有内容都非常重要。尽管如此,对话的连续性——流畅性——在很大程度上取决于这个组件在内存(通过填满的插槽)和动作选择方面的表现。
这就是为什么这篇文章通常由两个子部分组成:
对话框状态跟踪器(DST)
对话框策略(DP)
DST跟踪会话历史、时隙以及与会话上下文相关的所有信息。上面提到的插槽是内存单元,其中填充了通过语义框架、数据库调用、webhook响应等接收到的实体。
DP是负责根据语义框架、会话历史或所选动作选择下一个动作的子组件。
让我们通过一个示例来了解此组件必须处理的复杂性:
(1)用户:“我想从我的银行账户中提取50元。”
(2)Bot:“哪种账户:活期还是信用?““
(3)用户:“我的信用账户上有多少钱?““
(4)Bot:“您的银行卡账户余额为100元。”
(5)用户:“太好了!那我就从那一个拿走。”
(6)机器人:“好的,那么你想从你的信用账户中提取50元。是这样吗?““
(7)用户:“是的,请。”
…。
在(1)NLU部分中,推断的意图可能是“提取现金”,实体“金额”中填有50元。bot已经知道这个用户,比如说因为它是一个登录用户,并且从DB获取信息,得到两个帐户“current”和“credit”,这两个帐户填充了“availableu accounts”的位置
DP决定bot需要知道用户想要从哪个帐户取款,因此下一个操作是询问(2)中的用户应该从哪个可用帐户取款。在(3)中,用户改变了目标,现在想知道他们信用账户的余额。
DM必须足够聪明,在目标改变后继续对话,但要保留已经通过插槽记住的信息。在(5)中,用户返回到初始目标,引用过去的数据而不显式地指定它。
bot必须将这些信息关联起来,在(6)中,bot在执行所需操作之前请求确认收集的数据。
正如你所看到的,这不是一项容易的任务;学术界和公司正在对这一过程进行大量研究。根据目标,可以选择更直接的方法或更复杂的方法。
最简单实用的方法和最不灵活的方法是将对话框建模为一个有限状态机(FSM),其中每个状态表示动作,边表示意图。插槽可以保存在键/值数据结构中。
更灵活的方法是将FSM与基于帧的系统相结合,如GUS在1977年描述的框架驱动对话系统。
一种更复杂但同时也更复杂的方法是将对话框建模为ML的一个分类问题,其中对话框的历史、过去选择的动作和槽是特征,动作是要预测的类。
NLG组件
NLP将人类语言转化为非结构化数据,NLU通过语法理解数据,NLG则从结构化数据生成文本。
NLG可以比作一个分析员,他将数据翻译成单词、句子和段落。这个组件的主要好处是它创建了一个上下文化的叙述,输入隐藏在数据中的含义并进行交流。
一旦机器人知道下一步要做什么,就应该向用户生成一个响应,这样他们就可以得到某种反馈。在用户收到反馈后,他们可以决定是否有足够的信息,是否可以完成交互,或者提出进一步的问题。
这里有两个主要的解决方案:简单的方法是在模板中预定义响应,在生成响应时用占位符替换它们。另一种解决方案是动态句子生成,它稍微复杂一点,使用深度学习在注入一些数据后自动生成响应。它可以用于创建复杂的模板系统。
预定义响应解决方案的示例如下所示。这种模板可以用于将数据直接翻译成文本。
“我找到了从{从{城市}到{到{城市}的机票。”占位符是{从{城市}}和{到{城市},它们是取而代之的是谈话中收集的实际数据,给出这样的回答:“我找到了从马德里到哥本哈根的机票。”
谁知道呢,也许GPT-3会给你这个组件的答案!
模块化方法或端到端方法
到目前为止,在本文中,我已经介绍了构建chatbot的三个模块或组件:NLU、DM和NLG。然而,有一种不同的方法正在积极研究中,这意味着只有一个组件接收用户消息并生成响应。
用户可以说:“我想飞往北京”=>生成响应的E2E黑盒=>星期一和星期二有航班。
这是一种端到端的方法,非常有趣,但目前它只存在于学术领域。然而,它看起来非常有前途!
这种方法的主要好处是,它允许您在每个模块中控制NLP过程,对其进行培训,并分别对其进行改进。另一个好处是单一责任原则,每个模块只负责一件事,便于代码维护。
为您的项目选择正确的方法
到目前为止,我们已经提出了开发对话系统的不同技术和方法。根据您的项目需要,如果所需的bot非常简单,可以使用使用经典NLP方法的简单NLU和基于FSM的对话框管理器。
如果您正在研究ML提供的可能性,您可以选择模块化方法,每个模块使用不同的ML技术,也可以使用端到端方法。另一种选择是将它们结合起来——例如,实现一个基于ML的NLU模块,以及一个基于帧的对话框管理器和一个基于模板的NLG。
有很多可能性,但我们的想象力是有限的。我鼓励那些对构建bot感兴趣的人深入研究本文中讨论的不同选项,以发现哪个选项适合您的项目。
作者介绍