9.3 聊天机器人的设计
初始的ELIZA应用程序是200行出头的代码。Python NLTK的实现也是差不多的短小精悍。在NLTK网站的这个链接(http://www.nltk.org/modules/nltk/chat/ eliza.html),可以看到一些摘要。这里我也转载了以下内容。
# Natural Language Toolkit: Eliza # # Copyright (C) 2001-2016 NLTK Project # Authors: Steven Bird <stevenbird1@gmail.com> # Edward Loper <edloper@gmail.com> # URL: <http://nltk.org/> # For license information, see LICENSE.TXT # Based on an Eliza implementation by Joe Strout <joe@strout.net>, # Jeff Epler <jepler@inetnebr.com> and Jez Higgins <mailto:jez@jezuk.co.uk>. # a translation table used to convert things you say into things the # computer says back, e.g. "I am" --> "you are" from __future__ import print_function from nltk.chat.util import Chat, reflections # a table of response pairs, where each pair consists of a # regular expression, and a list of possible responses, # with group-macros labelled as %1, %2. pairs = ((r'I need (.*)',("Why do you need %1?", "Would it really help you to get %1?","Are you sure you need %1?")),(r'Why don't you (.*)', ("Do you really think I don't %1?","Perhaps eventually I will %1.","Do you really want me to %1?")), [snip](r'(.*)\?',("Why do you ask that?", "Please consider whether you can answer your own question.", "Perhaps the answer lies within yourself?", "Why don't you tell me?")), (r'quit',("Thank you for talking with me.","Good-bye.", "Thank you, that will be $150. Have a good day!")), (r'(.*)',("Please tell me more.","Let's change focus a bit... Tell me about your family.","Can you elaborate on that?","Why do you say that %1?","I see.", "Very interesting.","%1.","I see. And what does that tell you?","How does that make you feel?", "How do you feel when you say that?")) ) eliza_chatbot = Chat(pairs, reflections) def eliza_chat(): print("Therapist\n---------") print("Talk to the program by typing in plain English, using normal upper-") print('and lower-case letters and punctuation. Enter "quit" when done.') print('='*72) print("Hello. How are you feeling today?") eliza_chatbot.converse() def demo(): eliza_chat() if __name__ == "__main__": demo()
从这段代码中可以看出,它解析了输入的文本,然后将其与一系列的正则表达式进行匹配。一旦输入匹配成功,就会返回一个随机的答复(有时回应也会带上输入的一部分)。所以,像“I need a taco”这样的问题有时会触发“Would it really help you to get a taco?”这样的回答。显然,答案是肯定的,而且幸运的是,现在这个时代的技术已经可以为你提供这项服务了(祝福你,TacoBot),当然还是在早期发展阶段。令人震惊的是,有些人确实相信ELIZA是一个真实的人。
但是,更先进的机器人又怎样呢?它们是如何构建的?
令人惊讶的是,你遇到的大多数聊天机器人并没有使用机器学习的技术,他们使用的是所谓的基于检索的模型。这意味着答复是根据问题和上下文而预定义好的。这些机器人最常见的架构是被称为人工智能标记语言(AIML)的东西。AIML是一种基于XML的模式,它表示机器人应该如何与用户的输入进行交互。它只是一个更高级版本的ELIZA。
让我们来看看如何使用AIML来生成答复。首先,预处理所有的输入以使其标准化。这意味着当你输入“Waaazzup ???”时,它被映射到“WHAT IS UP”。这个预处理步骤通过多种方式,将针对同样事物的不同说法变成一个输入,这样就可以在输入上运行单个规则。标点符号等在这个阶段也被去除了。一旦完成,输入就匹配上了对应的规则。以下是模板的示例。
<category> <pattern>WHAT IS UP</pattern> <template>The sky, duh. Pfft. Humans...</template> </category>
这是基本的设置,你也可以使用通配符、随机化和优先级模式。例如,以下模式使用了通配符匹配。
<category> <pattern>* FOR ME<pattern> <template>I'm a bot. I don't <star/>. Ever.</template> </category>
这里,*通配符匹配了FOR ME之前的一个或多个单词,然后在返回的输出模板中重复这些内容。如果用户输入“Dance for me!”,回复就是“I'm a bot. I don't dance. Ever.”。
正如你所见,这些规则并没有产生任何接近于真实智力的东西,但有一些技巧让人们产生了幻觉。一个更棒的能力是根据话题的内容,产生相应的答复。
例如,以下是找到话题的规则。
<category> <pattern>I LIKE TURTLES</pattern> <template>I feel like this whole <set name="topic">turle</set> thing could be a problem. What do you like about them? </template> </category>
一旦设置了话题,那么就可以匹配上特定于该上下文的规则。
<topic name="turtles"> <category> <pattern>* SHELL IS *</pattern> <template>I dislike turtles primarily because of their shells. What other creepy things do you like about turtles? </template> </category> <category> <pattern>* HIDE *</pattern> <template>I wish like a turtle that I could hide from this conversation. </template> </category> </topic>
让我们看看这个交互大致是什么样子的。
>I like turtles! >I feel like this whole turtle thing could be a problem. What do you like about them? >I like how they hide in their shell >I wish like a turtle I could hide from this conversation.
你可以看到,谈话的连续性增强了现实感。
你可能认为在深度学习的时代,这不是最先进的技术,你是对的。虽然大多数机器人都是基于规则的,但下一代的聊天机器人正在浮现,它们是基于神经网络的。
2015年,Google的Oriol Vinyas和Quoc Le发表了一篇论文(https://arxiv.org/ pdf/1506.05869v1.pdf),描述了基于序列到序列模型的神经网络构造。这种类型的模型将输入序列,例如“ABC”,映射到诸如“XYZ”的输出序列。这些输入和输出可以是从一种语言到另一种语言的翻译。然而,在他们的工作案例中,训练数据不再是语言翻译,而是技术支持的对话脚本和电影中的对白。虽然这两个模型的结果都很有趣,但基于电影对白模型的互动却更加引人注目。
图9-5是从论文中截取的交互样例。
图9-5
这些都不是由人类显式编码的或存在于训练集中,然而,看着这些就像和真人交谈,不禁让人有点恐惧。让我们看看更多的内容,如图9-6所示。
图9-6
注意,模型回答时似乎考虑了性别(他,她)、地理(英格兰)和职业(球员)。即使是有关意义、伦理和道德的问题,表现得也不错,如图9-7所示。
图9-7
会话还在继续,如图9-8所示。
图9-8
如果这个对话脚本没有让你对未来产生轻微的恐惧感,那么你可能已经是某种形式的人工智能产物了。
我真心推荐你阅读整篇论文。它写得不是过于技术化,而且肯定能让你了解这项技术目前发展的进度。
我们谈了很多关于聊天机器人的历史、类型和设计,现在让我们继续,创建一个属于自己的机器人吧!
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论