AI コーディング ワークフローにフォールバックが必要な理由
実際の AI コーディング プロセスでは、LLM が外部ツール (ファイルの読み取り、シェル コマンドの実行、API のクエリなど) を呼び出すときに、ツールへのアクセス不能、パラメーター エラー、権限の不足、タイムアウトなど、さまざまな理由で関数呼び出しが失敗する可能性があります。フォールバック戦略がないと、単一の失敗でワークフロー全体が中断され、結果が不完全になったり、ランダムなコードが再生成されたりする可能性があります。 MCP (モデル コンテキスト プロトコル) によって提供される関数呼び出しフォールバックは、まさにこの種の問題を解決するためのものです。メイン パスの関数呼び出しがエラーを返すと、事前定義されたバックアップ ロジックが自動的にトリガーされ、ワークフローが直接クラッシュするのではなく実行を継続できるようになります。
フォールバックを使用する場合: 3 つの典型的なシナリオ
すべての関数呼び出しにフォールバックが必要なわけではありません。以下は、私が実際に遭遇した、フォールバックの構成が必要な 3 つのシナリオです。
シナリオ 1: 外部サービスに依存する構築手順
たとえば、AI が npm パッケージを作成する場合、npm install を呼び出して依存関係をインストールする必要があります。ネットワークがタイムアウトするかレジストリが利用できない場合、フォールバックはビルド タスク全体を失敗させるのではなく、別のレジストリの使用を試行するか、インストールをスキップしてログに記録することができます。私のプロジェクトの 1 つでは、フォールバックが構成されていなかったため、一時的なネットワーク障害により AI が不完全なコードを生成し、リファクタリング ラウンド全体が無駄になりました。
シナリオ 2: 複数ステップのコード レビューと書式設定
AI がコードを自動的に lint してフォーマットするときに、eslint --fix または prettier が呼び出されることがあります。コマンドの実行が失敗した場合 (たとえば、構成ファイルが正しくフォーマットされていない場合)、フォールバックは自動的にデフォルトのルールに切り替えるか、フォーマット手順をスキップして、後続のテスト実行をブロックする代わりに問題にフラグを立てることができます。
シナリオ 3: API 呼び出しのダウングレード
AI ドキュメントの生成時に、関数の署名や注釈を取得するために外部 API 呼び出しが行われる場合があります。 API がスロットリングしている場合、またはエラーを返した場合は、まずフォールバックをローカルのキャッシュ データに置き換えるか、空白または幻覚のあるコンテンツを出力する代わりに、ユーザーが手動でデータを補足することができます。

MCP の関数呼び出しフォールバックを構成する方法
MCP 自体には組み込みのフォールバック構成フィールドはありませんが、カスタム ツール ラッパー関数を通じて実装できます。以下は TypeScript に基づくリファレンス実装です。

// MCP ツール ラッパー、フォールバックを追加
import { createTool } から 'mcp'; // MCP SDK を使用すると仮定します
非同期関数 callWithFallback(
ツール名: 文字列、
引数: レコード<文字列、不明>、
フォールバック: () => Promise<string>,
maxRetries = 1
): Promise<文字列> {
let lastError: エラー;
for (試行 = 0;試行 <= maxRetries;試行 ++) {
{を試してください
const result = await someMCPClient.callTool(toolName, args);
if (result.isError) {
throw new Error(result.error || 'ツールがエラーを返しました');
}
result.content[0].text を返します。
} キャッチ (エラー) {
lastError = エラーとしてのエラー;
if (試行 < maxRetries) {
// 単純な再試行
await new Promise((r) => setTimeout(r, 1000));
}
}
}
//すべての再試行が失敗した後にフォールバックを実行
フォールバック()を返します;
}
// ツール定義で使用されます
const checkSyntaxTool = {
名前: 'check_syntax',
説明: 'tsc --noEmit を使用して TypeScript 構文をチェックする',
パラメータ: { ... }、
実行: async (args) => {
return callWithFallback('check_syntax', args, async () => {
// フォールバック: より緩やかなチェックを使用します
return await someMCPClient.callTool('check_syntax_lite', args);
});
}、
};
「」
重要なポイント:
- 各ツール関数は、内部的にリトライおよびフォールバック ロジックを実装します。
- フォールバック関数は、別の簡易バージョンのツールを呼び出したり、デフォルト値を返したり、エラーを記録したり、ユーザーにプロンプトを表示したりできます。
- 再試行の数とバックオフ戦略は、ツールの特定の障害モードに基づいて決定する必要があります。
## トラブルに巻き込まれやすい場所
実際のテストで 2 つの高周波エラーが見つかりました。
1. **フォールバック呼び出しが再び失敗し、無限ループが発生します**。フォールバック自体が同じ失敗パスをたどる場合、無限に再試行されます。解決策: フォールバック内のメイン パスとは完全に異なるツールまたは純粋なロジックのみを呼び出し、グローバルな失敗数の上限を追加します。
2. **LLM コンテキストの不一致は無視されます**。フォールバックがトリガーされると、LLM は何らかの状態 (コードの一部など) を蓄積する可能性があります。フォールバックによって返されたコンテンツが以前の状態と矛盾している場合、最終的な出力はわかりにくくなります。コンテキスト適応ロジックを追加してフォールバックするか、LLM に次のステップを再計画させることをお勧めします。
## 代替案と境界線
アプリケーション シナリオがフォールバックによる不正確さを許容できない場合、または失敗率が非常に低い場合は、フォールバックは必要ない可能性があります。代替案には次のようなものがあります。
- **冗長呼び出し**: 2 つの異なるツール (2 つのコード検査ツールなど) を同時に呼び出すと、最も一貫した結果が得られます。
- **人間による介入**: 失敗するとワークフローを一時停止し、ユーザーのフィードバックを待ちます。これは、非常に重要なタスク (コミット前のコード レビューなど) に適しています。
- **このステップをスキップ**: ツールが重要でない場合は、ツールをスキップして記録し、後続のステップを続行できます。
MCP フォールバックは、「失敗をやり直す必要がある」最終コミット ステップではなく、「失敗は回復できるが中断できない」中間ステップに最も適しています。
## 次のステップ: AI コーディング ワークフローを体系化する
すでに MCP フォールバックを構成しようとしている場合は、AI コーディングの奥深くに入ったことを意味します。これらの戦略を真に安定させて再利用可能にするには、ワークフロー設計、エラー処理パターン、品質管理を体系的に理解する必要があります。

コメントはまだありません