GitHub Repo
LangChain 1.4.2、人によるレビュー前のツール呼び出し案を保持し、エージェントの再試行時のコンテキスト矛盾を修正
新版では、人による変更をツール実行リクエストに適用し、実際に実行した内容をモデルに通知する。レビュー後の意図しない再試行を減らせるが、プロバイダーのインターフェースとツールの副作用は引き続き個別に検証する必要がある。

LangChainは9月18日に1.4.2をリリースし、人がツール呼び出しをレビューする際の履歴処理を修正した。ユーザーがツール名や引数を変更した場合、エージェントはモデルの元の提案を保持し、実際に実行した内容を別途通知するようになった。これにより、後続の推論で人による変更をモデル自身の判断と誤認するのを防ぐ。同バージョンはPyPIでも公開されている。[リリースノート](https://github.com/langchain-ai/langchain/releases/tag/langchain==1.4.2)と[パッケージページ](https://pypi.org/project/langchain/1.4.2/)で確認できる。
問題は、旧版が`AIMessage.tool_calls`を直接書き換えていたことにある。ツールは変更後の引数で実行される一方、会話履歴も同時に書き換えられていた。モデルの元の推論が別の操作を意図していた場合、次のターンで読み込む記録に矛盾が生じる可能性があった。メンテナーは、これによってモデルが人の介入を理解せず、元の呼び出しを再試行する可能性があると指摘している。[修正内容の説明](https://github.com/langchain-ai/langchain/pull/40463)
新版では、変更を実行層の`ToolCallRequest`に適用し、返される`ToolMessage`に介入を知らせる通知を追加する。この通知には、実際のツール名と引数が明記される。技術的な利点は、「モデルが何を提案したか」と「人が何の実行を許可したか」の両方をコンテキストに残し、後続の推論や追跡調査に役立てられることだ。そのため、モデルの元のメッセージだけを読み取って実行履歴を再構成するアプリケーションでは、前提を見直す必要がある。提案をそのまま完了済みの操作と同一視することはできない。
既存のヒューマンインザループ機構は、引き続き割り込みとチェックポイントで状態を保存し、承認、変更、拒否などの判断を受け取る仕組みだ。本番サービスでは永続化できるチェックポイントが必要であり、同じ会話識別子を使って実行を再開する必要がある。公式ドキュメントでも、引数を大幅に変更すると、モデルが計画を立て直したり、ツールを複数回呼び出したりする可能性があると注意を促している。そのため、今回の修正ですべての重複実行の問題が解消されると考えることはできない。[ヒューマンインザループのドキュメント](https://docs.langchain.com/oss/python/langchain/human-in-the-loop)
メンテナーは、複数のモデルで意図しない再試行が改善したと報告しているが、成功率に関する包括的なベンチマークは公表していない。一部のプロバイダーのインターフェースでは、従来から変更内容をネイティブのコンテンツブロックに書き戻していなかったため、実際の違いは主に通知の追加となる。導入する側は、自分たちのツールでレビューフローを再現し、元の提案、変更後の引数、最終的な副作用を併せて確認するとともに、再開後のエージェントが同じ操作を再び提案しないかを観察すべきだ。既存の監視で呼び出し内容と実行結果を照合している場合は、人の介入イベントも関連付ける必要がある。これにより、正当な変更、ツールの失敗、エージェント自身による再試行を区別できる。[実装上の適用範囲と制約](https://github.com/langchain-ai/langchain/pull/40463)