本地 LLM 做 Agent,最容易被低估的不是模型能不能回答问题,而是它能不能稳定地把一串工具调用跑完。

这句话听起来有点扫兴。毕竟现在 7B、8B、14B 模型的 benchmark 分数越来越好,Ollama、llama.cpp、llama-server 也把本地部署门槛降到了很低。我之前写过一篇 本地 LLM 推理工具的取舍,当时重点放在推理后端、模型格式和生态锁定上。但如果你真的想把本地模型接进自动化工作流,另一个问题会更快冒出来:模型单步看起来不错,多步之后为什么还是崩?

HN 上这两天有个项目 Forge 很适合拿来讨论这个问题。它的标题很抓人:“Guardrails take an 8B model from 53% to 99% on agentic tasks”。我对这种数字一向谨慎,因为 agentic task 的定义、评测场景和采样参数都会强烈影响结果。但 Forge 真正值得看的地方,不是“8B 追平 frontier model”这个营销点,而是它把本地 Agent 失败拆成了几个非常工程化的小故障:工具调用解析失败、走错步骤、错误恢复失败、上下文预算失控,以及多个工作流争用同一个 GPU 推理槽。

说白了,它不是在训练一个更聪明的模型,而是在给一个不够稳定的模型加流程控制。

为什么本地 Agent 会在多步任务里快速掉队

很多人第一次做工具调用 Agent,会拿一个天气查询、数据库查询或者代码搜索 demo 开始。模型需要做的事情很简单:读用户问题,选择工具,填参数,拿结果,再回答。单步成功率只要看起来有 90%,体验就会很好。

问题出在复合任务上。

假设一个工作流有 5 步,每一步成功率都是 90%。如果这些步骤必须全部正确,整体成功率不是 90%,而是 0.9 的 5 次方,大约 59%。这还是独立错误的理想情况;真实 Agent 里,前一步的轻微偏差会污染后续上下文,错误会复利。

Forge 作者在 HN 发布帖 里也用了类似的“compounding math”解释:本地模型每一步都不算太差,但连续工具调用会把小错误放大成任务失败。这其实是我最认同它的地方。生产环境的 Agent 可靠性,很多时候不是靠“再换一个大模型”解决,而是靠把可控部分从自然语言里拿出来,交给确定性系统。

这也是为什么我会把 Forge 和之前写过的 Statewright 状态机护栏 放在同一类问题里看。Statewright 更偏“限制 Agent 在什么阶段能做什么”,Forge 更偏“当模型工具调用出错时,如何修、如何重试、如何阻止它跳步骤”。两者的共同点是:它们都不再迷信一个超长 system prompt。

Forge 到底加了哪几层护栏

Forge README 看,它定位为 “a reliability layer for self-hosted LLM tool-calling”,支持 Ollama、llama-server、Llamafile 和 Anthropic 后端。它有三种用法:直接用 WorkflowRunner 构建工作流;把 Guardrails middleware 嵌进已有 orchestration loop;或者跑一个 OpenAI-compatible proxy,让 opencode、Continue、aider 这类客户端以为自己在调用一个更可靠的模型服务。

我更关心第二种和第三种,因为它们说明 Forge 不是又造一个全家桶 Agent 框架,而是试图站在“可靠性中间层”的位置。

第一层是 response validation 和 rescue parsing。小模型在工具调用里经常犯一种很烦的错:明明知道应该调用 search,却把 JSON 写坏、参数名写错,或者把解释性文字混在结构化输出里。Forge 的做法不是立刻失败,而是先尝试解析修复;修不了,再给模型一个更明确的 retry nudge。人话翻译就是:别把模型第一次输出当圣旨,先把低级格式错误拦下来。

第二层是 step enforcement。很多多步任务并不是“模型自由探索”越多越好,而是必须先 A 后 B。例如先检索,再读取详情,最后汇总;先跑测试,再改代码;先查库存,再下单。Forge 允许你声明 required steps 和 terminal tool,模型如果想过早结束或者跳过中间步骤,护栏会把它挡回去。这个思路和状态机很像,只是粒度更贴近工具调用循环。

第三层是 error recovery 和 context management。README 里提到 Forge 有 VRAM-aware budgets、tiered compaction,还提供 SlotWorker 给多 Agent 架构共享一个推理槽。这个点很现实:本地模型不是云 API,你可能只有一张 12GB、16GB 或 24GB 显卡。上下文开太大,速度慢、显存炸;上下文压太狠,Agent 忘掉关键状态。Forge 的 Model Guide 把评测拆成 OG-18 和 advanced_reasoning 两层,并明确说多数实际 agentic flows 更接近 mechanical/mid,而不是最难的 adversarial 场景。这种说法比单纯贴一个总分诚实一些。

“8B 从 53% 到 99%”该怎么理解

我不建议把这个数字直接理解成“本地 8B 模型已经能替代 Claude Sonnet”。

Forge README 当前写的是:Ministral-3 8B Instruct Q8 在 llama-server 上,跨 26 个场景得分 86.5%,hard tier 为 76%。HN 作者帖里则提到论文版本在 18 个场景上有 99.3% 的结果。两组数字不完全一样,原因可能包括评测集扩展、难度分层变化、模型/后端配置更新。对外部读者来说,最稳妥的读法是:Forge 在它定义的工具调用评测里显著提高了小模型稳定性,但这些数字不应直接外推到所有生产 Agent。

这不是泼冷水,而是工程上必须说清楚边界。

如果你的 Agent 工作流高度结构化,工具集合有限,失败模式主要是 JSON 格式、步骤顺序、可恢复 API 错误,那么 Forge 这类护栏很可能有效。比如个人知识库检索、代码仓库内的固定检查、内部数据查询、批量文档处理,这些任务通常有清晰的步骤和终止条件。

但如果你的任务本身需要开放式规划、复杂业务判断、跨系统权限决策,或者工具返回结果非常嘈杂,护栏只能减少机械错误,不能替你补齐模型的判断力。一个小模型在错误事实基础上做出“格式完美”的工具调用,仍然是错的。

我自己的判断是:Forge 更像是本地 Agent 的“可靠性放大器”,不是“能力放大器”。它能让一个已经基本会做任务的模型少翻车,却不能让一个不会做任务的模型突然会做。

什么时候值得引入 Forge

如果你满足下面三个条件,我会认真考虑 Forge:

第一,你已经决定自托管模型。可能是成本原因,也可能是隐私、延迟、离线运行或者数据合规原因。否则最简单的方案仍然是先用 frontier API,把产品闭环跑通,再考虑本地化。

第二,你的 Agent 任务可以被描述成有限工具集 + 明确步骤 + 可验证终点。Forge 的强项正是这种场景:它可以检查工具名、参数、步骤顺序、终止条件和错误预算。如果你的工作流每次都要重新发明任务计划,它的收益会下降。

第三,你愿意维护评测。Forge 自带 Eval Guide,但生产系统不能只看项目自带的 26 或 30 个场景。你需要把自己的真实任务抽样成 eval:成功标准是什么、允许几次重试、错误如何分类、上下文压缩后是否仍保留关键证据。没有这一步,所有护栏最后都会变成“看起来更稳”。

反过来,如果你只是想做一个聊天机器人,或者只是偶尔调用一两个工具,我不建议一上来引入这类中间层。复杂度是有成本的。你要理解 Workflow、ToolDef、Guardrails、backend adapter、context budget,还要处理本地模型服务本身的运维。很多团队真正需要的不是 Forge,而是更清晰的任务边界和更少的自动化野心。

和提示词、状态机、安全沙箱的关系

这里还有一个容易混淆的点:guardrails 不是万能安全系统。

Forge 主要解决的是工具调用可靠性:解析、重试、步骤、上下文、后端适配。它不等于权限沙箱,也不等于供应链安全,也不等于 prompt injection 防护。如果 Agent 能调用 rm -rf、发邮件、转账或者修改生产数据库,你仍然需要独立的权限隔离、审批流、审计日志和最小权限设计。之前那篇 AgentArmor 安全框架 讨论的就是另一层问题:当 Agent 有真实外部动作能力时,安全边界不能只靠模型自觉。

更准确地说,Forge 位于“模型输出”和“工具执行”之间。它检查模型想做的动作是否符合工作流规则,但不负责判断这个动作在业务上是否应该被允许。这个分工很重要。

我会把一个相对成熟的本地 Agent 架构分成四层:底层是推理后端,比如 llama-server 或 Ollama;上面是工具调用可靠性层,比如 Forge;再上面是工作流状态机或任务编排,比如 Statewright/OpenClaw 这类思路;最外层才是权限、安全和人工审批。少一层都可以做 demo,但要进生产,每一层迟早都会回来找你。

我的结论:先把“可恢复错误”工程化

Forge 这类项目让我比较乐观的一点是,它把 Agent 讨论从“模型会不会思考”拉回了“系统如何处理错误”。这是 AI 工程化必须经历的一步。

在过去一年里,很多 Agent 产品的默认叙事是:等模型更强,Agent 就会自然可靠。这个判断只对了一半。模型变强当然重要,但只要系统包含工具、状态、权限、上下文和外部副作用,可靠性就不可能只靠模型参数解决。Web 服务不会因为 CPU 更快就不需要重试、幂等和限流;Agent 也一样。

所以我对 Forge 的建议是:可以试,但不要神化。

把它放到一两个窄工作流里,拿自己的任务做 eval;把 bare loop、只加提示词、加 Forge guardrails 三种方案放在一起比;记录每次失败到底是解析错误、步骤错误、模型判断错误,还是工具本身错误。只有当你能说清楚失败类型,guardrails 才有意义。

如果最后发现 70% 的失败都是格式和流程问题,那 Forge 很可能是便宜有效的解法。如果 70% 的失败来自模型误解业务、检索证据不足或者工具权限设计混乱,那就别怪 8B 模型,也别怪护栏——你需要改的是系统边界。

本地 Agent 真正的生产化,不是把小模型包装成大模型,而是承认它会犯错,然后把每一种可预期的错误变成可检测、可重试、可回滚的工程机制。

Forge 做的,正是其中一块。

参考链接