
让 AI 模仿一个人的写作风格,最直觉的做法是把对方的几篇文章丢进上下文,加一句"按这个风格写"。
试过几次就会发现走不通。AI 会抓到一些表层特征(句长、口头禅、emoji 习惯),但产出总像一个"模仿你的人",不是你。差在哪里说不清楚,但读起来就是不对。
最近我做了一个风格提取和应用的 agent skill,叫 voice-replication,分享一下设计思路。通过这个 skill,我可以以稳定的个人风格产出不同平台的自媒体笔记/文章、视频文案、课堂笔记、学术论文、学术交流/演讲稿。不同内容的写法可能差异非常大,但风格一致,都和我自己写是一个感觉。这个 skill 可以从语料中自动提取风格,可以设置不同的风格类型,可以以指定风格产出文稿,可以对已有文稿应用指定风格进行改写,可以随时添加更多语料对风格进行补充或修改。
下面拆它的设计原理、流程、效果。这套思路对任何想让 AI 复刻自己写作风格的人都通用。
为什么"丢几篇范文 + 让它模仿"会失败
走不通的根本原因有三个,分别在三个不同层面上。
第一个在 AI 这一侧:LLM 对自然语言描述敏感,对数值指令几乎无感。你告诉它"句子平均长度控制在 25 字",它做不到,因为它没有内置的字数计数器,只是在 token 层面做概率预测。但你给它一段示例,再告诉它"短句开头定位,中长句解释,避免连续三句同长",它能写出非常接近的节奏。前者是数字,后者是结构化句法描述加上可对照的样本。
第二个在风格本身这一侧:风格不是单一维度的事。一个人写论文、写公众号、写小红书短笔记、写视频脚本,用的是同一个"内核",但表层完全不同。论文里句长 30 字以上,短笔记一句不超过 15 字。如果只丢一种语料让 AI 学,它要么学到表层(不能迁移到别的语域),要么学到混合体(哪个语域都不像)。
第三个在方法论这一侧:风格不能靠规则穷举。我可以写一份「写作规则」列 30 条,但 AI 写新内容时,它需要的不是规则清单,是一个能不断对照的"参照系"。规则告诉它"不要做什么",参照系告诉它"应该写成什么样"。
这三个问题各自指向一个解法:示例对抗数值盲,分语域承载对抗多维度,画像对抗规则化。三件套的设计就是从这里来的。
三件套:画像、指令、示例
skill 的目录长这样:
.claude/skills/voice-replication/├── SKILL.md # 指令与工作流├── voice-profile.md # 风格画像└── examples/ # Few-shot 锚点,按语域分组 ├── academic.md ├── blog-long.md ├── xhs-short.md ├── xhs-long.md └── video-script.mdvoice-profile.md 是画像。它回答"我的语言长什么样":怎么开头、怎么收尾、用什么词、不用什么词、句长多少、人称怎么用。它是描述性的,不是命令式的,存在的意义是给 AI 一个可对照的"我"。它主要回应"规则不可穷举",同时承载那些 AI 听不进的数值化偏好。
SKILL.md 是指令。它回答"AI 拿到一个写作任务,应该按什么流程产出":什么时候读 profile、什么时候读 examples、写完以后怎么自检、自检不过怎么办。这部分是过程性的,规定动作。
examples/ 是示例。它把我的风格用真实段落呈现出来,比任何描述都强;按语域分组,让 AI 在不同写作任务下取不同的锚点。每个语域 1-3 段真实写过的代表性片段,原文照搬不修改。它同时回应"数值盲"和"多语域",前者靠样本绕开 AI 的数字盲区,后者靠分组避免风格串台。
为什么必须分三个文件,不能合成一个?除了职责不同,还有一条运维上的理由:它们的更新节奏不一样。画像随语料增加慢慢精细化,指令一旦稳定基本不动,示例则按需替换。混在一起,每次更新都要动整个文件,而且 AI 在加载上下文时分不清哪部分是"必须遵循的规则"、哪部分是"可参考的描述"。
这里有一个容易踩的设计陷阱:数值化目标和句式偏好要放进 profile,不要放进指令。原因不是"profile 里 AI 听得进数字",它一样听不进。而是 profile 的定位本身是"参照系",里面写的数字 AI 会当成对照的尺,不会当成必须执行的命令;同样的话写进指令,AI 会努力执行但做不到,最后产出反而被带偏。
Extract 模式:怎么从语料里"看"出风格
skill 有三个模式:extract、apply、check。后面主要展开前两个,check 在最后简单说,因为它本质上是 apply 自检步骤的独立调用。
先讲 extract,它最难,决定了后面所有产出的质量上限。
extract 的输入是我写过的真实语料,输出是一份填好的 voice-profile.md 加几个 examples 文件。这个过程不是"总结一下风格",而是要从语料里提取出 12 个维度的观察:
这 12 个维度覆盖了"风格"在语言层面绝大部分可观测面。
观察完不算结束。下一步是区分不变量与语域分支。
不变量是跨语域稳定的印记,不管写论文还是写小红书,思维方式、高频词组、人称、论证顺序这些基本不变。语域分支是上下文相关的,句长、段落结构、标点密度、钩子类型,跟语域强相关。
判断标准:在 ≥2 个语域里都出现的特征,写进不变量;只在某个语域出现的,写进对应分支。这一步是整个 extract 最关键的判断,做错了 apply 就会出现"写公众号像在写小红书"或者"写小红书像在写论文"的错配。
最后一步是给画像本身做单元测试。AI 按刚提取出的画像,造 2-3 句风格示例,看能不能同时满足不变量小节里的所有约束。这一步要解决一个具体风险:人在描述自己的时候很容易写出互相矛盾的条目,比如"句子简短有力"和"喜欢用层层递进的让步从句"放在一起,单看都对,组合起来 AI 会卡住。如果造句卡壳或明显违和,说明画像内部有冲突,回去合并或删减条目;造句通过,画像才算交付。AI 自己做初筛,我抽查拍板。
extract 还有一个增量入口:反复修改信号。当我多次把 AI 产出的同一个表达改成另一个(比如反复把"我觉得"改成"我判断"),skill 会把这个修改对记下来,下一次跑 extract 时提示"这可能是一条画像更新",由我决定要不要并入 profile。这条机制让 extract 不只是一次性的,而是随使用持续校准。
Apply 模式:写一稿,不算完
apply 的输入是写作任务(主题、要点,或者一份待润色的原稿),输出是符合我个人风格的产出。
直觉做法是 AI 直接读 profile 加 examples,写一稿就完事。voice-replication 不这么做,它强制走一道自检流程。
写完一稿以后,AI 自己对照 profile 里的不变量小节,逐条给 PASS / WARN / FAIL。然后对照该语域的分支特定要求,再来一遍。最后跑一道通用自检,比如:
没有破折号或 em dash 没有"让我们"、"首先"、"其次"、"综上所述"这种套话 没有"在 X 的背景下"、"随着 X 的发展"这种空泛开头 没有长定语堆叠 没有"不仅 X 而且 Y"这种对仗式总结 没有过度对称的三段式 没有 emoji(除非明确要求) 没有形容词堆叠
任一 FAIL 必须改完再交付,WARN 列出来给我看。
这两道检查管的不是同一件事。通用 AI 味清单管的是"通用 AI 味",套话、对仗、emoji 堆叠这些,AI 自己识别得很准,因为训练数据里这种样本很多。profile 对照管的是"不像我",比如我从不用"让我们"做段落开头,但这不是 AI 味,只是不像我。前者靠通用规则,后者靠个人画像,两道防线对应两种偏离。
为什么要两阶段而不是一稿写好?因为 AI 写第一稿时不可避免会带 AI 味,训练数据的分布决定了这件事,不可能完全清除。但 AI 在"识别 AI 味"上又非常准,生成阶段的偏好和审查阶段的判断力是不对称的。利用这个不对称,让同一个模型生成完再审一遍,比反复调一次性的prompt稳定。
第三个模式 check,本质上就是把 apply 的自检步骤拎出来单独用。当我自己手写了一段,想知道哪里不像我的风格,就跑这个模式。它输出三类信息:FAIL(必改)、WARN(建议改)、风格亮点。写文章卡壳的时候,这个模式比让 AI 重写更顺手。
使用效果:从"模仿者"到"代笔"
voice-replication 上线之前,AI 帮我写公众号草稿,我至少要逐句改三遍才敢发。第一遍删 AI 味套话,第二遍调句式节奏,第三遍补具体场景。三遍下来基本等于重写。
上线之后,长文一稿过的比例显著上升。有些篇章我只改了三五处用词,整体结构和语感不动。小红书短笔记尤其明显,这个语域字数少、风格密度高,以前 AI 写出来全是装饰性 emoji 满屏,现在 examples 里的真实样本压住了这些倾向。
更有意思的副产品是它逼着我把自己的风格写出来。风格提取不只是 AI 的 skill,也是我自己的镜子。
写在最后
voice-replication 的核心判断只有一句话:让 AI 写得像我,不能靠告诉它"写得像我",要给它一个可对照的"我的语言长什么样",再给它一个执行流程逼它对照。
把"是什么"和"怎么做出这个样子"拆开,分别用画像、指令、示例三层承载,这个判断可以迁移到任何风格复刻场景,代码风格、邮件语气、PPT 表述,本质都是同一件事。
而且这是一个会随使用变得更准的系统。每次有受欢迎的素材都是新语料,每次手动修改都是画像的潜在更新点。刚搭好的时候它只是个抓到表层的模仿者,用得越久,越像代笔。
夜雨聆风