我构建了一个GBNF语法编译器,使8B模型能够可靠地调用工具——以下是它的工作原理(深度解析)
摘要
一位开发者用Rust为llama.cpp构建了一个GBNF语法编译器,该编译器强制遵循工具调用的JSON模式,使小型模型(如8B参数)能够可靠地调用工具。该系统每次调用时将语法限制为仅匹配的工具,提高了可靠性。
我一直在用Rust构建一个本地代理(Eris),它运行在llama.cpp上,并使用Obsidian兼容的存储库作为记忆。约有50个工具(存储库读/写、记忆、提醒、网页抓取、邮件、日历、视觉)。最大的痛点是让小型模型输出有效的工具调用JSON。各位都知道这个问题:模型将JSON包裹在代码围栏中,编造工具名称,忘记闭合大括号,在对象后面添加尾随文本。我的解决方案:在会话开始时,我将每个工具的JSON Schema编译成GBNF规则,这样采样器不仅强制执行“有效JSON”,还强制执行“对于这个特定工具有正确的键、类型和枚举值的有效JSON”。然后在每次LLM调用之前,我将语法缩小为仅语义路由器为此轮匹配的工具。8B模型在3个工具之间选择而不是50个=更加可靠。我写了一篇详细的技术文章,介绍了它的工作原理,并包含了项目中的实际代码:https://eris-system.dev/blog/gbnf-grammars 在4080(16GB VRAM)上运行Gemma 4 12B。在聊天+约32k上下文+视觉上效果很好。仓库:https://github.com/janpauldahlke/eris (Apache 2.0) 很高兴回答关于语法编译器、恢复循环或架构的问题。
相似文章
如何让小型的本地AI模型不再破坏JSON——一种基于语法的方法
作者介绍了一种使用llama.cpp中的GBNF语法来约束本地AI模型输出、确保生成有效JSON的方法。构建了一个编译器,将工具模式转换为语法规则,并在每轮对话中缩小范围,只保留相关工具。
小大脑,大成就:探索紧凑型语言模型
本文对17个紧凑型语言模型(1B-8B参数)在俄语RAG系统中作为生成器进行了基准测试,仅使用CPU推理,发现Qwen系列模型在私有、无GPU部署中提供了出色的质量-延迟权衡。
我对 PrismML 的 1-bit Bonsai-8B 与 IBM 的 Granite 在 CPU 工具调用上进行了基准测试。1-bit 模型胜出,但仅在语法约束解码下。
对 PrismML 的 1-bit Bonsai-8B 与 IBM 的 Granite 及其他模型在 CPU 工具调用上的独立基准测试显示,在语法约束解码下,Bonsai-8B 的通过率达到 92%,超越了更大的模型,但在无约束条件下失败。Granite 是原始表现最好的模型,通过率为 72%。
10,000 Lines Later: When a Tool Became a Compiler - Rob Durst - Gleam Gathering 2026
Rob Durst 在 Gleam Gathering 2026 上分享了如何用 Gleam 将 YAML-to-Terraform 的配置工具重写为编译器,并从中体会到类型驱动设计和解码器模式的力量。
以Zig风格构建你的项目
作者详细介绍了构建一个名为bygge-zig的工具,该工具使用Zig构建系统来编译Rust项目,用更少的代码行复制了Cargo的功能,并突出了其中的差异和挑战。