那天決定塞 20 個歷史人物 AI 進來

那天我坐在咖啡廳,盯著手機的對戰畫面,看著 AI 對手第 17 次做出完全沒邏輯的決策。

他應該要射這張 7,左門 3、右門 J。超過 60% 機率會通過。但他選擇「不射」。下一手他應該要跳過,結果他射了。毫無邏輯。

不是程式寫錯。我的 AI 就是一個亂數產生器包了一點 heuristic — 勝率高就多 70% 機率出手,勝率低就多 70% 機率不射。理論上是對的,看起來就是完全沒靈魂的 bot。

那時候我在喝第二杯美式。我想:「這玩意兒再精準,它還是個亂數。玩家不會想跟亂數玩到第五局。」

bot 不應該是亂數。bot 應該是角色

然後我做了一個完全不合理的決定 — 我要給這個 App 寫 20 個歷史人物 AI。

回家後打開 Notion,列出清單:漢尼拔、拉斯普丁、孔子、武則天、諸葛亮、項羽、伊莉莎白一世、凱撒、成吉思汗、瑪麗皇后、達文西、西施、愛因斯坦、拿破崙、唐太宗、曹操、甘地、貝多芬、秦始皇、海倫凱勒。

20 個各自有清楚的個性。每個人我給他們五個 trait 向量:

1
2
3
4
5
6
7
struct PersonaTraits {
var aggressiveness: Double // 攻擊性
var rationality: Double // 理性程度
var patience: Double // 耐心
var riskTolerance: Double // 風險容忍
var volatility: Double // 情緒波動
}

漢尼拔:aggressiveness 0.9, riskTolerance 0.85, volatility 0.4。他會大手筆出擊,但不會自我毀滅。

拉斯普丁:volatility 0.95。誰知道他下一手要幹嘛。

孔子:rationality 0.95, patience 0.9。他只在勝率很高的時候動手,其他時候就是冷靜地跳過。

海倫凱勒:patience 0.95, rationality 0.8。她不會輕易被場面帶著跑。

我還給每個人加了「情緒曲線」— 連續贏會變得更大膽、連續輸會變得更保守(或相反,看個性)。這部分用一個簡單的 decay function 就好:

1
2
3
4
func adjustedAggressiveness(base: Double, streak: Int, volatility: Double) -> Double {
let drift = Double(streak) * volatility * 0.05
return clamp(base + drift, 0.0, 1.0)
}

寫完 20 個人的時候天快亮了。版本推到 v2.0,那一版 git subject 我打「Settlement redesign, AI characters, behavior fixes」— 其實重點就是那 20 個人,其他都是附帶。

我那時候還不知道,接下來 12 天我會為了調這 20 個人的參數,寫出一個叫 /tune-v6 的 Claude Code skill。

這個 skill 會自動跑 backtest、讀結果、精準調 trait 向量、重跑驗證。從 V6.0 調到 V6.11,整整 16 個版本的參數微調。每調一次要跑幾百萬手 simulation,我筆電風扇半夜會突然轉起來,我就知道又在跑了。調到後面我已經分得出來漢尼拔跟凱撒誰比較敢冒險,誰比較愛打伏擊戰 — 不是用人設想的,是用參數決定的。

但那些都是之後的事。

今天晚上我想的只有一件事 — bot 終於有靈魂了。我之後要跟這 20 個人打很多場。


上一篇:4/4 · 練習模式大改版
下一篇:4/12 · 把橫式改直式那天,順便把寫死的尺寸全拔掉

下載邪門射龍門