AI 落子之前,必须先在一堆近十五万个单词的“干草堆”里找到自己的那一步,然后适时停止寻找。
本文以英文撰写和编辑。此中文版本由机器翻译生成;凡涉及准确性之处,以英文原文为准。 阅读英文原文 →
给一个人一整套 WordChess 字母牌,再嘱咐一句“下个好词”,他会不知不觉地把问题缩小。计算机却没有这种直觉。在 25×25 的棋盘上,它握有属于自己的一整套一百枚字母牌,几乎可以尝试词典中 148,941 个单词里的任何一个,而每个单词又能以成千上万种合法的坐标和方向摆放。更麻烦的是,一次摆放只有在它新放下的每一个字母与棋盘上已有字母交叉时也都组成真实单词的情况下才算合法。把单词数乘以摆放方式,再叠加这条交叉约束,得到的搜索空间是任何玩家——无论是硅基的还是其他的——都无法完整枚举并排序的。
正因如此,严肃的文字游戏引擎——包括开源的参考实现 Quackle——从不对词典进行暴力穷举。4 Steven Gordon 在 1994 年提出的 GADDAG 结构,以及在它之前的 DAWG,让程序能够从棋盘上已有的字母牌向外“生长”出单词,并在生长过程中随时检查交叉,使非法的分支尽早夭折,而不是先计分再丢弃。1 任务并不是“列出所有单词”,而是“只生成可能合法的走法,而且要快”。
即便是精简高效的生成器,给出的候选走法也多到无法逐一深入评估,于是第二个问题是时间。Brian Sheppard 的 Maven——第一个在对局中胜过顶尖人类对手的 Scrabble(拼字游戏)程序——正面临这个问题,并以两个阶段作答:先用快速的启发式方法把原始走法大致按质量排序,然后只对最有希望的一小批候选进行细致研究,即把对局向前模拟许多次,看哪一个候选实际表现最好。2 其他游戏用别的名字称呼同一个思路:西洋双陆棋里的 rollout(推演),围棋程序里的 playout(模拟对局);在 Maven 中,它被称为模拟。
WordChess 秉承同样的精神,但约束更严格:每一步都有固定的搜索时间预算。预算用完时,AI 就采用迄今找到的最佳单词。这不是工程师们引以为憾的妥协,而恰恰是整个设计的核心。一个永远思考下去的玩家并不是更强的对手,只是更慢的对手。时钟迫使机器去做人类凭本能就会做的事:满足于一步明显不错的棋,而不是一步可证明最优的棋。
熟悉词典是容易的部分。知道何时停止在词典里搜索,才是难的部分。
让游戏 AI 变简单的偷懒做法,是让它随机犯傻,让它把明明看到的一步棋搞砸。玩家会察觉,也会反感。人们常提到,设计师 Sid Meier 曾从《文明》中删掉结盟功能,因为计算机几乎能像玩家一样利用它们;用一篇关于 AI 对手设计的文章所引述的 Meier 本人的话说,那样的效果会“让玩家觉得自己赢不了,是因为计算机在作弊”。3 被视为不诚实的难度会毒害整个游戏,这也是为什么关于动态难度调整的研究文献关注的是调节 AI 能够做到什么,而不是允许它看到什么。5
WordChess 沿着人类能够理解的维度来调节它的四个难度等级,从不靠向 AI 提供隐藏信息。各等级的区别在于:可以搜索多长时间、词汇深入生僻词典的程度,以及偏好哪些词长区间。简单难度的对手会下一些看似合理的弱词——真实、说得通、偏短,而不是乱码。特级大师与困难等级共享全部冷僻词汇,并拥有最充足的时间去挖掘。玩家输给的是一个看起来词汇量更大、读盘更敏锐的对手,因为它恰恰就是如此。
| 难度等级 | 词汇范围 | 搜索预算 | 词长偏好 |
|---|---|---|---|
| 简单 | 仅常用词 | 最短 | 短 |
| 普通 | 常用词 + 中等词 + 一半生僻词 | 短 | 混合 |
| 困难 | 全部 | 长 | 较长 |
| 特级大师 | 全部 | 最长 | 不限 |
计算器每次都给出同样的答案;对手却会让你意外。WordChess 在选择走法时刻意加入了一个随机化步骤,使得几乎同样好的走法并不总是以同样的方式取舍,AI 也不会每次都重复下同一个单词。再结合每个等级的词汇上限,效果便是多样性:你会感觉棋盘对面坐着一个人在做选择,其中有些选择你自己也可能做出。
这正是其中不动声色的艺术。一个可信的对手既需要实力,也需要克制:愿意下一个仅仅是不错的词,愿意把分数留在桌上,愿意以一种让你赢得理所应当的方式被击败。这台机器最难的工程问题是搜索干草堆;而最微妙的问题,则是学会何时停止搜索、该知道什么,以及该保留多少实力。