大纲层和分集层混着改,通常会出现一种循环:改完一集冲突,回头发现整体方向也偏了;再动总纲,前面已经定稿的分集全部失效。比较稳的做法是把 ArcLoop 的输出先按层拆开,总纲层冻结不动,只在分集层让 Agent 补冲突,两层的修改记录也分开写。这套顺序适用于已有初版大纲、进入逐集打磨的阶段;如果大纲还没成形,先不要下沉到分集层。
先把输出拆成总纲层(主线、主角目标、结局方向)和分集层(单集冲突、必须发生的选择、结尾状态)。总纲冻结后再逐集补冲突。判断是否混调的标志是:改一集冲突时是否需要回头动总纲字段——如果需要,说明分集边界没定好,应先回分集层补“选择和结果”,而不是顺手改总纲。两层合并后再查同类冲突是否在多集重复。以上为通用经验,字段名与数量需结合 ArcLoop 的实际配置确认。
把当前输出拆成总纲层和分集层
拆层不是重新写大纲,而是把现有输出按“谁决定谁”归类。判断标准可以先用一句话:这条内容改掉之后,会连带影响其他集,就归总纲层;只影响本集开头到结尾的变化,就归分集层。
[总纲层]
主线:主角被逐出师门,重建自己的门派
主角目标:在第三卷前拿到镇派信物
结局方向:与旧同门和解,门派回到中立
[分集层 · 第 3 集]
冲突:镇派信物线索与同伴性命二选一
必须发生的选择:主角交出线索
结尾状态:同伴获救,线索落到对手手里
[分集层 · 第 4 集]
冲突:独自潜入,还是向旧同门求助
必须发生的选择:向旧同门求助
结尾状态:求助被拒,潜入计划推迟
[分集层 · 第 5 集]
冲突:是否在公开场合承认自己的身份
必须发生的选择:承认身份
结尾状态:身份暴露,门派内部出现分裂
这三个分集都只改变本集结局,不推翻主线;一旦某集写成了“主角放弃重建门派”,那就是总纲层的问题,不该塞进分集层里调。
先固定总纲层再调分集层
总纲层要冻结的字段建议只留三个:主线、主角目标、结局方向。其余设定(配角、世界观细节)可以先视为可调整内容,不进入冻结清单,否则冻结范围过大,后面每集都要回改。
下表的顺序是建议操作顺序,每一步的验证方式都可从配置或输出文本直接看到,不依赖额外工具。
| 步骤 | 改哪一层 | 输入 | 输出 | 验证方式 |
|---|---|---|---|---|
| 1 冻结总纲 | 总纲层 | 初版大纲文本 | 主线、主角目标、结局方向三个字段定稿 | 后续改动分集时,这三个字段不出现变更 |
| 2 校验分集边界 | 分集层 | 每集已有的冲突描述 | 每集一条“必须发生的选择” | 某集找不到选择时,回分集层补,不改总纲 |
| 3 Agent 补冲突 | 分集层 | 冻结的总纲 + 单集上下文 | 该集冲突与结尾状态 | 检查结尾状态是否仍指向主角目标 |
| 4 合并检查 | 两层 | 全部分集冲突 | 去重后的冲突列表 | 同类冲突是否在多集重复出现 |
分环节修改记录建议按行追加,只留两个 stage 取值,回滚时按 stage 筛选即可。字段名可替换为你自己的命名。
{"stage":"outline","field":"主角目标","before":"拿到信物","after":"在第三卷前拿到信物","reason":"给出时限"}
{"stage":"episode","ep":3,"field":"结尾状态","before":"线索到手","after":"线索落入对手手中","reason":"为后续冲突留口"}
记录的作用是:出问题时按 stage 判断是哪一层被改坏,而不是整份大纲推倒重来。
在分集层逐集补冲突和结尾状态
让 Agent 补全时,边界要写进提示词里,并给一个“无法补全”的出口,避免它自行修改总纲来凑冲突。
每集补齐四项:
conflict : 本集内无法两全的选择
choice : 主角在这一集必须做出的选择
result : 选择带来的直接结果
end_state : 本集结束时局面相对上一集的变化
你在分集层工作,只补全单集冲突,不改动总纲层字段。
总纲(已冻结,不可修改):
主线:<粘贴>
主角目标:<粘贴>
结局方向:<粘贴>
本集编号:第 3 集
上一集结尾状态:<粘贴>
输出 conflict / choice / result / end_state 各一行。
若本集无法产生“必须发生的选择”,只输出 NEED_OUTLINE_FIX,不要自行改总纲。
提示词里的总纲段落是替换项,每集调用时粘贴同一份,不要临时改写。验证方式很直接:Agent 输出里出现 NEED_OUTLINE_FIX,说明这一集和总纲之间缺衔接,先停下来看分集上下文或总纲,不要顺手改总纲字段。
合并两层后检查重复冲突
逐集补完之后,最常见的残留问题是多集出现同类型冲突:都是“救同伴还是保线索”,只是换了场景。先把每集字段导出成 JSONL,每行一集,再按冲突类型分组,重复的分组就是需要处理的对象。
import json, collections
rows = [json.loads(l) for l in open("episodes.jsonl", encoding="utf-8")]
by_type = collections.defaultdict(list)
for r in rows:
by_type[r["conflict_type"]].append(r["ep"])
dup = {k: v for k, v in by_type.items() if len(v) > 1}
print(dup)
把 episodes.jsonl 换成你实际导出的分集字段文件,conflict_type 换成你使用的字段名。输出为空说明本批分集没有同类重复;输出非空则逐条按下表处理。
- 保留一次:同类冲突只保留后果最重的一集,其余集的 conflict 换成别的类型。适合两集冲突几乎同构、又没有新增信息的情况。
- 改动机:冲突类型保留,换掉主角做选择的原因,让同类冲突指向不同的取舍。适合冲突本身有张力、只是动机重复的情况。
- 换阻力:动机和冲突类型都保留,换掉阻挡方(人、规则、时限),使选择结果不再重复。适合阻力来源单一的情况。
风险边界:改动机和换阻力都可能让后期的结尾状态与总纲的结局方向脱节。处理完重复冲突后,需要回到总纲层对照一次;如果对照发现结局方向要动,那属于总纲层的问题,不要在分集层继续硬凑。每次合并同样按上面的 stage 记录一行,方便下一次判断是哪一层先动过。