Răsfoiți Sursa

fix(core): tighter paragraph-size guidance in writer-prompts

round 2 bench8 显示上一版反向约束 (commit fdd2a37) 没真正约束住 writer,
还是出现 70-119 / 102-159 段 <35 字的碎段. 原因:
- "3-5 行手机阅读" 这个单位 LLM 看不见屏宽, 没办法 internalize
- 密度规则 (300 字 1 爽点 + 章末 action-climax) 比段落约束更显眼, 导致
  LLM 把 "节奏感" 读成 "切段"
- new.txt L1455 里的 "每句分段" 只限开场三句, 但没讲清楚, LLM 外推到了全文

这次把段落规则写得更像硬尺:
- 叙事段 (非对话) >= 40 字, 也就是手机屏大约 2 行
- 目标 40-120 字 / 段 (3-5 行手机屏), 允许到 150 字讲一段连贯动作链
- 短段 (<40 字) 只允许在三个场景独立成段: 开场 300 字内金句反转 /
  章末钩子定格 / 单章 <= 3 个爆点短段 (一击命中 / 改变局势的台词 /
  定格镜头). 三个场景合计一章 <= 5 个短段.
- 补了一组正反例让 LLM 直接看到 "动作 + 观察 + 反应不该各自一段,
  应该并成动作链".

参照依据是 new.txt L85 / L1041 / L1483 里反复讲的 "每段 3-5 行手机阅读,
避免大段堆砌 vs. 避免每句一段". post-write-validator.ts 里 35 字阈值不改,
给 LLM 留 5 字缓冲带.

核心 933 个测试继续通过.
Ma 6 luni în urmă
părinte
comite
6e471122fc
1 a modificat fișierele cu 8 adăugiri și 1 ștergeri
  1. 8 1
      packages/core/src/agents/writer-prompts.ts

+ 8 - 1
packages/core/src/agents/writer-prompts.ts

@@ -219,7 +219,14 @@ function buildCoreRules(lengthSpec: LengthSpec): string {
 - **每 1000-1500 字至少 1 个完整悬念**:一组"问题—蓄力—未解"的结构,给读者追下去的理由
 - 不靠密度堆砌糊弄——单章里的爽点/钩子/悬念必须服务于本章 goal,不能是和主线无关的孤立段落
 - 如果某段连续 300 字以上是环境、回忆、议论、心理独白而没有推进主线或制造看点,就是水文,必须删或改
-- **密度不是靠切段落实现——是靠段落内的语义密度实现**:每段仍维持 3-5 行手机阅读长度(约 40-120 字),禁止把一句动作、一句台词、一句反应各自切成孤立短段堆砌节奏感。只有需要单独承重的"爆点短段"(一击命中、一句改变局势的台词、一个定格动作)才允许独立成段,一章里这类爆点短段总数不超过 5 个。审核会拒绝:100 段里 50+ 段 <35 字 / 连续出现 5 个以上 <35 字段落。
+- **密度是靠段落内的语义密度实现,不是靠把段落切碎**:
+  - 叙事段(非对话)**必须 ≥ 40 字**——差不多是手机屏 2 行,低于这个数就是"一句动作 / 一句观察 / 一句反应各自一段",直接违反 new.txt 的"每段 3-5 行手机阅读"准则
+  - 目标长度:叙事段 40-120 字(3-5 行手机屏),允许偶尔到 150 字讲一段连贯动作链
+  - 对话段落不算入"短段"——它天然短,无需并段
+  - **短段(<40 字)只在三个场景允许独立成段**:(1) 开场前 300 字里的反转金句(如"她突然跪下"),(2) 章末钩子最后一句(action-climax 定格),(3) 单章 ≤ 3 个"爆点短段"(一击命中、改变局势的关键台词、定格镜头)
+  - 三个场景合计一章最多 5 个短段,超过就是在"堆砌电报体"
+  - 审核硬阈值:narrative 段里 60% 以上 <40 字 → 段落过碎 / 连续 3+ 短段并排 → 连续短段。触发即返工
+  - 正反例:✗ "他转身。/ 看向门外。/ 门开了一条缝。/ 赵无尘站在光里。"(4 段都 <15 字) ✓ "他转身看向门外。门开了一条缝,赵无尘站在光里。"(两段合并,40+ 字,动作链完整)
 
 ## 章节 80/20 断章(番茄老师弈青锋,硬尺)