yzma
纯Go语言通过purego FFI直接集成llama.cpp本地LLM推理框架,支持CUDA/Met
加载项目详情…
本应用为开源项目,仅供学习研究,请遵守其开源协议。
纯Go语言通过purego FFI直接集成llama.cpp本地LLM推理框架,支持CUDA/Met
加载项目详情…
本应用为开源项目,仅供学习研究,请遵守其开源协议。
想象这样一个场景:你是一名 Go 后端工程师,手里维护着一套 Go 微服务,某天产品经理突然提出需求——「能不能在服务里加一个 AI 对话功能?」。大多数人的第一反应是调 OpenAI API,但随之而来的是数据隐私顾虑、网络延迟、以及每月账单的问题。有没有一种方案,能让 Go 程序直接调用本地运行的大模型,不依赖任何外部服务,同时还能充分利用本机 GPU 加速?
yzma 正是为解决这个问题而生。它由 hybridgroup 团队(著名开源硬件/机器人项目 ArduPilot 的维护者)开发,是一个让 Go 应用程序直接集成 llama.cpp 推理引擎的底层框架。项目名 yzma 来自埃及神话中的天空女神,读作「噢兹玛」,标语是「Go with your own intelligence」——用你自己的智能。
该项目于 2025 年 9 月创建,不到一年时间已获得 505 颗 GitHub 星,展示了开发者社区对「在 Go 生态中使用本地 LLM」这一方向的强烈需求。Topics 包括:cuda、gguf、golang、llama、llamacpp、llm、metal、purego、raspberry-pi、rocm、vlm、vulkan 等,覆盖了主流 AI 推理和硬件加速方向。
yzma 最核心的技术亮点在于它完全不使用 CGO,而是通过 purego 和 ffi 两个 Go 包实现对 llama.cpp C 库的动态链接。
CGO 的问题在哪里? 传统 Go 调用 C 库需要 CGO,而 CGO 的编译开销大、交叉编译困难、部署复杂度高。对于一个需要发布跨平台(Linux/macOS/Windows)二进制文件的工具来说,CGO 是噩梦。
purego 如何绕过? purego 允许 Go 代码在运行时动态加载任意 .so/.dylib/.dll 文件,并通过函数指针直接调用其中的 C 函数。yzma 在 pkg/llama/ 目录下为 llama.cpp 的每一个 C 函数都写了对应的 Go wrapper——llama_backend_init、llama_model_load_from_file、llama_decode 等等。
项目 go.mod 依赖:
require (
github.com/ardanlabs/jinja v1.1.0 // 模板引擎
github.com/ebitengine/purego v0.10.0 // 核心 FFI 机制
github.com/hashicorp/go-getter v1.8.3 // 模型下载
github.com/jupiterrider/ffi v0.6.0 // 底层函数指针
github.com/urfave/cli/v2 v2.27.7 // CLI 框架
golang.org/x/sys v0.41.0 // 系统调用
)
// 加载 llama.cpp 动态库
llama.Load(os.Getenv("YZMA_LIB"))
// 初始化后端
llama.Init()
// 从 GGUF 文件加载模型
model, _ := llama.ModelLoadFromFile(modelPath, llama.ModelDefaultParams())
// 创建推理上下文
ctx, _ := llama.InitFromModel(model, llama.ContextDefaultParams())
// 执行推理
batch := llama.BatchGetOne(tokens)
llama.Decode(ctx, batch)
项目在 ROADMAP.md 中明确标注了其 llama.cpp API 覆盖率:超过 91%。从 backend 初始化、model 加载、context 管理、vocab 分词、sampler 采样、到 KV cache、LoRA 微调、MoE 专家选择、Draft model 推测解码——几乎所有主流功能均已覆盖。
yzma 提供的不仅是「加载模型然后生成文字」这么简单。项目内置了丰富的功能模块和示例程序:
| 功能 | 说明 |
|---|---|
| LLM 推理 | 所有 GGUF 格式量化模型(Q2_K ~ F16) |
| VLM 推理 | 支持 SmolVLM 等视觉语言模型,图片 + 文字多模态输入 |
| Embedding | 文本向量化,用于 RAG 等场景 |
| LoRA 微调 | 加载 adapter 权重进行微调推理 |
| MoE 支持 | 混合专家模型,可选择性激活专家 |
| 推测解码 | Draft model 加速生成 |
| KV Cache 管理 | pkg/llama/memory.go 实现 GPU/CPU 内存管理 |
安装后用户获得一个功能完整的 CLI:
go install github.com/hybridgroup/yzma/cmd/yzma@latest
yzma install --lib ~/yzma-lib --processor cuda # 安装 CUDA 版 llama.cpp 库
yzma model get -u <hf-url> # 下载 GGUF 模型
yzma model list # 查看已下载模型
yzma system info # 查看系统硬件信息
yzma install 命令能自动检测操作系统和硬件(CUDA/Metal/Vulkan/ROCm),从 GitHub Release 下载预编译的 llama.cpp 库,大大降低了配置门槛。
examples/ 目录下提供了 8 个完整的参考实现,每个都有详细 README:
yzma 的一大竞争力在于其跨平台硬件加速支持:
在 pkg/utils/utils_linux.go、utils_darwin.go、utils_windows.go 中分别针对各平台做了底层接口适配。对于 Jetson Orin Nano、Raspberry Pi 4/5、Arduino UNO Q 等边缘设备也有专门的文档说明。
yzma 不仅仅是一个技术演示,已被多个真实项目采用:
| 项目 | 类型 | 说明 |
|---|---|---|
| Kronk | 高层 API | OpenAI 兼容接口,底层基于 yzma |
| Fantasy | AI Agent 框架 | Charmbracelet 出品,多 Provider/多模型 |
| wasmVision | CV 引擎 | 高性能计算机视觉处理 |
| NornicDB | 图数据库 | 面向 AI Agent 的知识图谱数据库 |
| ImmyGo | Go UI 框架 | 描述式 GUI 开发,内置 yzma 本地 AI 能力 |
| Crush | Agent 编程 | Charmbracelet 出品,Agent 编程工具 |
go install,30 秒)yzma install --lib,5 分钟,含硬件检测)yzma model get,按模型大小,5-30 分钟)go run examples/chat/main.go)go.mod 中声明了 go 1.26.0yzma 是当前最完整的纯 Go llama.cpp 绑定方案,其核心价值在于:
局限性:
总体而言,yzma 为 Go 开发者打开了一扇通往本地 AI 推理的大门——不依赖云服务、不需要 Python 环境、不引入 CGO 开销,真正实现「Go + 本地大模型」的原生集成。对于需要在 Go 后端服务中嵌入智能能力、同时严格控制数据隐私的场景,yzma 是目前最值得评估的技术选型之一。