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 图→场景大纲

从因果图 中提取场景结构:

  1. 关键事件聚类:将时间/地点相近的事件聚为一个场景
  2. 场景序列化:沿因果图的拓扑序排列场景(前因→后果)
  3. 大纲生成:每个场景包含:
    • 场景头(内景/外景、地点、时间)
    • 关键事件摘要
    • 角色对话方向(需传达的信息和情感)
    • 与前后场景的因果衔接提示

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 最大迭代轮数 K3-5平衡质量与推理成本
事件相似度匹配阈值可调跨窗口事件对齐的精确度

相关笔记