这周翻下来,只有一篇值得单独讲。10 月 21 号挂到 arXiv,编号 2610.29749,12 页,5 张图。标题里的关键词是 metamodel-guided decoding。
它要干的事一句话讲清楚:让模型生成 DSL,光把语法写对不算数。
约束解码这词同行都熟。生成的时候每一步把不合法的 token 挡在门外,只让它在走得通的路上选。听起来挺完备,实际大部分实现只堵住了具体语法那一层。
DSL 底下还压着两层。一层是元模型定义的抽象语法,一层是挂在元模型上的良构性约束。
举个最土的例子。一个状态机,一条 transition 的源和目标语法上都是合法标识符,指的那个 state 却没定义。文本层面一个字符都没错,模型层面这个实例是废的。
这种错,事后再查能查出来。但你要是把生成接在一条自动化流水线里,事后查出来只能整条重来。这篇要解决的正是这个地方。
有个细节挺说明问题:它的主分类挂在 cs.SE 底下,cs.AI 只是交叉列出。这是软件工程圈的人在解决软件工程的麻烦,不是 NLP 圈在刷榜。两类论文读起来的味道很不一样。前者一般不太关心 SOTA 那两个小数点,关心的是这玩意儿能不能塞进现有工具链。
框架叫 MeMoDecode。作者是 Boqi Chen、Aren A. Babikian 和 José Antonio Hernández López。
做法不复杂,两句能讲完。模型每吐出一个完整的元模型概念,就把当前输出增量地映射成一个部分模型,然后问一句,这东西还有没有可能补全成一个一致的实例。答不上来就退回最近一个还站得住的快照,从那儿接着解码。
关键是那个“概念”的粒度。不是 token 级,也不是整段生成完再验。token 级的检查根本看不见结构,整段验又太晚。卡在中间这一档,是这篇真正下功夫的地方。
实验铺得不算小。4 种 DSL,6 个开源权重模型,参数从 0.6B 到 70B。结果:相对无约束解码平均提 23%,相对语法约束解码平均提 8%。运行时间开销,作者的说法是适度。
23% 那个数我不太在意。无约束解码本来就容易出错返工,把它按下去不算本事。
真正值钱的是那 8%。这 8% 是在语法已经堵住的前提下多出来的,解决的是最难解决的那一段。做这类工作的人都知道,前面那 90% 好办,最后一截最费劲。
不过这里得说一句。8% 是平均数。平均数在这种实验里往往意味着分布很不均,有的 DSL 上可能提了二十几个点,有的可能一个点没动。逐项的数我没拿到,这条先存疑,别拿平均数当结论用。
还有一个比数字有意思的地方:模型规模从 0.6B 跨到 70B,方法都成立。说明它省下来的不是“模型不够聪明”的那部分,是“结构约束本来就不该指望模型自己记住”的那部分。这两件事经常被混着说,其实根本不是一回事。
理论上作者也给了个性质,大意是只要后端验证器可靠,在某些自然假设下,它的表现不会比语法约束解码差。这段我只读懂一半。那个对齐性指标的定义我没吃透,先放在这里,等我搞明白再补一句。
现在说个我不太确定的怀疑。4 种 DSL 是个不小的数,但 DSL 这个家族太大了。图模型、状态机、配置文件、查询语言,各自的难点不在一处。最难的通常是跨引用,一个文件里的东西指向另一个文件里的东西,局部快照根本判断不了。这 4 种里要是没有跨文档引用的场景,8% 就偏乐观。我不知道有没有,这条纯猜。
不讲 DSL 的人,这篇有什么用?
我的看法是,它把一件常被忽略的事摆到台面上:一个模型能不能用,很多时候不取决于它多聪明,取决于你有没有在它输出的路上设卡,以及卡设得多细。粒度粗一点细一点,效果差得可能比换个模型还大。
这条对做 agent 的人一样成立。你让它生成结构化的东西,事后校验和生成中校验,成本差一个量级。前者失败一次重跑一遍,后者失败退一步。
约束解码这条线一直不太有人讲。原因也简单,它没法做演示。你没法把“生成的每一段都保证结构合法”剪成一段能传播的短视频,它只能体现在失败率的下降上,而失败率是看不见的。看不见的东西,就容易被当成不重要。
还有那个重试机制。简单得不能再简单,检测到不一致就退回上一个可补全的快照。没什么花活。但这类系统里,一个简单办法能稳定运行,比一个聪明办法运行不稳强。
理论那段我讲得含糊,有看懂的欢迎回来给我补。
本周就这些,下周见。
