app url: LINK
前言#
上一回主要強調的點
是要將文字看作本質的符號
天文、水文、人文等…所有天地人之文
它將世界與思想以符合成本的方式映射
變成我們主要理解以及與客觀世界的工具
理解這點才會意識到
LLM(大語言模型)雖然本質只是文字接龍
但是能力高到一個程度便已是核能級的國之重器
它的重要性讓我想要驗證它的能力
並且能夠隨著他能力的提升反覆驗證
一個堪稱完美的目標就是紅樓夢
假設有個全知全能的LLM
它可以在輸入曹雪芹原本紅樓夢前八十回,然後輸出後面的章節
但因為LLM的訓練資料有限
就如同題目不完整的數獨一樣無法確定答案
它現有的能力是在它能夠理解的範圍內,生產力非常高
紅樓夢模擬器要做的是在這種生產力的協助下
用傳統結構化的方式,用極少的人力快速產出及累積成果
假設#
我們需要一些假設、偏見、理論來讓預測結局的工作足夠可行及機械
講到準確地預測我直覺想到古典物理學其中的熱力學
在一個封閉的系統中,熱力學系統如果給定初始條件、運作規律
則系統的演化可預測且必然的
另一個假設是,LLM的模型能力會越來越強,
但在可預見的未來我們不會有更多清朝及曹公的訓練資料
所以我們可以有一個結構化的工作流程,並且可以讓現在和未來的LLM執行
初始條件#
初始條件主要是從小說原本萃取的資料,
現在我們使用LLM做原本高勞力密集的事情,
以往人力成本太高,並且人力多也是無法壓縮時間的,
如果做到一半,想要微調萃取規則重新來過太不實際。
時間跟成本不再是問題,而萃取的品質則取決於模型的能力。
例如我提取了:
主要角色的資訊,性格檔案,家族族譜;
一百二十回每回角色在那一回的經濟、社會、情緒、健康、人際關係等快照;
還有基本的賈府的空間地圖,空間資訊;
所有的對話記錄、詩詞語料…
先用不嚴謹但至少覆蓋率高的方式,將所有出現的文本都被提取到某個分類。
運作規律#
運作規律我用我的判斷分為兩種,一是基本的世界法則,二是作者的藝術意志。
這很武斷,但不做某種判斷的話完全無法進行。
世界法則則不限於且包含了以下基本的項目
社會:階級、權力、主僕關係、婚姻;
經濟:收支、債務、抄家風險;
文化 : 禮教、節慶、封建價值觀;
心理:角色情緒、性格驅動、內在衝突
政治: 皇恩、朝廷、外部勢力…
藝術意志則是紅樓夢除了沒有結局這個事實,他之所以適合當預測標的的原因,
那就是曹公在開頭以及全書到處都暗示了角色的命運,
最具代表性的就是十二金釵的判詞已點出了女一及女二的結局
可嘆停機德,堪憐詠絮才。玉帶林中掛,金簪雪裡埋。
規則引擎#
有了初始條件跟運作規律要如何套用呢
較理想的方式是建造類似遊戲的3D物理引擎,每個角色有自己所知的資訊,並讓一個ai chatbot 像是演員演繹角色那樣扮演互動
但是一來這樣成本太高,只是提高觀賞性而已,我們並沒有引入新的資訊,在3D引擎裡也不會有新的結果;
二來是我們不是做風洞流體力學的物理模擬,而是在猜測曹學芹的想法,目前停留在文字就可以了。
根據前面提取的資料,歸納出一些運算的主體跟規則,
實際上就是傳統上針對一件事發生與否的證據、信心、加減過程,
做系統化可重複、可修改的全面性暴力運算。
每一回合的模擬步驟為:
處理延遲效果 — 檢查 pending_effects,到期的立即 apply
評估所有法則 — 逐條檢查 premises 是否全部滿足(跳過 confidence < 0.3 的)
衝突解決 — 同時觸發的法則可能矛盾,裁決誰贏
套用效果 — 有 delay 的排入佇列,沒有的直接修改 state
快照 — 把當前 state 壓成數值向量
chapter += 1
文末附上一個完整的範例,九十八回的黛玉之死。
工作流程總結#
以上流程中主要的幾個組件,
萃取的資料在學術上是不是嚴謹、規則是否合理適用、模擬步驟是否合裡,
其實不是太重要,因為每個部分都可以分別改進及重新產生。
已軟體工程的思維來看,我的目標是讓這個引擎在介面上可以良好運作,
並隨著更多資訊的引入以及方法論的改進,不斷的完善預測結果。
目前成果:主客觀層次平行對照#
這裡又要提出一個自己獨斷的方法論,讓它能夠被結構化的比較,
那就是將推論的引擎的層次主要分為客觀條件以及藝術選擇兩個部分。


客觀條件#
成書年代的背景,其中的人物、場景、封建制度、經濟等等都是第一層的客觀條件,這可以限定故事能夠發生的所有範疇,目前已經針對該年代背景及學術文章提取一些客觀規律。
反過來在那時代實際上有的東西,理論上也能出現並對故事產生影響。
例如書中已經有一些西方現代物品例如自鳴鐘及懷錶,那如果西方的火槍出現並作為推動劇情的重要物品呢?
這種第一層客觀條件的可能性窮盡,是未來可以補足的方向,也許可以達到某種情理之中意料之外的效果。
藝術選擇#
而第二層則是作者曹雪芹對這個虛構世界的經營,
書中許多角色以及整個家族的走向帶有濃厚的命運論色彩,
書中無數的詩詞及隱喻,包括據說看過結局的友人的批注,也暗示這這點。
所以我們可以依照作者的背景經歷,
去推測他選擇讓角色有怎樣的命運,
進而呈現他真正想表達的價值觀。
交叉比對#
自此我們可以把高鶚的版本,視為一個最領先的玩家,
他做的事情其實跟我現在做的事情一樣,
根據書中人物及背景,去盡可能揣測曹雪芹的藝術選擇。
並且高鶚他補足了現有結局,讓紅樓夢的流傳度更廣,並且此版本已經被廣泛接受,所以把他的版本放在平行的地位比較。
寫實模擬#
而如果撇除所有藝術化處裡,只保留客觀的法則,讓故事自然演進會怎樣呢?
那就是大部分的情節在一百二十回的長度內不會發生,比較不戲劇化,比較少悲劇。
提高預測品質的方法#
LLM的能力提高後重新萃取文本
更多人為介入細修及嘗試不同的prompt
請紅學或歷史學者協助資料清理及調整引擎邏輯
更多相關資料出土或是未數位化的資料(若有)納入訓練
嘗試其他方法論
固定工作流程,讓ai agent 不斷微調產生許多版本,因沒有明確的終止條件,只能人工判斷品質
結論#
因為現存以及預訓練的資料關係,還有紅樓夢作為藝術作品的強烈自洽性,
不太會有機械降神的預測產生,更多的是內在的差異比較,
比如賈家實際上被抄家及破敗注定會發生,只是在時間點上的差異。
最後一點心得#
原本這種工作至少要一兩年以上,全職一人以上才有辦法完成,
現在可以利用下班時間就可以扮演另外一種職業,也算是滿足我當年因為經濟壓力轉領域的缺憾。
希望我實作紅樓夢模擬器中間的思考過程對你有幫助,
也期望除了電腦科學及自然科學,社會科學也能受益於AI 快速發展。
附錄 完整模擬過程範例#
第 97–98 回「黛玉之死」**走過完整六步的範例(以下內容由AI產生):
範例:第 97 回 — 掉包計 → 焚稿斷情 → 黛死
背景狀態(進入第 97 回時)
經過前面十幾回的累積衰退,林黛玉的狀態已經是:
agent.林黛玉: health=0.12, mood=0.08, isolation=0.72, tragedy_risk=0.95, alive=True
agent.賈寶玉: monk_tendency=0.35, mood=0.20
economy: debt_ratio=0.65
politics: family_decides_marriage=True
relation.賈寶玉::林黛玉: marriage_probability=0.15
relation.賈寶玉::薛寶釵: marriage_probability=0.72
黛玉的 health 為什麼會從初始的 0.35 掉到 0.12?因為每一回都有這條法則在默默觸發:
▎ PSY_E1_DAIYU_DECAY 「黛玉健康緩慢衰退」
▎ 前提: health > 0.0 AND isolation > 0.3 AND alive = True → 效果: health sub 0.017
▎ 每回 -0.017,十幾回下來就是致命的慢性消耗。
① 處理延遲效果
檢查 pending_effects 佇列。假設第 13 回觸發的:
▎ FATE_010 「秦可卿托夢:盛極必衰」 delay_chapters: 20
其效果 economy.spending_pressure add 0.1 早在第 33 回就已到期執行過了。此刻佇列已無待處理項。跳過。
② 評估所有 369 條法則
引擎逐條掃描。以下是本回會觸發的關鍵法則:
法則 A — VAR_MARRIAGE_SWAP「掉包計:瞞天過海嫁寶釵」 conf=0.95
前提檢查:
agent.林黛玉.health \< 0.15 → 0.12 \< 0.15 ✅
agent.林黛玉.alive == True → True ✅
politics.family\_decides\_marriage → True ✅
relation.寶玉::黛玉.marriage\_probability \< 0.5 → 0.15 \< 0.5 ✅
全部通過 → 🔥 觸發!法則 B — PSY_E1_DAIYU_DECAY「黛玉健康衰退」 conf=0.9
health > 0.0 → 0.12 > 0 ✅
isolation > 0.3 → 0.72 > 0.3 ✅
alive == True ✅
→ 🔥 觸發!法則 C — VAR_MARRIAGE_DAIYU「木石前盟:寶黛終成眷屬」 conf=0.9
relation.寶玉::黛玉.marriage\_probability > 0.7 → 0.15 > 0.7 ❌
→ 不觸發 (寶黛婚姻概率太低)本回同時還觸發了十幾條其他法則(經濟衰退、政治風險等),但以上是跟黛玉直接相關的。
③ 衝突解決
VAR_MARRIAGE_SWAP、VAR_MARRIAGE_NORMAL_BAOCHAI、VAR_MARRIAGE_DAIYU 三條屬於同一個 variant_group(婚姻結局互斥)。
只有 VAR_MARRIAGE_SWAP 通過了前提檢查,所以沒有實際衝突。但如果黛玉已死(alive=False),則 VAR_MARRIAGE_NORMAL_BAOCHAI 會觸發而非掉包計版本 —
那是另一條演化路徑。
PSY_E1_DAIYU_DECAY 的效果是 sub(加法類),跟其他法則不衝突,全部保留。
④ 套用效果
法則 A 的效果立即執行(delay=0):
marriage trigger_event BAOYU_MARRIED_BAOCHAI → fate_flags[“BAOYU_MARRIED_BAOCHAI”] = True
relation.寶玉::寶釵.marriage_probability set 1.0 → 1.0
agent.賈寶玉.mood sub 0.5 → 0.20 → 0.00 (clamp)
agent.賈寶玉.monk_tendency add 0.3 → 0.35 → 0.65
agent.林黛玉.health sub 0.1 → 0.12 → 0.02
法則 B 的效果:
agent.林黛玉.health sub 0.017 → 0.02 → 0.003
此時黛玉 health = 0.003,已接近零。
⑤ 快照
將當前世界狀態壓成數值向量:
snapshot = {
economy\_vector: \[0.42, 0.82, 0.65, 0.55, 0.80, 0.35],
agent\_vectors: {
"林黛玉": \[0.003, 0.08, 0.10, 0.00, 0.30, 0.00, 0.72, 0.95],
"賈寶玉": \[0.80, 0.00, 0.30, 0.72, 0.80, 0.65, 0.42, 0.92],
...
},
politics\_vector: \[0.0, 0.60, 0.75]}
這個向量之後會跟 actual_checkpoints.json 裡第 97 回的實際向量做歐氏距離比對。
⑥ chapter = 98
進入下一回。此時黛玉 health = 0.003,BAOYU_MARRIED_BAOCHAI = True。
第 98 回再次跑 ② 時,兩條致命法則同時觸發:
▎ VAR_DAIYU_HEARTBREAK「焚稿斷情:黛玉心碎而亡」 conf=0.95
▎ health ≤ 0.05 → 0.003 ≤ 0.05 ✅
▎ BAOYU_MARRIED_BAOCHAI → True ✅
▎ → death trigger_event FATE_DAIYU_DEATH
▎ → monk_tendency add 0.4 → 寶玉 0.65 → 1.0 (clamp)
▎ → alive set False
接著 SYS_E19_ZERO_DAIYU 觸發(checkpoint.FATE_DAIYU_DEATH = True),將黛玉所有屬性歸零。
再過幾回,寶玉的 monk_tendency 到了 1.0 且 mood ≤ 0.15,觸發 VAR_MONK_DESPAIR「萬念俱灰:寶玉出家」。
