Anchor Forcing: Anchor Memory and Tri-Region RoPE for Interactive Streaming Video Diffusion
Paper: arXiv:2603.13405 Code: vivoCameraResearch/Anchor-Forcing Code reference:
main@20281660(2026-05-05)
1. 一句话概括
Anchor Forcing 是一个面向交互式长视频生成的流式视频扩散框架:它把提示词切换边界附近的 KV 证据显式保存成 Anchor Memory,并用 Tri-region RoPE 把 sink、junction、local 三类缓存分别放回预训练模型熟悉的有界位置区间,从而在 60 秒多段 prompt-switch 视频里同时保住新指令遵循、视觉质量和运动动态。
这篇论文最适合放在 World Model / Interactive & Controllable:它不是单纯扩上下文长度,也不是只做文本到视频质量榜单,而是在“用户中途改 prompt / 加主体 / 加动作”的在线生成场景里,解决世界状态如何连续、如何按新意图演化的问题。作者的核心判断是:当前流式扩散模型的失败不主要来自单帧画质不足,而来自两个缓存层面的错配。第一,prompt 切换时重建 KV cache 会丢掉上一阶段已经形成的语义和边界证据;第二,长时间滚动生成时 RoPE 位置编号持续增大,超出 Wan2.1/CausVid 这类短轨迹训练模型真正见过的位置范围,导致运动先验迁移变差。
Figure 1 解读:图中用 0—20s、20—40s、40—60s 三段交互提示展示本文目标:第一段已有“巴黎桥上演奏萨克斯”的稳定场景,第二段新增舞者,第三段要求两人互动。LongLive 一类 baseline 在后段容易出现画质下降、动作弱化或新互动不成立;Anchor Forcing 的目标是在不回看完整历史、不无限扩 attention 的前提下,把早期场景、切换边界和最近运动三种证据都保留在可注意的缓存里。
2. 问题背景:为什么 prompt switch 是流式视频扩散的硬点
流式 autoregressive video diffusion 通常把长视频拆成小 chunk 生成。为了避免每一步都看完整历史,它只保留一个 rolling KV cache:最近若干 latent frame 的 local cache 负责短期动态,少量最早帧的 sink cache 作为全局语义锚点。这个机制对单 prompt 长视频已经很有用,因为它让计算量受窗口大小约束;但交互式生成会在某个时间边界把条件 prompt 从 改成 ,例如从“摊贩烤肉串”变成“游客询问拍摄”,再变成“摊贩翻动肉串产生火焰”。此时模型既要服从新 prompt,又不能把场景、主体身份、镜头风格和正在进行的动作全部重置。
已有 re-cache 方法的典型做法是:在切换点用新的 prompt 重新计算一段历史 latent 的 KV cache,使后续生成的 cache 条件与新文本一致。这个思路能让模型尽快吸收新 prompt,但问题是它通常会驱逐旧 KV 状态。被驱逐的不只是过时的文本条件,也包括上一段已经形成的主体外观、背景布局、边界附近动作线索。于是交互边界后会出现两类错误:一类是语义断裂,新主体虽然出现但和旧主体/场景没有自然关系;另一类是质量塌陷,local cache 窗口滚走后,边界证据不可再访问,后续段落只能依赖很短的近期上下文。
另一条失败路径来自 RoPE。Wan2.1-T2V-1.3B 这类 DiT 视频模型在预训练/蒸馏中主要见到的是有限长度轨迹;论文实现中 CausVid 初始化对应的 ODE 轨迹上限是 21 个 latent frame。如果流式推理直接使用全局帧编号,生成越久,query/key 的 RoPE index 越大,后面几十秒的注意力几何会偏离预训练分布。这个偏移对“画面是否清楚”未必马上可见,但对长程运动尤其明显:模型的动作先验是在短范围相对位置里学到的,无界位置会削弱它对相邻帧运动方向、速度和局部连续性的复用。
因此本文的目标可以拆成两个更具体的问题。第一,在 prompt switch 之后,如何让新 prompt 的 KV cache 被刷新,同时让上一段的关键证据仍能作为 anchor 被后续帧反复访问?第二,在几十秒流式滚动中,如何让所有缓存区域的 RoPE 编号保持在模型熟悉的有界区间,又不把 sink、边界、local 三类 token 混成同一种位置语义?Anchor Forcing 对应给出 Anchor-guided Re-cache 和 Tri-region RoPE 两个模块。
3. 方法详解
3.1 基础生成形式:带缓存的流式扩散
论文沿用 streaming autoregressive video diffusion 的基本形式。给定扩散时间步 、noised latent 、当前文本 embedding 和一个组装好的记忆 ,模型预测 denoising direction: 这里的 不是完整历史,而是若干 KV cache 的拼接。短视频蒸馏部分使用 DMD:少步生成器 把噪声映射到样本 ,再通过真实数据分布和生成分布的 score 差近似反向 KL 梯度。对这篇论文来说,DMD 不是创新点,但它解释了为什么 RoPE 对齐很重要:作者不是训练一个从零学习长位置的新模型,而是在 Wan2.1/CausVid 的短范围先验上做流式长调优;如果长视频训练时让 position index 无限增长,蒸馏目标会被迫在未见过的位置几何上学习,效率和运动稳定性都会受损。
训练与推理的关键设置比较明确。论文模型基于 Wan2.1-T2V-1.3B,生成 5 秒 832×480 视频片段;先用来自 base model 的 16k ODE-sampled 数据并按 CausVid 引入 causal attention mask,再按 LongLive 训练 DMD、切到带 sink token 的 short-window attention,并做 streaming long-tuning。每次 long-tuning 会持续 rollout 自己生成的连续 5 秒片段,最长到 60 秒。
实现里 sink cache 与 junction/anchor cache 各保存 、 个 latent frame 的 KV,论文正文给 rolling local cache 窗口 ;
公开代码的 configs/train_long.yaml/interactive_inference.yaml 中启用 global_sink: true、rope_enhance: true、use_prompt_cache: true,并把 model_kwargs.local_attn_size 设为 12、sink_size 设为 3,这表示总本地注意窗口包含 sink 预算,和论文里“local + sink + junction”组合的概念一致。
3.2 Anchor Memory:把边界证据变成可反复访问的缓存
Figure 2:anchor-guided re-cache
Figure 2 解读:Figure 2a 画出两个 prompt switch 的交互式生成流程。黄色/蓝色/绿色缓存分别对应 sink、junction 和 local。Figure 2b 是先前 re-cache:切换后只用历史 frame latent 重建 local cache,旧 KV 证据被清空。Figure 2c 是本文的 anchor-guided re-cache:在第二个切换点 ,模型不只刷新最近 local cache,还把生成 frame 6 时的 anchor memory 纳入 re-cache,使新 prompt 条件下的缓存仍能看到早期全局语义和上一切换边界的证据。
Anchor Memory 的三类缓存
Anchor Memory 由三部分组成。
sink cache:全局语义底座
第一是 sink cache ,保存最早 个 generated frames 的 per-layer KV。它的作用不是提供精细动作,而是作为全局场景和主体风格的固定参考。例如巴黎桥、夜市、白色工作室这种早期场景信息,即使 local window 已经滚走,也应该给后续段落一个语义底座。
junction cache:保存 prompt switch 边界
第二是 junction cache ,保存每次 prompt switch 后最开始 个 frame 的 KV。设 prompt 序列为 ,交互边界为 , 表示 prompt 更新到 的帧索引。论文定义最近一次边界: 边界 后的前 帧 KV 被保存为: 这部分是 Anchor Forcing 的关键。prompt switch 后最初几帧通常同时包含“新指令已生效”和“旧场景还没断”的信息,是最有价值的过渡证据。普通 rolling cache 会在窗口移动后把它们丢掉;junction cache 则让这些边界帧在后续段落仍可作为 anchor 被 attention 到。
local cache:最近窗口
第三是 local cache ,保存最近 帧:
生成时的 cache 组合
最终用于生成 frame 的 anchor memory 为: 的含义很实用:如果 junction frames 仍在 local window 里,就不重复加入;一旦 local window 把它们滚出,junction cache 才被激活,成为可重复访问的替代证据。这样做避免了缓存冗余,也让 attention budget 集中在三种互补信息上:早期全局语义、近期运动和边界过渡。
为什么不是单纯扩大上下文
Anchor-guided re-cache 的流程可以概括为:切换 prompt 时,先在新 prompt 条件下重算最近窗口的 cache;但重算不是在空历史里进行,而是把已有 anchor memory 作为 warm-start 上下文。公开代码中,pipeline/interactive_causal_inference.py::_recache_after_switch 会在切换点重置 local KV/cross-attn cache,取 min(local_attn_size, current_start_frame) 个历史 frame 作为 frames_to_recache,再调用模型并传入 kv_cache、rope_enhance 和 prompt_cache。训练侧 pipeline/streaming_switch_training.py::_recache_after_switch 对齐这一逻辑:若提供 switch_recache_frames,会把切换前帧和当前输出拼接后截取最近 local_attn_size 帧做 re-cache;代码注释还明确把早先的 21 帧版本改为 12 帧以和推理保持一致。
# conceptual pseudocode based on the public implementation
if current_start_frame reaches next_switch_frame:
reset rolling local KV cache, keep global sink when global_sink=True
frames_to_recache = recent frames before the boundary, capped by local_attn_size
run model under the new prompt with:
kv_cache = rolling cache
prompt_cache = junction cache storage
rope_enhance = tri-region RoPE switch
update prompt_cache with first post-switch KV frames
continue streaming generation with [sink, junction-if-active, local]这段伪代码强调一个实现细节:paper 中的 junction cache 在代码里主要表现为 prompt_cache。pipeline/causal_inference.py::_initialize_prompt_cache 为每个 transformer block 分配 3 个 frame 的 k/v、k_prior/v_prior、switch_frame、prompt_idx 和 rope_start_frame。wan/modules/causal_model.py 在 new_prompt_chunk_flag 激活时把当前 new_k/new_v 写入 prompt_cache[block_index]["k"] 和 "v",并先把旧 prompt cache 复制到 k_prior/v_prior,从而在多次 prompt switch 后仍能保留上一边界的证据。attention 时,如果 prompt_cache["switch_frame"] + local_attn_size - sink_size < current_start_frame,说明边界帧已经离开 local window,模型就把 k_sink、k_prompt_cache、k_local 拼起来参与注意力。
3.3 Tri-region RoPE:不是简单截断,而是三类缓存分区对齐
Tri-region RoPE 解决的是位置几何错配。若用全局 frame index,60 秒视频的后半段会产生远大于短视频预训练范围的位置编号。论文把有效 RoPE 位置限制在 ,对应 CausVid/Wan 初始化主要见过的 latent frame 范围;但它没有把所有缓存都粗暴 clamp 到同一个位置,而是按 sink、local、junction 三个 region 使用不同参考原点。
对于 sink cache,索引固定为 到 ,因为它表示最早的全局语义锚点。对于 local cache,若当前时间 ,仍使用原 latent index;若 ,则把窗口重新映射到有界末端: 这里 是 local cache 内部索引。直觉上,当前 query 和最近窗口总被放在“预训练见过的最后一段相对位置”里,模型可以继续使用短视频中学到的运动先验。对于 junction cache,论文把它放在 local cache 前面: 这使 junction token 既不与 local 最近帧重叠,也不会跑到无界远处。它们被编码为“local 之前的一小段边界证据”,符合它们在生成中的功能。
公开代码里的 wan/modules/causal_model.py::CausalWanSelfAttention.forward 对应这一点。未开启 rope_enhance 时,query/key 使用 current_start_frame 做常规 causal RoPE;开启后,写入 KV cache 时保存未旋转或重新对齐后的 key,attention 组装阶段再分别处理 sink、prompt cache 和 local。关键逻辑包括:rope_start_f = min(21 - (q.shape[1] // frame_seqlen), current_start_frame) 控制 query/local 的有界起点;sink 通过 causal_rope_apply(..., start_frame=0) 保持固定起点;prompt cache 在 rope_enhance=True 时用 prompt_cache["rope_start_frame"] 作为自己的起点,再与 k_sink 和 k_local 拼接。也就是说,Tri-region RoPE 在实现上确实不是一个全局 flag 的简单 clamp,而是在 cache assembly 阶段改变不同区域 key 的 RoPE 起点。
“RoPE re-alignment distillation”在正文中没有单独定义一个新 loss;从代码和配置看,它体现为 streaming long-tuning/DMD 过程中始终打开 rope_enhance: true,让生成器在蒸馏训练中学习这种分区后的注意力几何。这个理解很重要:Tri-region RoPE 本身提供位置索引规则,DMD/long-tuning 则让模型适应该规则下 sink、junction、local 的互补检索方式。
3.4 代码映射与可复现锚点
| Paper Concept | Source File | Key Class/Function |
|---|---|---|
| 交互式多 prompt 推理 | pipeline/interactive_causal_inference.py | InteractiveCausalInferencePipeline.inference |
| prompt 切换后 re-cache | pipeline/interactive_causal_inference.py | _recache_after_switch |
| 训练时带 switch 的 chunk rollout | pipeline/streaming_switch_training.py | StreamingSwitchTrainingPipeline.generate_chunk_with_cache |
| 训练侧 re-cache 对齐推理 | pipeline/streaming_switch_training.py | _recache_after_switch |
| junction / prompt cache 初始化 | pipeline/causal_inference.py | _initialize_prompt_cache |
| Tri-region RoPE 与 cache 拼接 | wan/modules/causal_model.py | CausalWanSelfAttention.forward |
| prompt cache 写入与 prior 保存 | wan/modules/causal_model.py | block-level cache update around new_prompt_chunk_flag |
| DMD switch 训练入口 | model/dmd_switch.py, trainer/distillation.py | Trainer.generate_video_with_switch |
| 论文核心训练配置 | configs/train_long.yaml | distribution_loss: dmd_switch, rope_enhance: true, use_prompt_cache: true |
从代码看,论文结果对应的关键开关不是散落在 README 默认值里,而在实际训练/推理配置中共同出现:distribution_loss: dmd_switch 选择带 prompt switch 的 DMD 训练;global_sink: true 保留 sink;rope_enhance: true 启用 Tri-region RoPE;use_prompt_cache: true 启用 junction/prompt cache;local_attn_size: 12 与 sink_size: 3 共同决定总缓存预算。configs/train_long.yaml 还给出 switch_mode: random_choice,候选切换帧为 [21, 39, 57, 75, 93, 111, 129, 147, 165, 183, 201],streaming_max_length: 240,vis_video_lengths: [240];结合 5 秒片段和论文 60 秒设置,可以看出训练确实围绕长 rollout 与随机 prompt boundary 做鲁棒化,而不是只在短视频上做离线蒸馏。
4. 实验结果与图表解读
4.1 实验设置
论文评估三种场景。第一是 60 秒交互式多 prompt 视频,采用 MemFlow 引入的 interactive benchmark:100 个 narrative scripts,每个脚本由 6 个连续 10 秒 prompt 组成。动态程度和质量在完整 60 秒序列上用 VBenchLong 维度统计,语义遵循则按 prompt boundary 分段,用 ViCLIP 计算每 10 秒 clip 与对应语义的匹配。第二是标准 5 秒单 prompt VBench,用来确认 Anchor Forcing 没有牺牲短视频能力。第三是 30 秒单 prompt VBench-Long,用来检验没有 prompt switch 时的长程质量和动态。
4.2 60 秒交互式生成:动态与后段语义保持是主要收益
Figure 3/5 解读:这张源图对应论文的交互式 qualitative comparison。每一行是一个方法,每一列是一个时间段,新 prompt 指令用红字标出。读图时应关注两个维度:新主体/动作是否按时出现,以及旧场景是否在后续段落中保持。Anchor Forcing 的优势不是单段最锐,而是跨 6 段后仍能把“新增互动”嵌入同一个世界;baseline 往往在后半段出现背景漂移、动作弱化或新旧主体关系不成立。
量化结果更直接。60 秒交互式评估中,Anchor Forcing 的 Dynamic Degree 为 73.00,高于 Infinity-RoPE 的 35.17、MemFlow 的 45.47 和 LongLive 的 26.37;Quality Score 为 82.25,也高于三者的 79.98、79.35、78.92。CLIP 分段语义上,Anchor Forcing 在 10—60 秒多数后段都是最高或并列最高,尤其 50—60s 为 23.63,而 LongLive 为 22.82、MemFlow 为 21.59。这个趋势符合方法设计:Tri-region RoPE 主要拉高长期动态,Anchor Memory 主要让边界后语义证据不被滚动窗口吞掉。
需要注意,第一段 0—10s 的 CLIP 最优是 MemFlow 24.87,Anchor Forcing 为 24.48;这说明本文方法并不是在所有短段语义分数上单点胜出。它更强调后段稳定性和整体交互完成度。若任务只生成 5 秒单 prompt,Wan2.1 原模型本身就很强,Anchor Forcing 的增益会变小;但一旦需求变为多次 prompt switch,普通 re-cache 的“新提示吸收”与“旧证据保留”冲突就会暴露。
4.3 5 秒与 30 秒基准:保留 teacher 能力,同时改善长程动态
5 秒 VBench 中,Anchor Forcing 在 streaming AR models 里 Total Score 83.99、Quality 84.84、Dynamic 73.61,超过 CausVid、Self-Forcing、Infinity-RoPE、DeepForcing、MemFlow 和 LongLive;Semantic 为 80.57,略低于 LongLive 的 81.01,但仍接近最优。和真实数据训练模型相比,它的 Total/Quality 不超过 Wan2.1 teacher 的 84.27/85.24,但 Dynamic 与 Wan2.1 相同为 73.61,说明 Anchor Forcing 没有明显破坏短视频动态能力。
30 秒 VBench-Long 更能体现长程收益。Anchor Forcing 的 Total Score 为 83.25、Quality 为 84.40、Dynamic 为 79.17、Imaging Quality 为 69.37、Temporal Style 为 24.17,均为表中最高;Semantic 为 78.67,低于 LongLive 的 80.64 和 MemFlow 的 79.31。作者的定性解释是:DeepForcing、MemFlow、Self-Forcing 在后段出现背景环状伪影,Infinity-RoPE 和 LongLive 在 15—25 秒之间存在主体数量/内容不一致。这里也能看出本文的取舍:它更偏向“长程画面和运动不崩”,不是专门最大化单一 CLIP/semantic 指标。
Figure 4 解读:Figure 4 的 30 秒白色纸艺舞者例子把单 prompt 长视频中的累积误差可视化。Anchor Forcing 行保持舞者数量、背景和动作连贯;DeepForcing/MemFlow/Self-Forcing 的背景逐渐出现环状损坏;Infinity-RoPE/LongLive 则在后段出现内容一致性问题。这个图说明 Tri-region RoPE 的意义并不局限于交互边界,它同样能缓解长程 rolling cache 下的位置分布漂移。
4.4 消融:tr-RoPE 主要救运动,AR 主要救质量和 prompt compliance
Figure 5 / Tables 4—6 解读:消融图把 baseline、baseline + tr-RoPE、baseline + tr-RoPE + AR 放在同一 60 秒夜市场景中比较。仅加入 tr-RoPE 后,动作动态明显增强,但红框处仍有肉串细节、游客属性和 prompt 响应退化;再加入 AR 后,新主体、火焰、游客咬一口、消失在人群等分段指令都更稳定。右侧表格把这个分解量化:tr-RoPE 把 Dynamic Degree 从 26.37 提到 74.83;AR 在此基础上把 Quality 从 81.72 提到 82.25,把 CLIP 从 23.71 提到 23.85。
核心消融表可解释为三条结论。第一,Baseline → +tr-RoPE 的主要跃迁是 motion:Dynamic Degree 26.37 → 74.83,Quality 78.92 → 81.72,CLIP 23.58 → 23.71。这说明位置对齐不是小修小补,而是长程运动先验能否被复用的主因。第二,+tr-RoPE → +tr-RoPE+AR 的收益更偏质量和语义:Quality 81.72 → 82.25,CLIP 23.71 → 23.85,Dynamic 略从 74.83 到 73.00,但仍远高于 baseline。第三,单独替换 re-cache 策略时,Flush 只把 Dynamic 从 26.37 提到 27.60,AR 则达到 50.73,同时 CLIP 24.22、Quality 79.78 都优于 Flush 和 baseline;这表明“清空/刷新缓存”不够,必须保存边界 anchor。
RoPE 变体表也有区分度。Bounded RoPE 只把 Dynamic 从 26.37 提到 29.09,Quality 从 78.92 提到 79.38;Tri-region RoPE 则把 Dynamic 提到 74.83、Quality 提到 81.72。这说明简单把位置截断到 21 并不能解决问题,因为不同 cache region 的语义角色不同:sink 是最早全局锚点,junction 是 prompt switch 后的边界证据,local 是最近运动上下文。三者若共享同一种位置规则,会把 attention 几何中的“远近”和“功能”混淆。
5. 评价、局限与可迁移启发
这篇论文的优点是问题定义和系统设计都很贴近实际交互式生成。许多长视频工作把“长”理解为扩大上下文或无限续写,但用户真正需要的是中途加入事件、主体、镜头动作后,视频世界仍然连续。Anchor Forcing 把这个需求落在 KV cache 生命周期上:哪些证据应该固定、哪些应该滚动、哪些只在离开 local window 后才补回来。这个视角比单纯修改 loss 或采样器更容易迁移到其他 streaming DiT。
第二个优点是模块分工清楚。Tri-region RoPE 和 AR 的收益方向不同,消融也支持这一点:tr-RoPE 更像“运动先验保持器”,AR 更像“边界语义和质量稳定器”。如果复现或移植时资源有限,可以先实现 Tri-region RoPE,因为它在动态指标上收益最大;如果目标是多次 prompt edit 后仍保持主体关系,则必须实现 junction/prompt cache,否则后段 prompt compliance 会掉。
局限也比较明显。第一,论文主要在 60 秒、6 段 prompt 的 benchmark 上验证,尚不能说明更多次交互、更长分钟级视频或用户任意编辑时同样稳定。Anchor Memory 保存的是少量 boundary frames,若新旧 prompt 冲突很强,或者边界本身生成失败,junction cache 可能会反复强化错误证据。第二,semantic 指标并非全胜:5 秒 Semantic 低于 LongLive,30 秒 Semantic 也低于 LongLive/MemFlow,说明长程画质/动态与文本匹配之间还有取舍。第三,训练成本不低:论文报告约 56 张 A800 训练 24 小时;这对小规模复现者意味着更现实的路径是从公开 checkpoint/inference pipeline 验证,而不是完整重训。
实现层面还要注意两个细节。其一,paper 中 与代码配置 local_attn_size=12、sink_size=3 看起来不同,但可解释为总 local attention budget 包含 3 个 sink token/frame 预算;因此读取代码时不应直接把 local_attn_size 等同于论文公式里的 。其二,prompt_cache 在代码里既保存当前 junction,也保存 k_prior/v_prior,这比论文公式中只写 更工程化:多次 switch 时,系统需要知道当前 prompt cache 是否已经替换、前一段 boundary 是否还可作为 fallback。写复现代码时若只实现一个单槽 junction,很容易在第三段以后行为不一致。
从更广的 World Model 角度看,Anchor Forcing 的启发是:交互式视频生成不只是 prompt conditioning 问题,而是“世界状态记忆管理”问题。大模型可以把早期场景、最近运动、交互边界视为不同时间尺度的记忆,并给它们不同位置编码和更新策略。这个思路可以扩展到 image-to-video、camera-control video 或 embodied simulation:用户动作/控制信号发生变化时,系统应把变化点附近的感知证据显式锚定,而不是让它随 rolling window 自然消失。
6. 复现检查清单
- 模型与数据:Wan2.1-T2V-1.3B backbone;VidProM filtered + LLM-augmented prompts;5 秒 832×480 chunk;streaming long-tuning 最长 60 秒。
- 缓存配置:
global_sink=true、use_prompt_cache=true、rope_enhance=true;sink cache 3 latent frames;junction cache 3 latent frames;公开配置总 local attention size 为 12。 - 训练配置来源:公开代码
configs/train_long.yaml给出distribution_loss=dmd_switch、lr=1e-5、lr_critic=2e-6、batch_size=1、max_iters=3000、denoising_step_list=[1000,750,500,250]、随机 switch 候选帧以及streaming_max_length=240。 - 评估重点:不要只看 5 秒 VBench;必须检查 60 秒多 prompt 的 Dynamic Degree、Quality Score、每段 ViCLIP,以及 30 秒单 prompt的背景/主体一致性。
7. 与我关心的研究线索的关系
如果把这篇论文当作后续研究组件,它最适合与“在线可控长视频”和“世界模型记忆”结合。对 RL/后训练方向,Anchor Memory 提供了一种可操作的状态表示:reward 不必只评价最终视频,还可以对 switch boundary 后 帧是否正确形成 junction evidence 施加约束。对架构方向,Tri-region RoPE 暗示长视频位置编码不应只有一个时间轴,而应按记忆功能分区;未来可以进一步把 region 的位置、容量和激活条件做成可学习策略。对产品方向,它解释了为什么很多 demo 在“继续生成”时看似可用,但一旦要求“加入新角色并与旧角色互动”就崩:系统没有保存交互边界的可检索证据。