【要約】[Agents on 16GB] turn 2 が消えた。直したのは片方の扉だけだった [Zenn_Python] | Summary by TechDistill
> Source: Zenn_Python
Execute Primary Source
// Problem
開発者がLangGraphでマルチエージェントを構築中、ユーザーの返答を受けて再開するはずの「2ターン目」が、なぜか最初からやり直される問題に直面した。これはHuman-in-the-loopの成立を阻害する致命的な挙動である。原因は以下の通りである。
- ・サブグラフが親のcheckpointerを自動で継承しない仕様。
- ・ライブラリのバージョン不整合が、コードのバグを隠蔽していた。
- ・開発環境(langgraph dev)特有のASGI制約が、修正を妨げていた。
// Approach
開発者はLangSmithのトレースを用いて「メッセージがリストに存在しない」という事実を特定し、段階的に原因を切り分けた。単なる推測ではなく、実行時のデータに基づいたアプローチを採用している。
- ・サブグラフのノード登録時に、明示的にcheckpointerを渡すようコードを修正。
- ・pyproject.tomlを更新し、uv syncによって依存関係を正しく固定。
- ・dev環境でのBlockingErrorを回避するため、同期I/O(SQLite接続)をモジュール読み込み時に移動。
// Result
一連の修正により、開発環境でも状態保持が可能となり、開発体験が劇的に改善した。ただし、最終的に開発環境の仕様に関する重要な知見も得られた。
- ・サブグラフへの明示的な注入により、会話の継続性を確保。
- ・依存関係の適正化により、ライブラリ起因の不具合を解消。
- ・langgraph devではプラットフォーム側のcheckpointerが優先的に使用される事実を特定。
Senior Engineer Insight
> フレームワークの抽象化は便利だが、内部の継承挙動やランタイムの制約を理解しないと、デバッグ不能な罠に陥る。特に「開発環境と本番環境の差異」は、致命的なバグを隠蔽する。本件のように、ライブラリのバージョン管理(uv)やASGIの制約、さらにはプラットフォームによるオブジェクトの上書きといった、低レイヤーの挙動を把握しておくことが、大規模なエージェントシステムを安定稼働させる鍵となる。