基于多 Agent 角色模拟的故事生成

问题 (Problem)

现有故事生成系统遵循”大纲→直接生成文本”的单步范式(如 Dramatron 的对话生成、Agents’ Room 的分阶段写作),忽视了叙事理论中 fabula(故事时间/编年顺序)syuzhet(叙事时间/呈现顺序) 的根本区别。直接生成有三大局限:(1) 角色行为和对话缺乏真实感,因为 LLM 对角色内在状态、记忆和目标缺乏细粒度建模;(2) 非线性的呈现顺序(syuzhet)难以处理——直接生成容易出现时间错乱、信息过早泄露(spoiler)或幻觉;(3) 缺乏结构化的人类协作接口,作者难以介入角色互动过程进行控制。现有 system 局限于 linear storytelling,无法有效生成具有非线性叙事结构的丰富故事。

解决方案 (Solution)

该工作首次将 fabula/syuzhet 叙事理论框架整合进统一的自动故事生成流程,分为两步:Role-Play(角色扮演)Rewrite(重写)

Role-Play 步骤(生成 fabula):

  • 输入:叙事计划 Pp(以 syuzhet 呈现顺序排列的场景列表)
  • 排序:LLM-based 排序算法将 Pp 中的场景按时序重排为 Pc(fabula 顺序),并对每个场景内的 outline 按时间线排序为 oc(chronological outline)
  • 角色扮演执行:对 Pc 中每个场景使用 Algorithm 1——Director Agent 和 Character Agents 交替互动
    • Director Agent:控制场景进程,选择下一个发言角色(next_speaker),给出高层次行动指令(next_command),并判断场景是否完成
    • Character Agent:每个角色作为一个独立 Agent,拥有 memory(文本记忆系统)、physical state(物理状态)和 scene-level goal。收到 Director 指令后,结合自身状态和记忆从第三人称视角生成逼真的对话和动作描述
    • 角色 Agent 在跨场景中复用,memory 和 physical state 持续累积更新,确保角色行为一致性
    • 最多 10 轮迭代防无限循环

Rewrite 步骤(生成 syuzhet):

  • 输入:角色扮演结果(完整 chat history)和原始呈现大纲 pp
  • 按照 Pp 指定的呈现顺序逐场景生成最终故事文本
  • Rewrite 时引用 Role-Play 中角色对话和动作的真实记录,确保叙事内容与角色行为一致
  • 模块化设计允许作者在每场景生成后修订中间内容,支持人机协作

核心创新:通过先按编年顺序模拟角色互动、再按叙事顺序重写的解耦策略,既保证角色行为的真实性和一致性(得益于 memory + goal 系统),又避免信息过早泄露(rewrite 严格遵循场景 outline),实现了叙事结构上的非线性表达能力。

评估 (Evaluation)

数据集:Tell Me A Story 数据集;使用 sBERT + UMAP + k-means 将 230 个 writing prompt 聚类为 14 组,选取 28 个代表性 prompt。

实验设置:采用 back-translation 范式——Teacher LLM(O3-mini)从 golden story 提取 synthetic plan,再交由各系统按 plan 生成故事。统一使用 GPT-4o(temperature=0.9)作为写作模型,零样本提示。

基线对比

  • Dramatron(单 Agent 方法,改编为故事写作)
  • Agents’ Room(多 Agent 方法,5 个 Agent 分写叙事弧五阶段)

评估方法:LLM-based 配对比较(Gemini 1.5 Pro),5 个维度——Plot(情节)、Creativity(创意)、Development(发展/细节)、Language Use(语言运用)、Overall(综合)。双向呈现消除位置偏差,通过 Bradley-Terry 模型导出系统强度参数。

核心结果(BTL 归一化强度,以 0 为中心):

维度OursAgents’ RoomDramatron
Overall2.3970.8020.520
Plot2.4770.7580.533
Creativity1.8620.9740.551
Development2.3970.8020.520
Language Use2.2510.8880.501

Win Matrix 关键数据(总 56 对比较):

  • Ours vs Dramatron:Overall 47 胜 9 负(胜率 83.9%)
  • Ours vs Agents’ Room:Overall 41 胜 15 负(胜率 73.2%)
  • 所有维度一致大幅领先,优势显著

定性分析:Dramatron 在非顺序场景中产生幻觉(编造不存在的内容);Agents’ Room 过早泄露后续信息(spoiler);本方法通过先按编年顺序角色扮演积累记忆、再重写控制呈现,成功避免两类问题。

优势 (Strengths)

  • 理论创新:首个将叙事理论中的 fabula/syuzhet 区分落地为工程实现的系统,理念清晰且论证充分
  • 角色真实性:memory + physical state + goal 机制使角色行为连续、一致、有深度,而非模板化
  • 非线性叙事能力:解耦编年顺序和呈现顺序,能处理倒叙、插叙等复杂时间结构
  • 人机协作友好:Role-Play 阶段人类可扮演角色参与;Rewrite 阶段每场景可人工修订
  • 实验严谨:采用 back-translation 避免数据泄露,BTL 模型处理配对比较,双向评估消偏
  • 开箱即用:基于 LLM API,无需训练,仅通过 prompt 和 agent 架构即可运行
  • 多方面大幅领先:在所有评估维度上一致且显著超越两个强基线

劣势 (Weaknesses)

  • 数据集较小:仅 28 个 writing prompt 经过人工筛选,评估统计力有限
  • 缺乏人工评估:评估完全依赖 Gemini 1.5 Pro 的 LLM 评估,无人工读者评价
  • 场景时间假设过强:假设场景间无时间重叠(任何两场景 Si 和 Sj 不重叠),现实故事中闪回与当下对话并行的场景无法处理
  • 隐私控制缺失:角色 Agent 的 memory 更新只反映”应知”信息,但角色扮演过程中未显式实施隐私控制——理论上角色可能”知道”不该知道的事
  • Role-Play 不稳定:Director Agent 对不满意的角色回应会重复相同指令,虽限制 10 轮但仍可能导致质量波动
  • 计算开销较大:每个场景需要多次 LLM 调用(Director 选择+指令、角色响应、memory 更新、物理状态更新、重写),比直接生成成本高得多
  • 对 Plan 质量敏感:若输入的叙事计划质量差,角色扮演和重写无法弥补,系统仅是 writing phase 而非 planning + writing

流水线 (Pipeline)

输入: Writing Prompt + Golden Story (仅训练时)
    │
    ▼
┌─────────────────────────────────────────┐
│         Plan Synthesis (Teacher LLM)     │
│  • 提取 Characters (名称/年龄/性别/     │
│    叙事角色/设定/说话特征/目标)         │
│  • 提取 Scenes (呈现场所/角色/大纲)     │
│  • 提取 Central Conflict + Setting       │
│  输出: 叙事计划 Pp (syuzhet 顺序)       │
└─────────────────┬───────────────────────┘
                  │
                  ▼
┌─────────────────────────────────────────┐
│          Chronological Sorting           │
│  • Scene 排序: Pp → Pc (fabula 顺序)    │
│  • Outline 排序: op → oc (逐场景内)     │
│  (LLM-based sorting algorithm)           │
└─────────────────┬───────────────────────┘
                  │
                  ▼
┌─────────────────────────────────────────────────┐
│  STEP 1: Role-Play (Fabula Generation)          │
│                                                  │
│  For each scene in Pc (chronological order):     │
│  ┌──────────────────────────────────────┐       │
│  │  Director Agent                      │       │
│  │  • should_terminate(scene, history)? │       │
│  │  • next_speaker(scene, history)      │       │
│  │  • next_command(scene, history)      │       │
│  └──────┬───────────────────────────────┘       │
│         │ select & command                      │
│         ▼                                        │
│  ┌──────────────────────────────────────┐       │
│  │  Character Agent (被选中角色)        │       │
│  │  • update_state(history)              │       │
│  │    → memory update + physical update  │       │
│  │  • get_response(history, command)     │       │
│  │    → 第三人称动作+对话               │       │
│  └──────────────────────────────────────┘       │
│  (Agent 跨场景复用, memory 累积)                │
│  (最多 10 轮迭代防死循环)                       │
│  输出: Chat History H (每场景完整对话记录)      │
└─────────────────┬───────────────────────────────┘
                  │
                  ▼
┌─────────────────────────────────────────────────┐
│  STEP 2: Rewrite (Syuzhet Generation)           │
│                                                  │
│  For each scene in Pp (presentation order):      │
│  ┌──────────────────────────────────────┐       │
│  │  Rewrite LLM                         │       │
│  │  输入:                                │       │
│  │  • Writing Prompt                     │       │
│  │  • Central Conflict + Setting         │       │
│  │  • Story Scenes (完整大纲)            │       │
│  │  • 已生成的故事内容                   │       │
│  │  • Scene Characters (含目标)          │       │
│  │  • Task Scene 大纲 (呈现顺序 op)      │       │
│  │  • Role-Play History (该场景的H)      │       │
│  │  输出: 该场景的最终叙事文本           │       │
│  └──────────────────────────────────────┘       │
│  (可在此阶段人工干预编辑中间内容)               │
│  输出: 完整故事 (syuzhet 形式)                  │
└─────────────────────────────────────────────────┘
                  │
                  ▼
            最终故事文本

参考链接

此文件夹下有0条笔记。