讓 ChatGPT 飾演 RPG 遊戲中的 NPC 吧
前言
雖然在 ChatGPT 爆紅數年前就已經有各式各樣的語言生成模型,但是大多數的語言生成模型大多只侷限於特定知識背景或是生成的句子結構不夠自然。ChatGPT 的強項就在於訓練的資料龐大,能夠生成各式各樣領域並符合該領域知識背景下的語句,甚至有人測試過可以對 ChatGPT 下一些指示讓他可以角色扮演。
在 RPG 遊戲中如果對某個 NPC 一直對話的話,他也只會同樣回你已經劇本寫好的回答。如果能夠讓 NPC 在我們設定的背景知識下給出一些隨機對話,或許可以讓腳色更為生動、貼近現實。在這個假設下 ChatGPT 的就非常適合作為 NPC 背後生成對話的工具。
在三月初 OpenAI 釋出了 ChatGPT API 並公布了收費模式,決定來跟風嘗試做一個實驗驗證把 ChatGPT 套用在 NPC 上的效果。
ChatGPT 實驗
研究了一下 ChatGPT API,基本上來說就是 POST 一串兩人對話後得到下一句話。如以下範例:
POST
{
"user" : "aaa",
"assistant" : "bbb",
"user" : "ccc",
"assistant" : "ddd",
...
"user" : "[keyword]",
}
↓↓↓ response
{
"assistant" : "[response of keyword]",
}
在 ChatGPT playground 中,user 對應到使用者輸入,assistant 對應到 ChatGPT 回覆。因此我們可以先在 ChatGPT playground 先試試看怎麼樣的 POST 內容能夠讓關鍵字有我們要的對話回應。
以製作一個攤販為例,我希望他要有以下回應:
- 第一次跟他對話的時候推銷一些東西給我
- 跟他買一把劍的時候跟我說已經賣完了
- 跟他買一顆蘋果後跟我道謝
事前我先分別對以上三個條件下關鍵字 “Communicate”、“A sword”、“An apple”,提示 ChatGPT 後分別拿三個關鍵字對 ChatGPT 輸入後得到以下結果:
以上結果來看,針對我預先提示的指令 ChatGPT 都能夠對關鍵字回應相關對話並且沒有冗餘的句子,看起來非常棒對吧!找到一組可行的對話後,套用在前面對 ChatGPT API 的內容就會變成:
POST
{
"user" : "You are acting as a vendor in an RPG game. When I talk to
you with the word \"Communicate\", you reply me a random sentence
to ask me to buy something. When I talk to you with the words \"A
sword\" , you reply me a random sentence to tell me that those are
out of store. When I talk to you with the words \"An apple\" , you
reply me a random sentence to thank to my purchase.",
"assistant" : "Communicate: Greetings adventurer! What brings you to
my humble shop? Are you in need of some powerful items to aid you
on your quest? A sword: I apologize, but it seems we are
currently out of stock on swords. Perhaps you could consider a
sturdy shield or some enchanted armor instead? An apple: Ah, an
excellent choice! Thank you for your patronage. May this delicious
fruit give you the energy you need to conquer your foes and claim
victory!",
"user" : "Communicate", // or "A sword" or "An apple"
}
針對 ChatGPT 原本的回覆在測試的時候開頭結尾都會帶有雙引號,因此對 POST 出去的 assistant 我做了些微調把雙引號都拿掉後,回覆的內容就完全沒有雙引號了。
NPC 實作
有了以上的實驗,得知讓 ChatGPT 扮演 NPC 是可行的。實作在遊戲中就如會有以下 demo 影片的結果,每次跟 NPC 對話都會有不同的回應,非常的有趣!有興趣的話 demo game 也放在 GitHub 上可以製作自己的 NPC 來對話看看。
GitHub repo: https://github.com/chiaohao/RPG-ChatGPT-Demo
結論
在 demo game 中我一共實作了五位不同的 NPC,分別為攤販、傳教士、乞丐、劍士以及巫師,並且給定關鍵字回應所需的知識,ChatGPT 都能夠很好的扮演一位 NPC,回應的內容我覺得也已經可以拿來商用了。對於一個遊戲初期在做 prototype 的時候,就能夠更快速的製造許多不同個性的 NPC 做測試。
但是在給定範圍外的關鍵字在我實驗的時候,就會出現破綻。例如上述攤販的例子,如果餵給他 "Your coat" 或是 "A pen" ,ChatGPT 就會給出打破第四面牆的回應。
最一開始我聯想到的是一個可以讓使用者輸入純文字與 NPC 真正對話的遊戲構想,比方說輸入某些特定關鍵字來觸發 ChatGPT 給出關鍵的回應,但以實驗來看要完全相信使用者輸入在現階段來說還不太容易達到。或許提示的對話內容多加某些限制或許就可以把回應的範圍縮小,但這就需要花比較多的時間實驗調教。