AI NPC:AI 驅動的非玩家角色如何運作(以及如何打造一個)
打造你自己的 AI NPC
AI NPC 能交談、記憶與反應。了解 AI NPC 的運作方式,接著用一句話打造一個,並把它放進一個可漫步的 3D 世界。
AI NPC 是一種非玩家角色,其對話與意圖由語言模型在執行時期產生,而移動與碰撞則維持在一條確定性的路徑上。AI 決定角色說什麼、想要什麼;引擎決定身體往哪裡去。在 Neta Studio 上,你用一句話描述一個角色,Agent Sprite Forge 會輸出一個低多邊形元件,而那個元件會放進一個以 Three.js 打造的可漫步 3D 世界。
這種切分很重要,因為它告訴你錯誤藏在哪裡。當 NPC 穿牆而過,是尋路出了問題。當 NPC 未受觸發就辱罵玩家,是提示詞契約出了問題。本頁涵蓋第二類:AI NPC 系統如何產生台詞、保存人格參數、記住一個工作階段,以及當模型擬定計畫、而引擎無法執行時如何失敗。
快速解答:AI NPC 究竟是什麼
把這個詞拆開來看。「AI」在這裡指的是由模型產生文字與高階意圖。「NPC」指的是角色控制器、碰撞體與動畫狀態機。兩者以不同的時鐘運作:模型在數百毫秒內回應,控制器則以 60 Hz 每一影格更新。它們透過一個狹窄的介面彼此溝通,通常是一個由控制器輪詢的 JSON 小物件。
實際上,這個介面長這樣:模型回傳 {line, intent, target}。控制器讀取 intent,檢查目標在導航網格上是否可達,然後選擇用相符的動畫播放該台詞,或替換成一句備援台詞。如果你把這兩層合併,就會得到會瞬移、滑行,或在模型還在生成時於句子講到一半就呆立不動的 NPC。
所以實用的定義是:AI NPC 是一種 NPC,其口語輸出與下一步動作的選擇來自生成式模型,並受到一組引擎實際能執行的固定合法意圖所界定。
- 對話層呼叫模型。延遲 200–900 毫秒。可能失敗、被限流,或回傳格式錯誤的 JSON。
- 意圖層一份簡短的列舉:問候、跟隨、逃跑、交易、攻擊、待機。列舉之外的任何內容都會被捨棄。
- 移動層導航網格尋路、碰撞體、動畫混合。每一影格執行。不呼叫模型。
- 記憶層一個鍵值儲存,存放 NPC 獲准回憶的事實,並受詞元預算上限所限制。
規則式 NPC 對比 AI 驅動的 NPC
規則式 NPC 從一張表裡挑選。狀態、轉場與台詞都由你親手撰寫。它精確、低成本且可重現:相同的輸入永遠產生相同的輸出,因此測試起來輕而易舉,除錯也易如反掌。它的上限就是你的寫作時間,而失敗模式則是玩家輸入你沒預料到的內容,然後換來一陣茫然。
AI 驅動的 NPC 則生成台詞。你撰寫一份契約與一組合法意圖,模型則填補兩者之間的空間。它能優雅地處理未預料到的輸入,但相同的輸入在兩次執行之間可能產生不同輸出,這會破壞天真的重播測試。成本隨對話長度而非角色數量增加,所以一個話多的場景比一個沉默的場景更花錢。
兩者都不是絕對更好。以下是誠實的比較:
| 面向 | 規則式 NPC | AI 驅動的 NPC |
|---|---|---|
| 行為來源 | 親手撰寫的狀態機與台詞表 | 受意圖列舉約束的模型輸出 |
| 可重播性 | 跨執行之間位元完全相同 | 除非固定種子與溫度,否則為非確定性 |
| 成本型態 | 在建置時固定 | 在執行時期按詞元計費,隨對話長度增加 |
| 可除錯性 | 追蹤轉場;紀錄檔就是程式碼 | 分別記錄提示詞、原始回應、解析後的意圖與備援 |
| 失敗模式 | 空白或走錯分支的回應 | 脫離契約的台詞、延遲飆升,或無法解析的 JSON |
| 撰寫成本 | 每句台詞成本高,每個狀態成本低 | 每句台詞成本低,每項限制成本高 |
動態對話
對話樹是一個含有人工撰寫節點的圖。寫作者掌控每一個字,這正是任務、契約,以及劇情關鍵揭露至今仍採用對話樹的原因。玩家的輸入會被匹配到 N 個分支中的其中一個;N 以外的任何內容都未被處理。對話樹隨內容呈線性擴張:對話加倍,寫作也加倍。
生成的對話是性質上的不同,不只是量上的不同。模型會讀取玩家的實際句子,再加上你注入的情境 — NPC 名稱、當前目標、最近三次往來 — 並寫出一段合宜的回應。它能處理你從未預料到的問題。它也可能把那個問題處理得很糟、很自信,且很符合角色,而那比失敗更糟。
對話樹依然正確的地方:任何承載遊戲其餘部分所依賴狀態的台詞。「閘門密碼是 4417。」不要讓模型去發明這種東西。可靠的模式是混合式 — 對話樹擁有事實與分支點,模型擁有措辭與閒聊。在 Neta Studio 中,當你從一段描述打造 AI NPC 時,生成的元件會公開一份意圖列舉;你想要保證不變的事實會以固定字串的形式放進元件,而不是以指令的形式放進提示詞。
經得起玩家考驗的提示詞形狀
把系統提示詞控制在約 300 個詞元以內。角色、語氣、三項限制,以及輸出結構描述。其餘的一切 — 物品欄、任務狀態、世界事實 — 都放進一個由引擎每回合注入的獨立情境區塊。如果你把整個世界塞進系統提示詞,延遲會攀升,而模型會開始忽略較晚出現的指令。
一律要求結構化輸出。要求一個帶有 line 與 intent 的 JSON 物件。解析它。如果解析失敗,就丟棄該台詞並播放備援。絕對不要在未做長度檢查的情況下,把模型的原始文字直接算繪到對話方塊;失控的生成會產生一段 400 字的獨白,把你的介面搞壞。
程序化人格
人格不是一段背景故事。一段背景故事是模型想像力的訓練資料,而且會隨長度增加而劣化:超過幾百字之後,模型會開始把它當成風味點綴,並逐漸漂向泛泛的熱心助人。改把人格視為三到四個參數,每一個都會改變可觀察的行為。
目標是 NPC 現在想要什麼。語氣是它說話的方式:簡短、正式、嘲諷。限制是它不會做的事:不會說謊、不會談論那場戰爭、不會交易。這三項能塞進單一提示詞行,而且各自都能單獨測試。只有當你能描述改變它時會有什麼變化,才再加上第四項。
在 Neta Studio 中,Agent Sprite Forge 接受一段描述,並回傳一個低多邊形元件,這些參數會以欄位的形式公開在元件上。你可以編輯目標而不必動到模型提示詞,也可以複製一個元件、只改變語氣,就得到第二個 NPC。兩個網格相同、語氣不同的 NPC,在場景中讀起來就是兩個不同的角色,這比撰寫兩個精靈更省。
- 目標一句話,現在式。「讓玩家離開神殿。」
- 語氣兩到四個形容詞。「簡短、古樸、不耐。」
- 限制否定式規則。「絕不說出那條河的名字。絕不接受物品。」
- 知識邊界NPC 可以引用的內容。任何超出邊界的內容都應該產生符合角色的迴避,而不是一項捏造。
適應性行為
工作階段內的記憶既便宜又有效。你保留一個最近 N 次往來的滾動緩衝,再加上一個存放 NPC 被告知事實的小型鍵值儲存。對大多數場景而言,N 為 8 到 12 就夠用;超過之後,提示詞增長的速度會比玩家的耐心更快,而且較舊的往來反正也不再影響輸出。
NPC 能可靠記住的事:玩家自報的名字、某件特定物品是否曾被給予或拒絕、先前某次互動是否以敵意收場,以及最後一次陳述的目標。它無法可靠記住的事:二十回合前的確切措辭、從未寫入鍵值儲存的事實,以及任何跨越頁面重新載入的內容 — 除非你把它持久化。只活在提示詞裡的記憶,就是會蒸發的記憶。
反應是另一半。引擎監看狀態變化 — 生命值下降、物品轉移、跨越距離門檻 — 並把一個事件推入 NPC 的情境。模型接著從列舉中挑選一個意圖。這正是意圖列舉存在的原因:模型提案,引擎定奪。一個「決定」要攻擊的 NPC,仍必須通過可達性檢查。如果沒通過,它會播放一句警告台詞並留在原地。
持久化實際上的成本
把記憶寫入儲存只需要一行程式碼和一個結構描述決定。讓鍵保持簡短而扁平:playerName、gaveItem、hostility。巢狀物件會膨脹並腐壞。從一開始就為結構描述加上版本;日後重新命名會默默丟棄舊存檔,除非你寫一份移轉程式。
跨工作階段時,不要試圖把整段對話歷史重播進情境。那既昂貴,又會讓 NPC 變得反覆。持久化保存摘要 — 三到五項事實 — 並以全新的逐字稿重新開始。
用一句話打造一個 AI NPC
Neta Studio 中的管線刻意保持簡短。你寫下一段描述。Agent Sprite Forge 產生一個帶有網格、調色盤與行為模式的低多邊形元件。你把它放進一個以 3D 遊戲建造器打造的可漫步場景,它就會在生成時附帶碰撞、尋路,以及一條已經接好的對話掛鉤。
一份能用的描述會具體說明角色、語氣與一項限制。「一個多疑的燈塔看守人,言語簡短、帶有北方鄉音,絕不談論那場船難。」這會產生一個提示詞恰好包含這三個參數的元件。像「一個很酷的角色」這樣的描述只會產生泛泛的結果,因為沒有任何東西可供界定。
你可以在兩個地方測試結果:The Cyclops' Island,那是長篇的可漫步場景;以及 Mini World,它更小、迭代更快。兩者都在瀏覽器中以 Three.js 執行。把元件放進去,走近它,輸入一句話,然後讀取回應。如果語氣不對,就編輯元件上的語氣欄位,而不是從頭改寫提示詞。
01
寫下一句話:角色、語氣、一項限制。
02
把它送進 Agent Sprite Forge,產生一個低多邊形元件。
03
在 3D 遊戲建造器中打開 Mini World 或 The Cyclops' Island。
04
把元件放進場景;它生成時附帶碰撞與一條對話掛鉤。
05
走近並輸入一句話。讀取回應,以及它選中的意圖。
06
在元件上編輯語氣或限制,而不是在系統提示詞上。
07
測試失敗路徑:輸入一段離題的內容,確認備援機制會啟動。
08
等它行為正常後,把元件移到較大的場景。
AI NPC 至今仍做不到的事
長跨度規劃行不通。一個被要求規劃橫跨場景三十個步驟的模型,會產生一份看似合理的計畫,然後在第六步就丟失脈絡,因為除了提示詞之外,沒有任何東西在步驟之間保持狀態,而提示詞正變得越來越長、越來越吵雜。如果你需要一個多階段的任務,就親手撰寫各個階段,讓模型在每個階段內填充對話。不要要求它撐住整個故事弧。
真正開放式的目標也行不通。「愛做什麼就做什麼」只會產生癱瘓,或一個泛泛的熱心助人迴圈,因為模型沒有任何訊號可以判斷什麼才算進展。一個目標唯有在引擎能檢查它是否被滿足時才堪用。如果你寫不出那項檢查,你有的就不是目標,而是一種心情。
成本控制才是真正的缺口。每回合的成本很小;問題出在永無止境的對話。玩家一直講,帳就一直計。你需要對每次互動的回合數設下硬性上限、對情境詞元設下上限,以及一條降級路徑 — 達到上限後,NPC 會切換成更短、預先寫好的罐頭回應。少了這三項,一個好奇的測試玩家燒掉的預算,就能比你的場景其餘部分加起來還多。
還有一些較小的失敗:延遲超過約 1.5 秒,讀起來就像遊戲壞了,而不是一個深思熟慮的角色。除非你固定種子與溫度,否則非確定性會破壞重播測試。而且任何生成出來的台詞,都可能與對話樹早已確立的事情互相矛盾 — 這正是事實要留在對話樹裡的原因。
- 規劃跨度在 1–2 個步驟內可靠。超過之後會嚴重劣化。
- 目標驗證必須能由引擎檢查。否則目標就只是裝飾。
- 成本上限需要每次互動的回合上限、詞元上限,以及一種備援模式。
- 延遲預算低於 1.5 秒才有對話的感覺;超過之後,玩家會以為畫面凍結了。
- 確定性預設為非確定性。如果你以重播方式測試,請固定種子與溫度。
走進它所屬的那個世界
精靈是一個無處可站的角色。最後這一步是別人都不提供的:把你剛做好的圖集放進一個有人能四處走動的世界 — 一座小島、一顆行星、一個下雨的街角。這個網站上的每一個世界,都是從一段書面描述打造而成,並發布成一個你可以遊玩的頁面。
FAQ
NPC 是 AI 嗎? +
傳統上不是。經典的 NPC 是一部帶有人工撰寫台詞的狀態機,而這在大多數已上市的遊戲中仍是預設做法。「AI NPC」這個詞專指對話或意圖選擇由模型在執行時期產生、而非從表格中挑選的角色。
什麼是 AI NPC? +
一種非玩家角色,其口語輸出與下一步動作的選擇來自生成式模型,並受一組引擎能執行的固定意圖所約束。移動、碰撞與動畫維持確定性;模型只負責填充對話並提出意圖。
AI NPC 能記住事情嗎? +
在工作階段內可以 — 一個涵蓋最近 8 到 12 次往來的滾動緩衝,加上一個存放事實的小型鍵值儲存,就能滿足大多數場景。跨越頁面重新載入時,唯有你把事實持久化寫入儲存才行。只活在提示詞裡的記憶,會隨著情境消失而消失。
我可以免費打造一個嗎? +
Agent Sprite Forge 與 3D 遊戲建造器都在瀏覽器中執行,讓你不需要本機工具鏈就能從一句話生成一個元件。執行時期的模型呼叫是會產生成本的部分,而那項成本取決於你路由到哪個模型,以及你的對話跑多長。
打造 AI NPC 需要遊戲引擎嗎? +
若只是瀏覽器場景,不需要。3D 遊戲建造器負責以 Three.js 算繪,並為生成的元件提供碰撞、尋路與一條對話掛鉤,因此你可以略過引擎設定的步驟。唯有當你的目標是原生建置時,才需要一套完整的引擎。
AI NPC 能在瀏覽器中運作嗎? +
可以。模型呼叫是一個網路請求,而算繪使用 WebGL,因此兩端都在瀏覽器中執行。實務上的限制是延遲:把系統提示詞保持簡短、把情境區塊分開,否則回應會等到玩家早已認定遊戲凍結之後才姍姍來遲。
執行一個 AI NPC 要花多少錢? +
它隨對話長度增加,而不是隨你放置的角色數量。一個沉默的 NPC 幾乎免費;一個話多的則按回合計費。真正重要的控制,是對每次互動設下硬性的回合上限,外加一個詞元上限,並在達到上限後以罐頭回應作為備援。
回到 3D 遊戲建造器
全部 31 個完成的 3D 世界、遊戲與場景都放在同一頁 — 每一個都能玩。