<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Tool Calling on Hypho - AI Agent 技术博客</title><link>https://blog.hypho.cn/tags/tool-calling/</link><description>Recent content in Tool Calling on Hypho - AI Agent 技术博客</description><image><title>Hypho - AI Agent 技术博客</title><url>https://blog.hypho.cn/papermod-cover.png</url><link>https://blog.hypho.cn/papermod-cover.png</link></image><generator>Hugo -- 0.148.2</generator><language>zh-cn</language><lastBuildDate>Wed, 13 May 2026 10:03:15 +0800</lastBuildDate><atom:link href="https://blog.hypho.cn/tags/tool-calling/index.xml" rel="self" type="application/rss+xml"/><item><title>Needle 26M 工具调用模型：Agent 真需要大模型来选工具吗？</title><link>https://blog.hypho.cn/posts/needle-26m-tool-calling-model/</link><pubDate>Wed, 13 May 2026 10:03:15 +0800</pubDate><guid>https://blog.hypho.cn/posts/needle-26m-tool-calling-model/</guid><description>Needle 是 Cactus 开源的 26M 参数工具调用模型，主张把单轮 function calling 视为检索与组装问题，而不是通用推理问题。本文从 Simple Attention Networks、端侧推理、微调和生产边界出发，分析小模型在 AI Agent 工具路由中的工程价值与风险。</description><content:encoded><![CDATA[<p>如果你正在做 AI Agent，有一个问题很容易被忽略：<strong>Agent 到底需不需要一个很大的模型来“选择工具”？</strong></p>
<p>我以前默认答案是“需要”。毕竟工具调用看起来像推理：用户说“明天早上 8 点提醒我带伞”，模型要理解意图、找到日历或提醒工具、抽取时间、地点和参数，最后输出一段合法 JSON。让 7B、14B 甚至更大的模型来做，似乎很自然。</p>
<p>但这两天 HN 上的 <a href="https://news.ycombinator.com/item?id=48111896">Needle</a> 把这个直觉反过来了。Cactus 团队开源了一个只有 26M 参数的 function calling 模型，README 里说它是把 Gemini 3.1 的工具调用能力蒸馏到一个 “Simple Attention Network” 上，目标是跑在手机、手表、眼镜这类消费设备上。项目目前 MIT 开源，代码在 <a href="https://github.com/cactus-compute/needle">cactus-compute/needle</a>，权重放在 <a href="https://huggingface.co/Cactus-Compute/needle">Hugging Face</a>。</p>
<p>26M 是什么概念？比很多 embedding 模型还小，比常见的 0.5B/1.5B 小模型又小一个数量级。它不打算写诗、聊天、做数学题，只做一件事：给定用户 query 和工具 schema，吐出应该调用的工具及参数。</p>
<p>坦白说，我觉得这个方向比“又一个端侧聊天机器人”更值得写。因为生产里的 Agent 系统，最先遇到瓶颈的往往不是“模型不够聪明”，而是“每一步都太贵、太慢、太不稳定”。</p>
<h2 id="把工具调用从推理降级成路由">把工具调用从“推理”降级成“路由”</h2>
<p>Needle 的核心判断很激进：单轮工具调用本质上不是开放式推理，而是 retrieval-and-assembly。</p>
<p>用人话说，就是三步：先从工具列表里匹配哪个工具最像用户意图；再从用户句子里抽参数；最后按 schema 拼成 JSON。这个过程当然需要语言理解，但它未必需要一个装满世界知识的大模型。工具说明和参数 schema 已经作为输入给了模型，事实知识在上下文里，不必塞进 FFN 权重里。</p>
<p>这也是它的架构为什么反常。Needle 的 <a href="https://github.com/cactus-compute/needle/blob/main/docs/simple_attention_networks.md">Simple Attention Networks 文档</a> 里明确写到：实验发现，如果任务依赖外部结构化知识，Transformer 里的 MLP/FFN 可以被完全拿掉，模型主要靠 attention 和 gating 工作。Needle 的结构是 12 层 encoder 加 8 层 decoder，隐藏维度 512，8 个 attention head，BPE 词表 8192；README 还强调 “no MLPs anywhere”。</p>
<p>这句话的工程含义很直白：FFN 更像模型的“记忆仓库”和非线性加工层，而工具调用场景里的“记忆”已经外置成工具列表了。既然你每次都把 <code>get_weather(location)</code>、<code>create_timer(duration)</code>、<code>send_message(contact, text)</code> 这些 schema 喂给模型，它要做的就不是背知识，而是对齐 query 与 schema。</p>
<p>这有点像 RAG 里的 rerank。你不会让一个通用大模型从全世界知识里凭空猜文档，而是先给它候选，再让它排序。此前我在写 <a href="https://blog.hypho.cn/posts/rerank-bi-encoder-cross-encoder/">RAG 重排里的 Bi-Encoder 与 Cross-Encoder</a> 时就说过：一旦候选空间被压小，专用模型往往比通用模型更划算。Needle 放到 Agent 里也是类似逻辑：工具集就是候选空间，function calling 模型就是路由器。</p>
<p>说白了，它不是想替代 GPT-5，而是想替代 Agent 系统里那一层“每次都请大模型选工具”的昂贵默认值。</p>
<h2 id="小模型真正省下来的不是钱而是系统复杂度">小模型真正省下来的不是钱，而是系统复杂度</h2>
<p>README 里给了一个很抓眼球的数字：Needle 在 Cactus 上可以达到 6000 tokens/s prefill、1200 tokens/s decode。这个数字要谨慎看，因为它和硬件、量化、输入长度、batch 方式都有关，不能直接拿来和云端 API 或 vLLM 服务做横向对比。但即便打个折，它也说明一个事实：26M 参数模型的部署形态完全不同。</p>
<p>大模型工具调用通常意味着：请求从 App 发到后端，后端调用 LLM API 或自建推理服务，模型返回 JSON，业务再执行工具。这里面有网络、鉴权、队列、限流、日志脱敏、失败重试和成本核算。每多一次 Agent step，都多一次系统不确定性。</p>
<p>如果工具路由能在端侧或本地服务完成，架构会简单很多。比如手机上的个人助手要在“计时器、短信、日历、导航、智能家居”之间选择工具，它不一定需要把用户原话发到云端；浏览器插件要对页面做轻量操作，也不一定要每次走服务器。这个判断和我之前写 <a href="https://blog.hypho.cn/posts/chrome-prompt-api-browser-local-llm/">Chrome Prompt API</a> 时的结论一致：端侧模型的核心价值不是更聪明，而是更靠近数据、更低延迟、更少合规解释。</p>
<p>当然，Needle 不是 Chrome 内置能力，它是一个开源模型和训练/微调工具链。但它代表的是同一条路线：把低风险、结构化、可校验的 AI 子任务从“大模型中心”拆出来，下沉到更便宜的位置。</p>
<p>我更看重的是这件事对 Agent 编排的影响。很多 Agent 框架现在喜欢把所有步骤都丢给同一个大模型：规划、选工具、写参数、观察结果、再规划。这样做 Demo 很快，但线上很难控。一个更工程化的拆法应该是：</p>
<ul>
<li>复杂规划交给强模型；</li>
<li>工具路由交给小模型或规则+模型混合层；</li>
<li>参数校验交给 schema validator；</li>
<li>高风险动作再让强模型或人工复核。</li>
</ul>
<p>Needle 正好卡在第二层。</p>
<h2 id="但别把它误读成26m-打败大模型">但别把它误读成“26M 打败大模型”</h2>
<p>我不太喜欢一些小模型项目的宣传口径：动不动就“beats Qwen / Gemma / Granite”。Needle README 里也提到它在单轮 function calling 上优于 FunctionGemma-270M、Qwen-0.6B、Granite-350M、LFM2.5-350M，但同时也承认这些模型的能力范围更大，聊天和通用任务更强，小模型也会比较 finicky。</p>
<p>这点很重要。</p>
<p>工具调用在生产里不是一个单一 benchmark。真实系统里会出现很多脏情况：用户一句话包含多个意图；工具 schema 写得含糊；业务参数有隐式默认值；同名联系人需要 disambiguation；模型输出 JSON 合法但业务语义错；多轮上下文里前一句的“它”到底指哪个对象。26M 模型如果只做 single-shot function call，遇到这些场景就需要外部系统补位。</p>
<p>所以我的建议不是“把 Agent 的工具调用全部换成 Needle”，而是先把任务分层。</p>
<p>适合 Needle 这类小模型的场景，大概有三个特征：第一，工具集合稳定且数量有限；第二，用户表达比较短，主要是单轮命令；第三，错误可以被校验、回退或二次确认。比如本地设备助手、浏览器扩展、企业内部固定流程、IoT 控制、低风险自动化命令。</p>
<p>不适合的场景也很明显：跨系统长链路规划、金融/医疗/法律等高风险动作、强多轮上下文依赖、工具 schema 高频变化、需要复杂业务推理的 Agent。这些地方小模型可以做候选路由，但不该单独拍板。</p>
<p>换句话说，Needle 的生产价值不是“更强”，而是“更窄”。窄到可以测试、可以微调、可以部署在边缘，也可以被工程系统包住。</p>
<h2 id="微调按钮很诱人数据质量才是坑">微调按钮很诱人，数据质量才是坑</h2>
<p>Needle 提供了 playground、CLI 和 Python API。README 的 Quickstart 是：clone 仓库，<code>cd needle &amp;&amp; source ./setup</code>，然后 <code>needle playground</code> 打开本地 Web UI；Python 里可以加载 checkpoint，把 query 和 tools 传给 <code>generate()</code>，得到类似 <code>[{&quot;name&quot;:&quot;get_weather&quot;,&quot;arguments&quot;:{&quot;location&quot;:&quot;San Francisco&quot;}}]</code> 的结果。它还支持 <code>needle finetune data.jsonl</code>，并且可以用 Gemini 生成训练数据。</p>
<p>这个体验看起来很顺，但我会特别提醒一句：微调工具调用模型，最难的不是跑训练，而是定义“正确”。</p>
<p>比如一个 CRM Agent 里有 <code>create_lead</code>、<code>update_contact</code>、<code>log_activity</code> 三个工具。用户说“把刚才那个客户加到下周跟进里”，到底应该调哪个？如果业务流程要求先查联系人再建任务，单轮数据里只标一个最终工具可能就是错的。再比如参数抽取，时间、币种、地区、权限范围都可能有业务默认值，这些默认值不在用户原话里，模型很容易学出看似合理但实际危险的补全。</p>
<p>所以，如果真要把 Needle 用到内部系统，我会这样落地：先从日志里抽取高频、低风险、单工具动作；人工审核一小批高质量 JSON 标注；用 schema validator 做硬约束；上线后只让它处理置信度高的请求；低置信度或校验失败就回退到强模型。不要一上来就让小模型接管所有工具调用。</p>
<p>这和我们做 <a href="https://blog.hypho.cn/posts/local-llm-ollama-llama-cpp/">本地 LLM 推理选型</a> 时的经验一样：模型只是系统的一块。真正决定可用性的，是输入边界、失败回退、观测指标和数据闭环。</p>
<h2 id="我会怎么评价-needle">我会怎么评价 Needle</h2>
<p>先说优点。它把一个长期被大模型垄断的子任务拆了出来，并且给了代码、权重、训练入口和架构解释。GitHub API 显示，Needle 仓库有 400+ stars，最近提交就在 2026 年 5 月 12 日，根目录包含 <code>needle/</code>、<code>pyproject.toml</code>、<code>requirements.txt</code>、<code>setup</code> 和训练脚本，不是只有白皮书的概念项目。背后的 <a href="https://github.com/cactus-compute/cactus">Cactus</a> 也是一个移动端低延迟 AI 引擎，stars 已经超过 4.7k，说明团队不是临时拼了一个 README。</p>
<p>再说保留意见。第一，Needle 目前更像一个实验性专用模型，而不是成熟平台。它的最佳场景是 single-shot function calling；如果你的 Agent 依赖复杂多轮状态，它不会神奇解决问题。第二，公开 benchmark 还需要更多第三方复现。README 里的速度和效果数字值得关注，但生产选型不能只看项目方自测。第三，端侧部署还涉及模型更新、兼容性、隐私日志、用户授权和安全策略，这些都不是 26M 参数本身能解决的。</p>
<p>但我依然觉得它值得跟进。原因不是它“打败了大模型”，而是它逼我们重新拆分 Agent 架构：哪些步骤真的需要强推理？哪些只是结构化映射？哪些可以由小模型、本地模型甚至规则系统完成？</p>
<p>这会是未来 Agent 工程里很现实的一条优化线。</p>
<p>如果你现在已经有 Agent 产品，我建议做一个小实验：把最近一周的工具调用日志拿出来，按“单轮/多轮、单工具/多工具、低风险/高风险、可校验/不可校验”四个维度打标签。你可能会发现，相当一部分调用并不需要昂贵的大模型。它们需要的是一个快、便宜、可控的工具路由层。</p>
<p>Needle 给这个路由层提供了一个可验证的开源起点。</p>
]]></content:encoded></item></channel></rss>