
本地模型上的多步骤 AI Agent:架构与模式
多步骤推理是小型模型历来失败的领域。但通过正确的架构——专家链、草稿本微调和混合路由——你可以在本地 7B-14B 模型上运行可靠的多步骤 Agent。以下是三种经过验证的模式及基准测试。
单步骤 AI Agent 是一个已解决的问题。用户说点什么,模型选择一个工具,工具返回结果。经过微调的 7B 模型可以可靠地处理这一任务——我们在工具调用微调指南中已深入介绍过。
多步骤 Agent 则完全不同。模型需要规划一系列动作,在各步骤之间跟踪状态,处理链路中的错误,并决定任务何时完成。这正是小型模型历来崩溃的地方:它们会丢失上下文,重复步骤,产生虚构的工具调用,或陷入无限循环。
但"历来"这个词在这里承载了太多含义。凭借正确的架构模式,多步骤 Agent 如今已能在本地 7B-14B 模型上可靠运行。本指南涵盖三种经过验证的模式、真实基准测试,以及使其运行的工程细节。
核心挑战:为什么多步骤对小型模型来说很难
单步骤 Agent 只需要一项技能:将用户意图映射到工具调用。多步骤 Agent 至少需要四项:
- 规划 — 将目标分解为有序的步骤
- 执行 — 在每一步使用正确的参数调用正确的工具
- 状态跟踪 — 将第 N 步的结果传递到第 N+1 步
- 错误恢复 — 检测失败并在重试、跳过或升级之间做出决策
通用 7B 模型之所以困难,是因为它们是在广泛任务上训练的,而不是顺序推理链。注意力窗口在 2-3 步后就 会变得嘈杂。模型会"忘记"它已经做了什么或计划做什么。
解决方案不是更大的模型。解决方案是更好的架构。
模式 1:微调专家链
不是让一个模型做所有事情,而是将 Agent 拆分为专门的角色:
用户请求 → 路由器 → 规划器 → 执行器 → 验证器 → 响应
每个模型都很小但高度聚焦:
- 路由器(分类):确定请求类型。这是订单吗?支持查询?数据查找?这是一个简单的分类任务——即使 1B 模型也能处理。
- 规划器(分解):接收分类后的请求并输出有序的步骤列表。在你的特定工作流上微调,它不需要规划任意任务——只需要规划你的任务。
- 执行器(工具调用):一次接收一个步骤并生成工具调用。这就是单步骤工具调用——已解决的问题。
- 验证器(校验):检查累积的结果。所有必填字段都存在吗?输出是否匹配预期的 schema?标记问题 以便重试或升级。
为什么这在小型模型上有效
每个专家都在狭窄的任务上进行微调。路由器看到数千个"此输入类型映射到此类别「的示例。规划器看到数千个」此类别分解为这些步骤"的示例。没有单个模型需要持有完整的推理链。
权衡取舍
延迟。四个模型顺序调用意味着单次调用推理时间的 4 倍。在本地 GPU 上,每次 7B 模型推理需要 200-500 毫秒(取决于上下文长度和量化)。4 步链总共需要 0.8-2.0 秒。
对于大多数业务工作流,这是可以接受的。对于实时聊天,会有明显感知。缓解方案:在依赖图允许的情况下并行运行专家。
基准测试:专家链 vs 单模型
| 指标 | 单个 7B(通用) | 单个 7B(微调) | 4 专家链(每个 7B) |
|---|---|---|---|
| 3 步任务准确率 | 41% | 67% | 89% |
| 5 步任务准确率 | 18% | 43% | 81% |
| 平均延迟(本地 GPU) | 450ms | 450ms | 1,400ms |
| 错误恢复率 | 12% | 34% | 78% |
单个微调模型相比通用模型有所改进,但链式架构是一个质的飞跃。每个专家只做好一件事。
模式 2:带草稿本的单模型(CoT 微调)
并非每个团队都想维护四个独立模型。模式 2 使用单个模型,但对其进行微调使其在行动前逐步思考。
关键洞察:你训练模型在输出工具调用之前生成一个"草稿本"——一个显式的推理轨迹。这是思维链(CoT)微调,但专门针对你的规划任务。
训练数据格式
{
"input": "Process order #4521 for customer acme-corp",
"output": "<scratchpad>\nStep 1: Validate order #4521 exists and is in pending status\nStep 2: Check inventory for all line items\nStep 3: Calculate shipping based on customer location\nStep 4: Confirm order and send notification\nCurrent step: 1\n</scratchpad>\n<tool_call>{\"function\": \"validate_order\", \"params\": {\"order_id\": 4521}}</tool_call>"
}
在每个工具结果之后,模型接收更新的上下文并生成下一个草稿本:
{
"input": "[Previous context + tool result: order valid, status: pending]\nContinue processing.",
"output": "<scratchpad>\nStep 1: Validate order — DONE (valid, pending)\nStep 2: Check inventory for all line items\nCurrent step: 2\n</scratchpad>\n<tool_call>{\"function\": \"check_inventory\", \"params\": {\"order_id\": 4521}}</tool_call>"
}
为什么这有效
草稿本外化了模型的"工作记忆"。不 再隐式跟踪它做了什么以及接下来要做什么(小型模型容易丢失跟踪),而是将计划直接写在输出中。模型在每一步都读取自己之前的推理。
在你的特定工作流上用 500-1,000 个示例进行微调,教会模型你的步骤模式。它不需要规划任意任务——只需要处理你的 Agent 涵盖的 5-15 种工作流类型。
何时使用模式 2 而非模式 1
- 你的不同工作流类型少于 5 种
- 延迟很重要(一次模型调用 vs 四次)
- 你想要更简单的部署(服务一个模型,而不是四个)
- 你的步骤主要是顺序的(并行化机会有限)
基准测试:草稿本 vs 普通微调
| 指标 | 7B 普通微调 | 7B CoT 微调 | 14B CoT 微调 |
|---|---|---|---|
| 3 步准确率 | 67% | 82% | 91% |
| 5 步准确率 | 43% | 71% | 85% |
| 计划正确率 | 54% | 88% | 93% |
| 每步 Token 数 | 45 | 120 | 130 |
CoT 模型每步使用约 2.7 倍的 Token(因为草稿本),但准确率的提升是值得的。如果你在本地运行,Token 是免费的。
模式 3:混合——本地模型 + 前沿模型兜底
有时诚实的答案是:你的本地模型能处理 85% 的请求,但剩下的 15% 确实需要更强的能力。模式 3 使这一点变得显式。
用户请求 → 本地路由器(分类复杂度)
├── 简单/已知 → 本地 Agent(模式 1 或 2)
└── 复杂/模糊 → 前沿 API(GPT-4、Claude)仅用于规划
└── 计划 → 本地执行器(在本地运行工具)
工作原理
本地路由器在两个维度上对每个请求进行分类:
- 复杂度:需要多少步骤?步骤来自已知模板还是全新的?
- 模糊度:用户意图是否清晰?是否存在多种有效解释?
已知模板、意图明确的请求完全在本地处理。新颖或模糊的请求只将规划步骤发送到前沿 API。前沿模型生成步骤计划。本地模型执行每个步骤(工具调用)。
成本计算
假设每天 1,000 个 Agent 请求:
- 完全前沿 API:1,000 x $0.03 平均 = $30/天 = $900/月
- 完全本地:1,000 x $0.00 每次查询 = $0/天(仅硬件成本)
- 混合(85/15 分割):150 x $0.01(仅规划,更短的提示)= $1.50/天 = $45/月
混合方案比完全 API 成本低 95%,同时处理本地模型可能出错的边缘情况。
成本上限和防护栏
为前沿兜底设置硬性月度预算。当达到上限时,所有请求路由到本地模型并附带置信度标志。应用程序可以决定:提供带免责声明的本地结果,或将请求排队以便后续处理。
步骤间的状态管理
无论你使用哪种模式,多步骤 Agent 都需要状态管理。以下是有效的方法: