我最近把《挪威的森林》和《三体》抽取成了两份结构化的小说描述。原本只是想看看人物、事件和时间线能不能被一种语言准确表达,结果在两条时间轴上发现了一件很有意思的事:渡边和叶文洁,都生活在 1967 年。
一个在日本,刚刚被木月的死亡改变;一个在中国,亲眼看着父亲死在时代的暴力里。他们没有见过彼此,甚至不在同一种文学里,却像站在同一年裂开的两边。渡边把死亡收进身体,继续学习怎样和具体的人相处;叶文洁则把自己的创伤推向整个人类,最后望向了星空。
当这两个结构化人物被放到同一张时间切片里时,这个巧合忽然变得可见。于是我又让 AI 画了一张图:渡边站在列车、车库和台球桌前,叶文洁站在雪山、红岸天线和星空下。中间只有一个年份:1967。
这张图并不是我做 DoslEngPlug 的原始理由,但它很像这个项目的一个注脚。
DoslEngPlug 是什么
简单说,DoslEngPlug 是一个让 AI 能够使用 DoslEng 的本地插件。DoslEng 的中文名是“多思引擎”,它做的事情并不神秘:先用一门描述语言,把某个领域里重要的对象、关系和规则写成结构化数据;再让“判官”编译和检查;最后交给不同插件,生成适合人、AI 或程序继续使用的产物。
DoslEng 有一个听起来很大、其实也很朴素的第一性原理:万事万物都可以被描述,所有的描述都是不完备的。
前半句让我们有理由去描述一本小说、一份通信协议,甚至一个人所处的时代;后半句则提醒我们,不要把描述误认成事物本身。一份结构可以帮助我们看见关系、发现错误、生成新的东西,但它永远只保留了某个目的下被选择出来的部分。换一种语言、换一个观察者,世界就可能显出另一副样子。
它不是又一个替人写 JSON 的聊天框。JSON 只是一层外壳。真正重要的是,里面的内容属于哪门语言、字段之间能不能互相引用、枚举是否合法、同名对象是否冲突,以及这些描述最终能不能生成有意义的东西。
现在 Codex 可以通过 DoslEngPlug 查询可用语言、读取语言规则、创建项目、保存原始资料、编写结构化描述、调用编译判官,再在本地查看器里阅读源文件、结构和生成结果。小说用 NSL 描述,通信协议用 PSL 描述。前面的 1967 年,就是 NSL 把人物状态放回叙述时间轴之后出现的一次意外碰撞。
下面不是概念图,而是 NSL 实际生成的 HTML。木月的死亡日期、叙述位置和小说时间落在 1967 年 5 月;叶文洁的第一段人物状态则从 1967 年延续到 1969 年。
我很喜欢这种感觉。AI 不只是读完一本书后给我一段聪明的总结,而是先把它理解成一组仍然可以检查、修改、比较和继续生长的对象。当然,结构不能代替小说,更不能代替阅读。它只是让那些原本藏在几百页文字里的关系,多了一种被看见的方式。
她能做什么
我暂时把 DoslEngPlug 的能力理解成四件事。
第一,把自然语言资料变成有约束的结构。资料可以是小说,也可以是协议文档。AI 负责理解和填写,但不能随便发明字段,因为语言已经规定了什么能写、该写在哪里。
第二,让描述可以被编译。名字重复、枚举越界、引用不存在、结构不符合规则,这些问题不必等到工程师拿去使用时才暴露。判官会先把它们拦下来,并把错误指向具体位置。AI 可以据此修改,再编译,直到通过。
第三,让同一份结构生成不同产物。人可以读 HTML 文档,Agent 可以读 Markdown 知识库,工程链路还可以按插件生成 CSV、代码或 SDK。不是每次换一个用途,就重新理解一遍原始材料。
第四,保留事情从哪里来。原始文件、需求和对话被放在项目的 inception 里,生成结果则进入版本目录。这样至少可以追问一句:这个结论来自原文,来自人的要求,还是来自 AI 的推断?在 AI 越来越能说会道之后,我反而觉得这句追问很值钱。
在协议领域的一次实践
协议大概是最适合说明这套方法的地方。
传统协议文档常常同时写着字段、位宽、枚举、时序和大量说明。人读起来已经费劲,AI 每次重新阅读,也可能得到略有不同的理解。PSL 做的事情,是把协议里的属性、结构、列表、接口和枚举转换成一份可编译的数据对象。编译通过后,再生成给人看的文档、给 Agent 读的知识库,或者继续生成编解码相关产物。
项目里已经用 QMI8658B 六轴传感器数据手册做过转换测试:64 个寄存器、175 个属性、120 多项枚举。第二轮测试在完善语言使用说明后一次编译通过,并生成了 HTML 与 Markdown 文档。另一个 Modbus 设备协议的实践,则暴露了一个很朴素但很危险的问题:结构成员里的 count 是元素个数,不是位宽。写错以后,JSON 仍然很好看,SDK 却可能按错误的位数解析。
生成的 HTML 先给出芯片能力和寄存器目录,再向下展开到单个寄存器的字段、类型、读写约束与枚举。它既是一份给人阅读的协议文档,也是结构化描述确实产生了工程结果的证据。
这也是我认为 DoslEngPlug 有价值的地方。它并不承诺 AI 永远不会犯错——这话说出来就很像吹牛逼。它只是尽量把“理解”从一次聊天,变成一份能编译、能追溯、能生成、也能再次被人检查的东西。
再回到 1967 年
渡边没有真的见过叶文洁。那张图也是假的。
但是,两个人确实被两本小说放进了同一个年份,也都在亲近之人的死亡之后走向了完全不同的人生。这个联系以前藏在书页里,后来落进两份结构化描述,再被我偶然看见。
这已经不只是一个停留在纸面上的设想。目前,DoslEngPlug 已经能够在 Codex 和 DeepSeek Harness 中正常使用;PSL 已经抽象了两轮车涉及的全部通信协议,NSL 也已经完成了《挪威的森林》和《三体》两本小说的抽象。协议和小说相距很远,但进入 DoslEng 之后,它们面对的是同一个问题:我们怎样描述一个世界,又怎样承认这份描述必然有所遗漏。
我不知道 DoslEngPlug 最后会长成多大的东西。现在的她还很年轻,有些能力已经能用,有些仍在路上。但至少在这次偶然的发现里,1967 不再只是一个数字。它像一条很细的线,从一间关闭的车库,穿过雪地里的红岸基地,最后接到了我正在做的这台引擎上。
