R² 方法详解:从小说到剧本的完整流程
1. 问题形式化定义
输入:长篇小说 (原始文本,可达数十万字)
输出:剧本 ,包含:
- 场景描述(时间、地点、氛围)
- 角色对话(含语气和行为标注)
- 舞台指导(动作、走位、道具)
核心转换:
其中 Reader 将小说转化为因果情节图,Rewriter 将该图转化为剧本。
2. Reader 模块:从小说到因果图
2.1 滑动窗口分段
小说 N → [窗口1] [窗口2] [窗口3] ... [窗口k]
- 固定窗口大小(适应 LLM 上下文限制,如 ~64K tokens)
- 相邻窗口有重叠区(防止边界切割关键事件)
- 每个窗口独立送入 LLM 进行事件提取
2.2 每窗口事件提取
对每个窗口,LLM 提取:
- 事件实体:
⟨地点+时间, 背景描述, 具体事件描述⟩ - 局部因果关系:窗口内事件间的因果方向
- 初始关系强度:High / Medium / Low
2.3 CPC:因果情节图构建
跨窗口事件对齐:
- 通过事件属性(地点、时间、参与者、描述语义相似度)匹配
- 将同一事件的多次出现合并为图中的一个节点
全局因果图构建:
| 元素 | 含义 | 示例 |
|---|---|---|
| 事件节点集合 | 主角发现秘密、反派设计陷阱 | |
| 有向因果边集合 | 发现秘密 → 产生恐惧 → 求助朋友 | |
| 边强度 | High: 直接导致; Medium: 部分影响; Low: 弱关联 |
2.4 贪心破环算法(Prim 变体)
动机:LLM 提取的原始图通常包含:
- 虚假循环(A→B→C→A,图上不可能作为因果图存在)
- 大量 Low 强度的幻觉边
算法步骤:
输入: 原始有向图 G = ⟨E, D, W⟩
输出: 无环因果图 G' = ⟨E, F⟩,其中 F ⊆ D
1. 排序 D: 按 W 降序(High → Medium → Low),同强度按端点度之和升序
2. 初始化 F ← ∅,维护每个节点的可达集合 R(v)
3. For each (a → b, w) in 排序后的 D:
If b ∈ R(a): // b 已通过已选边可从 a 到达
跳过(加入此边会形成环)
Else:
将 (a → b) 加入 F
更新所有相关节点的可达集合
4. Return G' = ⟨E, F⟩
设计直觉:
- 优先级保证:最强因果链优先保留
- 可达性检查:精确阻断所有可能的循环路径
- 贪心而非最优:每一步局部最优,最终 DAG 可能不是最大权重生成树,但在实践中保持了关键因果结构
3. Rewriter 模块:从因果图到剧本
3.1 图→场景大纲
从因果图 中提取场景结构:
- 关键事件聚类:将时间/地点相近的事件聚为一个场景
- 场景序列化:沿因果图的拓扑序排列场景(前因→后果)
- 大纲生成:每个场景包含:
- 场景头(内景/外景、地点、时间)
- 关键事件摘要
- 角色对话方向(需传达的信息和情感)
- 与前后场景的因果衔接提示
3.2 大纲→完整剧本
对每个场景大纲,LLM 展开为完整剧本段落:
场景描述:环境氛围、视觉要素、场景基调
角色对话:
- 每个角色对话前标注角色名
- 对话中嵌入语气说明(括号内)
- 对话推进情节(对应因果图中的因果边)
舞台指导:
- 角色动作和走位(斜体/括号标注)
- 道具使用和场景切换
- 情感节奏控制(紧张→舒缓→高潮)
4. HAR:贯穿全程的幻觉优化
4.1 幻觉类型检测
HAR 检测三类典型幻觉:
| 幻觉类型 | 表现 | 检测方法 |
|---|---|---|
| 不一致 (Inconsistency) | 同一角色在两个场景中的行为/动机矛盾 | 跨场景语义一致性检查 |
| 矛盾 (Contradiction) | 剧本内容与小说事实冲突 | 小说原文回溯验证 |
| 缺失因果 (Missing Causality) | 事件跳跃,前因未解释就出现后果 | 因果图完整性检查 |
4.2 迭代优化流程
LLM 生成输出
↓
HAR 检测 → 发现幻觉?
↓ 是
生成反馈提示(具体幻觉位置+类型+修正建议)
↓
LLM 根据反馈重新生成
↓
HAR 再检测 → 最多迭代 K 轮,取最佳输出
4.3 双重部署位置
Reader 阶段:
事件提取输出 → HAR → 清洗后的事件集
CPC 建图输出 → HAR → 无环因果图 G'
Rewriter 阶段:
场景大纲输出 → HAR → 清洗后的大纲
完整剧本输出 → HAR → 最终剧本 S
每一步都经过 HAR 把关,阻断幻觉的流水线传播。
5. 完整流水线(Mermaid 图)
graph TD N[📖 长篇小说 N] --> SW[🔍 滑动窗口分段] subgraph Reader[📚 Reader 模块] SW --> W1[窗口1 事件提取] SW --> W2[窗口2 事件提取] SW --> W3[窗口... 事件提取] W1 --> HAR1[🛡️ HAR 检测] W2 --> HAR1 W3 --> HAR1 HAR1 --> |清洗后事件| CPC[🔗 CPC 因果图构建] CPC --> |原始图| GCB[✂️ 贪心破环算法] GCB --> |排序: W降序| PRIM[Prim 变体选择] PRIM --> |可达性检查| HARG[🛡️ HAR 图验证] end subgraph Rewriter[✍️ Rewriter 模块] HARG --> |无环因果图 G'| SCENE[🎬 场景聚类 + 拓扑排序] SCENE --> OUTLINE[📋 场景大纲生成] OUTLINE --> HARO[🛡️ HAR 大纲验证] HARO --> DIALOG[💬 对话 + 舞台指导生成] DIALOG --> HARF[🛡️ HAR 最终验证] end HARF --> S[🎭 完整剧本 S] style N fill:#e1f5fe style S fill:#c8e6c9 style HAR1 fill:#ffcdd2 style HARG fill:#ffcdd2 style HARO fill:#ffcdd2 style HARF fill:#ffcdd2 style GCB fill:#fff9c4
6. 关键技术参数
| 参数 | 建议值 | 作用 |
|---|---|---|
| 滑动窗口大小 | ~64K tokens | 匹配 LLM 上下文限制 |
| 窗口重叠比例 | 10-20% | 减少边界切割损失 |
| HAR 最大迭代轮数 K | 3-5 | 平衡质量与推理成本 |
| 事件相似度匹配阈值 | 可调 | 跨窗口事件对齐的精确度 |