平行约束解码:在 Apple Silicon 上把结构化 JSON 生成加速 5 到 7 倍

作者:Harsha Gundala(@harshagundal,开源实现);本刊补充背景与延伸分析

9 月 15 日,TypeSafe 发布 System One 模型与 Jev:类型安全的结构化输出、校准概率、并行采样,两年隐身加融资。

9 月 16 日,Harsha Gundala 用两小时复刻了同一件事的推理形态并开源——Qwen-2.5-1B-RLCD,M4 上结构化 JSON 延迟降低 5.6 到 7.0 倍,他在随后一条推文里说 GPU 上最高能到 70 倍。

模型比 Jev 小得多,但机制是同一件事。

洞察:结构化决策不需要自回归

标准的 JSON 模式(JSON mode、语法引导采样)都是逐 token 生成:

上下文提示 → { → "risk" → : → "HIGH" …… 一个 28 字段的 schema 要跑三百多次顺序前向。

每一次前向都要读一遍权重、走一趟 KV cache。字段越多、输出越长,延迟线性增长。

但这套推理引擎抓的是另一个事实:在结构化抽取和分类里,字段取值属于有界候选集——布尔值,或者枚举。既然是有限选项,就没有必要「生成」,只需要在这些选项上打一次分。

具体做法分五步:

一、前缀预填一次。上下文文档和 schema 的语义描述只 prefill 一次,KV cache 留在统一内存里。

二、KV cache 广播。把这份 cache 在 batch 维度复制成 M 份(M = 字段数)。代码里就是一行:nc.keys = mx.repeat(c.keys, M, axis=0)。

三、子词表 logit 切片。每个字段只评估属于它合法候选的 token id,其余词表全部 mask 掉,然后在候选切片上做精确的 softmax——这就是那个「校准过的概率」。

四、多 token 候选消歧。当两个候选共享多 token 前缀时,用切片后的 cache 续接一步,零额外显存分配。

五、程序化拼装。JSON 由验证过的取值直接构造出来,所以语法有效性是构造保证的——不是解析器检查出来的,是压根不可能出错。

于是前向次数从 O(K) 次(K = token 数)变成 1 次批处理前向。这就是为什么 28 字段从 1,900 毫秒降到 270 毫秒,255 个选项的单字段从 500 毫秒降到 89 毫秒。

数字(M4 Max,Qwen2.5-1.5B-Instruct-4bit,统一内存占用约 1.1GB)

金融欺诈路由(4 字段):420 毫秒 → 75 毫秒,5.6 倍

代码安全审计(4 字段):380 毫秒 → 68 毫秒,5.6 倍

高基数关税分类(1 字段 / 255 选项):500 毫秒 → 89 毫秒,5.6 倍

企业工单分诊(28 字段):1,900 毫秒 → 270 毫秒,7.0 倍

四个场景的 schema 有效性都是 100% 保证。基准输出里那两列对比很有意思:自回归基线要 148 到 312 次前向,并行约束解码是 1 次。

和 TypeSafe 的关系

TypeSafe 的 System One 有四个要件:RLCD(面向校准决策的强化学习)训练、并行采样器、类型安全输出、校准概率。Jev 是训练过的模型。

这份开源实现证明的是:推理形态本身不需要训练。任何 instruct 模型都能这样解码——它在提示里构造一份「候选目录」,然后一次性对所有字段打分。

训练买到的是校准质量,不是可行性。这反过来也点出了 TypeSafe 真正的护城河在哪:不在「能并行打分」(这是几行代码),而在「概率准不准」。

为什么这件事值得继续深挖

第一,它改变了 agent 架构里的默认件。路由、分类、护栏、字段抽取、打分——这些「决策型调用」在 agent 系统里占了极大比例,过去它们被当成「生成 JSON」,现在可以当成「一次批处理打分」。成本模型完全不同。

第二,推理与决策可以拆成两条流水线。前沿模型负责「想」(规划、写代码、长链推理),1B 级的决策模型负责「判」(路由、护栏、抽取),各自按各自的成本和延迟预算运行。本机就能跑,1.1GB 内存。

第三,它也划出了边界。字段必须有界候选集,开放式文本仍然需要生成;单次前向意味着没有逐字段的思维链,推理必须在 prefill 或者上游完成;校准的好坏完全取决于基座模型。这些都是能测的东西,不是观点。

第四,生态信号本身值得记:当天就出现了至少四个衍生版(LFM2.5-350M、LFM2.5-2.6B 等);作者后来又发了「它在设备上跑 Doom,150 毫秒延迟」。一个需要两年隐身加融资的想法,被两小时复刻,一天内被 fork——这个传播速度本身就是这个时代的一手材料。

怎么上手

Hugging Face 上有并排对比的在线 demo(drinkmoonshine/parallel-constrained-decoding,跑在一张 a10g 上):左边并行约束解码,右边自回归流式生成,带实时毫秒计时、同步滚动和高亮对应字段,还会把自回归那一侧遗漏或幻觉出来的 key 标出来。

代码结构很干净:core/engine_mlx.py(Apple Silicon)与 core/engine_torch.py(CUDA)双后端,core/schema.py 定义 StructuredSchema(enum / boolean,枚举最多 255 个选项),附带四个企业预设和命令行基准测试——python3 -m core.benchmark 就能在自己的机器上重跑一遍那些数字。

原文:https://huggingface.co/harshatheg/Qwen-2.5-1B-RLCD

在线 demo:https://huggingface.co/spaces/drinkmoonshine/parallel-constrained-decoding

原始推文:https://x.com/harshagundal/status/2100044305536889015

#结构化输出 #本地推理 #约束解码