一源千面
发布源文件,让每位读者的 AI 为自己编译论文,而论断保持不变
我写过的每一篇论文,都只被编译过一次。章节的顺序、贯穿全文的例子、记号、哪一张图承载核心想法,这些都是我为一位想象中的读者选的,然后由定稿截止日期冻结下来。此后每个人读到的都是同一份构建产物:从没听说过隔离级别的机器学习研究者,想弄清团队该不该在意的工程师,试图复现它的学生。他们大多不是我想象中的那位读者。
这在过去无法避免:第二个版本的成本和第一个一样高,没有人会写十二个。如今不再如此。所以我们发表的东西也该变一变:发布源文件,让每位读者的 AI 为这位读者编译出论文。
论文是源码,读者是目标机
发表出来的东西变成一个 Markdown 文件。读者把它交给自己的助手(Claude、ChatGPT,用什么都行),只说一句:帮我编译这篇论文。助手会问几个问题:读者习惯怎样吸收技术材料,读哪种编程语言,来自哪个领域,想从论文里得到什么,然后为他生成一页属于他的论文。如果助手已经很了解这位读者,就该跳过提问,直接编译。
文件分四部分:一是指令,告诉助手如何访谈读者、如何规划版本、输出什么;二是一份论断清单,列出论文的每一个数字和每一条明言的局限,任何版本都必须原样保留;三是论文本身,也就是权威文本;第四部分稍后再谈。
规则比提示词更要紧。数字是固定的。局限一条不能少,版本再短也一样。助手添加的任何东西(一个类比、一个演算示例、一张重画的图)都要标明是添加的,绝不能冒充作者的话。伪代码可以译成读者熟悉的语言,但要逐行对应并注明是译文。图表绝不能用编造的数据重画。读者得到的是不同的呈现,而不是不同的论断。
两种决定,两个绑定时刻
先前一篇文章用一个问题给系统里的决定分类:它从什么时候起不再可改?拿这个问题来问论文。
一篇论文做两类决定。一类是它主张什么:问题、机制、数字、局限。另一类是如何呈现这些主张:顺序、例子、记号、深浅、图。如今两者在同一时刻绑定,即定稿截止日;由同一个编译器完成,即作者;而这个编译器只运行一次。没有人选择把两者绑在一起,只是从来没有第二个编译器。
这两类决定需要相反的绑定时刻。论断应当早绑定。别人要在它们之上构建、引用它们、试图推翻它们,前提是它们站得住、不挪动;而作者也只能为固定下来的东西押上自己的名字。呈现应当晚绑定,因为它所依赖的信息(谁在读,他们知道什么,为什么打开这篇论文)在写作时并不存在。作者只能猜,读者的助手却知道。
程序员会认出这一招。提前编译器必须为所有机器产出同一个二进制;即时编译器则等到看见实际的机器和实际的负载,再做特化。没有人认为 JIT 改变了程序的含义。那篇文章还点出了让这一切安全的接缝:接口。上一层定义接口,下一层实现它,并且可以在不重新谈判上层的情况下改变。在论文里,论断清单就是接口,每一个渲染版本就是一个实现。接口早固定,实现晚绑定,每一个实现都对照接口检查。
所以这个提议并不是“让 AI 改写论文”。它更窄:把论文的两个绑定时刻拆开。一个已经了解自己读者的助手,正是这个想法的极限,也就是最晚的绑定,连访谈都省了。
一篇论文,五位读者
我拿自己的论文试了一下。Cobra(OSDI’20)检查一个黑盒数据库是否真的提供了可串行化,论文里满是图、约束编码,以及一张承载核心算法的伪代码图。我把发表的文本转成源文件,写好论断清单(十二条论断、八条局限),交给五个全新的助手,每个助手只看到这个文件和一份简短的读者画像。源文件是公开的;交给你自己的助手,你会得到第六份。
五篇论文正如我所希望的那样各不相同:
- 一位喜欢图、读 Python 的机器学习博士后,得到了八千字和十一张图,其中隐藏的版本顺序被讲成一个隐变量,GPU 剪枝则被还原成它的本来面目:反复的矩阵乘法。
- 一位偏爱文字、读 C、想评判论断的系统方向博士生,得到了 C 写的算法、内核里的类比(锁顺序检查器、RCU),以及针对实验评估的读书会问题。
- 一位只有十分钟、熟悉 Java 的后端工程师,得到了不到一半的篇幅、六张图,以及一节题为“你的团队该不该在意?”的内容。
- 一位程序语言研究者,得到了把数据库术语映射到内存模型关系上的讲法,以及一份重建这个系统所需条件的清单。
- 一位上过一门 Python 课、几乎不懂计算机系统的高中生。这位读者不是论文的受众,这个版本也舍去了大部分技术内容。但它读得懂:键值存储变成一个 Python 字典,事务变成从 Alice 那里转十美元给 Bob,问题变成一个高中生也能问的问题:你看不见一个数据库的内部,还能信任它吗?对这位读者来说,另一种选择从来不是一篇更简单的论文,而是一篇读不懂的论文。
没有变的才是要点。五个版本里的每一个数字都能追溯到源文件。五个版本都说明 10 倍的提升指的是验证成本,而不是吞吐量;这正是我最担心摘要会写错的那句话。五个版本都保留了全部局限,包括最朴素的那一条:我们没有在真实环境中发现可串行化违例。
发表之后仍在阅读的论文
文件的第四部分,是我最想要的。
一篇发表了的论文,停留在它所读过的文献快照上;今天打开 Cobra 的读者,无法从论文里得知后来发生了什么。所以源文件附带一节注明日期的内容,标题是发表之后:不属于论文本身,也不是作者所写。对 Cobra 而言,它记录了截至 2026 年 9 月 Semantic Scholar 上的 72 次引用,以及直接建立在它之上的工作:复用其编码的快照隔离检查器,以它为比较对象的弱隔离级别检查器,一个加入 SQL 谓词、报告 60 至 100 倍加速的版本,等等;另有一段说明这一领域的现状。能联网的助手可以更新这一节,但每一条新内容都必须附上链接和日期,并与快照明显分开。
研究本来就运行在陈旧读之上。这让一篇论文能刷新自己的那一份。
作者仍然拥有什么
显而易见的反对意见是:如果每位读者看到的论文都不一样,作者发表的究竟是什么,又要为什么负责?
是源文件,而作者为论断清单押上自己的名字。这和我谈生成变得廉价之后什么仍有价值时给出的答案一样:那个一旦出错你就要为之付出代价的论断。文字、顺序、例子和图都是呈现,如今重新生成的成本很低;论断不是。引用和评审也随之而定:引用源文件及其版本,就像引用一次提交;评审源文件及其论断清单。一个渲染版本是正确的,当且仅当源文件有可能产生它。
我也要承认代价。一个我从未读过的版本,仍可能以规则没有预料到的方式出错,比如一个类比偷偷带进了论文从未作出的假设。论断清单能拦住被改动的数字和被丢掉的限定,却拦不住误导人的比喻。我赌的是,这个风险比我们早已在承担的那个更小:一个大多数读者都没有完全读懂的唯一版本。
一个中间阶段
这还不是终点。编译出来的论文仍然是一份从头往下读的文档。我真正想要的版本会回应你:改一个参数,看着图随之变化;问一步为什么成立,就得到证明。那是以后的一篇文章。
总之,我主张这样一种发表模式:论文主张什么,由为之负责的人在早期一次性绑定;论文怎么读,则在晚期为每位读者各绑定一次。一源千面:不是千种真相,而是一组论断,以及与读者一样多的进入它的道路。