agentleFS
wang-xiaochuanwang-xiaochuan/706-skills/author-style-mimicry/SKILL.md

author-style-mimicry

Skill0 starsChanged 29 days agoMITView on GitHub

以特定外国作家(中文译本)的文学声口改写 706 公共发布内容(公众号文章、Notion 长文、小红书)。 把"作家×译者"作为复合风格单元——同一作家不同译者声口差异极大(如村上春树的林少华 vs 赖明珠),译者选择是一等公民。

Files
SKILL.md

Author Style Mimicry · 作家×译者 声口改写工作台

你在做什么

帮 Xiaochuan 把一篇要发布的 706 内容(活动复盘、文章引言、书评、共居招募的某段独白),改写成他指定的某外国作家(特定中文译本)的文学声口。

输出三种可能场景:

  1. 完整改写:草稿 → 改写稿
  2. 段落改写:草稿中的某几段 → 改写稿(其余保持原样)
  3. 从零生成(仅当用户明确要求):用户提供事实骨架 → 生成有声口的初稿

发布前必做:原创性自检 + 透明度脚注建议。


工作模式判定

收到用户消息时,先判定属于以下哪一种:

模式触发信号进入阶段
Profile-Build「建档案」「我想加 XX」「档案里还没有 XX」Phase A
Style-Transfer给了草稿 + 指定作家×译者Phase B → C → D
From-Scratch没草稿但要求"仿 XX 写一篇关于 Y 的"先确认 + 让用户至少提供事实骨架,再进 Phase B
Profile-Edit「给 XX 档案加一段示例」「调整 XX 的档案」Phase A 的子流程

不确定时,先问一句确认,不要猜。


Phase A · 风格档案构建(Profile-Build)

适用:第一次用某个作家×译者组合,vault 中没有对应档案。

A.1 确认作家 × 译者

向用户确认:

我们要为哪个作家×译者组合建档案?同一作家不同译者声口差异很大,请明确:
- 作家中文名 + 原文名(如 卡尔维诺 / Italo Calvino)
- 译者(如 吕同六、张密、王焕宝……)
- 代表译作(用来定位这一组合)

强制规则:不接受单独"作家名"——必须有译者。如果用户说"就用最常见的译本",要先帮他指认是哪一位译者,再继续。

A.2 收集 3–5 段代表性原文

向用户索取 3–5 段从该译者译本中复制出来的代表性段落。不要自己去网上搜——避免取错版本,也避免引入 AI 训练数据里的错版翻译。

要求段落覆盖:

  • 至少 1 段叙事 / 描写
  • 至少 1 段抽象思考 / 议论
  • 至少 1 段对话 / 短句节奏感强的

如果用户只给得出 1–2 段,告诉他档案质量会受限;不要硬上。

A.3 抽取风格档案

按 references/profile-schema.md 的结构做风格抽取。抽取过程要做的:

  1. 表层(Surface):句长分布、句式偏好、词汇语域、标点偏好、修辞偏好
  2. 节奏(Rhythm):段落长度、段内"加速—减速"曲线、句间过渡
  3. 元层(Meta,最重要):作者写什么 / 不写什么 / 注意力偏向 / 主体—世界关系
  4. 译者层(Translator-specific):词汇偏好、句式习惯、与原作者语域偏移、迁移到该译者时的 ❌/✅
  5. 示例库:把用户提供的全部段落原文嵌入档案的 ## 示例段落 部分,每段加 1–2 句结构化的"这段体现了 X / Y / Z"评注。Phase B 会从这里抽取 few-shot。

抽取时严守:"不要发明用户样本里没有的特征"——如果只有 3 段样本,写"样本规模偏小,置信度有限"。宁可保守,不要幻觉。

A.4 写入 vault

用 mcp__obsidian-706-skills__write_note 写到 706-skills vault:

style-profiles/[作家中文名]-[译者中文名].md

文件名规则:用中文名,连字符分隔。示例:

  • style-profiles/卡尔维诺-吕同六.md
  • style-profiles/村上春树-林少华.md
  • style-profiles/村上春树-赖明珠.md(同作家可有多个档案)
  • style-profiles/博尔赫斯-王永年.md

A.5 更新档案索引

在 vault 顶层维护 style-profiles/_index.md,列出已建档案。每次新建一个档案,都更新这个索引(用 mcp__obsidian-706-skills__patch_note 追加一行)。

A.6 用户审阅 + 立刻试一次

把档案的 §三 元层 + §四 译者层呈给用户审阅(这两块最容易抽错)。用户确认后告诉他:

档案建完了。下次只要说"用 [作家]-[译者] 的风格改写...",我就会自动加载这个档案。
现在要不要直接试一下?给我一段你想改的内容。

不要让用户带着空档案离开——让他立刻验证一次 transfer 可用。


Phase B · 风格迁移(Style-Transfer)

B.0 加载档案

用 mcp__obsidian-706-skills__read_note 读取 style-profiles/[作家]-[译者].md。

如果用户没指定译者,先问——不要默认。

如果档案不存在,转 Phase A,先建档案。

B.1 输入分析(段落级切分 + 事实提取)

把用户的草稿做段落级切分。对每一段,判断:

  • 这一段是 叙事 / 描写 / 议论 / 对话 / 通知信息 / CTA 中的哪一类?
  • 这一段的事实点有哪些?(列出来作为 Phase C.1 的事实保留检查清单)
  • 这一段的核心意图(用户想让读者感受什么)?

信息类段落(活动时间地点、报名链接、价格、二维码)不做风格迁移——直接保留原样。这是硬规则。Borges 写不出"5 月 10 日 19 点 706 会客厅",强行改写只会损坏功能性信息。

B.2 主题适配判断

如果用户的草稿主题与该作家的题材偏好差异巨大(例如:用博尔赫斯风格写 706 共居招租通知),先在改写前告知用户并给一个判断:

博尔赫斯几乎不写当代生活和社群组织。直接套他的声口写共居招募会有违和感。
我有三个选项:
A. 仅迁移句式与节奏层(保留博尔赫斯的句法骨架,但不强求他的题材偏向)
B. 把它作为博尔赫斯式的思想片段来写(一段以共居为出发点的短哲思),但你的实用信息要单独一段,不进风格迁移
C. 换一个题材更适配的作家×译者组合(如本雅明、汪曾祺)
你想走哪一条?

不要默默地"硬适配"——会出怪文。这是设计原则之一:不蛮干。

B.3 改写

按 references/transfer-prompt.md 的模板,对每个待迁移段落构造 prompt 并改写。

关键设计点:

  • 事实清单是结构化注入的——不是让模型从原段自己提取
  • 示例段落只放 3 条最相关的(按段落类型筛选),避免 prompt 膨胀
  • 显式禁止抄连续 5 字以上短语,配合 Phase D 的 n-gram 兜底

B.4 拼装

逐段改写完成后拼装成完整草稿,保留段落顺序和未迁移段落原样。


Phase C · 双重批判循环(Critique Loop)

按 references/critique-prompt.md 跑两个独立 loop。

C.1 事实保真检查(必做,最多 1 轮重写)

LLM 输出 JSON:{"missing": [...], "added": [...], "twisted": [...]}

任一字段非空 → 自动重写一次。第二次仍不通过 → 升级到用户人工判断,不要无限循环。

C.2 声口保真检查(最多 2 轮重写)

LLM 评估五项 + 0–10 打分:

  1. 句长 / 句式 / 标点是否匹配?
  2. 词汇语域是否匹配该译者?
  3. 节奏是否匹配?
  4. 是否落入了该作家不会涉足的题材或修辞?
  5. 是否有"AI 腔"残留?

收敛规则:

  • 打分 ≥ 8 → 通过
  • 6 ≤ 打分 < 8 → 定向重写一次再批
  • 打分 < 6 → 第二次重写。仍 < 8 → 升级用户

硬上限 2 轮——避免自批自改的螺旋。

C.3 用户在环

呈给用户的格式:

【段 N · 改写】
原稿:
{original}

改写:
{transferred}

声口贴近度:8/10
事实保真:✅
评注摘要:{1-2 句}

让用户回复 "通过" / "再改改,要更 X" / "这段不要改了用原稿" 之一。逐段确认。


Phase D · 原创性自检 + 透明度脚注

这是发布前的硬关卡,不能跳。

D.1 N-gram 比对(脚本化)

调用 scripts/originality_check.py:

python3 scripts/originality_check.py \
  --draft <draft.md> \
  --profile <706-skills/style-profiles/[作家]-[译者].md> \
  --mode public

阈值(public 模式):连续 7 个汉字 OR 5 个 jieba token 完全一致即标记。

输出 JSON:{"flagged": [{"phrase": "...", "matched_in_sample": "...", "sample_id": ...}, ...]}

D.2 LLM 改写命中片段

对每个 flagged 短语,做局部改写:

"{flagged_phrase}" 与目标作家的示例段落连续重合 ≥ 7 字。
请在不丢失语义和声口的前提下,改写这一短语,使之不再连续重合。
仅输出改写后的短语。

替换回正文,再跑一次 D.1 验证。

D.3 透明度脚注建议

输出最终稿时,在末尾加一段建议(不强加):

【建议在文末注明】
本文写作风格参考了 {作家}({译者} 译)。改写过程使用了 AI 协助。

让用户决定要不要加。706 公开发布默认建议加上,但这不是 AI 强制的。


关键原则(执行时严守)

译者是一等公民

档案文件名永远是"作家-译者"。不存在只写作家不写译者的档案。如果用户说"就用村上春树",必须先问"林少华还是赖明珠"。

主题适配不能蛮干

作家有他的题材边界。让博尔赫斯写共居招租,让卡佛写学术沙龙开场白,违和感是必然的。Phase B.2 的判断要诚实地告诉用户。

信息段不迁移

活动时间地点、价格、报名链接、二维码——这些永远保持原样。声口迁移只作用于叙事、描写、议论、过渡这几类段落。

不要"创造"语录

Phase C.1 的 added 字段是硬关卡。模型在迁移声口时很容易脑补出"作家会说的金句"——必须拦住。

Originality check 不能跳

公开发布前必须跑 D.1。这是版权风险防线,没有讨价还价空间。

Critique 不超过 2 轮

自批自改的螺旋不会让结果更好。卡 2 轮就升级用户。


参考文件

  • references/profile-schema.md — 风格档案的 markdown 模板(详细字段定义)
  • references/transfer-prompt.md — Phase B.3 的 prompt 模板全文
  • references/critique-prompt.md — Phase C 的两个批判 prompt 模板
  • references/anti-patterns.md — 常见失败案例与对应修法(持续累积)
  • scripts/originality_check.py — Phase D.1 的 n-gram 比对脚本

与其他 skill 的协作

  • + 706-notion-writer:先用 706-notion-writer 出 706 调性的初稿 → 再用本 skill 转译成某外国作家声口(典型组合)
  • + wechat-publish:本 skill 输出最终稿 → 交给 wechat-publish 做公众号排版
  • + xhs-copywriter:xhs-copywriter 处理小红书的固定 706 调性;本 skill 处理"想用文学声口的"特殊场景,两者互斥

Download now (ZIP)

Does it work?

Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.

No reviews yet

People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.

  • It worked
  • Partly
  • It didn't
What did you use it for? e.g. Reviewing pull requests in a Rails app

Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.

Your trail

Files you open will collect here, so you can find them again.

Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.

Now do this for your own.

Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.