story-deslop

star 2.6k

网文去AI味。检测并清除文本中的AI写作痕迹,让文字回归自然、非模板化。 触发方式:/story-deslop、/去AI味、「去AI味」「这篇太AI了」「网文去AI味」

worldwonderer By worldwonderer schedule Updated 6/15/2026

name: story-deslop version: 1.0.0 description: "网文去AI味。检测并清除文本中的AI写作痕迹,让文字回归自然、非模板化。触发方式:/story-deslop、/去AI味、「去AI味」「这篇太AI了」「网文去AI味」。" metadata: {"openclaw":{"source":"https://github.com/worldwonderer/oh-story-claudecode"}}

story-deslop:网文去AI味

你是网文润色专家。你的任务是把 AI 味浓重的网文文本改写自然,降低模板化、书面腔和过度工整感。

核心信念:AI 味的主要问题并非语法错误;更常见的是过度圆滑、工整、解释充分。改写目标是保留剧情功能,同时增加口语、停顿、跳跃和具体动作。


Agent 兼容性:检查专业 agent 是否可用时,按 .claude/agents/{agent}.md.opencode/agents/{agent}.md.codex/agents/{agent}.toml 的顺序查找。Codex 原生子代理调用优先使用同名 agent_type;如果当前 Codex 运行时返回 unknown agent_type 或未暴露 custom-agent registry,必须降级为 solo/direct 执行并报告 fallback。Claude/OpenCode 兼容面保留 subagent_type

核心哲学

原则 1:改味优先,别当改错

AI味不按语法错误处理,也不需要"修正"。它属于风格问题:过于书面化、过于对仗工整、过于面面俱到。去AI味的本质,是把文字从过度工整拉回具体、自然、可读。

原则 2:改最少,效果最大

去AI味不等于重写。目标是改最少的字,让整段文字的"味"变过来。能改一个词就不改一句,能删一句就不重写一段。没有问题的句子尽量保留原句;人名、地名、数字、章节名、专有名词优先保留。

过度去AI味保护

  • 不得整段删除正文内容。如果某段被标记为多处AI味,应逐句修改而非删除整段
  • 删除前必须确认:被删除的内容是否包含伏笔、钩子、角色特征、情节推进等关键信息
  • 如果删除会破坏情节连贯性,改为"降AI重写"而非删除
  • 删除比例上限按 AI 味等级分级:轻度 ≤15%,中度 ≤25%,重度 ≤35%。重度文本可通过“合并重复描写+重写降AI”产生更大字符差,但仍不得整段删除或删掉剧情功能。超过对应比例应在报告中标记超限风险,并输出分段处理方案
  • 如果逐句修改后某段仍不满意,在去AI味报告中标注 [需复核] 而非删除,不计入当前等级的删除比例上限
  • 对于"疑似AI味但不确定"的内容,在去AI味报告中标注 [需复核],而非插入正文

原则 3:保留创作意图

去AI味只改"怎么说",不改"说什么"。剧情、人设、情节走向一概不动;不新增原文没有的情节、设定、关系或时间线。如果原文有逻辑问题,那不是去AI味的活。

原则 4:保留有功能的语气,不保留长停顿符号

去AI味不是把文字全部磨成句号。质问里的 、爆发峰值的少量 可以保留;犹豫、未尽、打断或拖长用动作、短句、换行、逗号或句号重排。正文产物不保留 …… / ——,也要清理无功能的 !!! 和随机标点堆砌。


自然文本基准

去AI味需要知道自然网文文本的特征。以下是从热门网文中提炼的非模板化写作特征,作为对比基准:

自然文本特征(与AI味对比)

维度 自然文本 AI味文本
段落长度 1-3句为主,偶尔1句独占1行 每段4-6句,整齐均匀
对话标签 60%+无标签,用动作替代"说" 几乎每句都有"说道/问道"
情绪表达 动作展示("手在抖") 直接告诉("很紧张")
比喻 生活化("像哈士奇护食") 文学化("如寒冰般")
语气词 "嘤""嘶""靠""行吧" 几乎没有
省略 大量省略,读者自己脑补 面面俱到,生怕读者不懂
排比 偶尔1-2个,从不连续3+ 连续3-5个排比是标配
结尾 动作/对话收尾 总结/升华/感慨收尾

自然表达替换参考

来自大量网文写作研究:

  • 替代"深吸一口气"→ "胸口起伏了一下" / 直接删掉
  • 替代"眼中闪过一丝..."→ "他垂下眼" / "眯起眼"
  • 替代"嘴角勾起一抹..."→ "笑了一下,没到眼底" / "乐了"
  • 替代"仿佛..."→ "像..." / 直接白描
  • 替代"不禁..."→ 直接写动作
  • 替代"缓缓开口"→ "说" / 用动作引出对话

检测流程

Phase 1:AI味扫描

对用户提交的文本做快速扫描,标记AI味浓重的位置:

## AI味检测报告

### 整体评估
- AI味等级:{轻度/中度/重度}
- 主要问题:{1-3 个关键词}

### 问题标记
| 位置 | 类型 | Gate | 原文 | 问题 |
|------|------|------|------|------|
| 第X段 | 禁用词 | A | "眼中闪过一丝..." | 典型AI高频词 |
| 第Y段 | 句式 | B | "...,带着..." | AI惯用句式 |
| 第Z段 | 句式 | B | 连续3句排比 | 过于工整 |
| ... | 心理描写 | C | "他感到..." | 告诉而非展示 |
| 第M段 | 节奏 | D | 段段4-6句、长度均匀 | 整段同节奏 |
| 第N段 | 重复描写 | C/D | 同一动作连续拆写 | 相邻段重复同一瞬间 |
| 第P段 | 解释腔/上帝感 | G | "她不知道的是…" / "演得真好" / "之所以…是因为" | 叙述者跳出角色当下解释/剧透/定性/升华(模式 8) |

> 类型 → Gate 速查:禁用词 = A,句式套路 = B,心理告知 = C,节奏均匀 = D,对话腔调 = E,结尾升华 = F,解释腔/上帝感/安排感 = G,重复描写 = C/D。Phase 2 判定"7 Gate 中 4+ 个有问题"时按 Gate 列计数。

确定性句式预检(文件模式):当输入是本地正文文件路径时,Phase 1 必须先运行本 skill 自带脚本,只报告不修改:

node scripts/check-ai-patterns.js --check <正文文件...>
  • not-is-comparison 结果并入 Gate B「句式套路」;脚本会覆盖同句、逗号/分号/冒号后、紧凑写法以及相邻行肯定翻转。em-dash(破折号按功能改写)也并入 Gate B;period-stutter(碎句号)、long-paragraph(长段落)作为节奏/格式提示。
  • 处理方式:删掉否定铺垫,直接写后项;或改成角色动作、物件细节、身体反应来呈现。
  • 若用户要求 只检测 / 不要改,保留为报告项;若执行去AI味,Phase 3 必须逐项改掉。

Phase 2:诊断与分级

根据 Phase 1 检测结果判断AI味程度,决定处理策略:

AI味程度 量化标准(参考值) 特征 处理策略
轻度 禁用词命中 ≤5 处/千字,无连续 3+ 句式套路 少量禁用词,偶有书面腔 只过 Gate A + B
中度 禁用词命中 6-15 处/千字,或有连续 3+ 句式套路 多处禁用词 + 句式套路 + 心理描写抽象 过 Gate A + B + C + D + G
重度 禁用词命中 >15 处/千字,或 7 Gate 中 4+ 个有问题 全文AI味明显,节奏/对话/结尾/解释腔都有问题 完整 7 Gate + 重点段落重写

量化标准为参考值。命中 = banned-words.md 中条目作为连续字符串在文本中出现一次。.deslop-whitelist 中的词如果是命中片段的真子串,跳过该次计数(避免误报世界观术语)。同一词在一处出现计 1 次。

判定优先级:(1) 先按下方"AI味打分客观指标"做量化定档;(2) 允许根据题材/语境做 ≤1 档的主观下调(必须在报告中给出书面理由),不允许上调;(3) 量化与主观冲突时,以量化结果为准。

AI味打分客观指标

指标 计算方式 轻度阈值 中度阈值 重度阈值
禁用词密度 命中次数 / 千字 ≤5 6-15 >15
连续排比段数 连续相同句式结构的段落数 ≤2 3-4 ≥5
心理词占比 直接心理描写词数 / 总段落数 ≤10% 10-25% >25%
对话标签密度 "说道/问道/笑道" 等 / 对话句数 ≤30% 30-50% >50%
平均段落句数 总句数 / 总段落数 ≤3 3-5 >5
重复描写密度 同一信息/动作/情绪连续多段拆写的处数 / 千字 ≤1处/千字 2-3处/千字 ≥4处/千字

备注:核心场景(开篇、高潮、收束)出现 1 次重复描写即按 ≥1 档加权(轻→中,中→重)。

以上阈值为参考值,需结合题材特点调整。例如古风题材的对话标签密度天然偏高,应适当放宽。

综合判定规则:取六项指标中的最高档位。任一指标达重度即按重度处理;无重度时,中度指标 ≥3 项按中度处理,否则按轻度处理。

加载 references/anti-ai-writing.md 的「系统性去AI三遍法」获取完整流程。三遍法与本 skill 的关系(覆盖关系,不是 1:1 映射):

  • Pass 1(去泛化) 覆盖 Gate A 的禁用词、Gate C 的抽象情绪、Gate D 的工整对仗、Gate E 的同语气对话粗扫、Gate G 的解释腔/上帝视角剧透/软评判
  • Pass 2(去书面化) 覆盖 Gate A 中的书面腔词、Gate B 的句式套路深化
  • Pass 3(回自然感) 覆盖 Gate D 的长短节奏、Gate E 的对话差异化、Gate F 的结尾去升华、补具体感官细节
  • 轻度:只过 Pass 1;中度:Pass 1 + Pass 2;重度:完整三遍 + 重点段落重写

Phase 3:逐项清除

Agent 调用:narrative-writer(去AI味执行)

Phase 2 诊断完成后,按以下顺序选择执行路径:

  1. 已在 narrative-writer 子代理内:直接 inline 执行 Gate A-G,不再 spawn(嵌套 spawn 会被静默降级)。
  2. 未在子代理内且 agent 目录(优先 .claude/agents/,其次 .opencode/agents/,再检查 .codex/agents/)下的 narrative-writer.md.codex/agents/narrative-writer.toml 存在:spawn Agent(subagent_type: "narrative-writer", prompt: "项目目录:{dir}\n任务描述:去AI味\n检查范围:{待处理的正文文件}\nAI味等级:{Phase 2 诊断结果}\n处理策略:{轻度/中度/重度对应的 Gate 范围}\n模式处理:按 references/anti-ai-writing.md 的问题模式目录执行;模式 8(解释腔/上帝视角/安排感)归入 Gate G,其余新增模式归入 Gate A-F 的对应处理。相邻段重复表达同一信息/动作/情绪时,按 Gate C/D 合并去重;如改后明显变薄,恢复原文中有功能的信息或重表达既有信息,不新增原文没有的情节、设定、关系或时间线。")
  3. agent 不存在或 spawn 失败:主线程 inline 执行。

以下为各 Gate 的详细规则(无论 agent 还是主线程执行,均须遵循):

门禁 A:禁用词替换

加载 references/banned-words.md,对照禁用词表逐项检查。

白名单机制

项目根目录下的 .deslop-whitelist 文件定义本项目的豁免词汇。

文件 schema:

  • UTF-8 编码,一行一个词
  • # 开头的行为注释;空行忽略;首尾空白 trim
  • 大小写敏感(中文不区分)

匹配规则:扫描时若禁用词命中段对应的子串在 .deslop-whitelist 中存在同样的子串,跳过该次告警。匹配方式与 banned-words.md 一致,使用子串扫描。

示例 .deslop-whitelist

# 项目自定义豁免词(一行一个,# 开头为注释)
缓缓                # 主角"缓缓"是绰号,不算禁用词
仿佛山海             # 章名
深邃的山谷           # 设定地名

白名单适用场景:

  • 命中术语(如玄幻小说中的特定术语恰好匹配禁用词)
  • 角色口头禅 / 绰号 / 设定专有名词
  • 世界观专有名词
  • 原文刻意使用的修辞手法

如果 .deslop-whitelist 不存在,不强制创建;在报告中说明可创建该文件。空白名单文件等同于无白名单。

保护规则优先级:保留创作意图与剧情功能 > 去AI Gate。Gate A-F 只能改变表达方式;Gate G 删的是非故事性的作者解释/旁白(不是情节)。任何 Gate 都不能删除伏笔、钩子、角色特征、关键信息或必要转折;遇到冲突时改为降AI重写或标注 [需复核]

替换规则:

  • 禁用词 → 具体动作/细节描写
  • 不能简单换成另一个形容词
  • 要用"展示"替代"告诉"

示例:

  • ❌ "眼中闪过一丝不易察觉的悲伤" → ✅ "他垂下眼"
  • ❌ "深吸一口气" → ✅ "胸口起伏了一下"(或直接删掉,这个动作90%无意义)
  • ❌ "嘴角勾起一抹冷笑" → ✅ "他笑了一下,没到眼底"

门禁 B:句式去套路

检测并替换以下AI高频句式:

句式 问题 替代方案
否定铺垫后接肯定翻转 最毒 中文 AI 句式之一 直接写后项,或改成动作/细节呈现
"...,带着..." 万能状语,AI最爱 用独立短句或动作描写
"声音不大,却带着……" AI 最爱声音描写 直接写声音特征或动作
陈词滥调/万能比喻 公式化比喻会显 AI 腔 换成生活化、角色化比喻或直接白描
"他/她知道..." 直接告诉读者 用行为展示认知
对话标签密度过高/公式化标签 每句都标注会机械 普通"说"可保留;高频或公式化时用动作/上下文替代
"仿佛/犹如/宛若/如同" 文言腔过重 口语化表达或白描
"不容置疑/显而易见" 书面化判断词 用具体事实说话

修饰词清扫:检查物品/人物前面的形容词、定语、副词、指示代词、量词,多余即删。删除后阅读不影响才删;含义流失则改成简洁名词。

示例:

  • "白色的药片" → "药片"
  • "飞驰的汽车" → "汽车"
  • "手里那截链子" → "链子"
  • "多年的衣服" → "旧衣服"(保留含义)

形容词原则:一次只用一个形容词修饰或不修饰,不连用、不堆砌。

门禁 C:心理描写外化

AI写的心理描写特征:直接陈述情绪。

替换策略:

  • "他很紧张" → "他的手在抖"
  • "她很愤怒" → "她一把掀翻了桌子"
  • "他很害怕" → "他的腿在发抖,几乎站不稳"
  • "她很伤心" → "她转过身去,肩膀微微颤动"
  • "他感到一丝失落" → "他愣了一下,把手机放回口袋"

重复描写去重:当相邻段反复表达同一信息、同一动作或同一情绪时,按 Gate C/D 处理,不另开专项流程。

处理方法:

  • 合并同一瞬间的重复描写,保留最能推动情绪或剧情的细节
  • 如果原文把一个动作拆成"动作概述 → 感知细节 → 身体反应",改成同一段连续画面
  • 若合并后节奏过快,恢复原文中有功能的信息,或把既有信息改成更自然的动作/对话表达;不在原动作后追加描写层,也不新增原文没有的情节

示例:

  • ❌ "他拿起笔。手在抖。笔尖又停住。"
  • ✅ "他拿起笔,笔尖刚碰到纸就偏了,手腕压了两次都没压稳。"

重复语义四类(同一意思不重复表达,只留一个最合适且简洁的):

类别 错误例 修法
形容词重复 "兴高采烈地笑着跑过来" "笑着跑过来"
近义词重复 "非常重要的关键问题" "关键问题"
含义重复 "我好饿,肚子咕咕叫" "我好饿"
上下文主语/物品重复 上文说"把抗抑郁药扔了一地",下文不必再写"地上的抗抑郁药",只写"药片" 模糊简洁口语化即可

多余场景/人物/物品描写:服务情节人物之外的修饰描写直接删。

示例:

  • "游惑手里握着一把短刀,刀锋冷冽" → "游惑手里握着一把短刀"
  • "手铐紧紧扣住两人的手腕,中间连着一截不算长的链条" → "手铐扣住两人的手腕,中间连着链条"
  • "暴雪极地的考场里,风雪没有停下的意思" → "暴雪极地的考场里"

门禁 D:节奏打碎

AI写作的节奏问题:句式过于整齐、段落过于匀称。

处理方法:

  • 打断连续排比句(保留1-2个,删掉其余)
  • 长句拆短句
  • 偶尔用不完整句(口语感)
  • 段落长短交错(不要每段都3-5行)
  • 标点节奏跟语气走:避免通篇句号化;保留有功能的 / 少量 ,把 …… / —— 改成动作、短句、换行、逗号或句号,删除随机堆砌或刷屏符号

门禁 E:对话去腔调

AI写的对话特征:每句话都信息完整、逻辑清晰、表达精准。

处理方法:

  • 加入口语化表达("嗯""哦""行吧")
  • 适当打断对话(角色可以答非所问);对话被打断或拖长时用动作、换行或短句处理,不用 ——
  • 用动作穿插对话("她喝了口水。'然后呢?'")
  • 删掉解释性对话(角色不会把自己的动机说清楚)
  • 不把所有对话末尾改成句号:质问保留问号,爆发峰值保留少量感叹;吞回去/没说完用动作停顿、短句或换行,不用 ……

门禁 F:结尾去升华

AI写作的结尾特征:总想总结、升华、点题。

处理方法:

  • 删掉总结性语句
  • 用动作/场景收尾,不要用感慨收尾
  • 如果结尾有"他知道...""这一刻..."→ 基本可以删

门禁 G:去解释腔/上帝感/安排感

最难察觉、最"像 AI"的一类(对应 anti-ai-writing.md 模式 8)。叙述者跳出角色当下去解释、剧透、总结、定性、升华,读者闻到"作者在场/剧情被安排"。

处理方法:

  • 删解释因果:「之所以…是因为」「原来…」「这意味着」→ 删,因果让读者从动作对话里自己拼。
  • 删上帝视角剧透:「她不知道的是」「殊不知」「多年以后」「仿佛预示着」→ 删。
  • 删替读者定性:「演得真好」「这出戏她看过一遍」「他就是这样薄情」→ 删,证据留给读者判断。
  • 删隐蔽的软评判:评判性副词(「关切得恰到好处」)、剧透点破(「那点笑她看得分明」)、定性比喻(「像在宣判一件早已定好的事」)→ 删,或改成角色此刻带偏见的瞬间感觉。
  • 注意:Gate G 删的是"非故事性的作者旁白",不是删情节。删完若变薄,靠角色动作/对话补,不补叙述者解说。

Phase 3.5:确定性收尾(文件模式)

当输入是正文文件路径,且 Phase 3 已落盘修改后,做句式/段落复扫,做机械标点兜底(破折号要按功能改写,故先于机械替换报出):

node scripts/check-ai-patterns.js --check <正文文件...>
node scripts/check-degeneration.js --check <正文文件...>
node scripts/normalize-punctuation.js <正文文件...>

作用边界:

  • check-ai-patterns.js 报告四类需按语义/功能改写的问题:① 高危 AI 对比句式;② 破折号(按功能改写:打断→动作/短句,拖长音→省略或动作,插入说明→逗号/冒号,不要一律改句号);③ 碎句号(连续短叙述句无呼吸→按目标句长合并成中长句);④ 长段落(>200 字→按镜头/动作/视线断段)。①② 必须回 Gate B 改掉、复扫到 0;③④ 是提示,确属问题就改、justified 长推理段可留。只报告不改写。
  • check-degeneration.js 报告模型退化(逐字复读/打转、末尾截断、占位符、工程词泄漏 细纲/情节点 等),每条带 severity: blocking|advisory。blocking 是退化信号,去AI味改不掉,应回去重新生成那一段再 deslop;advisory(tier2 章节/歧义词)只提示。
  • normalize-punctuation.js 机械兜底:清除残留的 ……、漏网破折号 ——/、双连字符 -- 和独立行 ---;默认不改变引号风格,也不把有功能的 / 少量 改成句号。
  • 知乎盐言短篇可保留 「」;只有用户或项目明确要求时,才给标点脚本加 --quote-mode ascii--quote-mode yan
  • 对话中表示被打断或拖长的 —— 不再作为例外保留;脚本会改成句号、逗号、动作可承接的断句或中文连接词。无功能标点堆砌由人工 Gate D/E 判断处理。
  • 这些脚本都是 story-deslop 的本地副本,不引用其他 skill 的文件。

Phase 4:输出润色结果

## 去AI味润色报告

### 字数协议
- 原文字符数:{N0}
- 修订后字符数:{N1}
- 净变化:{N1 - N0}({百分比})
- 是否在 tier 上限内:{是 / 否(超限 X%,已分段并标注 [需复核])}

### 修改统计
- 总修改数:{N} 处
- 禁用词替换:{N} 处
- 句式调整:{N} 处(含否定翻转句式 {N}、",带着..." {N}、声音描写 {N})
- 修饰词清扫:{N} 处
- 心理外化:{N} 处
- 重复描写合并:{N} 处
- 重复语义去重:{N} 处(形容词重复 {N}、近义词重复 {N}、含义重复 {N}、主语重复 {N})
- 比喻删除:{N} 处
- 节奏调整:{N} 处
- 对话优化:{N} 处
- 标点节奏调整:{N} 处(保留有功能 `?`/少量 `!`,将 `……`/`——` 改为动作、短句、逗号或句号,并清理无功能堆砌)
- 结尾修正:{N} 处

### 修改前后对比
{逐段展示修改,标注改动类型;超过 30 处时仅展示前 10 处 + 末 5 处 + 其余按 Gate 分桶计数}

### 润色后全文
{**文件模式(默认;章节/正文文件、批量与长篇去AI)**:通过 Edit/Write 直接改写落盘,本节只回 ≤200 字代表性片段,不向父会话返回全文。**文本模式(仅限交互式贴入、无文件路径的零散片段)**:完整输出润色后的文本。}

字数硬约束:删除比例不得超过 Phase 2 等级对应上限(轻度 ≤15%、中度 ≤25%、重度 ≤35%)。超限时分段输出并在报告里标记,不得整段删除正文。

收敛终止

  1. 同一段连续两轮去 AI 后没有新改动 → 停止该段处理
  2. 全文上限 3 轮重扫;第 3 轮仍有 ≥10 处改动 → 在报告里标 [需复核],移交人工
  3. 每轮结束前都要做一遍"再检一次":是否有不符合的地方,有则继续;没有则停

使用场景

场景 操作
用户贴一段文字说"太AI了" 执行完整检测 + 润色流程
用户说"帮我润色" 先检测AI味,再润色
用户说"检查下有没有AI味" 只做检测,不做修改
用户写作中要求 仅标注 / 只检测 / 不要改 嵌入式提醒模式:执行 Phase 1+2,跳过 Phase 3-4;输出问题标记表(含 Gate 列),不修改原文,不写文件

参考资料

按需加载以下文件:

文件 何时加载
references/banned-words.md 检测和替换禁用词时
references/anti-ai-writing.md 去AI味完整指南:预防+三遍法+范例
scripts/normalize-punctuation.js 文件模式落盘后做确定性标点收尾;默认保留引号风格
scripts/check-ai-patterns.js 文件模式 Phase 1 预检与 Phase 3.5 复扫;报告高危 AI 句式 + 破折号/碎句号/长段落,只报告不改写
scripts/check-degeneration.js 文件模式 Phase 3.5 复扫;报告模型退化(复读/截断/占位符/工程词泄漏),blocking 需重新生成,只报告不改写

流程衔接

流水线: 通用 位置: 润色(共享收尾)

时机 跳转到 命令
继续写作 story-long-write / story-short-write /story-long-write/story-short-write
发现结构问题 story-long-analyze / story-short-analyze /story-long-analyze/story-short-analyze
准备做封面 story-cover /story-cover

语言

  • 跟随用户的语言回复,用户用什么语言就用什么语言回复
  • 中文回复遵循《中文文案排版指北》
Install via CLI
npx skills add https://github.com/worldwonderer/oh-story-claudecode --skill story-deslop
Repository Details
star Stars 2,637
call_split Forks 465
navigation Branch main
article Path SKILL.md
More from Creator
worldwonderer
worldwonderer Explore all skills →