為什麼你的 AI Coding 工作流程需要 Fallback
在真實的 AI 編碼流程中,LLM 呼叫外部工具(例如讀取檔案、執行 shell 命令、查詢 API)時,函數呼叫可能因為多種原因失敗:工具不可達、參數錯誤、權限不足、逾時等。如果沒有 fallback 策略,一次失敗就會讓整個工作流程中斷,導致結果不完整或重新產生亂猜的程式碼。 MCP(Model Context Protocol)提供的 function calling fallback,正是為了解決這類問題-當主路徑的函式呼叫傳回錯誤時,自動觸發預先定義的備用邏輯,讓工作流程繼續執行,而不是直接當機。
什麼時候該用 Fallback:三個典型場景
不是所有函數呼叫都需要 fallback。以下是我在實踐中遇到的三種必須配置 fallback 的場景:
場景一:依賴外部服務的建置步驟
例如,AI 在寫一個 npm 套件時,需要呼叫 npm install 來安裝相依性。如果網路逾時或 registry 不可用,fallback 可以嘗試使用其他 registry,或跳過安裝並記錄日誌,而不是讓整個建置任務失敗。在我的一個專案中,因為沒有配置 fallback,AI 因臨時網路故障生成了不完整的程式碼,浪費了一次完整的重構回合。
場景二:多步驟程式碼審查與格式化
當 AI 自動對程式碼進行 lint 和格式化時,可能會呼叫 eslint --fix 或 prettier。如果命令執行失敗(例如設定檔格式不正確),fallback 可以自動切換到預設規則,或跳過格式化步驟並標註問題,而不是阻塞後續的測試運行。
場景三:API 呼叫的降級
AI 在產生文件時可能會呼叫外部 API 以取得函數簽章或註解。如果 API 限流或回傳錯誤,fallback 可以先用本機快取資料代替,或是讓使用者手動補充,而不是輸出空白或幻覺內容。

如何設定 MCP 的 Function Calling Fallback
MCP 本身沒有提供內建的 fallback 配置字段,但可以透過自訂工具包裝函數來實現。以下是一個基於 TypeScript 的參考實作:

// MCP 工具包裝器,新增 fallback
import { createTool } from 'mcp'; // 假設使用 MCP SDK
async function callWithFallback(
toolName: string,
args: Record<string, unknown>,
fallback: () => Promise<string>,
maxRetries = 1
): Promise<string> {
let lastError: Error;
for (let attempt = 0; attempt <= maxRetries; attempt++) {
try {
const result = await someMCPClient.callTool(toolName, args);
if (result.isError) {
throw new Error(result.error || 'Tool returned error');
}
return result.content[0].text;
} catch (error) {
lastError = error as Error;
if (attempt < maxRetries) {
// 簡單重試
await new Promise((r) => setTimeout(r, 1000));
}
}
}
// 所有重試失敗後執行 fallback
return fallback();
}
// 在工具定義中使用
const checkSyntaxTool = {
name: 'check_syntax',
description: 'Check TypeScript syntax using tsc --noEmit',
parameters: { ... },
execute: async (args) => {
return callWithFallback('check_syntax', args, async () => {
// fallback: 使用較寬鬆的檢查
return await someMCPClient.callTool('check_syntax_lite', args);
});
},
};
關鍵點:
- 每個工具函數內部實作 retry 和 fallback 邏輯。
- fallback 函數可以呼叫另一個簡化版工具、傳回預設值、記錄錯誤或提示使用者。
- 需要根據工具的具體失敗模式決定重試次數和退避策略。
最容易踩到坑的地方
我在實際測試中發現兩個高頻錯誤:
- fallback 呼叫又失敗導致死循環。如果 fallback 本身也走了同樣的失敗路徑,就會無限重試。解:在 fallback 中只呼叫與主路徑完全不同的工具或純邏輯,並且加上一個全域失敗計數上限。
- 忽略了 LLM 上下文不一致。當 fallback 被觸發後,LLM 可能已經累積了一些狀態(例如部分程式碼)。如果 fallback 傳回的內容與先前狀態矛盾,會導致最終輸出混亂。建議在 fallback 中加入上下文適配邏輯,或讓 LLM 重新規劃下一步。
替代方案與邊界
如果你的應用程式場景無法接受任何 fallback 帶來的不準確性,或者失敗率極低,可能不需要 fallback。替代方案包括:
- 冗餘呼叫:同時呼叫兩個不同的工具(例如兩個程式碼檢查工具),取多數一致的結果。
- 人工介入:失敗時暫停工作流程並等待使用者回饋。這適用於高關鍵任務(例如提交程式碼前審查)。
- 跳過該步驟:如果工具不關鍵,可以跳過並記錄,繼續後續步驟。
MCP fallback 最適合那些「失敗可恢復、但不能中斷」的中間步驟,而不是「失敗必須重新做」的最終提交步驟。
下一步:系統化你的 AI Coding Workflow
如果你已經在嘗試設定 MCP fallback,表示你已經進入了 AI coding 的深水區。要讓這些策略真正穩定且可重複使用,你需要係統理解工作流程設計、錯誤處理模式和品質控制。

暫無評論,快來發表你的看法吧