Bladeren bron

feat(de-ai): 接入文字减法,压缩同义反复和无效热闹 (#73)

章节去AI味按信息密度做减法:删第二遍气氛/心理/赶路,细节用三问决定去留,打散整章单轨推进。原文没有进展只压缩重复,不编新情节;文艺稿不按比喻数量硬砍。

Co-authored-by: Cursor Agent <cursoragent@cursor.com>
Co-authored-by: darknessomi <darknessomi@users.noreply.github.com>
darknessomi 1 maand geleden
bovenliggende
commit
89b0f3d0ad

+ 5 - 1
skills/SkillHub/ZhengwenSkill/anti-ai-polish/SKILL.md

@@ -14,13 +14,17 @@ description: Use when revising fiction to reduce AI-like prose, template phrasin
 1. 删除“这说明、这意味着、由此可见”等替读者总结。
 2. 删除泛泛升华和机械排比。
 3. 删除角色替作者解释设定的对话。
-4. 删除无动作支撑的情绪词。
+4. 删除无动作支撑的情绪词,以及“他此时非常愤怒”这类标签句。
 5. 删除“仿佛整个世界都...”这类空泛氛围句。
+6. 删除同一层意思的第二遍、第三遍:重复气氛、重复心理、重复打趣赶路。热闹不等于进展;原文没有进展,就压缩重复,不编进展。
+7. 细节过不了三问(情感偏向 / 人设更立体 / 后文反转更站得住)且不是设定或伏笔的,删。
+8. 整章只剩对线循环、独白绕圈或打斗无信息时,把原文已有的动作、对话、环境、心理穿插起来,不补新镜头。
 
 ## 保留原则
 
 - 保留剧情事件、人物选择、伏笔信息和情绪烈度。
 - 短篇可以保留主观审判句,只删无具体对象的空话。
+- 空修饰压到具体动作,有效意象保留;不要按比喻数量硬砍。
 - 修改后只输出正文,不解释已修改什么。
 
 

+ 54 - 4
skills/de-ai-writing/references/novel-de-ai-rules.md

@@ -27,6 +27,10 @@
 - 固定场景模板:环境→人物→对话→内心
 - 无意义转场:"时间一分一秒过去"
 - 概括式冲突:"双方陷入僵持"
+- 同义反复:同一层恨意、同一套气氛词、同一个动作翻来覆去写
+- 无效热闹:气氛循环、重复心理、重复打趣赶路,剧情原地踏步
+- 空修饰堆叠:连续空形容词、悬浮大词,没有落到可见动作或后果
+- 单手法循环:整章只剩对线、独白或打斗一种形式
 
 ## 二、去AI味核心方法
 
@@ -64,6 +68,40 @@
 - 保留"呃""嗯""那个"
 - 不解释潜台词,让读者自己体会
 
+### 方法6:信息密度减法
+执行顺序:先删重复层 → 再压空修饰 → 再打散单一手法。这是去AI味补丁,不是重写课:只压缩同义反复和无效热闹,不补新剧情。
+
+**1. 拒绝无效热闹(压缩,不扩写)**
+热闹不等于进展。气氛循环、重复心理、重复打趣赶路,是同一层意思的第二遍、第三遍。
+
+判断废句用三问(不是生成新情节的借口):这句有没有新信息?人物关系变了没?矛盾更尖了,还是被挪走了?
+
+章/段处理后,原文若已有进展(新信息、关系变化、冲突升级、目标接近或风险加深),应仍能指出来。原文若整章停在对峙或赶路,不要补秘密、约架、反转道具;只删第二遍渲染。
+
+❌ 两人再对视一次。空气更凝固。周围人更不敢出声。
+✅ 两人对视。她先把旧账摊到桌上。
+
+**2. 具体化,砍空修饰**
+- 空泛大词、悬浮形容词落到可见动作、生理反应或场面后果。
+- 情绪点到为止:一两处具体反应够了,后半段同义抒情删。
+- 同一对象上连续空形容词只留最有信息量的一个。
+- 机械排比三连以上:弱的删,只留最有力的一组。
+- 空泛比喻:同一喻体不反复。不为限额砍有效意象,不要套单章比喻硬顶。
+
+❌ 他执行力强,杀意凛然,整个人陷入极度复杂的情绪。
+✅ 闹钟一响他就坐起来。刀已经出鞘。
+
+**3. 细节三问(留门,不是全删)**
+先删替读者贴标签的句子,例如“他此时非常愤怒”。其余细节只要满足其一就留:
+1. 让读者对某个角色产生情感偏向(讨厌、心疼、崇拜等)
+2. 让人设更立体
+3. 让后文反转更站得住
+
+三问都空的才删。设定解释、伏笔、必要因果按保留边界豁免,不拿三问砍。不要为了“过三问”新编原文没有的反差动作。
+
+**4. 手法不要单轨**
+同一章若连续大段只剩一种形式(纯对线循环 / 纯独白绕圈 / 纯打斗无信息),把原文已有的动作、对话、环境、心理、旁观反应穿插起来,用上两三种即可。不为“交叉”补原文没有的道具、旁观者或环境镜头。对线循环(同一句指控和否认来回)压成有效交锋,不改双方立场。
+
 ## 三、执行流程
 
 ### 步骤1:识别文本功能
@@ -81,6 +119,8 @@
 - 这句删了影响理解吗?→ 不影响就删
 - 同义重复了吗?→ 删一个
 - 铺垫过度了吗?→ 直接进入正题
+- 这句是第二遍气氛、心理或赶路吗?→ 是就删
+- 这处细节能过三问之一吗?→ 都不能且不是设定/伏笔,就删
 
 ### 步骤3:变化句式
 - 禁止连续3句主谓宾
@@ -99,9 +139,15 @@
 2. 视角人称、角色声线
 3. 伏笔、章节钩子
 4. 原有对话和关键动作
-5. 不增删剧情点,只改写作方式
+5. 不增删剧情点,只改写作方式。原文没有进展,就压缩重复,不编进展。
+
+**中文小说适配注意**:
+- 保留角色声线、对白毛边、叙事节奏和必要停顿
+- 不要按非虚构文章规则硬删副词或压缩到固定字数
+- 小说中的"似乎""仿佛""缓缓"等词在特定语境下是风格,不是AI味
+- 情感描写可以有一定修饰,不必强制精简到极致
 
-## 五、最终检查(10项)
+## 五、最终检查
 
 处理完后逐条确认:
 1. ✓ 删除了禁用词汇
@@ -109,11 +155,15 @@
 3. ✓ 情绪用动作/环境表现而非总结
 4. ✓ 对话保留口语特征和潜台词
 5. ✓ 没有每段转折、每句修饰
-6. ✓ 快慢节奏有变化
+6. ✓ 快慢节奏有变化,没有一种形式撑全章
 7. ✓ 保留了原有剧情、人物、伏笔
 8. ✓ 章节钩子没被删除
-9. ✓ 没为了"自然"增加新情节
+9. ✓ 没为了"自然"、"有进展"或"交叉手法"增加新情节
 10. ✓ 读起来不像AI,也不刻意反AI
+11. ✓ 同一层意思没有反复写;没有靠第二遍气氛、心理或赶路撑字数
+12. ✓ 空修饰已压,有效意象还在
+13. ✓ 留下的细节能过三问之一,或属于设定/伏笔豁免
+14. ✓ 信息密度提高了,有效信息没有被削成提纲
 
 ---
 

+ 1 - 0
src/lib/novel/de-ai-adapter.ts

@@ -51,6 +51,7 @@ export function buildDeAiRewriteMessages(content: string, customSkill?: string):
 const DIRECTIVE_PREFIX = [
   "请保持剧情一致,并用更自然、更像真人网文作者的方式输出。",
   "减少套话、总结腔和机械解释。",
+  "压缩同义反复和无效热闹,提高信息密度;不要为了有进展而编造剧情。",
   "注意中文小说适配:保留角色声线、对白毛边、叙事节奏和必要停顿,不要按非虚构文章规则硬删副词或压缩到固定字数。",
   "",
   "任务内容:",

+ 48 - 4
src/lib/novel/de-ai-rules.ts

@@ -34,6 +34,10 @@ export const CHINESE_NOVEL_DE_AI_RULES = `# 中文小说去 AI 味补充规则
 - 固定场景模板:环境→人物→对话→内心
 - 无意义转场:"时间一分一秒过去"
 - 概括式冲突:"双方陷入僵持"
+- 同义反复:同一层恨意、同一套气氛词、同一个动作翻来覆去写
+- 无效热闹:气氛循环、重复心理、重复打趣赶路,剧情原地踏步
+- 空修饰堆叠:连续空形容词、悬浮大词,没有落到可见动作或后果
+- 单手法循环:整章只剩对线、独白或打斗一种形式
 
 ## 二、去AI味核心方法
 
@@ -71,6 +75,40 @@ export const CHINESE_NOVEL_DE_AI_RULES = `# 中文小说去 AI 味补充规则
 - 保留"呃""嗯""那个"
 - 不解释潜台词,让读者自己体会
 
+### 方法6:信息密度减法
+执行顺序:先删重复层 → 再压空修饰 → 再打散单一手法。这是去AI味补丁,不是重写课:只压缩同义反复和无效热闹,不补新剧情。
+
+**1. 拒绝无效热闹(压缩,不扩写)**
+热闹不等于进展。气氛循环、重复心理、重复打趣赶路,是同一层意思的第二遍、第三遍。
+
+判断废句用三问(不是生成新情节的借口):这句有没有新信息?人物关系变了没?矛盾更尖了,还是被挪走了?
+
+章/段处理后,原文若已有进展(新信息、关系变化、冲突升级、目标接近或风险加深),应仍能指出来。原文若整章停在对峙或赶路,不要补秘密、约架、反转道具;只删第二遍渲染。
+
+❌ 两人再对视一次。空气更凝固。周围人更不敢出声。
+✅ 两人对视。她先把旧账摊到桌上。
+
+**2. 具体化,砍空修饰**
+- 空泛大词、悬浮形容词落到可见动作、生理反应或场面后果。
+- 情绪点到为止:一两处具体反应够了,后半段同义抒情删。
+- 同一对象上连续空形容词只留最有信息量的一个。
+- 机械排比三连以上:弱的删,只留最有力的一组。
+- 空泛比喻:同一喻体不反复。不为限额砍有效意象,不要套单章比喻硬顶。
+
+❌ 他执行力强,杀意凛然,整个人陷入极度复杂的情绪。
+✅ 闹钟一响他就坐起来。刀已经出鞘。
+
+**3. 细节三问(留门,不是全删)**
+先删替读者贴标签的句子,例如“他此时非常愤怒”。其余细节只要满足其一就留:
+1. 让读者对某个角色产生情感偏向(讨厌、心疼、崇拜等)
+2. 让人设更立体
+3. 让后文反转更站得住
+
+三问都空的才删。设定解释、伏笔、必要因果按保留边界豁免,不拿三问砍。不要为了“过三问”新编原文没有的反差动作。
+
+**4. 手法不要单轨**
+同一章若连续大段只剩一种形式(纯对线循环 / 纯独白绕圈 / 纯打斗无信息),把原文已有的动作、对话、环境、心理、旁观反应穿插起来,用上两三种即可。不为“交叉”补原文没有的道具、旁观者或环境镜头。对线循环(同一句指控和否认来回)压成有效交锋,不改双方立场。
+
 ## 三、执行流程
 
 ### 步骤1:识别文本功能
@@ -88,6 +126,8 @@ export const CHINESE_NOVEL_DE_AI_RULES = `# 中文小说去 AI 味补充规则
 - 这句删了影响理解吗?→ 不影响就删
 - 同义重复了吗?→ 删一个
 - 铺垫过度了吗?→ 直接进入正题
+- 这句是第二遍气氛、心理或赶路吗?→ 是就删
+- 这处细节能过三问之一吗?→ 都不能且不是设定/伏笔,就删
 
 ### 步骤3:变化句式
 - 禁止连续3句主谓宾
@@ -106,7 +146,7 @@ export const CHINESE_NOVEL_DE_AI_RULES = `# 中文小说去 AI 味补充规则
 2. 视角人称、角色声线
 3. 伏笔、章节钩子
 4. 原有对话和关键动作
-5. 不增删剧情点,只改写作方式
+5. 不增删剧情点,只改写作方式。原文没有进展,就压缩重复,不编进展。
 
 **中文小说适配注意**:
 - 保留角色声线、对白毛边、叙事节奏和必要停顿
@@ -114,7 +154,7 @@ export const CHINESE_NOVEL_DE_AI_RULES = `# 中文小说去 AI 味补充规则
 - 小说中的"似乎""仿佛""缓缓"等词在特定语境下是风格,不是AI味
 - 情感描写可以有一定修饰,不必强制精简到极致
 
-## 五、最终检查(10项)
+## 五、最终检查
 
 处理完后逐条确认:
 1. ✓ 删除了禁用词汇
@@ -122,11 +162,15 @@ export const CHINESE_NOVEL_DE_AI_RULES = `# 中文小说去 AI 味补充规则
 3. ✓ 情绪用动作/环境表现而非总结
 4. ✓ 对话保留口语特征和潜台词
 5. ✓ 没有每段转折、每句修饰
-6. ✓ 快慢节奏有变化
+6. ✓ 快慢节奏有变化,没有一种形式撑全章
 7. ✓ 保留了原有剧情、人物、伏笔
 8. ✓ 章节钩子没被删除
-9. ✓ 没为了"自然"增加新情节
+9. ✓ 没为了"自然"、"有进展"或"交叉手法"增加新情节
 10. ✓ 读起来不像AI,也不刻意反AI
+11. ✓ 同一层意思没有反复写;没有靠第二遍气氛、心理或赶路撑字数
+12. ✓ 空修饰已压,有效意象还在
+13. ✓ 留下的细节能过三问之一,或属于设定/伏笔豁免
+14. ✓ 信息密度提高了,有效信息没有被削成提纲
 
 ---
 

+ 18 - 0
src/lib/novel/de-ai-skill-library.spec.ts

@@ -71,6 +71,24 @@ describe("de-ai skill library", () => {
     )
   })
 
+  it("folds information-density subtraction into comprehensive and keeps literary metaphor uncapped", () => {
+    const comprehensive = BUILT_IN_DE_AI_SKILLS.find((skill) => skill.id === "built-in:comprehensive")?.content ?? ""
+    const literary = BUILT_IN_DE_AI_SKILLS.find((skill) => skill.id === "built-in:literary-retain")?.content ?? ""
+    const explanation = BUILT_IN_DE_AI_SKILLS.find((skill) => skill.id === "built-in:reduce-explanation")?.content ?? ""
+    const regularity = BUILT_IN_DE_AI_SKILLS.find((skill) => skill.id === "built-in:break-regularity")?.content ?? ""
+    const dialogue = BUILT_IN_DE_AI_SKILLS.find((skill) => skill.id === "built-in:dialogue-natural")?.content ?? ""
+
+    expect(comprehensive).toContain("信息密度")
+    expect(comprehensive).toContain("无效热闹")
+    expect(comprehensive).toContain("三问")
+    expect(comprehensive).toContain("不编进展")
+    expect(explanation).toContain("三问")
+    expect(regularity).toContain("单手法循环")
+    expect(dialogue).toContain("对线循环")
+    expect(literary).toContain("不要用单章比喻数量硬顶")
+    expect(literary).not.toContain("比喻单章不超过2")
+  })
+
   it("keeps built-in skill prompts materially different from each other", () => {
     const contents = BUILT_IN_DE_AI_SKILLS.map((skill) => skill.content)
 

+ 58 - 28
src/lib/novel/de-ai-skill-library.ts

@@ -38,7 +38,7 @@ const comprehensiveSkillContent = `# de-AI-writing
 
 ## 去AI味核心目标
 
-本 Skill 用于整体去AI味,适合一次性处理多种 AI味:解释腔、总结腔、模板句、机械排比、段落过度工整、情绪直白宣布、角色说话像旁白、空泛升华、协作口吻残留。处理时先识别 AI味 来源,再进行最小必要改写。去AI味的目标是“降低生成感”,不是“重写成另一篇文章”。
+本 Skill 用于整体去AI味,适合一次性处理多种 AI味:解释腔、总结腔、模板句、机械排比、段落过度工整、情绪直白宣布、角色说话像旁白、空泛升华、协作口吻残留、同义反复、无效热闹、空修饰堆叠、单手法循环。处理时先识别 AI味 来源,再进行最小必要改写。去AI味的目标是“降低生成感”,不是“重写成另一篇文章”。先删重复层,再压空修饰,再打散单一手法。
 
 ## 适用场景
 
@@ -54,6 +54,10 @@ const comprehensiveSkillContent = `# de-AI-writing
 - 工整式 AI味:段落长短接近、句式骨架相似、排比三连过密,像提纲扩写。
 - 旁白式 AI味:人物对白完整说明心理、动机、背景,像作者借角色讲设定。
 - 协作式 AI味:残留“下面我们、接下来、希望这能帮助你、作为 AI”等服务口吻。
+- 同义反复 AI味:同一层恨意、同一套气氛词、同一个动作翻来覆去写。
+- 无效热闹 AI味:气氛循环、重复心理、重复打趣赶路,热闹不等于进展。
+- 空修饰堆叠 AI味:连续空形容词、悬浮大词,没有落到可见动作或后果。
+- 单手法循环 AI味:整章只剩对线、独白或打斗一种形式。
 
 ## 诊断步骤
 
@@ -62,13 +66,22 @@ const comprehensiveSkillContent = `# de-AI-writing
 3. 判断哪些内容必须保留:事实、设定、人物关系、情绪方向、事件顺序、伏笔、作者已有的语气。
 4. 只处理真正影响自然度的句子。不要把所有段落都重写一遍。
 
+## 信息密度减法
+
+执行顺序:先删重复层 → 再压空修饰 → 再打散单一手法。只压缩同义反复和无效热闹,不补新剧情。
+
+1. 拒绝无效热闹:气氛循环、重复心理、重复打趣赶路是同一层意思的第二遍。判断废句用三问(不是生成新情节的借口):这句有没有新信息?关系变了没?矛盾更尖了还是被挪走了?原文没有进展,就压缩重复,不编进展。
+2. 具体化,砍空修饰:空泛大词落到可见动作或生理反应;情绪点到为止,后半段同义抒情删;同一对象上连续空形容词只留一个;机械排比三连以上只留最有力的一组;同一喻体不反复,不为限额砍有效意象。
+3. 细节三问:先删“他此时非常愤怒”这类标签句。其余细节只要满足其一就留——让读者对角色产生情感偏向、让人设更立体、让后文反转更站得住。三问都空且不是设定/伏笔才删。不要为过三问新编反差动作。
+4. 手法不要单轨:整章只剩对线循环、独白绕圈或打斗无信息时,把原文已有的动作、对话、环境、心理、旁观反应穿插成两三种。不为交叉补原文没有的道具或镜头。
+
 ## 去AI味处理流程
 
-1. 先删:删除协作口吻、重复解释、空泛总结、无信息量的升华句。
-2. 再弱化:把强讲解改成弱提示,让读者通过情节、动作、对话和后果自己理解。
-3. 再打散:调整过于整齐的句式和段落节奏,但不打乱事件顺序。
+1. 先删:删除协作口吻、重复解释、空泛总结、无信息量的升华句,以及第二遍气氛、心理、赶路。
+2. 再弱化:把强讲解改成弱提示,把空修饰压成具体动作,让读者通过情节、动作、对话和后果自己理解。
+3. 再打散:调整过于整齐的句式、段落节奏和单手法循环,但不打乱事件顺序,不补新镜头。
 4. 再贴回语境:所有去AI味改写都要回到当前人物、当前场景、当前叙述视角。
-5. 最后自检:读一遍结果,确认没有新增剧情、没有换风格、没有把去AI味做成普通润色。
+5. 最后自检:读一遍结果,确认没有新增剧情、没有换风格、没有把去AI味做成普通润色,信息密度提高了但有效信息还在。
 
 ## 改写优先级
 
@@ -86,9 +99,10 @@ const comprehensiveSkillContent = `# de-AI-writing
 
 ## 禁止改法
 
-- 不新增原文没有的剧情、设定、观点、情绪反转或宏大主题。
+- 不新增原文没有的剧情、设定、观点、情绪反转或宏大主题。原文没有进展,就压缩重复,不编进展。
 - 不把所有句子都改成短句,也不为了自然感故意制造病句。
 - 不主动加入网络口语、古风词、成语堆砌、鸡汤式总结或评论腔。
+- 不为了交叉手法补原文没有的道具、旁观者或环境镜头。
 - 不输出“以下是修改后内容”“我帮你优化了”等协作说明。
 
 ## 反润色约束
@@ -97,6 +111,7 @@ const comprehensiveSkillContent = `# de-AI-writing
 - 不把去AI味做成洗稿,不改变作者本来的表达路线。
 - 不把所有文本统一成同一种顺滑、圆润、编辑腔。
 - 不用“更自然”作为借口删掉原文的锋利、粗糙、犹豫或人物特有语气。
+- 不把有效细节削成提纲;删的是同一层意思的第二遍、第三遍。
 
 ## 去AI味输出契约
 
@@ -126,21 +141,24 @@ const reduceExplanationSkillContent = `# de-AI-writing
 - 主题拔高 AI味:具体事件后面硬接成长、命运、人性、选择、复杂性等抽象总结。
 - 因果复述 AI味:同一因果连续讲两遍,只是换了词。
 - 段尾讲解 AI味:每段最后都像给读者做阅读理解答案。
+- 情绪标签 AI味:直接写“他此时非常愤怒/绝望/委屈”,而不是让动作承担。
+- 同义反复 AI味:同一层意思换词再说一遍,信息密度被稀释。
 
 ## 诊断步骤
 
 1. 标出解释触发词:这说明、这意味着、由此可见、本质上、归根结底、换句话说、显然、事实上、从某种意义上。
 2. 判断解释是否必要:如果前文动作、对话、结果已经表达清楚,就删弱或合并。
-3. 区分必要因果和多余讲解:必要因果保留,多余心理分析、主题拔高和重复说明删除。
+3. 区分必要因果和多余讲解:必要因果保留,多余心理分析、主题拔高和重复说明删除。同一因果只留最密的一处。
 4. 检查段尾:如果段尾只是在替读者总结情绪或意义,优先改成画面、动作、沉默、结果或更克制的判断。
+5. 用细节三问判断去留:这段细节能否让读者对角色产生情感偏向、让人设更立体、或让后文反转更站得住?三问都空且不是设定/伏笔,就删。不要为过三问新编反差动作。
 
 ## 去AI味处理流程
 
-1. 先删掉无信息解释:凡是只把上一句换种说法的解释,直接删除。
-2. 对必要因果做压缩:把长解释压成短因果,让逻辑不断但不啰嗦。
-3. 把心理说明交还给行为:能用动作、停顿、视线、语气、选择表达的,不用旁白解释。
+1. 先删掉无信息解释:凡是只把上一句换种说法的解释,直接删除。先删“他此时非常愤怒”这类替读者贴标签的句子。
+2. 对必要因果做压缩:把长解释压成短因果,让逻辑不断但不啰嗦。同一层意思只留最有信息量的一处。
+3. 把心理说明交还给行为:能用动作、停顿、视线、语气、选择表达的,不用旁白解释。情绪点到为止,后半段同义抒情删。
 4. 把抽象总结落回场景:将“这意味着……”改成更具体的后果、反应或环境变化。
-5. 完成后检查去AI味结果:如果读起来像删减版讲义,继续去掉残留的解释腔 AI味。
+5. 完成后检查去AI味结果:如果读起来像删减版讲义,继续去掉残留的解释腔 AI味。有效信息不能被削成提纲。
 
 ## 改写优先级
 
@@ -160,7 +178,7 @@ const reduceExplanationSkillContent = `# de-AI-writing
 
 - 不把所有解释都删光,尤其是世界观设定、推理链条、任务规则和关键伏笔。
 - 不把解释腔改成更空泛的抒情腔。
-- 不新增人物没有表现出来的心理结论。
+- 不新增人物没有表现出来的心理结论,不为过三问新编原文没有的反差动作。
 - 不输出删改说明或“已为你去除解释腔”之类的提示。
 
 ## 操作细节
@@ -168,6 +186,7 @@ const reduceExplanationSkillContent = `# de-AI-writing
 - 优先做减法,其次才做改写。能删掉半句解决的问题,不要重写整段。
 - 如果必须保留解释,把它压缩成一句更具体的因果,不要继续扩展意义。
 - 人物情绪优先交给行为和对话表达,旁白只保留最低限度的提示。
+- 细节三问只要答上其中一个就留;三问都空且不是设定/伏笔才删。
 
 ## 反润色约束
 
@@ -197,6 +216,7 @@ const dialogueNaturalSkillContent = `# de-AI-writing
 - 多个角色说话没有差异,身份、年龄、关系、情绪都被同一种语气覆盖。
 - 对话里充满书面连接词、心理剖析、主题总结和不自然的礼貌句。
 - 角色把本该藏在动作、沉默、打断里的态度直接说出来。
+- 对线循环:同一句“你诬陷我 / 我没有”来回多轮,场面热闹但没有新信息。
 
 ## AI味识别清单
 
@@ -206,6 +226,7 @@ const dialogueNaturalSkillContent = `# de-AI-writing
 - 礼貌客服 AI味:冲突场景里仍然语气完整、客气、逻辑过顺。
 - 同声同气 AI味:不同角色都使用同一种句式、词汇和情绪表达。
 - 书面连接 AI味:因此、然而、与此同时、从某种意义上说、换句话说频繁出现在对白里。
+- 对线循环 AI味:同一句指控和否认来回多轮,信息不再增加,像在拖字数。
 
 ## 诊断步骤
 
@@ -218,9 +239,10 @@ const dialogueNaturalSkillContent = `# de-AI-writing
 
 1. 先保留信息:确认对白里必须留下的剧情事实、关系变化、设定信息。
 2. 再去掉讲解:删除角色不该明说的心理分析、主题总结和背景说明。
-3. 再调整语气:让句子符合角色身份和当前情绪,不强行现代口语化。
-4. 再制造自然缺口:必要时用半句话、停顿、反问、回避、打断替代完整解释。
-5. 最后检查 AI味:如果角色仍像在替作者交代信息,继续压缩对白里的说明感。
+3. 再压对线循环:同一句指控和否认来回时,压成一轮有效交锋,不改双方立场,不补原文没有的新证据或新事件。
+4. 再调整语气:让句子符合角色身份和当前情绪,不强行现代口语化。
+5. 再制造自然缺口:必要时用半句话、停顿、反问、回避、打断替代完整解释。
+6. 最后检查 AI味:如果角色仍像在替作者交代信息,继续压缩对白里的说明感。
 
 ## 改写优先级
 
@@ -240,7 +262,7 @@ const dialogueNaturalSkillContent = `# de-AI-writing
 
 - 不把对话改成段落总结。
 - 不为了口语化加入无关语气词。
-- 不改变人物关系和剧情信息。
+- 不改变人物关系和剧情信息。对线循环只压缩重复轮次,不改立场,不补新证据。
 - 不让所有角色都变成同一种现代口语。
 - 不用“嗯、啊、吧、嘛”堆砌来假装自然。
 
@@ -278,6 +300,7 @@ const breakRegularitySkillContent = `# de-AI-writing
 - 句式连续重复,例如连续“他……,他……,他……”或连续“不是……而是……”。
 - 排比、三连句、对仗和总结句过密,读起来像宣传稿或讲义。
 - 每段都按“观点句 + 展开解释 + 段尾总结”推进,缺少自然停顿。
+- 整章只剩一种形式:连段对线、连段独白、连段打斗,读者已经懂了它还在写。
 
 ## AI味识别清单
 
@@ -287,6 +310,7 @@ const breakRegularitySkillContent = `# de-AI-writing
 - 固定收束 AI味:段尾总要总结意义、点题、升华或回扣主题。
 - 路标词 AI味:然而、同时、此外、更重要的是、总而言之反复出现。
 - 提纲扩写 AI味:每段都像从一个小标题扩成的说明段。
+- 单手法循环 AI味:整章只剩对线、独白或打斗一种形式,节奏没有张弛。
 
 ## 诊断步骤
 
@@ -299,9 +323,10 @@ const breakRegularitySkillContent = `# de-AI-writing
 
 1. 先保顺序:事件顺序、论证顺序、设定说明顺序不能因为去AI味被打乱。
 2. 再破模板:调整连续相似的段落开头、句式骨架和段尾收束。
-3. 再删路标:能不用连接词的地方直接删,用具体动作、后果、场景变化承接。
-4. 再调长短:短段、中段、厚段按内容需要交替,不为了整齐而均分。
-5. 最后检查 AI味:如果文本仍像“观点 + 展开 + 总结”的批量段落,继续去掉模板感。
+3. 再破单轨:整章只剩对线循环、独白绕圈或打斗无信息时,把原文已有的动作、对话、环境、心理、旁观反应穿插成两三种。不为交叉补原文没有的道具或镜头。
+4. 再删路标:能不用连接词的地方直接删,用具体动作、后果、场景变化承接。
+5. 再调长短:短段、中段、厚段按内容需要交替,不为了整齐而均分。
+6. 最后检查 AI味:如果文本仍像“观点 + 展开 + 总结”的批量段落,或仍是一种形式撑全章,继续去掉模板感。
 
 ## 改写优先级
 
@@ -321,7 +346,7 @@ const breakRegularitySkillContent = `# de-AI-writing
 
 - 不为了变化而随意拆句、倒装或制造理解障碍。
 - 不把所有长句都切成短句,也不把所有短句合成长句。
-- 不新增无关细节来填补节奏。
+- 不新增无关细节来填补节奏。不为交叉手法补原文没有的花、杯子、旁观者。
 - 不输出结构分析、节奏分析或修改说明。
 
 ## 操作细节
@@ -358,6 +383,7 @@ const literaryRetainSkillContent = `# de-AI-writing
 - 原文有画面和情绪,但夹杂“仿佛、某种、难以言说、命运般、灵魂深处”等空泛堆叠。
 - 原文有文采,但段尾总是升华主题、宣布情绪或替读者赏析。
 - 需要保留作者原来的温度,而不是改成冷冰冰的说明。
+- 同一对象上连续空形容词堆叠,或同一个喻体反复使用,把有效画面稀释了。
 
 ## AI味识别清单
 
@@ -367,6 +393,8 @@ const literaryRetainSkillContent = `# de-AI-writing
 - 赏析旁白 AI味:文字替读者说明“这一刻多么复杂/珍贵/残酷/温柔”。
 - 对仗排比 AI味:为了文艺感制造过度整齐的句式。
 - 情绪宣布 AI味:直接告诉读者人物悲伤、释然、震动,而不是让画面承担情绪。
+- 空修饰堆叠 AI味:同一对象上连续空形容词,没有落到可见动作或感官。
+- 同一喻体反复 AI味:同一个比喻翻来覆去用,把有效意象稀释成口头禅。
 
 ## 诊断步骤
 
@@ -378,9 +406,9 @@ const literaryRetainSkillContent = `# de-AI-writing
 ## 去AI味处理流程
 
 1. 先保留画面:保留能看见、听见、闻到、触到的细节,这是文艺文本去AI味的底座。
-2. 再清空泛词:删除或弱化没有具体对象的深沉词、氛围词、宏大词。
-3. 再压升华:把强行上升到人生和命运的句子收回到当前人物、当前场景、当前动作。
-4. 再调修辞:保留有效意象,删除重复意象和只负责显得高级的对仗排比。
+2. 再清空泛词:删除或弱化没有具体对象的深沉词、氛围词、宏大词。同一对象上连续空形容词只留最有信息量的一个。
+3. 再压升华:把强行上升到人生和命运的句子收回到当前人物、当前场景、当前动作。情绪点到为止,后半段同义抒情删。
+4. 再调修辞:保留有效意象,删除重复意象和只负责显得高级的对仗排比。同一个喻体反复出现时,留最准确的一处。不要用单章比喻数量硬顶去砍有效意象。
 5. 最后检查 AI味:如果读起来仍像模型在模拟文学感,继续减少空泛抒情。
 
 ## 改写优先级
@@ -397,6 +425,7 @@ const literaryRetainSkillContent = `# de-AI-writing
 - 不新增宏大主题、人生感悟或作者没有写出的结论。
 - 不为了简洁删掉关键意象和氛围铺垫。
 - 不堆砌新的华丽词汇、古风词、成语或空泛形容词。
+- 不用比喻数量硬顶去砍有效意象;只删空泛堆叠和同一喻体反复。
 - 不输出赏析、评价或“保留了文艺感”的说明。
 
 ## 操作细节
@@ -406,6 +435,7 @@ const literaryRetainSkillContent = `# de-AI-writing
 - 抒情句要服务人物和场景,不要脱离当前情境单独升华。
 - 结尾可以留白,避免把余味解释成明确道理。
 - 语言可以克制,但不能把原文的气息、温度和画面感一并删掉。
+- 空泛大词落到具体感官;有效比喻、角色口癖和必要排比保留。
 
 ## 反润色约束
 
@@ -435,7 +465,7 @@ export const BUILT_IN_DE_AI_SKILLS: DeAiSkill[] = [
   {
     id: "built-in:comprehensive",
     name: "综合去AI味",
-    description: "综合减少解释腔、模板句式和机械总结。",
+    description: "综合减少解释腔、模板句式、机械总结、同义反复和无效热闹。",
     templateId: "comprehensive",
     content: comprehensiveSkillContent,
     source: "built-in",
@@ -443,7 +473,7 @@ export const BUILT_IN_DE_AI_SKILLS: DeAiSkill[] = [
   {
     id: "built-in:reduce-explanation",
     name: "减少解释腔",
-    description: "重点删掉动机解释、情绪总结和重复说明。",
+    description: "重点删掉动机解释、情绪总结、重复说明和过不了三问的废细节。",
     templateId: "reduce-explanation",
     content: reduceExplanationSkillContent,
     source: "built-in",
@@ -451,7 +481,7 @@ export const BUILT_IN_DE_AI_SKILLS: DeAiSkill[] = [
   {
     id: "built-in:dialogue-natural",
     name: "对话口语化",
-    description: "让人物对话更像真人说话,减少书面腔。",
+    description: "让人物对话更像真人说话,减少书面腔和对线循环。",
     templateId: "dialogue-natural",
     content: dialogueNaturalSkillContent,
     source: "built-in",
@@ -459,7 +489,7 @@ export const BUILT_IN_DE_AI_SKILLS: DeAiSkill[] = [
   {
     id: "built-in:break-regularity",
     name: "打破工整句式",
-    description: "打散整齐段落、排比句和模板化起承转合。",
+    description: "打散整齐段落、排比句、模板化起承转合,以及整章一种形式的单轨推进。",
     templateId: "break-regularity",
     content: breakRegularitySkillContent,
     source: "built-in",
@@ -467,7 +497,7 @@ export const BUILT_IN_DE_AI_SKILLS: DeAiSkill[] = [
   {
     id: "built-in:literary-retain",
     name: "保留文艺感",
-    description: "去除AI味时保留必要修辞、氛围和文学质感。",
+    description: "去掉空泛文艺腔和修饰堆叠,保留有效意象与画面,不按比喻数量硬砍。",
     templateId: "literary-retain",
     content: literaryRetainSkillContent,
     source: "built-in",

+ 2 - 2
src/lib/novel/skill-seed.ts

@@ -1778,11 +1778,11 @@ export const DEFAULT_BUILTIN_WRITING_SKILLS: UserSkill[] = [
   normalizeUserSkill({
     id: "builtin:basic-de-ai",
     name: "基础去AI味",
-    description: "降低正文里的解释腔、总结腔、模板句和协作口吻。",
+    description: "降低正文里的解释腔、总结腔、模板句、同义反复和无效热闹。",
     kind: ["style", "rewrite"],
     stages: ["rewrite", "output"],
     modes: ["fast", "standard", "strict"],
-    content: ["输出前进行基础去AI味:","1. 删除“这说明、这意味着、由此可见”等替读者总结的句子","2. 减少段尾升华、机械排比和模板化转折","3. 对话不要替作者解释设定或心理","4. 保留原剧情、人设、视角和信息密度","5. 最终只输出正文,不说明已去AI味"].join("\\n"),
+    content: ["输出前进行基础去AI味:","1. 删除“这说明、这意味着、由此可见”等替读者总结的句子","2. 减少段尾升华、机械排比和模板化转折","3. 对话不要替作者解释设定或心理","4. 压缩同义反复和无效热闹,空修饰落到具体动作,细节过不了三问就删","5. 保留原剧情、人设、视角和信息密度;不编新进展","6. 最终只输出正文,不说明已去AI味"].join("\\n"),
     source: "built-in",
   }),
   normalizeUserSkill({