剧情生成:用语言模型编织分支叙事

FreeGuideOnline 最新 2026-06-25

节点 ID: CAFE_01 场景: 深夜的雨街咖啡馆,窗外霓虹闪烁 情境: 主角刚发现信封中的秘密地图 NPC: 神秘女子艾琳(好感度 40) 分支选项:

  • [A] 将地图递给艾琳,询问真相 → GOTO PARK_02
  • [B] 藏起地图,敷衍离开咖啡馆 → GOTO ALLEY_01
  • [C] 仔细观察咖啡馆内是否有其他线索 → GOTO CAFE_SEARCH

## 核心技巧二:编写系统级提示词(System Prompt)

系统提示词是你作为“导演”给整个剧本下达的宏观指令。它应包含:

1. **叙事规则**:如“始终保持黑色电影风格,多用阴雨、阴影意象”
2. **角色约束**:关键角色的核心动机与语气特征
3. **分支一致性指令**:明确要求模型在生成每个分支结尾时,提供**符合选项逻辑的、明确的状态变化**

### 示例系统提示词

你是一个专业的互动小说引擎。你正在创作一部赛博朋克风格的悬疑故事。

叙事规则:

  • 采用冷峻、简洁的描写,对话占比70%以上。
  • 每个叙事节点的结尾必须提供2~4个具体的行动选项,让读者选择。
  • 选项必须导向明显不同的后果,而非换种表述通往同一场景。
  • 在主回复中不要生成选项,选项由调用方通过代码逻辑附加。

你必须跟踪以下隐藏状态变量,并在每次生成时在内心更新:

  • 「黑客技能」:高/中/低
  • 「警局声望」:数值0-100
  • 「是否获得记忆芯片」:是/否

当前故事起点: ……


**关键点**:将“选项生成”的任务从主回复中剥离,往往能获得更干净的情节文本。你可以在代码层面把选项追加回去,这样更灵活。

## 核心技巧三:分支连贯性维持——上下文窗口管理

语言模型有上下文长度限制。当故事发展到几百个节点后,早期事件会被“遗忘”。解决策略:

- **阶梯式摘要**:每当节点数达到预设阈值(如每10个节点),调用模型对整个故事进行摘要,只保留关键状态与伏笔。
- **角色/物品卡**:在每次生成 prompt 时,始终附带上当前场景主要角色的“角色卡”和当前持有的“关键物品卡”,避免人设漂移。
- **显式状态注入**:将隐藏变量(好感度、线索)以**标记**的形式直接写入用户消息中,如:

[当前状态:好感度-艾琳:45,警局声望:30,地图已获得] 上一节点你选择了B,现在进入 ALLEY_01。


## 实战:构建一个简单的分支叙事生成器

我们将用伪代码展示一个最小可运行的流程。

### 第一步:定义初始世界与状态

状态 = { "场景": "主角的公寓,清晨", "角色": {"主角": "前警探里昂", "AI助手": "芯片人格露娜"}, "隐藏变量": {"线索数": 0, "体力": 100} }


### 第二步:生成当前场景叙述

调用模型,传入系统提示词 + 当前状态描述 + 要求:“请只生成场景描写和角色互动,不要输出任何选项。”

用户消息: [当前场景状态:…] 请叙述里昂在公寓中醒来,发现窗外有警车声,露娜发出警告时的场景。


模型返回一段叙事文本。

### 第三步:生成可用分支选项

再次调用模型,传入**同样的上下文** + 要求:“基于以上叙述,提供4个逻辑合理且后果各异的分支选项,用数字编号。”

用户消息: 以上是当前场景叙述。请提供3个供玩家选择的分支行动,每个选项需体现不同的风险与方向。格式:

  1. [选择行动] - 可能导向:……
  2. [选择行动] - 可能导向:……
  3. [选择行动] - 可能导向:……