![]()
扩散语言模型展现出较高的发展潜力,但在代码等形式语言生成任务中,仍难以稳定满足语法约束。
针对这一问题,本文提出了针对扩散语言模型约束解码方法 —— LAVE,通过对扩散语言模型的中间输出进行前瞻补全与语法验证,为模型生成过程提供了可靠的语法保障。
实验表明,LAVE 能够显著提升多种扩散语言模型生成形式化语言(例如源代码、JSON、化学表达式)的语法正确率,同时改善功能正确率,并保持较低的推理开销。相关论文已被软件工程顶会 ISSTA 2026 接收,代码已开源。
本研究由清华大学人工智能学院 AI Agent 课题组完成。通讯作者为清华大学人工智能学院李佳助理教授,主要研究方向包括 AI Agent、AI Safety、Software Engineering 等。第一作者张奕彤为清华大学人工智能学院 2026 级直博生,主要研究方向为 AI Safety。
![]()
- 论文标题:Lookahead-then-Verify: Reliable Constrained Decoding for Diffusion LLMs under Context-Free Grammars
- 论文链接:https://arxiv.org/pdf/2602.00612
- 代码链接:https://github.com/THU-Agent/LAVE
研究背景
扩散语言模型正在成为自回归语言模型之外一条具有发展潜力的技术路线。自回归语言模型按照从左到右的顺序逐个生成 token;扩散语言模型则从一段由 [MASK] 构成的序列出发以非顺序的方式生成 token。由于一次前向传播可以同时预测所有位置的 token 概率分布,扩散语言模型天然地具有并行解码和高效推理的潜力,催生了 LLaDA、Dream 和 Gemini Diffusion 等扩散语言模型的出现。
![]()
随着扩散语言模型逐渐被用于代码、JSON 和 SMILES 等形式语言生成任务,其输出能否符合语法约束成为影响其实际应用的重要因素。对于这些形式语言,任何语法错误都会导致输出无法使用。论文的初步实验显示,流行的扩散语言模型 Dream-7B 在 HumanEval-CPP 上的语法错误率高达 23.8%,说明现有扩散语言模型仍难以稳定生成符合语法约束的输出。
约束解码是提高形式语言生成语法正确性的常用方法,被广泛用于提高自回归语言模型的生成结果可靠性。它在推理过程中引入目标语法,并根据当前生成状态实时地限制下一步允许生成的 token 集合,使中间输出始终保留扩展为合法输出的可能。对于代码、JSON、SMILES 等多数形式语言,上下文无关文法(Context-Free Grammar)可以基本描述其语法,上下文无关文法的语法解析器(如 Earley Parser)则可以判定一个中间输出是否仍能扩展为符合语法约束的完整输出。
在自回归语言模型中,约束解码实现起来较为直接。模型始终从左向右生成,因此任意时刻的中间输出都是一个不含空缺的完整前缀。语法解析器可以直接判断该前缀是否可扩展,并据此确定下一步允许生成的 token。扩散语言模型的中间输出则常常是包含空缺的不完整前缀。例如:
![]()
此时,已经生成的中间输出中仍保留若干 [MASK]。现有语法解析器通常只能处理不含 [MASK] 的完整前缀,因而无法直接判定这类不完整前缀是否仍能补全为符合语法约束的完整输出。
解决了什么问题?
论文研究的核心问题是:
给定一个含有 [MASK] 的不完整前缀,如何判断是否存在一种补全,使补全后的完整前缀仍可扩展为符合语法约束的完整输出?
例如,对于下面的不完整前缀:
![]()
一种合法的补全是:
![]()
由于 return a > b ? a : b 可以被扩展为符合语法约束的完整输出,因此自然地 return a [MASK] b ? [MASK] : b 也可以扩展为符合语法约束的完整输出。
然而,直接枚举所有补全并不可行。前缀中的每个 [MASK] 都可能对应词表中的大量 token (如 100000 规模的词表),多个位置组合后会形成指数规模的候选空间,在实践中不可行。因此,实际挑战在于:如何利用有限的计算开销,找到一个能够证明当前前缀仍然可扩展的补全。
提出了什么方法?
针对上述问题,论文提出了LAVE。其核心思想是Lookahead-then-Verify即 "先前瞻,再验证"
扩散语言模型在一次前向传播中,会同时给出所有位置的 token 概率分布。LAVE 利用这些概率分布,为当前不完整前缀生成若干高概率的候选补全,再使用语法解析器验证补全后的完整前缀是否可扩展。
![]()
具体而言,当模型在某个 [MASK] 位置生成一个新 token 后,LAVE 首先将该 token 暂时写入当前输出。随后,算法找到最右侧的已生成 token,并截取从输出开头到该位置的内容,作为当前需要验证的不完整前缀。
对于其中剩余的 [MASK],LAVE 根据模型预测的概率分布进行采样。例如:
![]()
可能被补全为:
![]()
这些候选已经不含 [MASK],可以直接交给语法解析器。语法解析器并行地检查每个候选是否仍能扩展为符合语法约束的完整输出。
只要存在任意一个候选通过验证,当前新提出的 token 就会被接受;如果所有候选都不可扩展,该 token 将被拒绝,模型将会重新生成新的 token。
实验结果与分析
研究团队在 LLaDA-8B、LLaDA-1.5、Dream-7B 和 DiffuCoder-7B 四个有代表性的扩散语言模型上进行了评测,实验覆盖 C++、JAVA、GO、JSON 和 SMILES 等形式语言的生成任务。
![]()
- 结果显示,LAVE 在不同模型和任务上均显著提高了语法正确率。四个模型在五项任务上的平均语法正确率均接近 100%。
![]()
- 语法正确率的提高也带来了功能正确率的提升。例如,在 Dream-7B 的 C++ 任务上,功能正确率从 25.6% 提高到 33.5%。
![]()
- 在推理效率方面,LAVE 引入的额外开销总体有限。例如,与无约束生成相比,其平均推理时间在 JSON 任务上仅增加约 3%。在 SMILES 任务中,我们的方法减少了无关自然语言的生成,平均推理时间反而有所下降。
特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.