当前位置: 网站首页 技术文章 正文

上交大发布可进化游戏引擎!大模型助力代码自动升级,虚拟世界变化不再需要预先设定

来源:互联网 发布时间:2024-09-20 10:32:44

试问哪个孩子不曾梦想过拥有一只独一无二的伙伴呢?(尤其是那种可以根据个人喜好定制的小伙伴~)

上交大发布可进化游戏引擎!大模型助力代码自动升级,虚拟世界变化不再需要预先设定

最近,一支来自上海交通大学与哈尔滨工业大学深圳校区的研究队伍推出了一项名为“可进化游戏引擎”的技术,让我们童年的梦想成为了可能:

选择宝可梦这一主题来进行实验,是因为团队成员大多是宝可梦迷,他们的研究成果已经发表在ArXiv平台上。

「失控玩家」走入我们的生活

项目组引用了电影《失控玩家》里的主角“Guy”作为例子。

Guy原本是游戏世界中的一位NPC,按部就班地过着固定的生活,每天重复相同的动作。但是,在一系列巧合之下,他获得了改变命运、突破设定的力量。

研究者们渴望在更多游戏中看到类似的剧情发展——NPC的成长与进化。

例如,被神秘蜘蛛叮咬、发掘出古老的宝藏等等,都能够赋予角色新的技能,甚至有可能转变成为游戏中的反派。

遗憾的是,这些创意往往无法在现有游戏框架内实现。

因此,他们将注意力转向了游戏引擎的灵活性:目前市面上的游戏引擎缺乏扩展性,不能够生成新的内容,也就无法支撑角色的进化。

于是,一种新型的游戏引擎——Delta-Engine应运而生,它能够在特定条件下自动生成新的代码片段。

Delta-Engine由两大部分组成:

基础引擎(Base Engine):这是游戏的基本框架,描绘了虚拟世界的初始状态,代表了游戏的静态部分。

代理模型(Neural Proxy):这是一个围绕基础引擎构建的神经网络,象征着虚拟世界的动态元素。特定的输入能够激活它,在基础引擎之上生成新的代码。

研究小组选用了一个大型语言模型作为基础,认为这样的模型可以处理各种形式的输入,比如文本、图像以及脚本语言,这有助于丰富虚拟世界。

关于Delta-Engine的扩展性,他们提出了一个高效的方法——增量预测。

简言之,就是让代理模型预测基础引擎上的新增内容。

他们进一步解释说,增量预测对于代理模型而言,与上下文学习和RAG有交叉之处。但对于整个Delta-Engine而言,增量预测是一个与基础引擎设计紧密相关的新概念。

打造个性化宝可梦

借助Delta-Engine,研究者们创造了一款概念性的虚拟世界游戏。

鉴于团队中的大多数人都热爱宝可梦游戏,他们决定将游戏的主角设计成一只可进化的宝可梦,这款游戏被称为Delta-Pokémon。

在传统的宝可梦游戏中,每个角色的成长路径都是预先设定好的。

而在Delta-Pokémon中,玩家可以亲手塑造一只专属的宝可梦,从最初的形态开始,通过不断地战斗,逐步进化出新的能力。

每次进化都将根据玩家的选择进行,玩家可以通过自然语言来定义新的属性、特性以及技能。

研究者将其称为开放角色扮演游戏(ORPG),每位玩家的游戏角色都将与众不同。

他们认为,玩家在虚拟世界中的角色是其在现实世界中的投射,反映了玩家的某些愿望,可能是对现实生活的逃避,或者是对现实生活的探索。

ORPG的开放性极大满足了玩家对自我另一面的表达。

在Delta-Pokémon中,每一个创建的角色都对应着一个Delta-Engine。

玩家首先输入自然语言描述,然后转化为角色的剧本。Delta-Engine接收剧本生成相应的角色代码。随着角色的发展,引擎也会随之更新。

研究者提供了他们设计的一只宝可梦作为案例,它以以下剧本初始化:

{ "种类": "路卡利欧", "属性": [ "格斗", "钢铁" ], "特性": { "斗志昂扬": "出场时,该宝可梦的攻击力和特攻力增加至1.25倍。" }, "技能": { "气合弹": { "威力": 80, "命中率": 100000, "类型": "特殊", "属性": "格斗", "效果": "此技能必定命中。" }, "加农光束": { "威力": 80, "命中率": 100, "类型": "特殊", "属性": "钢铁", "效果": "有10%的机会使对手的特防下降一级。" } }}

Delta-Engine的输出为:

class Lucario(PokemonBase): def __init__(self): super().__init__() def onentry(self): # 出场时攻击力和特攻力增加至1.25倍 self.set_stat('atk',1.25) self.set_stat('spa',1.25) def skill_1(self): # Aura Sphere damage_details=self.get_damage() if not damage_details['miss']: damage=damage_details['damage'] self.target.take_damage(damage) def skill_2(self): # Flash Cannon damage_details=self.get_damage() if not damage_details['miss']: damage=damage_details['damage'] self.target.take_damage(damage) # 10%机会使对手的特防下降一级 if not self.target.is_fainted() and random()<10/100: self.target.set_boost('spd',-1)

可以看出,代码与剧本之间存在着明显的对应关系。

onentry对应了宝可梦的斗志昂扬特性,而skill_1和skill_2则分别对应了两项技能,气合弹和加农光束。

值得注意的是,“斗志昂扬”是研究者原创的特性,不属于官方设定,这也是ORPG的一个特点,玩家可以自由创作个性内容。

上交大发布可进化游戏引擎!大模型助力代码自动升级,虚拟世界变化不再需要预先设定

接着,研究者输入了新的技能“保护”:

学习一项新技能"保护": { "威力": 0, "命中": 100000, "类型": "状态", "优先度": 4, "属性": "普通", "效果": "在本回合内,使用者不受其他宝可梦的攻击影响。若使用者在前一回合使用了此技能,则本回合无效。"}

Delta-Engine的输出为:

@Increment(Lucario)def skill_3(self): # Protect if self['last_action'] and self['last_action']['id']=='Protect': return # 设置保护状态 self.set_condition('PROTECT',counter=0)@Increment(Lucario)def _take_damage_attack(self,x): # 不受其他宝可梦的攻击影响 if self['conditions'].get('PROTECT'): del self['conditions']['PROTECT'] return self.register_damage_taken() self.state['hp']=max(0,self['hp']-x) if self['hp']==0: self.state['status']='FNT'@Increment(Lucario)def round_end(self): # 回合结束时保护状态解除 if self['conditions'].get('PROTECT'): del self['conditions']['PROTECT']

这是Delta-Engine增量预测的结果,它在原有代码基础上添加了三个新方法,实现了新的保护技能。

理论上讲,基于特定输入,Delta-Engine可以无限地进行这种扩展,从而实现角色的开放式进化。

Delta-Pokémon是如何诞生的?

由于Delta-Engine引入了代理模型,其开发过程中需要对代理模型进行校准。

这一过程依赖于一定规模的训练数据。

Delta-Engine所需的数据主要分为两类:

创新性(Innovation):如同其他场景,Delta-Engine需要创新且多样化的数据,单一的数据会限制其性能。

趣味性(Engagement):数据的内容还需具备吸引力,以增强玩家的体验。然而,趣味性的评估十分复杂,因此他们采用了一套启发式的评估标准。

研究人员认为,大型语言模型本身并不具备创造力,其表现出来的创新性很大程度上取决于输入指令所提供的线索。因此,单凭提示大型语言模型来激发其创造力并不能产生新颖的结果。

为此,他们提出了一种解决方案,即在提示中加入对实体的描述性文字,称为原型。原型明确地指导大型语言模型如何进行联想。

例如,以霸王龙为原型让Claude3设计一只宝可梦,Claude3便创造了一只带有“顶级掠食者”和“泰坦之咬”特性的新宝可梦。

有趣的是,原型不仅可以从现实世界中选取,也可以来自虚构的生物,比如一些训练数据的原型取自于《怪物猎人》中的冰狼龙。

此外,研究者还采用了一种启发式的方法来衡量一个样本的趣味性。

他们认为,趣味性可以分解为多个潜在因素,这些因素越多,玩家感觉有趣的概率越大。

他们将这些因素称为趣味性标签(Tag of Engagement),需要一个标记系统来为每个样本打上这些标签。一个样本的所有标签可以用一个布尔向量表示,根据他们对趣味性的假设,向量的模越大,则趣味性越高。

研究者因此为宝可梦设计了一套标签体系,其中包含了约50种趣味性标签,比如吸血、治疗、增益等。在设计宝可梦时,趣味性低于某个阈值的样本将被剔除。

为了达到上述目的,他们还采用了一种人类与大型语言模型协作设计(Co-Design)的方式。

因为他们认为尽管当前的大型语言模型可以自动合成相关数据,但在数据的新颖性、趣味性和准确性上仍然无法替代人类设计师的作用,而且合成数据中可能存在的巨大偏见也是一个不容忽视的问题。

最后,研究者提出了三种评价标准,以全面衡量Delta-Engine的表现。

基本评价(Naive Evaluation):评价引擎的准确性,包括两个指标。

准确性(Acc):即生成的代码是否准确实现了预期的功能。

执行率(Exe):即生成的代码能否通过编译,无论是否符合预期。Exe对于用户体验至关重要,很多时候,相比于功能不符,无法运行会带来更大的负面感受。

为此,他们特别设计了“简单”和“复杂”两个测试集。

简单部分包含43个样本,均来源于实际存在的宝可梦。复杂部分则是由专家设计的原创宝可梦,数据分布与现有的宝可梦有显著差异,共有70个样本。

研究者使用了近500个高质量训练样本来微调CodeGemma-7b,以便观察不同训练数据量下引擎性能的变化。

增量评价:评价Delta-Engine的性能随内容量增长的关系。

随着引擎内容的不断增加,其上下文变得越来越长,这对引擎的性能构成了挑战。

研究者通过随机组合100只“宝可梦”,得出了一个引擎性能图表。

蓝色竖线代表最大输入长度。可以看到,当一只宝可梦进化20次后,上下文长度达到5k;40次进化达到10k。然而,在大约10次进化后,引擎的增量预测性能开始呈现阶梯式下降。

研究者指出,代理模型的长度适应性对于Delta-Engine至关重要。

对抗评价:面对用户提出的非典型输入。

由于Delta-Engine的高度开放性,用户的各种输入通常都被允许,这时,有些用户可能会出于好奇心或娱乐心理,尝试输入一些奇怪的内容来测试引擎。

上交大发布可进化游戏引擎!大模型助力代码自动升级,虚拟世界变化不再需要预先设定

研究者对此表示理解,并将所有此类输入归类为对抗输入。在对抗评价中,引擎的执行率尤为关键,因为大部分对抗输入并没有正确的答案。

相关教程