本地模型上的多步驟 AI 代理:架構與模式
多步驟推理是小型模型歷來失敗的地方。但通過正確的架構——專家鏈、暫存微調和混合路由——你可以在本地 7B-14B 模型上運行可靠的多步驟代理。以下是三種帶有基準測試的已驗證模式。
單步驟 AI 代理是一個已解決的 問題。用戶說一些事情,模型選擇一個工具,工具返回一個結果。微調的 7B 模型可靠地處理這個問題——我們在工具呼叫微調指南中已經深入介紹了這一點。
多步驟代理是不同的。模型需要規劃一系列動作、在步驟之間追蹤狀態、處理鏈中的錯誤,並決定任務何時完成。這是小型模型歷來崩潰的地方:它們失去上下文、重複步驟、產生工具呼叫幻覺或無限循環。
但「歷來」在那句話中承擔了很多工作。通過正確的架構模式,多步驟代理今天在本地 7B-14B 模型上可靠地運行。本指南涵蓋三種已驗證的模式、真實基準測試,以及使其有效的工程細節。
核心挑戰:為什麼多步驟對小型模型很難
單步驟代理需要一項技能:將用戶意圖映射到工具呼叫。多步驟代理至少需要四項:
- 規劃 — 將目標分解為有序步驟
- 執行 — 在每個步驟使用正確的參數呼叫正確的工具
- 狀態追蹤 — 將步驟 N 的結果帶入步驟 N+1
- 錯誤恢復 — 偵測失敗並在重試、 跳過或升級之間做出決定
通用 7B 模型掙扎,因為它們是在廣泛的任務上訓練的,而不是在順序推理鏈上。在 2-3 個步驟後,注意力視窗變得嘈雜。模型「忘記」了它已經做了什麼或計劃做什麼。
解決方法不是更大的模型。解決方法是更好的架構。
模式 1:微調專家鏈
不是讓一個模型做所有事情,而是將代理分成專門角色:
用戶請求 → 路由器 → 規劃器 → 執行器 → 驗證器 → 回應
每個模型都很小,但專注:
- 路由器(分類):確定請求類型。這是訂單嗎?支援查詢嗎?資料查詢嗎?這是一個簡單的分類任務——即使是 1B 模型也能處理。
- 規劃器(分解):接受分類的請求並輸出有序步驟列表。在你的特定工作流程上微調,它不需要規劃任意任務——只需要你的任務。
- 執行器(工具呼叫):一次處理一個步驟並產生工具呼叫。這是單步驟工具呼叫——已解決的問題。
- 驗證器(驗證):檢查累積的結果。所有必需的字段都存在嗎?輸出是否與預期架構匹配?標記重試或升級的問題。
為什麼這在小型模型上有效
每個專家都在狹窄的任務上微調。路由器看到數千個「這種輸入類型映射到這個類別」的例子。規劃器看到數千個「這個類別分解為這些步驟」的例子。沒有單個模型需要保持完整的推理鏈。
權衡
延遲。四個序列的模型呼叫意味著單次呼叫推理時間的 4 倍。在本地 GPU 上,每次 7B 模型推理需要 200-500ms(取決於上下文長度和量化)。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": "處理 acme-corp 客戶的 #4521 訂單",
"output": "<scratchpad>\n第 1 步:驗證 #4521 訂單存在且處於待處理狀態\n第 2 步:檢查所有行項目的庫存\n第 3 步:根據客戶位置計算運輸費用\n第 4 步:確認訂單並發送通知\n當前步驟:1\n</scratchpad>\n<tool_call>{\"function\": \"validate_order\", \"params\": {\"order_id\": 4521}}</tool_call>"
}每次工具結果後,模型接收更新的上下文並產生下一個暫存器:
{
"input": "[之前的上下文 + 工具結果:訂單有效,狀態:待處理]\n繼續處理。",
"output": "<scratchpad>\n第 1 步:驗證訂單——完成(有效,待處理)\n第 2 步:檢查所有行項目的庫存\n當前步驟:2\n</scratchpad>\n<tool_call>{\"function\": \"check_inventory\", \"params\": {\"order_id\": 4521}}</tool_call>"
}為什麼這有效
暫存器將模型的「工作記憶」外部化。不是隱式追蹤它做了什麼和接下來的事情(小型模型會失去追蹤),計劃字面上在輸出中。模型在每個步驟閱讀自己之前的推理。
在你的特定工作流程的 500-1,000 個例子上微調,教模型你的步驟模式。它不需要規劃任意任務——只需要你的代理處理的 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 明確了這一點。
用戶請求 → 本地路由器(分類複雜性)
├── 簡單/已知 → 本地代理(模式 1 或 2)
└── 複雜/模糊 → 前沿 API(GPT-4、Claude)僅用於規劃
└── 計劃 → 本地執行器(在本地執行工具)