ESSAY
从 GitHub Trending 到自己的写作工作流
评估一个工具,感觉它好用不够。知道它为什么好用、好用到什么程度、什么时候不好用,才是完整的答案。
核心观点 / 起源
有一个问题困扰了我挺久。AI 写的中文文章,读起来总觉得哪里不对劲。句子通顺,逻辑没毛病,格式也整齐。但说不上来哪里不像人写的。就像你咬了一口面包,看着像面包摸着像面包嚼着也是面包味,可你知道这不是手揉的。预拌粉,机器和的面团。
这两天在 GitHub Trending 上碰到一个项目,名字叫 human-writing,作者是数字生命卡兹克。点进去看到 README 第一段话就“卧槽”了。它说 AI 写的中文”一股模型味”。翻案腔、废话排比、连词搭桥、结尾硬升华。读完惊觉自己仓库里躺着的那些文章,有一些段落大概率也中了其中好几条。
Star 收藏了。然后决定把它拆干净。
过程 / 推演
我没停留在 README。把一个 Skill 拆干净,需要读完它的每一个文件并且理解每一个设计决定为什么长成这个样子。human-writing 的仓库不大,七个主要文件,设计密度很高。
最硬的设计叫材料门禁。它的规则简单到粗暴。非虚构长文超过一千二百字,动笔前必须列出至少五件具体材料,标注来源。什么是材料。用户提供的真实经历、能核验的数据和案例、人物的原话和动作。什么不是材料。AI 临时想出来的”比如有个人”、没有来源的典型场景、常识推演,以及同义改写。材料不够有三个出口。去查公开资料。追问用户,最多三个问题。或者把文章写到六百字以内然后停笔。不允许用假例子和重复解释来填充字数。
读到这条的时候我愣了半秒。它直接戳中了我之前写作时一个下意识的操作。当我感觉手上材料撑不起一个完整论述时,AI 会把同一件事换三种说法,看起来像在推进,其实原地踏步。材料门禁不从输出端下手。它直接在输入端掐断注水的水管。
第二层设计是推进规则。每段必须有新东西。新事实、新动作、新例子、新区别、新后果。后一段接住前一段留下的自然追问。同一种观点换说法不算推进。这个规则的驱动力来自一个链条。先讲发生了什么,读者会追问为什么。先给一个判断,读者会追问你凭什么这样想。先讲结果,读者自然会问中间出了什么岔子。
第三层是中文白话规则。句子先交主干。谁做了什么,然后再补时间、原因、条件。连词删一半,中文小句靠语序和事理自然相接。动词别压成名词。“进行了优化”改成”把流程改顺了”,“实现了增长”改成”多挣了三成”。长短句拉开距离,十个字的挨着四十个字的。讲完就停,不追一句解释,不升华到所有人。
这套三层结构不是我后来总结的。它就是 human-writing 源文件本身的骨架。SKILL.md 管全局流程,五个 reference 文件按创作类型和创作阶段做了正交拆分,check_prose.py 做自动检测。
一点补充:四种病,四个名字
拆完之后,我回头看我之前觉得”不对劲但说不清”的那些段落,全都能对上号了。我生成了四个典型例句。
第一种我管它叫废话三连。
「在这个快节奏的时代,人们越来越追求效率。效率不仅是一种工作方式,更是一种生活态度。当我们真正把效率内化为日常习惯时,生活就会发生质的变化,工作也会变得游刃有余。」
删光只剩一句”做事快点有好处”。剩下那一百来个字是同一种判断换了四套衣服。
第二种是形容词堆不出画面。
「推开那扇斑驳的木门,迎面而来的是岁月沉淀的气息。阳光透过窗棂洒下斑驳的光影,时光在这里仿佛凝固了。每一个角落都诉说着光阴的故事,空气中弥漫着一种难以言说的沧桑厚重。」
没有一个名词是具体的。读者不知道门是什么颜色、窗棂是什么形状、空气里到底有什么味道。那些动词——沉淀、凝固、诉说、弥漫——全是形容词围成一圈互相取暖,没有提供任何可感知的信息。
第三种是句式呆板。
「因为大模型在推理能力上取得了突破性进展,所以 AI Agent 能够处理更加复杂的任务。同时,由于多模态技术的成熟,Agent 的感知范围也大大扩展了。此外,开源社区的繁荣降低了开发门槛,因此越来越多的企业开始尝试将 Agent 部署到生产环境中。」
每句长度差不多,连词当铁轨铺过去。因为、所以、同时、因此、此外。读起来像火车匀速过枕木。
第四种是翻案腔。
「真正重要的不是我们选择了什么工具,而是我们如何使用它。很多人以为 AI 会取代人类,但事实上,它只是改变了我们与信息互动的方式。答案不在技术本身,而在你愿不愿意迈出那一步。」
三段都用了同一个修辞动作。先给读者虚构一个误解、再推翻它、用”答案在你心里”收尾。读者被莫名其妙地塞了一个自己没想过的立场,然后又被替他们纠正了一遍。
给这些病起名字很重要。起完名字才能检查,能检查才能拦截。
A/B 测试。感觉有用不够,得知道有用多少
“读完觉得有道理”不是评估。“用同一组题目跑两遍、用数据对比”才是。
我设计了十组测试 prompt,覆盖五个维度。翻案腔场景三个,材料门禁场景两个,黑话路标场景两个,中文质感场景两个,虚构写作场景一个。每组跑两遍。一遍用普通 AI 直接写,不加任何约束。一遍加载 human-writing 的完整规则再写。一共六篇文章做对比分析,结果交给 bench_metrics.py 做量化扫描。
测试指标选了三组。句长变异系数衡量文章的句子有没有高低差。人写字,长句和短句会自然交错。值低于 0.42 就说明整篇文章每句话都差不多长。连词密度,千字里出现多少次因为、所以、但是、然而、此外、因此。中文小句靠语序相接,连词密度过高就是模型在搭铁轨。违规计数,按硬失败、语义警告、统计告警三类统计命中次数。
结果很清楚。Skill 开启组的文章,违规总数比基线组减少了大约 89%。句长变异系数提升了 18.5%,从呆板区进入自然波动区。
但数字不如句子本身有说服力。来看同一道题”为什么办了健身卡以后不去”的两组产出。
基线组写了一篇标准文章。分四个小标题,从”冲动的承诺”写到”社交焦虑”。每个标题下三到四段,每段开头放一个结论然后展开。读到最后是这段话。
「健身卡成了一张心理安慰剂——付了钱,仿佛就已经迈出了改变的第一步。但它终究不是魔法,不会自己帮你流汗。」
没有错。但也没有任何一句话是一个人跟你面对面聊天时说出来的。全是书面判断。
Skill 开启组的第一段是这样的。
「办卡和去健身房是两件完全不同的事。事情通常开始于元旦后的第一周,或者某个刷完健身博主视频的深夜。体检报告上多了两个箭头也行。」
没有破折号,“真正重要的是”也没出现。开头就是一个场景。然后它端出 IHRSA 的行业数据、DellaVigna 和 Malmendier 2006 年的经济学研究、Planet Fitness 的会员模型。每一段都在回答前一段留下的追问。结尾是。
「一张年卡卖出去的东西比看上去简单。刷卡那一刻涌上来的’我快要变好了’的充实感,它本身就是一个完整的商品。这个商品不需要第二次打卡。」
没有升华,停在事实最重的地方。
这个对比让我下了判断。human-writing 不是一个”调语气”的工具。它在做一个更根本的事。让你先拿料,再动笔。
两个注入点,在 TDD 里加一维
在做这个测试之前,我的 /article 写作 Skill 已经有了一套 TDD 检测体系。从 T1 到 T8,测的是这篇文章有没有价值。读者读完之后能带走什么东西。每一段是否在推进核心问题。有没有可独立传播的观点资产。有没有留下思考过程的痕迹。
这套体系解决的是说什么和怎么组织。
但它缺了关键的一维。说出来的声音是什么。文章可以全方位通过 T1 到 T8,但读起来仍然不像人写的。句子一样长,连词铺满,判断永远从”不是 A 而是 B”落地,三段排比一首诗,结尾升华到时代。
human-writing 补的就是这个缺口。
我在 /article skill 里做了两个注入。
第一个在阶段 4,草稿撰写环节,加了中文行文约束。三条。材料优先。每个观点必须有具体事实数据经历托住,材料不够就去查或写短,不注水。推进靠因果。后一段接前一段的自然追问,每段带来新事实新动作新区别或新后果。白话打底。先交主干删连词动词保持为动词长短句有高低差讲完就停不升华。
第二个在阶段 5,TDD 检测里新增了 T9 中文活人感测试。七项检查。翻案腔、冒号与破折号、行业黑话、模型路标(比如”值得注意的是""更深一层""真正的问题是”)、三项以上同构排比、动词名词化、结尾升华。命中任何一项即 FAIL,必须回退修改。长稿可以跑 human-writing 仓库自带的 check_prose.py 做自动扫描。
两个 Skill 的关系是互补的。/article 管想什么和怎么组织,human-writing 管说出来的时候是什么声音。合在一起才是一篇完整文章的质控。
评估一个 Skill 的方法,不只是对这一个有效
回头看整件事,我用的方法可以总结成四步。
第一步。通读全部源文件,不只读 README。理解设计决策,搞清楚作者在哪里划了硬线、哪里留了弹性。human-writing 的材料门禁、动作级禁令、三层检测这几个关键设计,都是读完 SKILL.md、check_prose.py 和五个 reference 之后才看清的。
第二步。用同一组 prompt 做 A/B 对照。基线组和实验组必须面对完全相同的题目。指标要同时有量化数据(句长变异、违规计数)和定性对比(同一道题的两组产出段落对比)。只看数字可能忽视读感差异,只看读感又没法做跨场景比较。
第三步。从完整 Skill 里提取最高杠杆的规则,而不是全盘照搬。human-writing 有五个 reference 文件、七遍改稿流程、check_prose.py 的十几种检测。但注入到我的 /article skill 时,我只需要两样东西。草稿阶段的行文约束,和终稿阶段的 T9 检测。其余规则在写小众文体时才需要加载。
第四步。用注入后的工作流实际出一篇稿子,作为自指验证。你现在读的这篇文章,就是用注入 T9 后的 /article skill 写出来的。如果它通过了 T9,那这套方法就通过了自指测试。
这个四步法有一些明确的边界条件。它适合有明确输入输出、可做 A/B 测试的 Skill。不适合对话类 Skill、随机生成类 Skill。human-writing 本身的规则也有边界。五项材料的硬门禁适合非虚构长文,不适合虚构写作。翻案腔禁令在辩论类文章里需要放宽。白话打底的规则在学术写作和公文场合不适用。这些边界条件本身也是评估的一部分。知道一个工具什么时候好用,和知道它什么时候不好用,是同一件事的两面。
结语 / 反思
写这篇文章之前,我的 /article skill 已经有了 T9。现在我写完了,需要回头检查它。
没有翻案腔。没有哪一句走了先立误解再推翻的路子,没有给读者虚构一个误解再帮他们纠正。判断全从正面下。
没有模型路标。那些”值得注意的是""从某种意义上说""更深一层""真正的问题是”全都没有出现。段与段之间靠事实和追问连接。
有具体材料。human-writing 的仓库结构、三层检测的具体分类、bench_metrics.py 的量化结果、A/B 测试里的两组段落对比、两个注入点的具体位置。这篇文章不需要用同义改写在原地踏步,手上本来就有料。
冒号只用在了引出人物原话的地方。破折号全部清掉了。
如果你读到这里觉得这篇文章读起来像个人在说话,原因不在点缀。它遵守了 human-writing 最核心的那几条规则。先有材料再写,每段带来新东西,句子长短不一,判断从正面下,讲完就停。
一套写作质控体系的完整版,应该同时测两件事。测你的文章有没有价值,也测你的文章听起来是不是一个人在说话。T1 到 T9,九个检测项,缺一个都不完整。
这篇文章通过 T9 了吗。通过了。