昨天刷到一个项目给我整沉默了——Needle,一个26M参数的模型,专门干函数调用(function call)这件事。
说人话:就是你问它「北京今天天气怎么样」,它能老老实实给你生成一个get_weather(location="北京")的调用,而不是在那儿废话连篇写一大段文字描述。
这项目是从Gemini 3.1蒸馏来的,权重完全开源,HuggingFace上直接下载。Mac上能跑,生产环境能跑到1200 tokens/s的解码速度。
快速上手
安装贼简单:
git clone https://github.com/cactus-compute/needle.git
cd needle && source ./setup
needle playground
直接起一个Web UI,测试你自己的工具集,权重自动下载。
Python调用更直接:
from needle import SimpleAttentionNetwork, load_checkpoint, generate, get_tokenizerparams, config = load_checkpoint("checkpoints/needle.pkl")
model = SimpleAttentionNetwork(config)
tokenizer = get_tokenizer()result = generate(model, params, tokenizer,query="What's the weather in San Francisco?",tools='[{"name":"get_weather","parameters":{"location":"string"}}]',stream=False,
)
print(result)
# [{"name":"get_weather","arguments":{"location":"San Francisco"}}]
就问你怕不怕,26M,CPU都能跑。
这玩意儿到底什么原理
核心是一个叫Simple Attention Network的结构,8层Decoder + 12层Encoder,专门做跨注意力融合。
等等,12层Encoder是什么鬼?传统LLM用的是纯Decoder,Needle加了个Encoder来处理工具调用的结构化信息——说白了就是把函数签名当文档丢给Encoder,让模型学会「看到这种输入格式就对应那种工具」。
预训练用了16块TPU v6e跑了200B token,27小时。然后用20亿token的函数调用数据做微调,45分钟搞定。
能用吗?值不值得跑?
适合场景:
- 手机/手表/眼镜这种端侧AI助手
- 需要快速响应的工具调用场景
- 边缘设备上跑function call
局限性:
- 纯函数调用单项任务,不适合通用对话
- 26M参数能做的事情有限,复杂推理别指望它
- 小模型本身比较娇气,数据分布偏移了性能掉得很快
泼冷水时间
3个月后这项目最大的问题:工具一多就傻眼。
现在它用的是单工具调用测的,toy case跑得漂亮。但现实里一个Agent可能要调度十几个工具,工具之间还有依赖关系和返回值传递——这种场景下26M够不够用真不好说。
另外,Gemini被蒸馏的过程中「灵魂」丢了多少也存疑。函数调用只是表面,真正的理解能力、推理链、上下文窗口才是价值所在。
最后,生态问题——这种极小模型的生命力取决于社区能跑多少场景,如果主要还是极客玩具,三个月后star数不跌才怪。
一句话评价: 方向对了,但路还长。端侧AI函数调用这个坑有人来填是好事,别指望它能替代Claude/GPT的Agent能力,先当成树莓派跑AI的玩具比较合适。
👉 项目地址:https://github.com/cactus-compute/needle
🤗 模型权重:https://huggingface.co/Cactus-Compute/needle
