Webエンジニア向けプログラミング解説動画をYouTubeで配信中!
▶ チャンネル登録はこちら

【ITニュース解説】Claude Parallel Tool Use: My Agent Loop Crashed on 388 of 1,200 Runs

2026年10月02日に「Dev.to」が公開したITニュース「Claude Parallel Tool Use: My Agent Loop Crashed on 388 of 1,200 Runs」について初心者にもわかりやすく解説しています。

作成日: 更新日:

ITニュース概要

ClaudeのAIが複数のツールを使う指示を同時に出す際、全ての実行結果を返さないとエラーになる。一部を無視すると、AIが過去の指示を誤解し、性能が低下する。全てを同時に実行し、結果をまとめて返すのが正しい解決策だ。これでエラーを防ぎ、性能と処理速度が向上する。

ITニュース解説

ニュース記事は、大規模言語モデル(LLM)であるClaudeの「並列ツール利用(Parallel Tool Use)」機能の扱いで発生した問題と、その適切な解決策について解説している。システムエンジニアを目指す初心者にとって、AIエージェント開発における重要な教訓となるだろう。

この記事の中心は、AIモデルが人間の指示に基づいてツール(外部のプログラムや機能)を呼び出し、その結果を使ってタスクを遂行する「エージェント」というシステムである。筆者のエージェントは、Pythonのコードベースに関する質問に答えることを目的とし、ファイルを読み込んだり、コードを検索したりするツールを活用していた。

問題は、Claudeが一度の応答で複数のツールを使う指示(tool_useブロック)を同時に出してくることがある、というAIモデルの高度な能力にある。例えば、「二つのファイルのタイムアウト処理を比較して」という質問に対し、AIモデルは「ファイルAを読んでください」と「ファイルBを読んでください」という二つの指示を一度に発行することがある。これは、個別に指示を出すよりも効率的で、AIとシステム間のやり取り(ラウンドトリップ)の回数を減らし、全体の処理時間を短縮できるメリットがある。

しかし、筆者が最初に実装したエージェントのコードは、AIモデルからの応答に含まれる複数のtool_useブロックのうち、最初のものしか処理しないように書かれていた。具体的には、「next(b for b in resp.content if b.type == "tool_use")」というコードが、最初に見つかったtool_useブロックのみを取り出していたため、残りのtool_use指示は無視されてしまっていた。

この「部分的な処理」が原因で、システムは頻繁にクラッシュした。ClaudeのAPI(Application Programming Interface)には、「AIモデルが出したすべてのtool_use指示に対して、次のユーザーメッセージで対応するtool_result(ツールの実行結果)を返さなければならない」という厳格なルールがある。もし一つでもtool_useに対応するtool_resultが返されないと、APIは「HTTP 400 invalid_request_error」(不正なリクエストエラー)というエラーを返し、エージェントの実行が停止してしまっていた。実際、筆者のエージェントは1200回の実行のうち388回でこのエラーが発生し、クラッシュしていた。

このクラッシュを一時的に回避するため、筆者は「最初のtool_useブロックだけを残し、残りのtool_useブロックは削除してAIモデルに返す履歴から隠す」という修正を行った。この修正により、エラーによるクラッシュは止まった。しかし、これは新たな、より深刻な問題を引き起こした。AIモデルは、自分が複数のツールを使った指示を出したにもかかわらず、システムの履歴には「一つしか指示しなかった」と記録されているのを見ることになる。これは、AIモデルにとって「自分の記憶が改ざんされた」ような状態であり、AIモデルが自身の計画を立てる際の「記憶の整合性」を損なうことになった。

結果として、エージェントの回答精度は大きく低下した。50問の評価セットで、この修正後のエージェントは38/50という低いスコアしか出せなかった。AIモデルは、本来入手すべき情報を入手できなかったため、その情報を再度要求して余計なやり取り(ターン数)を増やしたり、情報が不完全なまま間違った回答をしたりするようになった。AIが過去に行ったと信じている行動に基づいて次を決定するため、履歴の整合性が損なわれると、その計画がずれてしまうのだ。

最終的に見出された正しい解決策は、AIモデルが出したすべてのtool_use指示を適切に処理することである。具体的には、以下の手順を踏む。

  1. AIモデルからの応答に含まれるすべてのtool_useブロックを特定する。
  2. これらのtool_useを、Pythonのasyncio.gatherのような非同期処理の仕組みを使って、すべて並行して実行する。これにより、複数のツールを同時に実行できるため、全体の処理時間が短縮される。
  3. すべてのツール実行結果(tool_result)を収集する。もしツールの実行中にエラーが発生した場合でも、そのエラー内容を「is_error: true」というフラグとともにtool_resultとして返す。エラーがあったからといって結果を省略したり無視したりしてはならない。AIモデルはエラー結果を受け取ることで、次のターンでそのエラーを修正するような行動をとれるようになる。
  4. 収集したすべてのtool_resultを、一つのユーザーメッセージとしてまとめてAIモデルに返す。複数の結果を別々のユーザーメッセージに分けず、必ず一つのメッセージにまとめることが重要である。また、APIの仕様により、tool_resultブロックはユーザーメッセージ内のテキストコンテンツよりも先に配置する必要がある。

この修正により、エージェントはクラッシュすることなく、評価セットでのスコアも46/50へと大幅に改善された。さらに、余計なラウンドトリップが減ったことで、平均ターン数は4.9から3.6へと減少し、AIモデルへの入力トークン数も約29%削減され、実行速度も31%高速化された。これは、並列ツール利用を正しく扱うことが、精度だけでなく、効率やコストにも大きく影響することを示している。

記事では、AIモデルが実際に並列ツール呼び出しをどれくらいの頻度で行うかについてもデータが示されている。筆者のエージェントでは、ツールの呼び出しを含むアシスタントの応答の約14.2%が二つ以上のtool_useブロックを含んでおり、最大で一度に6つのtool_useがあったという。この数字が、なぜ最初のコードで32%ものクラッシュ率が発生したのかを説明している。一つの実行には複数のツール呼び出しターンが含まれるため、少なくとも一度は並列呼び出しが発生する確率が高くなるからである。

「disable_parallel_tool_use」という設定を有効にすることで、AIモデルが一度に一つのtool_useしか出さないようにすることもできる。これは、ツールを実行する順序が厳密に重要であるような場合にのみ検討すべき設定だ。例えば、ファイルを書き込み、その後にテストを実行するようなケースでは、書き込みとテストが同時に走ると、テストが古いファイルに対して実行されてしまう可能性があるため、順序を保証する必要がある。しかし、このような特別な事情がない限り、並列ツール利用を無効にすることは、エージェントのパフォーマンス(ターン数、トークン数、速度)を低下させるため、推奨されない。

システムエンジニアを目指す初心者が自分のAIエージェントを開発する際には、AIモデルの出力であるresp.contentの中からtool_useブロックを処理する部分を特に注意して確認する必要がある。「最初のtool_useだけを取る」、「特定のインデックスのtool_useだけを使う」、「tool_use_idが単一の文字列として扱われている」といったパターンは、この記事で解説されたバグと同じような問題を引き起こす可能性がある。また、ツール実行中にエラーが発生した際に、tool_resultを返さずに処理を継続するコードや、AIモデルに返す履歴を編集・フィルタリングするコードも避けるべきだ。

この一連の問題と解決策は、AIエージェント開発において、AIモデルの出力フォーマットを正確に理解し、その要求に完全に答えるような堅牢な処理ロジックを構築することの重要性を示している。AIモデルの能力を最大限に引き出し、効率的で信頼性の高いエージェントを作成するためには、その「記憶の整合性」を保ち、すべての指示を正しく処理することが不可欠なのである。

関連コンテンツ

関連IT用語

関連ITニュース