设想你在键盘上敲下一句:“我担心明天的考试。”屏幕很快回答:“你为什么担心明天的考试?”
你继续说:“因为我觉得自己准备得不够。”它又问:“你经常觉得自己准备得不够吗?”
这段对话是为解释机制编的。它听上去像有人在认真追问,但也有一种更省事的可能:对方根本没有判断你准备得怎样,只是把你刚输入的文字拆开,又装进了一个问句。
1966 年,麻省理工学院的 Joseph Weizenbaum 发表了 ELIZA 论文,展示了一种能够进行文字对话的程序。它最著名的一类脚本模仿心理访谈中的追问方式。这里讨论它的文本操作,不把程序当作有诊断能力的治疗工具。1
上一篇的翻译器需要把话译对。聊天程序却给研究者提供了另一种处境:只要回应能够让谈话继续,对方有时就愿意接着说。于是,一个值得追问的问题出现了:连贯的回应里,有多少来自程序的操作,又有多少来自人的解释?
一、先找到一句可以接的话
继续开头的设想。我们为小程序写一条规则:输入里出现“我担心”时,把后面的文字保存下来,再放到“你为什么担心……?”这个句式里。
输入是“我担心明天的考试”。程序找到了“我担心”,截取余下的“明天的考试”,拼成问句。它既没有检查考试时间,也没有掌握你的复习进度。
把输入换成“我担心冰箱里的西瓜”,同一条规则照样得到“你为什么担心冰箱里的西瓜?”这次对象变了,操作完全一样。西瓜得到了与考试同等郑重的关注,主要因为它站在同一个位置。
这就是模式匹配:检查输入是否符合预先指定的文字形状,把符合位置的片段取出来。随后进行重组,用选定的句式重新安排这些片段。ELIZA 原论文明确讨论了分解规则与重组规则,两者配合产生回应。1
不过,如果程序每次都在全部规则里找一遍,写得越多,查找就越麻烦。原系统先识别关键词,再尝试与关键词关联的规则;关键词还可以有优先顺序。句子同时提到几个可回应的话题时,优先顺序会影响先处理哪个。1
在我们的中文版演示里,可以设想先检查“担心”,再检查其他类别。这里的顺序由人预先规定,并不代表程序经过考虑后认定考试比西瓜重要。它从输入里选择了一个入口,这已经足够让对话继续一轮。
从早期翻译到这类对话,规则仍在发挥作用,但目标变了:翻译的错误会暴露在译文里,追问却可以把进一步说明的任务交还给用户。
二、把“你”和“我”调换,句子就像有了立场
只截取尾巴还不够。有些回应需要处理说话者的关系。
再设想输入:“我觉得你不相信我。”我们规定把它拆成“我觉得”“你”“不相信”“我”四块,取出中间表示态度的“不相信”,然后放入“是什么让你觉得我……你?”这个新句式。结果便是:“是什么让你觉得我不相信你?”
原输入中被指责的是“你”,也就是程序;程序回应时,这一方要变成“我”。原输入里的“我”指用户,回应里则要改成“你”。这种转换改变了人称关系,却没有验证双方究竟相信什么。
Weizenbaum 在论文里用英语说明过类似的拆分和重组:抓住指定词与其间片段,调整人称,再加上一个预设开头。上面的中文句子是对此类操作的演示,不是原程序的中文运行记录。1
这个差别很容易被流畅的句子掩盖。我们读到“我不相信你”,会自然把“我”理解成一个正在表达立场的说话者;但在程序里,它也可能只是重组模板中固定的一块文字。代词已经站对了位置,立场却未必存在。
如果把输入改成“我觉得你在冰箱里跳舞”,同一类模板也可能问:“是什么让你觉得我在冰箱里跳舞?”句法仍然通顺,常识已经有点冷了。程序可以对荒唐前提进行形式上合适的追问,因为它执行的是转换,不是核查。
这也说明了规则的能力和边界。它能保留用户输入中的具体内容,所以比每次都回答“请继续”更贴近谈话;但贴近可以来自复制与重组,不能仅凭这一步推断它拥有相应经历、信念或世界知识。
三、接不上时,怎样让谈话不断线
实际聊天不会永远提供规整的“我担心……”句子。用户可能只说“嗯”,也可能输入一个脚本没有覆盖的话题。若程序立即沉默,刚建立的对话感就会消失。
ELIZA 的设计因此还包括没有找到合适关键词时的回应办法:可以使用不依赖具体内容的句子,也可以在特定条件下取出较早生成并保存的材料。原论文把这一问题单独列为系统需要解决的事项。1
为了看清区别,设想我们的小程序刚保存过“明天的考试”。用户随后只输入“唉”,当前规则匹配失败,于是程序按预定条件取出保存的片段,问:“再说说明天的考试?”用户可能觉得它一直记挂着这件事;实际操作则是保存一段文字,在某个分支中再次使用。
这比没有记忆的固定问答多了一步,但也别把它看成已经记住了你的全部情况。要检验保存了什么,可以继续问:“我刚才说考试在哪一天?”一个只存片段、没有相应查询规则的程序,未必能按你期待的方式回答。保存过文字与能灵活利用文字,不是同一种能力。
原系统还有一个重要安排:关键词和转换规则组成脚本,脚本与执行这些规则的程序分开。换脚本能够改变对话方式,而不必把整个程序重写一遍。这把“怎么执行匹配”与“遇到什么话该怎样接”分成了不同工作。1
这时,程序看上去学会了新话题,实际可能是编写者给它增加了新规则。这里的“学习”如果不说清来源,就容易让人工编辑穿上自动成长的外套。
四、一段顺畅对话,到底证明了什么
ELIZA 留给后来的问题,并不只是程序能否接上下一句。Weizenbaum 的原论文开头就在讨论:当程序内部的步骤被清楚解释出来,人们对它的评价会怎样改变。1
开头那两轮考试对话,可以同时包含真实的交流效果和有限的技术操作。用户确实可能被追问引导,进一步整理自己的表达;程序也确实可能只做了匹配、复制、人称转换和选择模板。不能因为效果有限就否认发生了互动,也不能因为发生了互动就把所有人类能力一并归给程序。
想分辨它靠什么接话,可以保持句式不变,替换内容;可以把内容保留,却换一种说法;还可以要求它核对前文中的关系。前两种变化分别检验模板是否忽略具体意义、是否过度依赖固定表达,后一种变化则检查它能否使用已出现的信息。这里没有一问定聪明的魔法试题,只有逐步缩小解释范围的比较。
后来的统计与神经方法会改变回应的产生机制。我们不能把它们都说成 ELIZA 式的模板,也不能因为它们不再靠相同模板,就省掉同样的追问:当前表现究竟由什么操作支持,在什么条件下会失效?
回到“我担心明天的考试”。小程序能把它接成一个合适的问题,是因为我们替它规定了怎样找到、截取和重组文字。那句关切可以推动谈话,却还不能证明程序知道考试是什么。
考试仍需你准备。至于冰箱里的西瓜,它暂时只享受到了格式正确的关心。