不是替你写,是学你怎么写。
你可能遇到过这些问题:
- 网上刷到一篇感触很深的文章,第一反应是“我也想写这样文章” → 奈何文笔不够
- 想着让 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等斜杠写法仍兼容(为老用户平滑迁移),但不再是首选。
- Python 3.10+(安装脚本和
profile_stats.py等脚本需要) - Claude Code(任意版本)
- 三平台都支持:Windows / macOS / Linux
# 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 会主动询问是否生成对比清单,下次自动应用偏好。
不想用 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 即视为安装成功。
| 关键词 | 你什么时候用 | 关键产出 |
|---|---|---|
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 维命中度、自动验证是否真用上你的档案)。
核心承诺:同一个毛病不犯第二次。
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 自动加载 │
│ 这些偏好作为"作者硬约束" 🚨 │
└─────────────────────────────┘
~/.claude/styles/difference/result-0819_差异对比.md 从一次对话体草稿(2200 字)提炼出 8 条作者偏好:
| # | 偏好 | 升级为 |
|---|---|---|
| 1 | 口语化优先 | 🟢 软约束 |
| 2 | 陈述代替反问 | 🟡 强约束 |
| 3 | 诚实优先于确定 | 🟡 强约束 |
| 4 | 不要卖惨 | 🚨 硬约束 |
| 5 | 因果要完整 | 🟡 强约束 |
| 6 | 措辞要统一 | 🟢 软约束 |
| 7 | 短句再短一点 | 🟡 强约束 |
| 8 | 副词一层意思 | 🟢 软约束 |
下次你 write 时,🚨 硬约束会被自动注入 prompt,永远不再写"卖惨"句式。
Style Distiller 把"风格"当作一个可观察、可存储、可检索、可验证、可纠错的"学习系统"问题,而不是 prompt 模板问题。
你说"文笔细腻"——这是模糊的。AI 不知道该做什么。
Style Distiller 把它翻译成 AI 可直接执行的具体动作:
| 你的描述 | 翻译后的可执行动作 |
|---|---|
| 文笔细腻 | 80% 句子在 25 字以内;偏好用名词作结 |
| 开头抓人 | 67% 用对话开场,33% 用场景锚定 |
| 有深度 | 每 300 字必有 1 处认知反差(先陈述常识再反转) |
| 不要套路 | 检测到"作为一个..."、"在这个...的时代"等开头直接重写 |
| 收尾克制 | 禁用"总之"、"愿你"、"共勉";偏好开放问题或留白 |
💡 为什么必须这样? 形容词没法被验证,没法被检索,没法被纠错。动作可以。
┌─────────────────────────────────────────────────────┐
│ Style Distiller 工作循环 │
├─────────────────────────────────────────────────────┤
│ │
│ 📥 摄入层 � 处理层 📤 输出层 │
│ ───────── ───────── ───────── │
│ feed → 动作级提取 → write │
│ reject → 8 份 profile → review │
│ feedback → + 检索增强 → feed │
│ │
│ ↑ │ │
│ │ ▼ │
│ 反馈权重 ←─────────────── 强制验证 │
│ │
└─────────────────────────────────────────────────────┘
| 机制 | 解决什么 |
|---|---|
| 上下文工程 | 把"细腻"翻译成 25 字以内的硬规则 |
| 检索增强 | 50 个样本里挑 3-5 个最相关的,不是全加载 |
| 规则蒸馏 | 模糊偏好 → 🚨🟡🟢 三层硬约束 prompt |
| 反馈循环 | 你的每次打分都让档案更准 |
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 在中文短文上有强默认偏置(鸡汤收尾、平台模板、空洞金句、网络梗)——护城河就是为了不让这些偏置偷渡进你的"风格输出"。
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 字 | 深度论证 + 故事钩子 |
总样本数 = 投喂样本 + 自写样本(results/ 按主题去重)
⭐ v2 新规则:自写样本也算入阶段判定。同一题目(
result-{MMDD}_{标题})的初版+终版只算一篇,优先算终版——避免重复计数。
| 状态 | 总样本数 | 含义 |
|---|---|---|
| 🔴 冷启动 | 0-2 | 主要靠通用基线 |
| 🟠 萌芽 | 3-9 | 风格可见但不稳定 |
| 🟡 学习 | 10-29 | 可用风格档案 |
| 🟢 成熟 | ≥30 | 强风格还原度 |
你的当前状态:
python scripts/profile_stats.py输出会同时显示 state_basis=weights_json(旧字段)和 state_inferred(新逻辑推断),让你看到差异。
┌─────────────────────────────────────────┬──────────────────────────────────────────┐
│ ~/.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/)。
| 脚本 | 作用 |
|---|---|
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,便于分享或备份 |
| 类别 | 模板 | 首次 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逐步填充。
⭐ v2 新增。这是"为什么这样设计"而非"怎么用"——面向维护者、面试讲清楚、复盘演进。
| 文档 | 解决什么问题 |
|---|---|
action-level-extraction.md |
为什么必须把"形容词"翻译成"动作" |
quality-guardrails.md |
5 道护栏背后的 LLM 偏置恐惧 |
retrieval-strategy.md |
50 个样本里怎么挑 3-5 个最相关的 |
verification-rubric.md |
为什么必须事后核对而不能信模型"声称遵循" |
feedback-loop.md |
4 类反馈 + 状态机的演进逻辑 |
A:之前的逻辑只数投喂样本。v0.3 把自写样本(你 ~/.claude/styles/results/ 里的文章)也算进去——加起来 12 篇应该是 🟡 学习。如果你的还是 �,说明 ~/.claude/styles/results/ 还没文章。跑 python scripts/profile_stats.py 看细分数字。
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 自动应用。
A:style-distiller 现在是菜单引导器——无参数时列出 5 个子 skill 让你挑;带子 skill 名时(如 style-distiller feed xxx)自动转交对应 skill。直接用 feed xxx 等关键词是精确路由——已经知道要做什么时更快。两者不冲突。
A:兼容(保留是为老用户平滑迁移),但不再是首选。新约定是用自然语言关键词触发——主对话 Claude 看到 feed / feedback / reject / review / write 就自动 Read <name>-SKILL.md 执行。
A:拷贝 ~/.claude/styles/ 整个目录即可。工具层(~/.claude/skills/style-distiller/)重新 git clone。
A:删 ~/.claude/styles/ 整个目录。下次触发任意 skill 会自动重建(scripts/init_styles.py 会重新创建空骨架)。
A:不会。~/.claude/styles/ 完全在用户主目录下,git 永远不会碰它。仓库里也不再有任何用户数据目录(write-results/ 等已彻底删除),详见下方「用户数据所有权与隐私」。
⭐ v0.3 新增章节——首次明确「你的数据归你」的边界。
核心承诺:你写的每一篇文章、每一个风格偏好、每一次反馈评分,都只属于你,永远不会出现在任何 git commit、GitHub 仓库或网络请求里。
| 层 | 路径 | 谁拥有 | git 是否跟踪 |
|---|---|---|---|
| 数据层(你的隐私) | ~/.claude/styles/(用户主目录) |
你 | ❌ 永不被 git 跟踪 |
| 工具层(代码) | ~/.claude/skills/style-distiller/(仓库) |
MIT 协议公开 | ✅ 可公开推 GitHub |
仓库从未包含、也永远不会包含你的写作样本和风格档案——这两个目录从一开始就被设计在仓库之外。
~/.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 被怎样指令,确保没有偷偷把你的数据发给任何地方。
架构哲学转变(本次合并提交包含的所有改动):
- 🆕 仓库结构扁平化:取消 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.mdStep 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。
重大改动:
- 🆕 仓库根新增聚合入口
SKILL.md(/style-distiller路由 6 个 skill) - 🆕 自主进化闭环:
~/.claude/styles/results/→~/.claude/styles/results/→~/.claude/styles/difference/→ 下次自动应用偏好 - 🆕 深度对话挖掘:
/style-writePhase 1 Q1-Q8 逐层提问确认写作意图 - 🆕 阶段判定重构:投喂样本 + 自写样本合计(按主题去重、终版优先)
- � references 方法论文档体系(5 份面向维护者/面试/复盘)
- 🔧
profile_stats.py重构:支持自写样本去重统计 - � 护城河从 5 道扩到 6 道(加 #0 自主进化)
- 5 个核心 skill(feed / feedback / reject / review / write)
- style-lib 共享 prompt 库(11 个 prompt)
- 5 道质量护城河(检索 / 翻译 / 组装 / 验证 / 修复)
- 7 个风格维度
- references 方法论文档(初版)
MIT — 见 LICENSE 文件。