快轉到主要內容
  1. 博客/

红楼梦模拟器:热力学与艺术选择

QQder 核舟记部落格
作者
QQder 核舟记部落格
这里有八款 iOS App,全部免费、无广告、无追踪——直接挑一款来用。同时记录一个文科背景的系统管理员,如何靠 AI vibe coding 从零把想法做进 App Store。

app url: LINK

前言
#

上一回主要强调的点

是要将文字看作本质的符号

天文、水文、人文等…所有天地人之文

它将世界与思想以符合成本的方式映射

变成我们主要理解以及与客观世界的工具

理解这点才会意识到

LLM(大语言模型)虽然本质只是文字接龙

但是能力高到一个程度便已是核能级的国之重器

它的重要性让我想要验证它的能力

并且能够随着他能力的提升反复验证

一个堪称完美的目标就是红楼梦

假设有个全知全能的 LLM

它可以在输入曹雪芹原本红楼梦前八十回,然后输出后面的章节

但因为 LLM 的训练数据有限

就如同题目不完整的数独一样无法确定答案

它现有的能力是在它能够理解的范围内,生产力非常高

红楼梦模拟器要做的是在这种生产力的协助下

用传统结构化的方式,用极少的人力快速产出及累积成果

假设
#

我们需要一些假设、偏见、理论来让预测结局的工作足够可行及机械

讲到准确地预测我直觉想到古典物理学其中的热力学

在一个封闭的系统中,热力学系统如果给定初始条件、运作规律

则系统的演化可预测且必然的

另一个假设是,LLM 的模型能力会越来越强,

但在可预见的未来我们不会有更多清朝及曹公的训练数据

所以我们可以有一个结构化的工作流程,并且可以让现在和未来的 LLM 执行

初始条件
#

初始条件主要是从小说原本萃取的数据,

现在我们使用 LLM 做原本高劳力密集的事情,

以往人力成本太高,并且人力多也是无法压缩时间的,

如果做到一半,想要微调萃取规则重新来过太不实际。

时间跟成本不再是问题,而萃取的质量则取决于模型的能力。

例如我提取了:

  • 主要角色的信息,性格档案,家族族谱;

  • 一百二十回每回角色在那一回的经济、社会、情绪、健康、人际关系等快照;

  • 还有基本的贾府的空间地图,空间信息;

  • 所有的对话记录、诗词语料…

先用不严谨但至少覆盖率高的方式,将所有出现的文本都被提取到某个分类。

运作规律
#

运作规律我用我的判断分为两种,一是基本的世界法则,二是作者的艺术意志。

这很武断,但不做某种判断的话完全无法进行。

世界法则则不限于且包含了以下基本的项目

  • 社会:阶级、权力、主仆关系、婚姻;

  • 经济:收支、债务、抄家风险;

  • 文化 : 礼教、节庆、封建价值观;

  • 心理:角色情绪、性格驱动、内在冲突

  • 政治: 皇恩、朝廷、外部势力…

艺术意志则是红楼梦除了没有结局这个事实,他之所以适合当预测标的的原因,

那就是曹公在开头以及全书到处都暗示了角色的命运,

最具代表性的就是十二金钗的判词已点出了女一及女二的结局

可叹停机德,堪怜咏絮才。玉带林中挂,金簪雪里埋。

规则引擎
#

有了初始条件跟运作规律要如何套用呢

较理想的方式是建造类似游戏的 3D 物理引擎,每个角色有自己所知的信息,并让一个 ai chatbot 像是演员演绎角色那样扮演互动

但是一来这样成本太高,只是提高观赏性而已,我们并没有引入新的信息,在 3D 引擎里也不会有新的结果;

二来是我们不是做风洞流体力学的物理模拟,而是在猜测曹雪芹的想法,目前停留在文字就可以了。

根据前面提取的数据,归纳出一些运算的主体跟规则,

实际上就是传统上针对一件事发生与否的证据、信心、加减过程,

做系统化可重复、可修改的全面性暴力运算。

每一回合的模拟步骤为:

  1. 处理延迟效果 — 检查 pending_effects,到期的立即 apply

  2. 评估所有法则 — 逐条检查 premises 是否全部满足(跳过 confidence < 0.3 的)

  3. 冲突解决 — 同时触发的法则可能矛盾,裁决谁赢

  4. 套用效果 — 有 delay 的排入队列,没有的直接修改 state

  5. 快照 — 把当前 state 压成数值向量

  6. 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「万念俱灰:宝玉出家」。