各位好,我是开源君!
小设备想用 AI,一直是件麻烦事。
大模型塞不进手表,小模型又太笨。语音传到云端怕慢,留在本地又怕爆内存。
最近开源君看到一个项目,叫 Needle。
它把一整套"会自己调工具"的 AI,压成了一个 14MB 的文件。

Needle是由 Cactus Compute 团队开源的一个微型基础模型,专门为手机、可穿戴设备、智能家居和机器人这类微型设备设计。

说它"微",是真的微——整个模型只有一个 14MB 的二进制文件,完整跑一个会话大约只需要 28MB 内存。

它只干三件事:
关键是,全程不联网。推理引擎和权重都打包在那个 14MB 文件里,不需要额外的模型文件,也不依赖云端。
在基准测试中,Needle 和 FunctionGemma 270M、LFM2.5 230M、Apple FM 这些模型互有胜负,但体积只有它们的 1/5 到 1/70。人家用 f16 精度,Needle 只用了 2-bit 量化,效果却不落下风。

Needle的工作原理其实很简单:用 Python 装饰器定义工具函数,Needle 读取函数签名和文档描述来理解工具用途。
输入一句话后,模型决定调用哪个工具、怎么填参数,Needle 执行函数、把结果喂回模型,最终返回完整响应。
按照官方给出的指引,开源君这边使用 Needle 搭建了一个web demo进行效果测试
示例一:工具调用
在后台的代码中提前定义了一些工具函数,包括这个获取天气

在web demo中,输入一段自然语言文字:
what's the weather in Tokyo?

然后对话区就会自主的选择调用了定义好的 called get_weather(city='Tokyo'),并返回了天气 JSON;
右侧面板同步显示决策 JSON、推理过程、置信度进度条(绿色,>0.9)。
Needle自己识别意图、选工具、填参数、执行,无需写代码或指定函数名。
示例二:设备控制
紧接着,我连续输入两条指令
dim the living room to 30
make it 21 degrees and cool the room

执行后,第一条调用 set_lights(room='living room', on=True, brightness=30)
第二条调用 set_thermostat(temperature=21, mode='cool')。
对话历史会自动累积,不同设备自动匹配不同工具,参数从自然语言中提取;"cool the room" 里的 room 不会误判成灯光指令。
示例三:结构化提取
输入一段文字,然后点 Extract。
Taxi ride with Uber, fare 23.60, paid with mastercard
右侧输出合规 JSON:
{
"merchant": "Uber",
"total": 23.6,
"payment_method": "mastercard"
}

再试试下方示例 "Invoice from Acme Corp, $1,200.00, due 2026-09-01"
提取出 {"merchant": "Acme Corp", "total": 1200.0}。
当前的基础模型只提取标量字段,若有类似多行商品明细这类复杂结构,需要 LoRA 微调后才能可靠输出。
这个功能我特别喜欢。
每次响应,Needle 都会附带一个校准过的置信度分数。你可以设一个阈值——高于阈值,直接执行;低于阈值,上报给你人工处理。
对智能硬件来说,这点太重要了。你不会希望模型把"调暗客厅灯光到10%"理解错了,大半夜给你把灯全开。
可以声明一个很大的工具目录,几百个都行。但每次对话,Needle 内置的检索头只会渲染 前5个 最相关的工具,语法约束也只在这5个里生效。
这个设计很聪明,既节省了计算量,又提高了准确率。
Needle 用了一个 256-token 的滑动窗口,工具调用作为 KV sinks 固定在内存里。
不管你的对话进行了100轮还是1000轮,总内存始终维持在 28MB 左右。
权重、引擎、一切,全打包在一个 14MB 的 .cact 文件里。不需要管理单独的模型文件,不需要编译构建,推理时不发任何网络请求。
pip install 之后,引擎从 Hugging Face 下载一次并缓存,后面就再也不需要网络了。部署到设备上,一个文件拷过去就能跑。
装它很简单。一行命令:
pip install cactus-needle
想用 GPU 加速(NVIDIA)就装这个:
pip install "cactus-needle[gpu]"
苹果芯片(Apple Silicon)用这个,能跑在 GPU 上:
pip install "cactus-needle[metal]"
引擎第一次会从 Hugging Face 自动下载并缓存,之后啥都不用再装。
最简单的工具调用,就这么几行:
import needle
@needle.tool
def get_weather(city: str):
"Get the current weather for a city."
return {"city": city, "temp_c": 27, "sky": "clear"}
agent = needle.Needle(tools=[get_weather])
print(agent.run("what's it like in Lagos right now?")["results"])
# [{'city': 'Lagos', 'temp_c': 27, 'sky': 'clear'}]
从文本里抽结构化数据也简单:
from pydantic import BaseModel
class Invoice(BaseModel):
vendor: str
total: float
due_date: str
invoice = needle.extract("Invoice from Acme Corp, $1,200.00, due 2026-09-01", Invoice)
print(invoice.vendor, invoice.total) # -> Acme Corp 1200.0
不想写代码?直接起个浏览器 playground:
needle playground # 基础模型,http://127.0.0.1:7860
needle playground --weights my.cact # 跑你自己微调过的模型
还能在界面上点一下"Finetune on these tools",自动跑完微调流程,下载一个 .cact 就能用。
Needle这个项目真的让人眼前一亮,用 14MB 的单文件,把"能本地跑、会自己调工具"的 AI 塞进了手机、手表甚至机器人里。
如果你在做 IoT、可穿戴、智能家居、机器人,或者任何内存和算力受限的 AI 项目,Needle 值得你花一个下午试试。
项目地址:https://github.com/cactus-compute/needle