ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

解密3个控制Token:MOSS-VL-Realtime-FP8实时流式输出协议与silence机制详解

解密3个控制Token:MOSS-VL-Realtime-FP8实时流式输出协议与silence机制详解

【免费下载链接】MOSS-VL-Realtime-FP8

项目地址:https://ai.gitcode.com/OpenMOSS/MOSS-VL-Realtime-FP8
点击查看免费下载

MOSS-VL-Realtime-FP8 是 OpenMOSS 发布的实时视频理解视觉语言模型的 FP8 量化版本,它的核心能力是按时间戳逐帧输入视频流并实时输出描述,而这一切依赖一套由<|silence|>、<|time_start|>、<|time_end|>等控制 Token 构成的流式输出协议。本文带你零基础读懂这套协议:silence 机制如何让模型"该说话时说话、没变化时闭嘴",时间戳包裹如何告诉模型"这一帧是第几秒",以及应用层如何按协议过滤和渲染这些标记。

为什么实时流式推理需要控制 Token

普通对话模型是"问一句答一句",而 MOSS-VL-Realtime 的工作方式完全不同:

  • 输入是持续的视频流:应用侧按 1 FPS 左右不断喂入带时间戳的帧;
  • 输出是主动的:模型不等用户提问,而是自己判断画面有没有变化,有变化才开口;
  • 一个会话贯穿始终:一个模型实例同时只支持一个实时会话,上下文随时间累积。

这意味着模型必须在输出流里携带"元信息":现在这帧是什么时间、我现在要不要说话、这一轮对话到没结束。这些元信息就是通过控制 Token表达出来的,它们是模型词表里真实存在的特殊 Token。

你可以在 added_tokens.json 中看到它们被正式注册的 Token ID:

控制 TokenToken ID角色
<|time_start|>151669时间戳包裹的"开头"
<|time_end|>151670时间戳包裹的"结尾"
<|silence|>151671静默/空闲信号
<|response|>151672响应标记(备用)

3个控制 Token 逐个拆解

1️⃣<|silence|>:静默开关,silence 机制的核心

这是整套协议里最关键的 Token。系统提示词明确告诉模型:当画面没有相关变化时,直接输出<|silence|>(见 modeling_moss_vl.py 中的默认 system prompt)。

它的机制比"输出一个词"要深,包含三层设计:

① 静默即等待。在流式主循环中,每当模型吐出的 Token 恰好是<|silence|>,运行时就把should_wait_for_new_input置为真,然后在这里原地阻塞等待新帧或新提示词到达,而不是继续空转烧算力(见 modeling_moss_vl.py 与 等待逻辑)。这正是实时推理省显存、省延迟的关键——没有新输入时,GPU 不做无用功。

② 唯一的空闲信号。采样前,运行时会把<|...|>(省略号)的得分强制压到负无穷,确保<|silence|>是模型表达"没话说"的唯一通道,避免两种空闲信号混用(见 modeling_moss_vl.py)。

③ 与训练分布对齐。训练数据里每个 assistant 回合的第一个 Token 都是<|silence|>。因此当新提示词和新帧在同一轮一起进来时,代码会手动补插一个<|silence|>,防止推理分布偏离训练分布(见 modeling_moss_vl.py)。

💡 静默阈值silence_threshold被固定为 0.0。上游曾有 0.6 的默认值,结果把概率稍低的合法静默也压掉了,表现为"该闭嘴时模型还在说话"的伪影,因此官方不建议调高。

2️⃣<|time_start|>与<|time_end|>:给每帧盖上时间戳

这两枚 Token 总是成对出现,用来包裹帧的时间戳。每推入一帧,运行时都会把帧拼接成如下形式插入上下文:

<|vision|><|time_start|>12.0 seconds<|time_end|><|image|></|vision|>
  • 时间戳保留一位小数,格式固定为X.X seconds,拼接逻辑见 modeling_moss_vl.py,processor 侧对应实现在 processing_moss_vl.py;
  • 模型由此知道"这一帧发生在第 12 秒",可以谈论"几秒前发生了什么"、"变化正在发生"等时序概念;
  • 会话层强制时间戳非递减:如果推入的帧时间戳早于上一帧,push_frame会直接抛出Frame timestamps must be non-decreasing错误(见 modeling_moss_vl.py)。

3️⃣ 应用层轮次标记:<|round_start|>/<|round_end|>

严格来说这两个标记不在模型词表里,而是运行时往输出队列里投递的协议级标记,供应用层区分轮次边界:

  • 每当一条新的用户提示词进入队列,运行时先向输出队列放入<|round_start|>并清空 Token 缓冲(见 modeling_moss_vl.py);
  • 一轮生成结束或发生错误时,放入<|round_end|>收尾(见 modeling_moss_vl.py)。

前端收到它们时可以做"新一轮回答开始/结束"的 UI 渲染,或者简单过滤掉。README 中也有明确提示:模型输出流中可能出现<|silence|>、<|round_start|>、<|round_end|>等控制 Token,应用侧应按协议过滤或渲染(见 README_zh.md)。

一次完整的流式轮次长什么样

把上面的机制串起来,_real_time_sample主循环(modeling_moss_vl.py)每一轮做三件事:

  1. 前向一步,产出 1 个 Token:若是<|silence|>,标记"接下来等新输入";
  2. 解码推送:多字节片段会先进缓冲区拼完整再放入输出队列,避免中文出现半字节乱码;
  3. 排空队列并拼接新内容:把等待中的帧(带时间戳包裹)和新提示词拼进上下文,为下一轮前向准备好状态。

节拍由max_tokens_per_turn控制(Token/秒上限),官方示例中常用 12,配合 1 FPS 的推帧节奏,输出平滑且跟得上实时性。

快速上手:创建会话并观察控制 Token

session = model.create_realtime_session( processor, initial_prompt="持续描述视频中的重要变化,没有明显变化时保持安静。", frame_queue_size=1, max_tokens_per_turn=12, ) session.start() for image, ts in frames: # (PIL.Image, 非递减时间戳) session.push_frame(image, timestamp=ts) while chunk := session.poll_output(timeout=0.0): print(chunk, end="", flush=True) # 可能含 <|silence|> / <|round_start|> / <|round_end|> session.close()

会话 API 完整定义在 MossVLRealtimeSession,包括push_frame、push_prompt、poll_output、stream_outputs等方法,create_realtime_session入口见 modeling_moss_vl.py。

常见疑问速答

  • 输出里出现<|silence|>是 Bug 吗?不是,它是"当前无需发言"的正常信号,直接过滤即可。
  • 时间戳可以乱序吗?不行,必须非递减,否则push_frame抛 ValueError。
  • 为什么要trust_remote_code=True?流式与量化缓存代码随 checkpoint 发布在 modeling_moss_vl.py 中,加载时需信任自定义代码。
  • FP8 量化影响流式输出吗?不影响协议本身。权重用 FP8 E4M3 + 动态激活,KV Cache 用 HQQ INT8(配置在 generation_config.json 与 recipe.yaml 中),Benchmark 显示量化后 OVOBench Avg 仅从 70.86 降到 70.66,几乎无损。

关键文件导航

文件内容
modeling_moss_vl.py流式主循环、会话封装、silence 阈值与帧拼接逻辑
processing_moss_vl.py时间戳 Token 定义与帧格式化
added_tokens.json控制 Token 及其 Token ID
special_tokens_map.json特殊 Token 注册清单
tokenizer_config.json分词器配置(含<|silence|>等)
README_zh.md中文使用文档:安装、加载、流式推理示例

理解了<|silence|>的等待机制、时间戳包裹和轮次标记这三个环节,你就掌握了 MOSS-VL-Realtime-FP8 实时流式输出协议的全部核心。剩下的,就是接入你的摄像头或视频流,观察模型在"说话"与"闭嘴"之间自如切换了。

【免费下载链接】MOSS-VL-Realtime-FP8

项目地址:https://ai.gitcode.com/OpenMOSS/MOSS-VL-Realtime-FP8
点击查看免费下载
上一篇:NES.css与PWA:8位像素风格应用的离线体验增强方案
下一篇:Mastering 项目协作规范:代码风格与提交信息格式

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进