开源llama.cpp Releases·原文 2026年10月26日

llama.cpp b11888修复长token在语法约束下总被拒的问题,并加速语法采样

该版本把语法采样中候选拒绝的递归改为自带层级栈的循环:长度超过 256 字符的token(如GLM-4.7-Flash的 512 空格token和Laguna-S-2.1的长空格token)不再因深度上限被一律拒绝,生成的掩码与master一致;提交说明称在GLM-4.7、Laguna、Qwen3.6、gemma-4上配合json、list、spaces语法采样快于master。以上为提交说明中的说法。

AI解读:llama.cpp发布b11888,核心改动在grammar模块:llama_grammar_reject_candidates_for_stack原有的深度上限统计的是词表token的码点数,导致长度 256 字符及以上的token在语法约束下总被拒绝。

受影响的例子包括GLM-4.7-Flash的 512 个空格token,以及Laguna-S-2.1的长空格token。新实现改为用自身的层级栈逐码点遍历,不再递归,提交说明称任意长度的GGUF token都没有上限和栈风险,且掩码与master相同。

候选拒绝改为以输入候选的下标而非副本记录层级;提交说明称在GLM-4.7、Laguna、Qwen3.6和gemma-4上,使用json、list、spaces语法时语法采样比master更快,掩码不变。

同一批改动还给common的schema遍历加入depth_guard,把GRAMMAR_RECURSIVE_LIMIT移入 .cpp,并降低PEG parser的递归上限;提交说明把递归深度限制称为一项要求。

发布页提供macOS(arm64、x64)、iOS XCFramework、Linux(CPU、Vulkan、CUDA 12.8/13.4、ROCm 10.0、OpenVINO、SYCL)、Android、Windows、Snapdragon及UI等构建包,openEuler构建标注为DISABLED。

llama.cpp发布b11888,主要改动是把语法采样中的候选拒绝从递归改为循环。提交说明称,原先llama_grammar_reject_candidates_for_stack的深度上限按词表token的码点数计数,因此长度达到 256 字符的token在语法约束下会一直被拒绝,例如GLM-4.7-Flash的 512 空格token和Laguna-S-2.1的长空格token。

长token被误拒的修复方式

按提交说明,新的拒绝逻辑改为用自身的层级栈遍历码点,不再递归,因此对来自GGUF的token没有长度上限,也没有栈风险,生成的掩码与master一致。

候选的追踪方式也变了:同一码点下,候选与输入只差码点指针位置,现在层级保存的是指向输入候选的下标而非副本,拒绝结果可直接映射回输入。

  • 受影响对象:长度 256 字符及以上的词表token
  • 举例:GLM-4.7-Flash的 512 空格token、Laguna-S-2.1的长空格token
  • 提交说明称修复后掩码与master相同

提交说明中的性能说法与其他改动

提交说明称,语法采样在GLM-4.7、Laguna、Qwen3.6和gemma-4上搭配json、list、spaces语法时比master更快,掩码不变。这一比较来自提交说明,未给出具体数值。

  • common的schema遍历加入depth_guard
  • GRAMMAR_RECURSIVE_LIMIT移入 .cpp
  • PEG parser的递归上限降低,提交说明称递归深度限制成为一项要求

构建包覆盖

发布页列出macOS Apple Silicon与Intel、iOS XCFramework、Linux(CPU、Vulkan、CUDA 12.8与 13.4、ROCm 10.0、OpenVINO、SYCL FP32/FP16)、Android、Windows多后端及Snapdragon平台构建包。openEuler构建与macOS arm64的KleidiAI构建均标注为DISABLED。

信息来源

llama.cpp Releases原始来源

更多

新闻专题
外观