LangGraphとChainlitのアップデート対応とリファクタリング
はじめに
以前から何度か記事で紹介している、LangGraphとChainlitを使用したチャットアプリですが、現時点でLangGraphのバージョンが0.0.55から0.2.14に、Chainlitのバージョンが1.1.202から1.1.402にアップデートされており、単純にバージョンを上げただけではうまく動作しなくなっていたため、その対応を行いました。
また、これに合わせてコードのリファクタリングも行い、かなりファイル構成が変わったため、その変更点についても記載します。
実際のところは次回の記事の準備段階として行った作業のため、記事にするかは微妙でしたが、リファクタリングによる変更が大きかったため、備忘録として残しておきます。
なにをしたかは書いていますが、具体的なコードは省略しています。
気になる方はリポジトリを参照してください。
以下の画像が変更後のアプリの実行結果です。
機能自体の変更は特にないですが、Chainlitのバージョンアップに伴い、中間ステップの見え方が変わっています。
成果物
リポジトリは以下になります。
今回の変更点を見たい方は、以下のPRを参照してください。
LangGraphの変更点
こちらのドキュメントを参考に実装を変更しました。
もともとはastream_log
という関数を使用していましたが、astream_events
に変更されていました。
コード自体は前回同様ほぼドキュメントから持ってきましたが、読みやすさ、変更のしやすさを向上させるべく、src/services/agent.py
でSingleAgent
クラスとして実装し、toolもsrc/services/tools/*.py
に分割しました。
さらにtest_agent.py
を実行すると、SingleAgent
のみを起動して、動作確認が行えるようにしました。
これはChainlitを使わずに動作確認ができるため、デバッグ時の原因特定に役立ちます。
Chainlitの変更点
前回までは、src/main.py
で色々な処理を行っていたのでぐちゃぐちゃしていたのですが、今回はsrc/services/chainlit_agent.py
に、SingleAgent
を継承したChainlitAgent
クラスを作成し、Agent特有の処理をそちらに切り出すことで、見通しを良くしました。
src/main.py
は、チャット起動時にChainlitAgent
をインスタンス化し、メッセージを受け取ると、ChainlitAgent
の処理を呼び出すだけになりました。
また、ChainlitAgent
側の処理も、実際のAgentの処理部分はSingleAgentに任せているので、ChainlitAgent
は、添付ファイルの処理や、メッセージの整形等、ChainlitとAgentの橋渡し部分のみを担当するため、かなりシンプルに実装できました。
バージョンアップへの対応としては、Stepの見え方が変わっていたため、Tool呼び出し時のinputとoutputがうまく処理できるように、LangGraphで出力されるrun_id
を使って、複数Toolが同時に動いても、それぞれの結果を正しく処理できるようにしました
おわりに
今回は、LangGraphとChainlitのアップデートに伴う変更点について記載しました。
動き自体はあまり変わってないですが、ファイル構成を見直して、モジュールごとの役割を明確にしたので、今後のメンテナンスがしやすくなったと思います。
次回は、このリファクタリングを元に、新しい機能を追加していきたいと思います。
Discussion