我构建了一个GBNF语法编译器,使8B模型能够可靠地调用工具——以下是它的工作原理(深度解析)

Reddit r/LocalLLaMA 工具

摘要

一位开发者用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) 很高兴回答关于语法编译器、恢复循环或架构的问题。
查看原文

相似文章

小大脑,大成就:探索紧凑型语言模型

Hugging Face Daily Papers

本文对17个紧凑型语言模型(1B-8B参数)在俄语RAG系统中作为生成器进行了基准测试,仅使用CPU推理,发现Qwen系列模型在私有、无GPU部署中提供了出色的质量-延迟权衡。

以Zig风格构建你的项目

Lobsters Hottest

作者详细介绍了构建一个名为bygge-zig的工具,该工具使用Zig构建系统来编译Rust项目,用更少的代码行复制了Cargo的功能,并突出了其中的差异和挑战。