上下文退化-关键Token
一、先搞懂:什么是「关键Token」
- 硬规则强制关键Token(人工定义)
系统Prompt、任务约束、指令文本、首次视觉观测、目标物体描述、安全规则、电力操作禁忌、Rollout成功/失败判定标签;必须全程保留,绝不裁剪。 - 模型动态关键Token(注意力自动判定)
解码过程中累积注意力权重极高的Token(H2 Heavy-Hitter重击Token):名词、动作动词、坐标指令、边界条件、数值参数;低权重为虚词、连接词、重复冗余内容,可删除。
第一层:上层Prompt/输入侧人工强制保留(零成本,优先做)
1. 固定结构排版,规避Lost in the Middle(中间遗忘)
强制输入模板(VLA机器人任务直接套用)
【永久保留区(头部,绝不删减)】
1. 系统硬约束(电力安全规则、操作禁区、任务目标)
2. 本次顶层语言指令
3. 历史失败Rollout摘要总结
【可变观测区(中部,可压缩)】
当前图像观测描述、关节状态、传感器数据
【最新时序区(尾部,滑动窗口保留)】
最近3步动作轨迹、即时奖励值
原理:模型对开头、结尾Token注意力天然更高,核心规则放头部彻底杜绝中段丢失。
2. 超长历史做摘要压缩,替代原始长Token流(解决Rollout长轨迹退化)
执行逻辑
单条Rollout轨迹过长 → 调用LLM把整条动作序列压缩为高密摘要 → 只把摘要塞进上下文,原始长轨迹存入向量库RAG按需召回。
示例伪代码:
python
# 长轨迹原始文本不直接入上下文
long_rollout_text = "step1移动机械臂...step7碰撞...step10任务失败"
# 压缩为关键Token摘要
rollout_summary = llm(f"精简这条机器人轨迹,只保留动作、结果、失败原因:{long_rollout_text}")
# 仅摘要送入VLA模型输入
prompt = f"历史执行摘要:{rollout_summary},当前新观测:xxx"
3. 冗余Token硬过滤(预处理脚本)
过滤内容:重复语句、换行空格、重复坐标、无效占位符、日志垃圾文本、循环冗余动作描述;直接从源头减少非关键Token数量。
4. 滑动窗口截断(兜底)
多轮对话/多段Rollout只保留最近N轮完整内容,更早内容全部摘要化,例如只保留最近4段轨迹原始内容,更早全部摘要。
第二层:推理KV缓存智能淘汰(工业主流,vLLM一键开启,解决架构级上下文退化)
方案A:H2O(Heavy-Hitter Oracle)注意力打分保留(最通用)
核心逻辑
- 设置KV缓存最大Token预算上限;
- 每一步解码统计所有Token累积注意力总分;
- 缓存溢出时,贪心删除分数最低的低贡献Token;
- 强制保留:开头Sink锚点Token + 高注意力重击Token + 近期新Token。
vLLM 启动命令直接启用(复制可用)
bash
vllm serve your-vla-model \
--gpu-memory-utilization 0.9 \
--enable-h2o \
--h2o-window-size 4096 \
--h2o-heavy-hitter-rate 0.2
参数解释:
h2o-window-size:KV最大缓存Token数heavy-hitter-rate 0.2:20%空间留给高注意力关键Token,80%留给近期新Token
方案B:StreamingLLM(Sink锚点+滑动窗口,长文本稳健)
原理
永久保留前4个初始锚点Token (模型注意力天然依赖的sink token),剩余空间做滑动窗口只保留最新序列,避免直接删开头规则导致任务漂移。
vLLM参数:
bash
--sliding-window 4096
方案C:TRIM-KV(进阶,模型内置打分门控)
给每个Token训练一个留存分数gate,分数随时间指数衰减,永久保留高固有重要性Token,适合长期多轮Agent迭代,需要模型权重原生支持。
补充:KV量化辅助腾出空间(间接保住更多关键Token)
bash
--kv-cache-dtype fp8
FP8压缩KV显存占用一倍,相同显存可以容纳更多高价值关键Token。
第三层:模型内部前向传播时动态剪枝Token(ViT视觉侧,VLA视觉Token保留)
针对VLA视觉编码器图像Patch Token:
1. DynamicViT 动态视觉Token筛选
每层Transformer增加轻量化打分头,计算每个图像Patch重要性分数,删除低关注度背景Patch,只保留设备、操作点、障碍物等关键视觉Token,减少视觉侧冗余输入加剧上下文稀释。
2. 硬规则视觉Token保留
强制保留:机械臂本体、开关、表计、柜体、障碍物对应Patch,其余背景Patch直接裁剪。
第四层:训练侧根治(微调阶段让模型学会识别关键Token)
- 长轨迹RL微调时做Token权重掩码
Rollout轨迹样本训练中,给指令、目标、奖励、安全约束对应Token加更高loss权重,让模型训练阶段就优先绑定关键信息; - LoRA专项微调长上下文注意力
用分段长轨迹数据微调,修正RoPE远距离衰减,提升中段关键Token召回能力; - 负样本Rollout惩罚:因遗忘前置规则导致失败的轨迹加大惩罚loss。
贴合你【电力VLA+Rollout长时序】最终落地执行清单(按顺序做)
- 输入层改造:固定Prompt结构,硬约束放最头部,长Rollout轨迹先摘要再入上下文;
- 推理后端开启H2O :vLLM加
--enable-h2o,限定KV窗口大小,自动留存高注意力动作/指令Token; - 视觉端裁剪:ViT删掉无关背景Patch,只保留电力设备关键视觉Token;
- 缓存兜底:开启FP8 KV量化,提升缓存容量;
- 训练强化:RL微调对规则类Token加权,减少长时序上下文退化导致动作跑偏。
极简一句话总结
人工把硬性规则放最前+长轨迹摘要压缩,推理端用H2O按注意力分数自动保住高贡献Token,视觉端裁剪无效Patch,三层联动彻底解决长Rollout上下文退化。