Skip to content

Repository files navigation

Style Distiller

不是替你写,是学你怎么写。

License: MIT Version Platform


🎯 这是什么

你可能遇到过这些问题:

  • 网上刷到一篇感触很深的文章,第一反应是“我也想写这样文章” → 奈何文笔不够
  • 想着让 AI 写吧 → 写出来一股 AI 味
  • 让 AI "仿照我的风格去写" → 结果它根本不懂你

Style Distiller 不替你写,它学你怎么写。

它维护一份"你的文字人格档案",每次你:

你想干什么 用哪个(自然语言关键词,无需斜杠)
"我喜欢这篇" / 喂入喜欢的文章 feed <文章>
给写出来的草稿打分 feedback <草稿>
喂入你讨厌的文章 reject <文章> <理由>
看看自己风格档案什么样 review
用你的风格写一篇 write <主题> <平台>
不确定该用哪个?说一句话即可 style-distiller ⭐ 兼容入口

⭐ v0.3 起新约定:自然语言触发为主——主对话 Claude 看到 feed / feedback / reject / review / write 等关键词会自动 Read <name>-SKILL.md 加载执行。/style-distiller 等斜杠写法仍兼容(为老用户平滑迁移),但不再是首选。


📦 安装(30 秒)

前提条件

  • Python 3.10+(安装脚本和 profile_stats.py 等脚本需要)
  • Claude Code(任意版本)
  • 三平台都支持:Windows / macOS / Linux

方式 A:一键安装(推荐)

# Linux / macOS / WSL
git clone https://github.com/MiaIria/style-distiller.git \
  ~/.claude/skills/style-distiller \
&& bash ~/.claude/skills/style-distiller/install.sh
# Windows PowerShell
$dir = "$env:USERPROFILE\.claude\skills"
New-Item -ItemType Directory -Force -Path $dir
git clone https://github.com/MiaIria/style-distiller.git "$dir\style-distiller"
& "$dir\style-distiller\install.ps1"

脚本会自动建好 ~/.claude/styles/ 骨架(首次安装是创建、再次运行因幂等性会跳过已存在文件):

~/.claude/styles/                   ← 用户档案数据(隐私本地化,首次安装即建好)
├── weights.json                    ← 档案权重与状态
├── history.md                      ← 初始化日志
├── profile/                        ← 8 份风格画像(hook/rhythm/voice/verve/closing/vocabulary/format/persona)
├── samples/positive/                ← 投喂样本(feed)
├── samples/negative/                ← 反样本(reject)
├── backups/                         ← 自动备份
├── results/                         ← AI 写作产物(平铺,无初版/终版子目录)
└── difference/                      ← 初版 vs 终版差异对比清单

⭐ v0.3 数据层规范:results/ 和 difference/ 是平铺目录,不放子目录。

  • AI 草稿:~/.claude/styles/results/result-{MMDD}_{slug}-初版.md
  • 用户改后定稿:~/.claude/styles/results/result-{MMDD}_{slug}-终版.md
  • 手写满意文章(跳过初版):~/.claude/styles/results/result-{MMDD}_{slug}.md(无后缀)
  • 差异对比清单:~/.claude/styles/difference/result-{MMDD}_{slug}-对比.md

📌 自动检测:当 results/ 中出现与初版同 MMDD 的「终版」文件时,write 会主动询问是否生成对比清单,下次自动应用偏好。

方式 B:手动下载(zip)

不想用 git 的话:下载 main 分支 zip → 解压到 ~/.claude/skills/style-distiller/(目录名必须是 style-distiller,否则子 skill 内部硬编码路径会读不到共享 prompt)→ 在解压目录跑 bash install.sh(Windows PowerShell 下跑 .\install.ps1)。

验证安装

cd ~/.claude/skills/style-distiller
python scripts/profile_stats.py

预期输出(如果你已有真实档案数据,数字会不同):

profile_dir=~/.claude/styles
state=cold_start
state_basis=inferred
state_inferred=cold_start
positive_samples=0
self_written_samples=0
total_samples=0

看到 profile_dir 指向 ~/.claude/styles 即视为安装成功。


📚 5 个核心子 skill(自然语言触发)

关键词 你什么时候用 关键产出
style-distiller �(兼容入口) 不确定用哪个?说一句话 列 5 项菜单 + 自动识别分发
feed xxx 刷到喜欢的好文章 样本 ID + 8 份 profile 差分更新
feedback <草稿> 给草稿打分 / 纠错档案 history.md 记录 + 权重校准
reject <文章> <理由> 看到油腻/套路化写法想避雷 反样本 + 禁忌区
review 好奇自己的风格长什么样 完整档案审视报告(含导出/回滚)
write <主题> <平台> "用我的风格写一篇" ~/.claude/styles/results/result-{MMDD}_{slug}-初版.md(含风格匹配度报告)

协同流程:怎么把风格练出来

1. feed            喂 3-5 篇你喜欢的好文章  或在 ~/.claude/styles/results/ 中添加你写过的满意文章       ← 必选,先建库
2. feedback        对 AI 草稿打分(加速收敛)     ← 可选
3. reject          标几个反例(如"小红书体")    ← 可选
4. review          看看档案成熟度                ← 建议样本 ≥10
5. write           用你的风格写一篇              ← 终极目标

⭐ v0.3 更新:write 现在包含 深度对话挖掘(最多问你 8 个问题确认写作意图)+ 风格匹配度报告(生成后告诉你 7 维命中度、自动验证是否真用上你的档案)。


🔁 自主进化闭环(v2 全新)

核心承诺:同一个毛病不犯第二次。

Style Distiller 不只"读你喜欢的",还"看你改的":

┌─────────────────┐         ┌─────────────────┐         ┌─────────────────┐
│  AI 写第一稿     │  ──────>│  你定稿(终版)   │  ──────>│  逐字对比差异    │
│ ~/.claude/styles/ │  你改   │ ~/.claude/styles/ │  对比   │ ~/.claude/styles/│
│ results/         │         │ results/         │         │ difference/     │
│ result-{MMDD}_   │         │ result-{MMDD}_   │         │ result-{MMDD}_  │
│ {slug}-初版.md   │         │ {slug}-终版.md   │         │ {slug}-对比.md  │
└─────────────────┘         └─────────────────┘         └─────────────────┘
                                                                 │
                                                                 ▼
                                              ┌─────────────────────────────┐
                                              │ 下次 write 自动加载          │
                                              │ 这些偏好作为"作者硬约束" 🚨   │
                                              └─────────────────────────────┘

真实例子(来自 v2 实战)

~/.claude/styles/difference/result-0819_差异对比.md 从一次对话体草稿(2200 字)提炼出 8 条作者偏好:

# 偏好 升级为
1 口语化优先 🟢 软约束
2 陈述代替反问 🟡 强约束
3 诚实优先于确定 🟡 强约束
4 不要卖惨 🚨 硬约束
5 因果要完整 🟡 强约束
6 措辞要统一 🟢 软约束
7 短句再短一点 🟡 强约束
8 副词一层意思 🟢 软约束

下次你 write 时,🚨 硬约束会被自动注入 prompt,永远不再写"卖惨"句式。


🧠 工作原理

一句话

Style Distiller 把"风格"当作一个可观察、可存储、可检索、可验证、可纠错的"学习系统"问题,而不是 prompt 模板问题。

核心创新:动作级提取(Action-level Extraction)

你说"文笔细腻"——这是模糊的。AI 不知道该做什么。

Style Distiller 把它翻译成 AI 可直接执行的具体动作:

你的描述 翻译后的可执行动作
文笔细腻 80% 句子在 25 字以内;偏好用名词作结
开头抓人 67% 用对话开场,33% 用场景锚定
有深度 每 300 字必有 1 处认知反差(先陈述常识再反转)
不要套路 检测到"作为一个..."、"在这个...的时代"等开头直接重写
收尾克制 禁用"总之"、"愿你"、"共勉";偏好开放问题或留白

💡 为什么必须这样? 形容词没法被验证,没法被检索,没法被纠错。动作可以。

4 大机制

┌─────────────────────────────────────────────────────┐
│              Style Distiller 工作循环                 │
├─────────────────────────────────────────────────────┤
│                                                     │
│  📥 摄入层        � 处理层        📤 输出层        │
│  ─────────       ─────────       ─────────         │
│  feed          →  动作级提取   →  write            │
│  reject        →  8 份 profile →  review           │
│  feedback      →  + 检索增强   →  feed             │
│                                                     │
│            ↑                          │              │
│            │                          ▼              │
│        反馈权重 ←─────────────── 强制验证            │
│                                                     │
└─────────────────────────────────────────────────────┘
机制 解决什么
上下文工程 把"细腻"翻译成 25 字以内的硬规则
检索增强 50 个样本里挑 3-5 个最相关的,不是全加载
规则蒸馏 模糊偏好 → 🚨🟡🟢 三层硬约束 prompt
反馈循环 你的每次打分都让档案更准

🛡️ 6 道质量保证护城河

Style Distiller 不只是 prompt——6 道护城河确保风格真的被用上而不是"穿外壳":

# 护城河 解决什么 v2 状态
0 ⭐ 自主进化 AI 不再"学了忘"——遍历终版 + 作者偏好,下次自动应用 v2 新增
1 检索要准 50 个样本里挑 3-5 个最相关的(按主题相似度 + 维度匹配 + 时效加权) 保留
2 档案翻译要硬 软描述 → 🚨🟡🟢 三层硬约束,不靠 LLM "理解" 保留
3 Prompt 组装要全 嵌入完整原文 + 特征签名 + 作者偏好,不只是摘要 保留
4 生成后必验证 7 维核对 + 反样本扫描 + 样本特征还原核对 保留
5 偏离自动修复 偏离 10-25% 自动改,>50% 自动重写(最多 2 次) 保留

⚠️ 6 道不是装饰。LLM 在中文短文上有强默认偏置(鸡汤收尾、平台模板、空洞金句、网络梗)——护城河就是为了不让这些偏置偷渡进你的"风格输出"。


🎯 7 个风格维度 + 写作场景

Style Distiller 把"风格"拆成 7 个可独立观察的维度:

维度 它管什么 典型偏好
hook 钩子 开场 3 秒抓人 对话开场 / 场景锚定 / 反常识断言
rhythm 节奏 句长与断点 80% 在 25 字内 / 名词作结 / 段落 3-5 行
voice 口气 整体调性 冷静克制 / 温和共情 / 锋利观点
verve 金句 让人想截图的话 认知反差 / 自嘲 / 类比
closing 收尾 怎么结尾 开放问题 / 留白 / 行动召唤
vocabulary 词汇 口头禅与禁用词 高频词库 + 禁用词清单
format 格式 排版习惯 段落长度 / emoji 密度 / 引用块

典型写作场景

平台 字数范围 调性建议
小红书 300-800 字 故事感 + 个人体验 + emoji 适度
朋友圈 ≤200 字 真实感 + 短句 + 留白
微博 ≤140 字 金句密度高 + 强观点
即刻 100-300 字 思考感 + 反共识 + 简洁
公众号 1500-3000 字 深度论证 + 故事钩子

📊 状态等级与数据目录

状态判定(v2 重大更新)

总样本数 = 投喂样本 + 自写样本(results/ 按主题去重)

⭐ v2 新规则:自写样本也算入阶段判定。同一题目(result-{MMDD}_{标题})的初版+终版只算一篇,优先算终版——避免重复计数。

状态 总样本数 含义
🔴 冷启动 0-2 主要靠通用基线
🟠 萌芽 3-9 风格可见但不稳定
🟡 学习 10-29 可用风格档案
🟢 成熟 ≥30 强风格还原度

你的当前状态:

python scripts/profile_stats.py

输出会同时显示 state_basis=weights_json(旧字段)和 state_inferred(新逻辑推断),让你看到差异。

数据目录结构(v0.3 重画)

┌─────────────────────────────────────────┬──────────────────────────────────────────┐
│       ~/.claude/styles/                 │       ~/.claude/skills/style-distiller/  │
│       (档案数据,隐私本地)             │       (工具方法论,GitHub 同步)         │
├─────────────────────────────────────────┼──────────────────────────────────────────┤
│                                         │                                          │
│ ├── weights.json                       │ ├── SKILL.md           ⭐ 聚合入口(兼容) │
│ ├── history.md                         │ ├── feed-SKILL.md      ⭐ 自然语言触发   │
│ ├── profile/                           │ ├── feedback-SKILL.md                    │
│ │   ├── persona.md                     │ ├── reject-SKILL.md                      │
│ │   ├── hook.md                        │ ├── review-SKILL.md                      │
│ │   ├── rhythm.md                      │ ├── write-SKILL.md                       │
│ │   ├── voice.md                       │ ├── lib-SKILL.md       ← 共享库入口      │
│ │   ├── verve.md                       │ ├── lib-prompts/      ← 12 个共享 prompt │
│ │   ├── closing.md                     │ │   ├── feed.md / write.md / ...         │
│ │   ├── vocabulary.md                  │ ├── templates/        ← 8 份空白模板 ⭐新 │
│ │   └── format.md                      │ │   ├── hook.md / voice.md / ...         │
│ ├── samples/                           │ │   └── weights.json                     │
│ │   ├── positive/                      │ ├── references/       ← 5 份方法论      │
│ │   └── negative/                      │ └── scripts/           ← 5 个工具脚本 ⭐新│
│ ├── backups/                           │     ├── init_styles.py   ← 首次安装脚本  │
│ ├── results/    ⭐平铺目录(无子目录)  │     ├── profile_stats.py                  │
│ │   result-{MMDD}_{slug}-初版.md        │     ├── retrieve_samples.py               │
│ │   result-{MMDD}_{slug}-终版.md        │     ├── verify_draft.py                   │
│ │   result-{MMDD}_{slug}.md(手写)     │     └── export_profile.py                 │
│ └── difference/ ⭐平铺目录             │                                          │
│     result-{MMDD}_{slug}-对比.md        │                                          │
└─────────────────────────────────────────┴──────────────────────────────────────────┘

⚠️ 数据/逻辑分离的好处:你的写作样本永远不会上传到 GitHub。本地隐私、跨设备可迁移(手动拷贝 ~/.claude/styles/)。


🔧 工具层与 references 方法论

scripts/ 5 个工具脚本

脚本 作用
init_styles.py ⭐ v0.3 新增 首次安装时初始化 ~/.claude/styles/ 目录结构 + 复制 8 份空白模板 + 写入 weights/history。用 Path(__file__) 自定位,不依赖 ${CLAUDE_SKILL_DIR} 变量解析
profile_stats.py ⭐ 统计档案状态。v0.3 重构:自写样本数据源改为 ~/.claude/styles/results/(平铺,不再有 初版/终版 子目录)
retrieve_samples.py 按主题 + 维度多路召回 Top N 样本(topic×0.5 + dim×0.3 + time×0.2 加权)
verify_draft.py 对草稿做确定性自检——统计字数 + 扫禁用词命中
export_profile.py 合并 8 份 profile + weights + history 为单文件 Markdown,便于分享或备份

templates/ 8 份空白模板(v0.3 新增)

类别 模板 首次 init 时复制到
8 份 profile 模板 hook.md / rhythm.md / voice.md / verve.md / closing.md / vocabulary.md / format.md / persona.md ~/.claude/styles/profile/
权重配置 weights.json ~/.claude/styles/weights.json

这些是空白骨架,不带任何个人风格数据。用户的真实偏好通过 feed / feedback / reject 逐步填充。

references/ 5 份方法论文档

⭐ v2 新增。这是"为什么这样设计"而非"怎么用"——面向维护者、面试讲清楚、复盘演进。

文档 解决什么问题
action-level-extraction.md 为什么必须把"形容词"翻译成"动作"
quality-guardrails.md 5 道护栏背后的 LLM 偏置恐惧
retrieval-strategy.md 50 个样本里怎么挑 3-5 个最相关的
verification-rubric.md 为什么必须事后核对而不能信模型"声称遵循"
feedback-loop.md 4 类反馈 + 状态机的演进逻辑

❓ FAQ

Q:我已经 feed 投了 7 篇,为什么 state 还是 🔴?

A:之前的逻辑只数投喂样本。v0.3 把自写样本(你 ~/.claude/styles/results/ 里的文章)也算进去——加起来 12 篇应该是 🟡 学习。如果你的还是 �,说明 ~/.claude/styles/results/ 还没文章。跑 python scripts/profile_stats.py 看细分数字。

Q:~/.claude/styles/difference/ 是什么?怎么生成?

A:v0.3 新增。你先 write 在 ~/.claude/styles/results/result-{MMDD}_{slug}-初版.md 拿到 AI 草稿 → 自己改完后另存为 result-{MMDD}_{slug}-终版.md → 用 feedback 触发逐字对比 → 生成的偏好清单在 ~/.claude/styles/difference/result-{MMDD}_{slug}-对比.md。下次 write 自动应用。

Q:聚合入口 style-distiller 跟直接 feed 啥区别?

A:style-distiller 现在是菜单引导器——无参数时列出 5 个子 skill 让你挑;带子 skill 名时(如 style-distiller feed xxx)自动转交对应 skill。直接用 feed xxx 等关键词是精确路由——已经知道要做什么时更快。两者不冲突。

Q:兼容老的 /style-xxx 斜杠写法吗?

A:兼容(保留是为老用户平滑迁移),但不再是首选。新约定是用自然语言关键词触发——主对话 Claude 看到 feed / feedback / reject / review / write 就自动 Read <name>-SKILL.md 执行。

Q:我换台电脑怎么迁移?

A:拷贝 ~/.claude/styles/ 整个目录即可。工具层(~/.claude/skills/style-distiller/)重新 git clone。

Q:怎么删除档案重新开始?

A:删 ~/.claude/styles/ 整个目录。下次触发任意 skill 会自动重建(scripts/init_styles.py 会重新创建空骨架)。

Q:会泄露我的文章到 GitHub 吗?

A:不会。~/.claude/styles/ 完全在用户主目录下,git 永远不会碰它。仓库里也不再有任何用户数据目录(write-results/ 等已彻底删除),详见下方「用户数据所有权与隐私」。


🔒 用户数据所有权与隐私

⭐ v0.3 新增章节——首次明确「你的数据归你」的边界。

核心承诺:你写的每一篇文章、每一个风格偏好、每一次反馈评分,都只属于你,永远不会出现在任何 git commit、GitHub 仓库或网络请求里。

数据/工具严格分离

层 路径 谁拥有 git 是否跟踪
数据层(你的隐私) ~/.claude/styles/(用户主目录) 你 ❌ 永不被 git 跟踪
工具层(代码) ~/.claude/skills/style-distiller/(仓库) MIT 协议公开 ✅ 可公开推 GitHub

仓库从未包含、也永远不会包含你的写作样本和风格档案——这两个目录从一开始就被设计在仓库之外。

v0.3 数据层完整结构(首次 init 时自动创建)

~/.claude/styles/                       ← 完全私有,git 不碰
├── weights.json                        ← 状态机配置
├── history.md                          ← 进化日志
├── profile/    (8 份风格画像)          ← hook / rhythm / voice / verve /
│                                          closing / vocabulary / format / persona
├── samples/positive/                   ← 你 feed 进来的好文章
├── samples/negative/                   ← 你 reject 的反例
├── backups/                            ← 自动备份
├── results/                            ← AI 写作产物(平铺,无子目录)
│   result-{MMDD}_{slug}-初版.md        ← AI 草稿
│   result-{MMDD}_{slug}-终版.md        ← 你改后的定稿
│   result-{MMDD}_{slug}.md             ← 手写满意文章
└── difference/                         ← 初版 vs 终版差异对比清单
    result-{MMDD}_{slug}-对比.md

你可以随时做的隐私操作

操作 命令
备份全部档案 cp -r ~/.claude/styles/ /path/to/backup/
迁移到新电脑 拷贝 ~/.claude/styles/,重新 git clone 工具层
删除全部重新开始 rm -rf ~/.claude/styles/,下次触发自动重建
导出单文件快照 python scripts/export_profile.py --output style-export.md

�️ 工具层(~/.claude/skills/style-distiller/)是公开的、可审计的——你可以随时 cat SKILL.md / cat lib-prompts/write.md 看到 AI 被怎样指令,确保没有偷偷把你的数据发给任何地方。


📜 版本

v0.3.0(2026-08-23)— 扁平化 + 数据层独立 + 新手友好 ⭐

架构哲学转变(本次合并提交包含的所有改动):

  • 🆕 仓库结构扁平化:取消 5 个子 skill 的 style-feed/ / style-lib/ 等文件夹,子 skill 入口改为裸 feed-SKILL.md / feedback-SKILL.md / reject-SKILL.md / review-SKILL.md / write-SKILL.md 平铺在仓库根
  • 🆕 自然语言触发为主:用户说 feed xxx / write 加班 小红书 等自然语言关键词,主对话 Claude 自动 Read <name>-SKILL.md 执行——不再依赖斜杠命令记忆
  • 🆕 数据层彻底独立:write-results/ / write-difference/ 从仓库内彻底删除,搬到 ~/.claude/styles/results/ 和 ~/.claude/styles/difference/(平铺,无初版/终版子目录)
  • 🆕 首次安装友好:templates/ 目录提供 8 份空白 profile + weights.json 模板,scripts/init_styles.py 用 Path(__file__) 自定位,不再依赖 ${CLAUDE_SKILL_DIR} 变量解析——修复了「首次 write 卡住」的历史 bug
  • 🆕 隐私章节:README 新增「用户数据所有权与隐私」,明确数据/工具分离
  • 🔧 lib-prompts/init.md Step 2:改为调用 init_styles.py,不再让 AI 解析模板路径
  • 🔧 scripts/profile_stats.py:自写样本数据源从 ~/.claude/skills/style-distiller/write-results/ 改为 ~/.claude/styles/results/,逻辑简化(无子目录循环)
  • 🗑️ 删除:write-results/、write-difference/ 目录及 .gitkeep
  • 🗑️ .gitignore 简化:删除针对已删除目录的规则

改动统计:27 个文件,~310 +/-/~220。

v0.2.0(2026-08-20)— 自主进化 ⭐

重大改动:

  • 🆕 仓库根新增聚合入口 SKILL.md(/style-distiller 路由 6 个 skill)
  • 🆕 自主进化闭环:~/.claude/styles/results/ → ~/.claude/styles/results/ → ~/.claude/styles/difference/ → 下次自动应用偏好
  • 🆕 深度对话挖掘:/style-write Phase 1 Q1-Q8 逐层提问确认写作意图
  • 🆕 阶段判定重构:投喂样本 + 自写样本合计(按主题去重、终版优先)
  • � references 方法论文档体系(5 份面向维护者/面试/复盘)
  • 🔧 profile_stats.py 重构:支持自写样本去重统计
  • � 护城河从 5 道扩到 6 道(加 #0 自主进化)

v0.1.0(2026-06-12)— MVP

  • 5 个核心 skill(feed / feedback / reject / review / write)
  • style-lib 共享 prompt 库(11 个 prompt)
  • 5 道质量护城河(检索 / 翻译 / 组装 / 验证 / 修复)
  • 7 个风格维度
  • references 方法论文档(初版)

📄 License

MIT — 见 LICENSE 文件。

About

用 5 个 Claude Code Skill 训练一个「像你写作」的 AI — 个人写作风格蒸馏器

Topics

Resources

Stars

5 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages