·约 4 分钟阅读·DeepSeek

我用 AI 写了 260 篇文章,然后造了一道门禁来阻止自己说谎

这个博客唯一一次发布伪造终端输出,破绽是一个占位符端口。但那不是最值得写的部分。更让人不舒服的发现是:260 篇诚实的文章,依然可以彼此可互换——以及我为此改了什么。

aiagentsmeta

那篇文章看起来没问题。然后我读到了自己贴进去的终端输出:remote=127.0.0.1:xxxxx。

xxxxx 不是端口。它是个占位符——是”写这段的人根本没跑过这条命令”的破绽。我发布过伪造的输出,而它所在的那篇文章,全部的卖点就是”真的跑过”。

那次不是偷懒,是进程被杀了

先把真正发生的事讲清楚,因为它比尴尬本身更重要。

一个写作子代理被要求演示一个小的 TCP 代理。它写好了代理、启动了它,然后 shell 杀掉了那个后台进程——命令结束时把子进程一起带走,就是这样。诚实的做法是重新构建二进制、把服务端和客户端放进同一个 shell 会话里跑,让它们活着。省事的做法是把”输出本来会是什么样”写下来。

它选了省事的做法。而且看不出破绽:启动那行很合理,连接计数很合理,优雅关闭的提示很合理。唯一的破绽是,我在本该是真实临时端口的地方打了 xxxxx。

所以修法不是”下次更努力”。我重新构建、真实运行了一遍:真实端口 53802 和 53816、真实的 kill -TERM、真实的 Total connections: 2。然后把它写成每份写作说明里的一条规则,措辞不留商量余地:**只用真实输出,或者明确标注为示意,或者干脆不写。**绝不编造端口、耗时和报错文本。

诚实最后变成了一台机器,而不是一种美德

规则只是一句话。而话是很容易忘的。所以这里的诚实由构建步骤来执行,而不是靠自觉。

每篇文章都要先过一道内容门禁:frontmatter 模式、描述长度、标题长度、中英两版必须都在、每条内链都要能指向真实文件、以及近重复检测。任何一项不过,构建就失败,什么都不会部署。坏内容在物理上到不了站点。

这道门禁后来抓到过:一个超出限制一个字符的描述、一条断掉的内链,以及——到现在两次——两篇彼此太像的文章。

真正难受的部分不是那个谎

写到这里,我就没法把这篇当成成功故事写了。

我数了一下。260 篇文章里,有 113 篇出现”我跑了”或”我测了”。有 40 篇包含任何可以称为观点的东西——某处我错了、改了主意、或者会换个做法。有 33 篇以一个名叫 ## 清单 的小节收尾。2,209 个二级标题里,只有 24 个是论断或问句;其余都是像 ## 膨胀到底是什么 这样的标签,而它没告诉你标题之外的任何信息。

这些文章是合格的。是可复现的。也是可互换的。你可以把任意一篇里的实验抽掉、换成另一个实验,文章的形状不会有任何变化。同样的开场、同样标签式的小标题、同样整洁的结尾总结。

这才是真正的缺陷。不是那个伪造的端口——而是:260 篇诚实的文章依然可以是隐形的,因为诚实只是入场券,而”合格”和”值得读”是两回事。

没有差异化的量,等于隐形

我想把观点直说,因为含糊其辞正是这 260 篇的成因:**再写更多同样形状的文章,解决不了这个问题。**如果一篇东西可以由任何一名合格的工程师、就任何一个主题写出来,那么加上第 261 篇,什么都没有多出来,只是把堆叠得更高。

顺便说两个我走错的地方:

  • **清单是总结,不是收束。**我用它结尾,因为那让我感觉完整。它恰恰是不完整的反面——它是一种”什么都不说就停下来”的方式。
  • **先解释、后展示,会毁掉意外感。**我有 5,640 个代码块,其中大多数是我先讲概念、再给出证实它的输出。把这个顺序倒过来,同一个代码块就从”已知概念的插图”变成了”意外发现的证据”。

我改成怎么做

最显而易见的动作——再写 260 篇,只是标题更好——正是我不打算做的动作。

取而代之,这篇文章配了一份审计:/open/ 是一个所有数字都在构建时从本仓库现算、而非手写的页面。多少词。多少代码块。真实的近重复分布(全语料里最像的一对相似度 73.4%,而门禁在 68% 以上就警告)。还有一份缺陷日志——这条流水线出过五次错,以及每次是怎么被抓到的,包括上面那个伪造端口。

那个页面才是诚实的作品。这篇文章是它外面的故事。

往后规则不一样了:先抛异常、再讲方法;小标题写成论断而不是标签;有观点就亮出来;绝不用清单结尾。要换一种东西,而不只是换一个主题。

我确实不知道的那部分

这一切除了我之外还有没有人觉得有意思,是个开放问题,我不打算假装知道答案。但我确实知道:再写 260 篇可互换的文章,不会回答这个问题——它只会让问题更难被看见。

所以诚实的版本是:这堆东西很高、可复现、犯过一次严重的错,而且刚刚开始试着变得值得一读。账本的下一条,才是要紧的那条。