見出し画像

これからのLangChainとの向き合い方/第16回もくもくLangChainレポート

去る1月8日、LangChainのバージョンがいよいよ、v0.0.XXXからv0.1になりました(まだ0.1かよ!というツッコミは無しにして…)。

「バージョンが上がるたびにインターフェースが変わるのでついていけない」「これ、本当にプロダクションで使っている人いるの?」「LangChainは素人だましのためのフレームワークだよね」

みたいな話がTL上で漏れ聞こえてくるLangChainですが、v0.1になったことで変化の激しい部分と基盤部分がスッキリ整理され、これからのLangChainとの向き合い方が少し見えてくる格好となりました。


LangChain v0.1概観

役割別にパッケージが分割された

大きな変化はLangChainライブラリそのものの分割です。役割に応じて大きく3つに分割されています。

  • LangChain

    • CoreやCommunityの機能を組み合わせた高レベルな実装がこのパッケージに集まる。ConversationRetrievalChainやMapReduceDocumentsChainなどの高機能なチェインや、Agent Executorといったエージェント系の高機能クラスなど。

  • LangChain Community

    • 様々なベクトルストアへの接続や、データ取込など、他サービスとのインテグレーションに関わるような機能がこのパッケージに集まる。バージョン毎の差分で多いのがインテグレーション周りのコミットなので、Communityパッケージが最も活発にバージョンアップされていく流れになるのでは、という予想。

  • LangChain Core

    • LangChainやCommunityを実装するための基盤となる機能を提供する。特にLangChain Expression Language(以下LCEL)は、他機能を実装するための前提となるインターフェースを提供する。

このように俯瞰して見てみると、一言で「LangChainを使う」と言ったときでも、どのレイヤーに着目するかで大分響きが変わってくるのではないでしょうか。

また、LangChainを取り囲むLangServeやLangSmithがもたらすエコシステムも注目に値します。

LangServeは一言で言うとチェインをAPIとして外部公開するサーバを作るための仕組みです。内部はFastAPIで動いています。マイクロサービスとしてチェインを起動させ、本体サービスと連携し合うような用途を想定しているのではないかと思われます。

またLangSmithはLangChainにおけるチェイン実行を監視し、ロギングしてくれる仕組みです。LangSmithによってチェインの性能評価や、デバッグが可能になるため、これだけでもLangChainを使う価値があるのではないかなと思われます。

更にv0.1リリース記事のワンモアシングとして、LangGraphという新しいパッケージ(旧:permchain)が紹介されていました。

LangGraphは各チェインをグラフ構造のようにつなぎ合わせることで、高度な処理を実現するコードを書くためのフレームワークです。

直列な処理はLangChainを使って簡単に書くことができますが、例えばエージェントのようにある終了条件を満たすまで様々なチェーンを組み合わせて実行し続けるような処理を書くのは大変で、コードの見通しも悪くなります。LangGraphを使えば見通しの良いコードを書くことができます。

これからのLangChainとの向き合い方

このような流れを踏まえて考えてみると、これからのLangChainとの向き合い方は「いかにして堅牢なチェインを作って資産化していくか」というところにあるのではないかと思われます。

LangServeはチェインそのものを外部に公開するための仕組みですし、LangGraphはそのチェインを組み合わせて実行するための仕組みです。さらにLangSmithはそれらのチェインが正常に動いているかを監視するための仕組みとも言えます。コミュニティによって汎用化され、資産化されたチェインはLangChainパッケージに集まっていくと思われますが、LangChainのユーザーである個社においては、個社で資産となるチェインを作り、管理していく流れになるかなと思われます。

このような、いかにして堅牢なチェインを作って資産化していくかという流れの中で、最も重要で、誰もが掴んでおきたい内容がLCELになるのではないかと思います。なぜならば、LCELがLangChainでチェインを開発する際の基盤であり、LCELの扱い方一つでそのチェインは堅牢にも脆弱にもなり得るからです。

LCELを完全に理解する

と、言うわけで先日1月10日はLCELを完全に理解するための会を開催したのでした。

いつもはLangChainの差分を見ながらダラダラと話をするもくもく会ですが、今回は珍しく資料を用意して話す形になりました。

LCELを完全に理解するための資料はSpeakerdeckにアップロードしてありますので、ご参考ください。

LangChainを堅牢に扱うには?

もくもく会では特に「どのようにすればLangChainを堅牢に扱うことができるか?」というところに注目が集まりました。

堅牢に扱うために特に重要なのは、柔軟にデバッグできることと、テストが可能であることだと思います。

例えばLCELではチェインのグラフ構造を取得して描画してくれる仕組みがあります。下記の例では単なる直列なのでそこまで複雑ではありませんが、分岐を含んでいたり、並列な処理を含んでいるような複雑なチェインの場合は、LangChainにどのようにチェインが認識されているかを確かめるためにも便利な機能だと思われます。

また、チェインで扱われているプロンプトを取得するためのメソッドもあります。ただチェインだけが提供されていて構造がブラックボックスになっているようなときに、中のコードを読まなくてもプロンプトを掴むことができる点で有益だと思われます。

テストについてはChatOpenAIなどLLMによる処理をモック化することで、チェインそのものが適切に動いているかどうかを確かめるようにしていくのが有効ではないかという話が挙がりました。

例えばLangChain内部でもFakeクラスを使ってテストをしています。

このようなFakeクラスの実装を参考に、チェインの処理内のLLMクラスをパッチして置き換えることで、チェイン自体は正常に動いており、変動要因はLLMによる挙動だけである、という状況を担保し、その変動要因であるLLMのアウトプットはLangSmithなどの運用監視ツールによって監視することで、LLMアプリケーション全体の品質を確保していくことが重要なのではないかと思われます。

そういうわけで、今後のLangChainもくもく会は「いかにしてLangChainを堅牢に扱っていくか」をテーマに、本番利用を視座に入れた対話が進行していきそうです。

そんなLangChainもくもく会の次回は2月7日に開催されます。次回も実践ネタをみんなで持ち寄って有益な会にしていきましょう!もちろんROM専でもOK。みなさまのご参加をお待ちしております。

現場からは以上です。


LangChainの活用法やAIエージェントの実装など、LLMアプリケーション開発に関するまとまった情報をお届けする「実践LLMアプリケーション開発」という記事をSoftwareDesign誌で連載しております。

興味のある方はこちらもチェックして下さい↓

この記事が気に入ったらサポートをしてみませんか?