上交大推出“可進化游戲引擎”!大模型加持代碼自動成長,虛擬世界演化無需預設
試問誰小時候沒有幻想過有一只專屬于自己的寶可夢?(可以DIY的那種~)
最近來自上海交通大學的團隊整了個“可進化游戲引擎”,實現了這個兒時夢想:
大模型與傳統游戲引擎結合,能夠被被特定的條件觸發,自動地成長出新的代碼。
選擇寶可夢題材做實驗,是因為團隊中大部分成員都是寶可夢粉絲,目前相關論文已上傳ArXiv平臺。
圖片
「失控玩家」走進現實
研究團隊用電影《失控玩家》中的主人公 “Guy”舉了一個的例子。
Guy原本是虛擬游戲中的一名NPC,每天都生活在被規劃好的劇本里,每天重復著相同的事情。但在陰差陽錯下,他卻擁有了改變生活、打破劇本的能力。
研究人員們非常希望在其他游戲中也能看到類似的情節 ———NPC在線進化。
例如被蜘蛛咬到、發現奇妙的寶藏等,從而解鎖全新的能力,甚至有可能在某一天轉變為反派角色。
不過他們幻想的內容大多數并不在虛擬世界的劇本中,無法被實現。
因此,他們將虛擬世界的進化特性聯系到了其背后引擎的可拓展性:當前虛擬世界的引擎不具備可拓展性,無法拓展出新的內容,從而無法發生進化。
于是他們提出了一種全新的引擎Delta-Engine,它能夠被特定的條件觸發,從而自動地成長出新的代碼。
Delta-Engine由兩個組件構成:
基座引擎(Base Engine):一個原始的引擎,它刻畫了虛擬世界最初的樣子,代表了其靜態的部分。
代理模型(Neural Proxy):一個神經網絡作為基座引擎的外包裝,它代表了虛擬世界可變的部分,特定的輸入能夠觸發它在基座引擎的基礎上生成新的代碼。
研究人員選擇了一個大語言模型作為基礎,他們認為大語言模型還能夠支持多種類型的輸入,例如文本、圖像、以及腳本語言,有利于虛擬世界的打造。
而針對Delta-Engine的可拓展性,他們也相應提出了一種高效的拓展方式,叫做增量預測。
簡單來說,就是讓代理模型預測基座引擎上的新增內容。
他們還強調,僅對于代理模型來說,增量預測和上下文學習、RAG是相交的概念。但增量預測是對于整個Delta-Engine而言的概念,它和基座引擎的設計密切相關。
圖片
DIY專屬寶可夢
基于Delta-Engine,研究人員們打造了一款類虛擬世界的概念游戲:
Free-Pokémon(失控寶可夢)
在傳統的寶可夢游戲中,各個角色的內容包括其成長模式都是被預設好的。
而在Free Pokémon中,玩家將為自己量身定做一只專屬寶可夢,從最初階段的白板寶可夢,通過不斷的對戰,從而進化學會全新的能力。
每一次進化將完全取決于玩家的意愿,玩家可以通過自然語言,根據自己的喜好任意地編寫新的屬性、特性、以及技能。
以上專屬寶可夢,靈感來自于怪物獵人中的“轟龍”
研究人員稱其為開放角色扮演游戲(ORPG),每一名玩家的游戲中角色都會各不相同。
他們認為,玩家在虛擬世界中的形象是他在真實世界中的映射,能夠反映玩家的某種欲望,可能是對現實世界的抽離、或是對現實世界的深入。
ORPG帶來的開放性,能夠極大程度滿足玩家對自我的另一種表達。
Free Pokémon中每一個創建的角色都對應著一個Delta-Engine。
玩家首先輸入自然語言,隨后會被轉換成對應的角色劇本。Delta-Engine接受角色劇本生成相應的角色代碼。隨著角色的進化,引擎也會隨之膨脹。
研究人員還提供了他們設計的一只寶可夢作為示例,它以以下劇本初始化:
{
"物種": "路卡利歐",
"屬性": [
"格斗",
"鋼"
],
"特性": {
"勝利之心": "上場時,該寶可夢的攻擊和特攻數值變為1.25倍。"
},
"招式": {
"波導彈": {
"威力": 80,
"命中率": 100000,
"分類": "特殊",
"屬性": "格斗",
"效果": "該招式必定命中。"
},
"加農光炮": {
"威力": 80,
"命中率": 100,
"分類": "特殊",
"屬性": "鋼",
"效果": "10%幾率令目標的特防降低1級。"
}
}
}
Delta-Engine的輸出為:
class Lucario(PokemonBase):
def __init__(self):
super().__init__()
def onswitch(self):
# 登場時攻擊和特攻變為1.25倍
self.set_stat('atk',1.25)
self.set_stat('spa',1.25)
def move_1(self): # Aura Sphere
damage_ret=self.get_damage()
if not damage_ret['miss']:
damage=damage_ret['damage']
self.target.take_damage(damage)
def move_2(self): # Flash Cannon
damage_ret=self.get_damage()
if not damage_ret['miss']:
damage=damage_ret['damage']
self.target.take_damage(damage)
# 10%幾率令目標的特防降低1級
if not self.target.isfaint() and rnd()<10/100:
self.target.set_boost('spd',-1)
仔細看,其實能夠很輕松找到代碼和上方劇本的對應關系。
onswitch對應了寶可夢的勝利之心特性,而move_1和move_2分別對應了兩個招式,波導彈和加農光炮。
值得注意的是,勝利之心是研究人員原創的特性,不屬于官方特性,這也是ORPG的特點之一,玩家可以自行創造自己的專屬內容。
接下來關鍵的內容來了,研究人員再次輸入:
學習一個新招式
"保護": {
"威力": 0,
"命中": 100000,
"分類": "變化",
"優先": 4,
"屬性": "一般",
"效果": "在這一回合中,使用者將免受其他寶可夢的攻擊。如果使用者在上一回合使用了此招式,則此招失敗。"
}
Delta-Engine的輸出為:
@Increment(Lucario)
def move_3(self): # Protect
if self['last_act'] and self['last_act']['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_act_taken()
self.state['hp']=max(0,self['hp']-x)
if self['hp']==0:
self.state['status']='FNT'
@Increment(Lucario)
def endturn(self):
# 回合結束時保護消失
if self['conditions'].get('PROTECT'):
del self['conditions']['PROTECT']
以上為Delta-Engine增量預測的結果,它在初始代碼的基礎上新增了三個類方法,來實現新的保護招式。
理論上來說,基于特定的輸入,Delta-Engine可以無限制地進行這種新增,從而讓角色開放式地進化。
圖片
Free Pokémon 是怎么做出來的?
由于Delta-Engine引入了代理模型,它的開發過程離不開對代理模型的對齊。
這個過程需要一定量、或是大量的訓練數據。
而Delta-Engine所需的數據主要有兩個方面:
新穎(Novelty):和其他場景類似,Delta-Engine需要新穎且多樣的數據,一味重復的數據會造成性能瓶頸。
有趣(Interestingness):數據的內容上還需要做到有趣,來提升玩家的體驗。然而有趣性的評估相當困難,因此他們采用了一種啟發式的評估準則。
但研究人員認為大語言模型并不具有想象力,它表現出的想象力很大程度來源于指令中提供的線索。因此,僅僅靠提示大語言模型讓其發揮想象力并不能獲得新穎的結果。
為此他們給出了一種解決思路,即在提示中引入一段對實體的描述性文字,稱之為原型。原型去顯示地提示大語言模型該怎么進行聯想。
例如,將霸王龍作為原型讓Claude3設計一只寶可夢,Claude3于是給出了一只具備“頂級捕食者”和“泰坦之咬”特性的全新寶可夢。
有意思的是,原型不僅僅能夠采自于現實世界,還能是一系列虛擬生物,例如一部分訓練數據的原型取自于游戲《怪物獵人》中的冰狼龍。
圖片
除此之外,研究人員還采用了一種啟發式的方法來量化一個樣本的有趣性。
他們認為有趣性可以被量化為一系列潛在的可能讓玩家感覺到有趣的“有趣因子”,有趣因子越多,玩家越有可能覺得有趣。
他們將這些有趣因子稱為有趣性標簽(Tag of Interest),需要一個標注模塊來為一條樣本標注出這些標簽。一個樣本的所有這些標簽可以用一個布爾向量來表示,按照他們對有趣性的假設,向量的模越大,則有趣性越高。
研究人員因此針對寶可夢設計了一個標簽集,其中包含近50種有趣性標簽,例如吸血、恢復、強化等。在設計寶可夢時,其有趣性低于某一閾值的樣本將被過濾。
為了滿足上述兩種需求,他們還采用了一種人類和大語言模型協同設計(Co-Design)的管線。
因為他們覺得雖然現在大語言模型可以全自動合成相關數據,但在構造數據的新穎程度、有趣性、以及正確性上AI始終是無法取代人類設計師的工作,而且合成數據中隱藏的巨大偏見也是一大隱患。
最后,研究人員給出了三種評估準則,用來全面地評估Delta-Engine的性能。
常規評估(Naive Evaluation):評估引擎的正確性,包含兩個指標。
正確率(Acc):即生成的代碼是否正確地實現了應有的功能。
執行率(Exe):即生成的代碼是否能通過編譯,不論正確與否。Exe對于用戶的體驗感非常重要,很多情況下,相比功能不匹配,無法正確運行會帶來更強烈的負面感受。
為此他們還專門構造了“簡單”和“困難”兩部分的測試集。
簡單部分包含了43條樣本,皆來自于官方存在的寶可夢。困難部分皆為由專家撰寫的原創寶可夢,數據分布和現有的寶可夢存在較大差異,總共包含了70條樣本。
研究人員使用了近500條高質量訓練樣本來微調CodeGemma-7b,從而觀察不同訓練數據量下,引擎性能的變化。
圖片
增量評估:評估Delta-Engine的性能與其內容量之間的關系。
隨著引擎內容的不斷膨脹,其上下文會越來越長,其性能也會遇到挑戰。
研究人員通過隨機采樣縫合了100只“寶可夢”,獲得了一張引擎性能圖。
藍色豎線代表的是用于訓練的最大輸入長度。可以看到一只寶可夢進行20次進化后,上下文長度達到了5k,40次進化將達到10k。但大約在10次進化過后,引擎的增量預測性能開始了階梯式下滑。
對此研究人員指出,代理模型的長度延展性對于Delta-Engine來說非常重要。
圖片
對抗評估:應對用戶給出的非常規輸入。
由于Delta-Engine帶來的高度開放性,用戶的大部分輸入都會被允許,此時不乏有用戶處于好奇和娛樂的心態,嘗試輸入一些稀奇古怪的內容來試探引擎。
研究人員對此表示高度理解,并將所有這類輸入統稱為對抗輸入。在對抗評估中,引擎的執行率尤為重要,因為大部分對抗輸入不存在正確解。