📌 项目地址:cactus-compute/needle | ⭐ 4,060 颗星 | 🔧 Python | 📜 未标注
这个项目解决了一个很具体的问题
大模型工具调用通常意味着三件事:大量参数、GPU 显存、网络请求。手机和物联网设备上没法这么干,又确实需要结构化输出能力。
Needle 2 把这条路走通了:一个 45M 参数的完整模型,权重直接烘焙进单个 14MB 的二进制文件,推理时整个会话约占用 28MB 内存。不需要神经网络推理框架,不需要单独的权重文件,不需要联网。对于电池供电、内存受限的设备来说,这是完全不同的取舍。
它做的是工具调用(function calling)、设备操作和结构化信息提取——把自然语言指令转成结构化的 JSON,然后交付给设备上的应用逻辑。
14MB 里装了什么
技术核心是一个叫 Simple Attention Network(SAN)的架构。论文在 arXiv:2607.18363,仓库里也有实现。几个关键设计:
- Hadamard MLP 替代 FFN:用 Walsh-Hadamard 变换(一个固定矩阵)做变换,不需要读取权重,时间复杂度 N log N。
- GQA 注意力:分组查询注意力,减少 KV 缓存。
- Engram 记忆:基于哈希 n-gram 表的键值记忆。
- 多通道超连接:四个残差流,RMS 归一化后展平。
模型量化到 CQ2-bit(Cactus Quants),对比同类的 FunctionGemma 270M、LFM2.5 230M、Apple FM 等模型时,体积小 5 到 70 倍,精度从 f16 压到 2 bit。
工具调用的四个关键机制
这些机制决定它能不能在真实设备上可靠工作:
结构化的调用合约:工具调用以结构化数据返回——文本进,JSON 出。模型在解码时受一个字节级文法的约束,这个文法是从你声明的 JSON Schema 编译出来的,每个 token 都不能偏离。
置信度门控:每个响应带一个从学习头输出的校准置信度分数。你可以设置阈值:高于阈值就执行,低于就转人工或提示用户。
内置工具检索:工具目录可以很大,但每轮只会把排名前五的工具喂给模型,文法也只约束到这一子集。如果你在设备上声明了一百个工具,模型不会在无关的工具上浪费注意力。
有界记忆:256 token 滑动窗口,工具描述通过 KV sinks 固定住。不管对话多长,总内存保持在 28MB 左右。这意味着内存占用可预测,适合长时间运行的设备端服务。
实际用法
安装就是一条命令:
pip install cactus-needle
核心用法是用 Python 装饰器声明工具。函数签名给出参数类型,docstring 是工具描述,然后调用 run() 完成循环。README 明确指出:”Needle reads your tool descriptions to decide what to call and how to fill arguments, so describing them well is the whole game.”——描述工具质量直接决定调用准确率。
三种声明工具的方式,控制力递增(从装饰函数到完全手动声明 Schema),具体 API 参考官方仓库文档。
推理引擎首次从 Hugging Face 拉取后缓存在本地,跑起来后完全离线。没有额外的构建步骤,pip 装完即可用。同时支持 LoRA 微调和导出(把模型部署到非 Python 环境)。
边界和注意事项
这个模型是用于嵌入式设备的,不是通用聊天助手。45M 参数的模型在复杂推理、长文本理解上不可能和 70B 模型比。它的任务是窄而明确:把指令变成 JSON。
另外几点值得注意:
- 零网络推理:权重在本地,但你需要先确保推理引擎已经下载缓存。
- 置信度阈值需要调:不同任务、不同工具集下,置信度分数分布可能不一样,阈值需要实际测试。
- 工具描述的质量决定一切:模型没有内建的世界知识来”猜”你的工具的意图,清晰、明确的描述是准确调用的前提。
- 许可证:需要去 Hugging Face 权重页和 GitHub 仓库确认具体的开源许可证,README 里没有明确说明。
对于工具调用场景,它的竞争力在于一个非常独特的组合:模型文件小到能塞进固件、内存占用固定、推理不依赖网络、输出随时可被程序消费。如果你的设备端应用正好需要这样的结构化输出能力,14MB 换来的是完全没有网络依赖的本地推理,这个成本结构值得深入看。