任意文风迁移?
如果使用LLM进行写作…
有些时候,阅读一篇文章时,我们也许会读到一些句子、词语,比如臭名昭著的“不是…而是…”。它们使我们觉得,文章作者不像一个真实的人类,而像是一台根据预测概率输出文字的机器。这种感觉,就是所谓的“AI感”。
“AI味”是怎么来的?
我尝试过很多次给AI一个故事,要求它完善这个故事的叙事细节,写出一篇完整的文章(小说?)。一般来说,在不加特定要求的情况下,如果你要求一个大模型按照给出的情节写一篇小说,它的输出几乎具有一种稳定的风格,而这种风格也无非就是相关训练数据被投入神经网络后最自然的结果。
不幸的是,AI的风格往往会使文章读起来没有那么令人愉悦,尤其是对于一些需要文学性的文章来说。那么,我们有没有什么办法让AI产出的文字没有那么重的AI感呢?
如果我们在提示词中加入一些文风的要求,效果往往会有一些改观,但是依然会遇到很多不尽人意的地方。就好像我们对文风的描述和训练数据堆出来的模型没有完全对齐。
要是我们能让文风向任意方向迁移呢?
存不存在更好的方法,来更好地在llm的文字创作任务中进行文风要求的对齐呢?
这正是**任意文风迁移(Arbitrary Text Style Transfer)**所描述的。它指的是,给定一段原始文本,通过LLM将其改写/重写为任意目标文风下的目标文本,同时保留文本的内容和流畅度。
前期准备
先学习下前人的成果
文风迁移(Text Style Transfer,TST)在学术界已经有很多相关研究。对于TST任务的定义本身就隐含了一个前提,也就是对于一段文本,其风格与内容是相对独立的两个层面,我们可以改动文风而保证独立的内容部分不受影响。这个前提是我们之后遇到的很多难题的原因。我找到了几篇相关的文献并在deepseek-v4.1-flash的帮助下阅读了它们。英文还是太困难了,要求它将论文翻译后输出为html格式:
Steering Large Language Models with Register Analysis for Arbitrary Style Transfer:通过基于语域分析(register analysis)的提示方法来描述示例的风格,以引导 LLM 产出高质量的改写,
Catch Me If You Can? Not Yet: LLMs Still Struggle to Imitate the Implicit Writing Styles of Everyday Authors:LLM 仍难以模仿日常作者的隐性写作风格,
A Recipe for Arbitrary Text Style Transfer with Large Language Models:增强零样本学习:一种让大语言模型执行任意风格文本迁移、且不需要目标风格任何示例的提示方法,
Low-Resource Authorship Style Transfer: Can Non-Famous Authors Be Imitated?,
TinyStyler: Efficient Few-Shot Text Style Transfer with Authorship Embeddings
阅读文献得到的信息有:
1.文风迁移任务的主要路线可以分为:1)通过模型的后训练,针对特定任务进行加强;2)通过提示词的设计,在不进行训练的前提下进行改写任务
2.现有LLM在基于示例的文风迁移任务上的表现不甚理想,这种方法下LLM难以把握“作者的隐性写作风格”
3.”文风与内容深度纠缠,常常无法独立分离”,TST任务需要与这个现实难题共存
4.TST任务的另一个困难在于不同文风的平行文本(原文内容相近或对应的文本)的稀缺
5.已有多种评估文风相似度的方法和向LLM传达文风要求的方法,它们都被运用且效果参差不齐
如何评估迁移的结果
已有的对文风迁移任务结果的评估,就文风这一项上,主要有6种思路:1)计量风格距离(Stylometric Distance),本质上是对文本的诸多特征的差异进行计量比较;2)监督分类,训练一个分类器来对文本按作者/文风分类;3)用现成的嵌入模型得到的向量计算两个文本的余弦;4)解耦表示:把文本解耦为风格向量和内容向量(听起来不太现实,且涉及VAE、对抗学习,不太懂);5)语域(register,寄存器),分析文本中许多语言特征共同变化的模式,并把它们归纳成“功能维度”(Biber register analyzer);6)让人/LLM去评估两个文本的文风相似度。
由于绝大部分方法都是针对英文语料训练的,我们没有办法开箱即用。
因此,我们遇到了一个重要的子问题:如何评估文风迁移任务的结果?如何手搓一套文风评估标准?
语料
巧妇难为无米之炊,为此我们首先建立了一个语料库,来自十几位著名作家与来自不同网络平台的文本,并将原文本清洗掉目录、注释等无意义内容之后按自然段裁切,保证每段长度在300-2000字之间,其中包含了:
语料库信息
全部数字为实测统计(生成于当前语料快照)✓ 全文不使用表格 ✗,改用清单与叙述。
一、总体规模
语料共 52 个来源、17,800 个单元、合计 31,933,272 字。
按性质分为三块:
- 公共语料(公版):27 个来源 / 898 个单元 / 约 120 万字 —— 可公开、可用于论文;
- /books 单作者全集:11 位作者 / 10,779 个单元 / 约 2000 万字 —— 版权期内,仅内部研究 ✗;
- /books 合集拆分:14 位译本作者 / 6,123 个单元 / 约 1144 万字 —— 同上,仅内部 ✗。
二、公共语料(27 来源 / 898 单元)
文学原创(含民国白话簇):鲁迅、老舍、郁达夫、萧红、许地山、庐隐、瞿秋白、徐志摩、朱自清、沈从文等。其中老舍、郁达夫、果戈理(鲁迅译)三人构成最难区分的"弱区分簇"(语域相同、个体不同)。
公版译本(按"译者文风"采集):林纾(译欧美小说)、周作人(译日本文学)、傅雷(译巴尔扎克)、紫式部(丰子恺译)、果戈理(鲁迅译)、洛克(叶启芳译)等。
需要如实说明一个结构性约束 ✗✓:中文公版资源里,外国文学实际收录的都是早期公版译本,因此这些标签反映的是译者的翻译风格(用词习惯、句式节奏、虚词分布),而非原作者文风 —— 标签体系据此诚实标注为"某译者译笔" ✓。
网络平台文体:知乎体、贴吧体、小红书体、豆瓣体、新闻通稿体、学术摘要体。这六类来自真实平台抓取,其中学术摘要与新闻通稿质量最高(LLM 审核合格率 ≥95%),小红书与贴吧偏碎片但具真实文体价值。
三、/books 单作者全集(11 位 / 10,779 单元 / 2000 万字)
按体量排序:残雪 537 万 · 毕飞宇 329 万 · 卡夫卡 270 万 · 沈从文 257 万 · 史铁生 206 万 · 村上春树(林少华译)183 万 · 余华 140 万 · 普鲁斯特 30 万 · 马尔克斯 23 万 · 加缪 14 万 · 海明威 9.5 万字。
用途有三:判别器训练(v3 的 11 类作者嵌入即由此而来)、词向量校准(近义词组的 PPMI-SVD)、以及风格方向的净值审计(判断某文风能否构成独立方向)。
四、/books 合集拆分(14 位 / 6,123 单元 / 1144 万字)
从一套 51 册合集(1126 个文件 / 1022 个 spine 条目)中按"章节开头 120 字内的作者名"自动切换归属拆分而成 ✗✓:
巴尔扎克 131 万 · 冈察洛夫 110 万 · 泰戈尔 110 万 · 哈代 90 万 · 纪德 84 万 · 歌德 76 万 · 莫泊桑 68 万 · 契诃夫 42 万 · 屠格涅夫 30 万 · 萧伯纳 27 万 · 梅里美 21 万 · 莱蒙托夫 12 万 · 普希金 3.6 万字(含陀思妥耶夫斯基等)。
这批数据的实测结论 ✗✓:扩到 25 位作者后噪声大于信号(E2 反降),有监督嵌入的收益在 11 类处饱和 —— 因此线上仍用 11 类,合集数据仅作扩展实验与对照。
五、单元(unit)的定义
- 文学与译本:以段落为最小单位聚合,每单元 300–2000 字;尾段过短则并入前一单元;绝不跨段切割 ✓。
- 平台文体:一帖一单元(60–500 字)✓ —— 不再把多条帖子拼成长文(早期拼接导致段落间话题跳变、文本不通顺 ✗,已重做)。
- 超长文本硬约束:单篇源文 ≤500 字才进实验 ✗✓ —— 超过 4000 字会触发 LLM 压缩陷阱(
styll/rg压缩到 0.43–0.72,语义暴跌)。
六、质量门(两级 + 一项治理)
规则级(check_corpus_quality.py):目录式"篇名(作者)"≥4 次、括注密度 ≥3/100 字、书名号堆叠、无句末标点等模式;判据同时作用于全文与前 300 字(页面只展示前 300 字,防开头低质被忽略 ✓)。
模型级(audit_platform_llm.py):逐篇询问 LLM"是否通顺""是否有实际内容",6 并发 + 逐篇缓存。结果:学术摘要与新闻通稿合格率 ≥95%,小红书"有意义"49%、贴吧 41% —— 处置方式是不在语料层删除,只在出题层过滤 ✓✓(片段化是部分文体的真实写法,删掉反而失真)。
规模治理(trim_new_sources.py):单一来源超过 100 篇则截断到 50 篇 ✓(否则随机抽样会被大来源垄断 —— 历史上正是因此出现过"果戈理占 37%"的问题 ✗)。
七、版权边界(必须区分)
- 公共语料:公版作品,可公开、可在论文中引用与分发 ✓;
- /books 全部内容:版权期内作品(含译本),仅限内部研究,输出不外传 ✗ —— 由它训练出的判别器/嵌入模型同样不得随论文分发;论文中只能报告方法,不展示原文样本。
八、语料在各环节的使用
- 249 维特征与族权 W 的校准:用全部 17,800 单元 ✓;
- v3 判别器训练:用 /books 的 11 位作者,每作者 ≤300 单元,共 2,539 单元;
- sim_new 的 30×12 矩阵:由公共语料的 30 个内容 × 12 种文风经 signature 策略渲染(LLM 改写)构造 ✓;
- 人评题包:从 898 个公共语料单元中完全随机抽取配对(150 题),隐藏来源标签 ✓。
文风是什么?
从定义到量化模型
在TST任务上,文风是独立于内容的文本特征。我们尝试进一步定义文风:文风,是某个或某一类作者因个人习惯、时代性、文化差异,在用词、句式、标点、文章结构等层面上造成的文本阅读体验的差异。关键在于差异,我们对于文风的定义,是基于不同文本之间的差异的。
除了定义,我们真正需要的是一套文风相似度的算法。
有请deepseek-v4.1-flash介绍我们尝试过的几种算法:算法介绍、数学推导及迭代过程
简单来说,最初我们尝试了Burrows’s delta,一种经典的计量风格学算法,但是建立的算法只包含了50个语言特征维度(虚词、标点、句长),**效果并不理想:**对文风和题材(内容层)的解耦程度不够高,导致鲁迅的文本和知乎的文本、豆瓣的文本的相似度,几乎和鲁迅自身文本的相似度一样,这显然是反直觉的;**对此的改进:**1.将维度扩充至249维,包含虚词、句式、连词等;2.引入扰动探针,通过对内容层的扰动(同作者的不同主题文本)和对功能层的扰动(保留内容,修改风格,即获得平行文本,由于语料库局限主要通过llm改写),分别测量出不同特征对两种扰动的敏感度并依此对特征加权。由此得到,该算法与真人测评的spearman相关性为四种算法中最高,。以上两种方法本质上都是将不同文本按照特征投射到空间中,标准化后计算它们的距离。得益于本人贫瘠的数学知识,这里根本没有任何数学推导,但是链接里有。
有天下午,我突然想到,如果我们同意风格和内容可以在一定程度上解耦,我们能不能这样去理解风格:对于有待表述的一个内容,我们可以选择许多具体的表述方式,因此,风格就是建立在同一内容原点之上所可能延伸出的不同表达向度。deepseek对此的理解:文风不该是绝对位置,而应是相对于内容的位移方向。(等等,那长度意味着什么?风格强度???)这一思路同样要求内容和风格解耦,只是实现方式不同。对此,我们根据语料库中的12种语料作者/来源和30种内容,通过signature TST方法(后文会有,如果没有,下一篇会有)补全了一个30*12的文本矩阵,之后将每一内容的12种不同风格的文本相加计算风格质心,则风格位移为文本的位置到质心的位移,将该位移降维到五维的空间(去噪,类似Biber)后计算其余弦值,作为文风相似度的量化。该方法的实现过程听上去有点不靠谱,主要是文风原点的算法有待改进。
第四种方法是用11位风格迥异的作者的语料训练一个判别器,将其与的249维特征拼接后即可得到新的风格坐标。
以上四种方法都可以算出任意两篇文本的文风相似度。
有效性检验
为了收集文本相似度的真人评估数据,我们将语料中的段落两两随机配对,并在300字处截断,由真人评估两篇文本的相似度。给出两段文本,询问参与者“认为以下文本是否属于同一文风”,共有五个选项,其具体测试在tests.singularars.site。我们认为,一旦参与者感到两篇文本有相似之处,对于两段文本不是一种文风的判断就会动摇,因此换算:从“不是”到“是”,相似度分别为0,0.25,0.5,0.75,1。将其与归一化/z标准化后的四种相似度量化值比较,即可得到二者的契合度。
截至9.27 21:00,我们收到50个参与者的430对评估数据(太少),数据如下:
| 方法(代数) | 核心机制 | 人评 |ρ| | E2 判别差 | 弱簇净值(郁达夫 / 果戈理) | 其他实测 |
|---|---|---|---|---|---|
| 旧Δ(一代) | 50 维手工特征 + 曼哈顿距离 | 0.202 | — | — / — | 测语域,个体不可分 ✗ |
| Δ_R(二代) | 249 维 + SVD60 + 探针加权 L2(低秩 Mahalanobis) | 0.227(单口径最高) | +0.548 | 0.036 ✗ / 0.044 ✗ | 不可判率 33% |
| sim_new(三代) | 矩阵质心 δ + P_sty(r=5) 投影后余弦 | 0.115(纯)/ 0.188(接 v3 后) | +0.562 | 0.045 ✗ | 策略混淆 0.94× ✗;去混淆后 0.20 ✓ |
| v3(四代·现行) | 判别器 11 维嵌入 + 与 249 维按 3:1 拼接 | 0.188 | +0.573 | 0.054 ✓ / 0.060 ✓ | E2 ±0.024;人评 ±0.047 |
| 组合口径(服务) | 0.1·v3 + 0.4·Δ_R + 0.5·旧Δ | 0.261 | — | — | 分半双向验证 ✓(+0.014 / +0.041) |
| 人-人一致性上界 | 同题、两半标注人均值之秩相关 | 0.363 | — | — | 任何完美指标的天花板 |
相关说明
数值定义
- 人评 |ρ|:自动指标与人工评分(五档「不是 → 是」)之间的 Spearman 秩相关绝对值;距离型指标(旧Δ / Δ_R)原始符号为负 ✓,本表已取绝对值。
- E2 判别差:在按内容切分的留出集上,「同文风跨内容对的余弦均值」减「异文风对的余弦均值」,越高越好;r=5 指 P_sty 取前 5 主轴。
- 弱簇净值:
自一致度 − 跨相似度;≥ 0.05 才视为该文风构成独立方向。郁达夫与果戈理(鲁迅译)即历史最难区分的「同语域、不同个体」二人。 - 「—」:表示该指标不适用于该方法(如旧Δ未参与矩阵判别实验)。
三点读法
- 三条演进曲线同向上升:E2 单调上升(— → +0.548 → +0.562 → +0.573);弱簇净值从全 ✗ 到 0.054 / 0.060 ✓(历史上首次双双越过 0.05 阈值);服务口径 |ρ| 达 0.261。
- 最后一行是标尺:人-人一致性上界 0.363 说明 0.2 上下的数字并非算法失败 ✗,而是主观判断任务的天花板 ✓ —— 各自动指标已贴近甚至超过人-人水平。
- 两处诚实标注:弱簇 0.054 的 bootstrap 区间下界恰在 0.05 阈值附近,属「贴线通过」而非稳健突破 ✗✓;组合口径增益经分半协议双向验证后仍为正(+0.014 / +0.041 ✓),但量级小。
一种初步的尝试
我们仍然需要更多的数据,一方面是需要更多元、更完善的语料,另一方面是更多的真人评估数据。
同时我也感受到,实验设计与针对得到的实验数据进行数据处理是一门很深的学问,不同的处理手段可能导致迥异的结论,选择恰当的数据处理方法非常关键。
而且这个问题涉及到的领域好多啊。
To be continue…





