我正在构建一个使用 AI 生成基于硬码的故事情节的单机动作 RPG。游戏引擎处理所有动作和 AI 编写的故事情节。其中一部分意味着我必须建立系统来扫描玩家输入以确定玩家试图进行什么动作。犯罪侦测、物体互动等都是。
很早以前,Everything使用基本字符串包含来检查玩家的行动是否包含特定的关键词。如果玩家输入了"steal"那么将会触发抢劫动作;如果输入了"kill"那么将会触发暴力动作;如果输入了"door"那么将会触发与门的互动。这种简单的方法在测试时是有效的,因为我是在测试清晰明确的输入。
然而,当我实际玩游戏时,比如“我会探测封存符”的话,游戏将提示我说没有找到“robe”。同样,当我输入“我想探索仓库”时,游戏会提示我找到了“ore”;当我输入“这个情况正在杀死我 Thorgrim”时,系统会触发杀人确认,因为找到了“killing”。
整个代码库中,每一次包含检查都有同一个问题:只要包含包含更短关键词的任何字符串就都将触发。因此,大部分方法是通过使用word boundary regex来修复它。所有检查都包括了“\b”来只匹配整词:“probe”不会匹配“robe”等。这种修复方法在代码库中进行了机械替换,同时也提供了一个小型的原有函数,使得我们不需要在原址使用raw regex。
经过这个修复之后,子串问题完全解决了。但是,之后又出现新的问题。
AI有时候会忽略我的NPC,自己产生新的NPC。为了解决这个问题,我建立了一个过滤器,检查生成的文本是否含有以小写字母开头的单词,也不在NPC名单中。 如果找到这样的单词就用一个名称取代它。这种方法基于Regex同样的word boundary规则。
但是,叙事文学中用大写字母写的单词并不都是NPC名称。 “Container runes” 中的 Containment”或“The Warehouse”等文本会触发filter,去替换普通的词语。但是,这使得对正常的英文文本都出现了多余的NPC名称。
Regex无法解决这个问题了,因为问题已经变成了识别。问题不在于匹配,而在于识别。它需要将虚幻的 NPCs 名称与正常的大小写单词做出区分。
因此,我又建立了一个处理多个层次的管道。首先,检查上下文,因为NPC名字通常与 "the" 或 "a" 之后的单词不一样。接着,检查后缀模式,因为以 “-tion、-ment、-ness” 结尾的单词都不太可能是NPC名字。最后,对于名词进行匹配,检查典型的英文名词词典。如果经过所有检查后的单词中依然存在大写单词并且它可能实际上是虚假的 NPCs 名称,进而替换。
我所学习的就是,每次输入是自然语言的匹配都是陷阱。它在您的测试用例中有效,因为你写的测试用例通常是清晰和可预测的。实际玩家可以输入任何内容,并且每个常见的英文单词都有可能和您的关键词列表产生冲突。使用Word Boundary regex作为一个最基本的基础,甚至在您试图识别单词而不是仅仅匹配它们时,它的界限还不是非常明确。
任何人都在遇到这个问题吗?我的AI仅生成行文,所有的游戏逻辑和数据都是确定式的。但即使在这种分离下,问题的界限与匹配单词和单词在上下文中所代表的意义之间的区别也会反复出现在我身上。因此,我很想知道有多少人正在经历类似的情况。
评论 (0)