🔄

LangGraphとChainlitのアップデート対応とリファクタリング

2024/09/01に公開

はじめに

以前から何度か記事で紹介している、LangGraphとChainlitを使用したチャットアプリですが、現時点でLangGraphのバージョンが0.0.55から0.2.14に、Chainlitのバージョンが1.1.202から1.1.402にアップデートされており、単純にバージョンを上げただけではうまく動作しなくなっていたため、その対応を行いました。

また、これに合わせてコードのリファクタリングも行い、かなりファイル構成が変わったため、その変更点についても記載します。

実際のところは次回の記事の準備段階として行った作業のため、記事にするかは微妙でしたが、リファクタリングによる変更が大きかったため、備忘録として残しておきます。

なにをしたかは書いていますが、具体的なコードは省略しています。
気になる方はリポジトリを参照してください。

以下の画像が変更後のアプリの実行結果です。
機能自体の変更は特にないですが、Chainlitのバージョンアップに伴い、中間ステップの見え方が変わっています。

成果物

リポジトリは以下になります。

https://github.com/0msys/langgraph-chainlit-agent

今回の変更点を見たい方は、以下のPRを参照してください。

https://github.com/0msys/langgraph-chainlit-agent/pull/10/files

LangGraphの変更点

こちらのドキュメントを参考に実装を変更しました。

https://langchain-ai.github.io/langgraph/how-tos/streaming-events-from-within-tools/#setup

もともとはastream_logという関数を使用していましたが、astream_eventsに変更されていました。

コード自体は前回同様ほぼドキュメントから持ってきましたが、読みやすさ、変更のしやすさを向上させるべく、src/services/agent.pySingleAgentクラスとして実装し、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