はじめに
大規模言語モデル(LLM)を用いたアプリケーション開発を支援するために、多くの現場でLangChain と LangGraph が利用されています。
本稿では、IBMがYouTube上で公開している「LangChain vs LangGraph: A Tale of Two Frameworks」をもとに、LangChain と LangGraph について、その違いとそれぞれの特徴、そしてどのような場合にどちらを選択すべきかを解説します。
引用元記事
- タイトル: LangChain vs LangGraph: A Tale of Two Frameworks
- 発行元: IBM
- 発行日: 2024年11月4日
- URL: https://www.youtube.com/watch?v=qAF1NjEVHhY
要点
- LangChain は、LLMを利用したアプリケーションを構築するためのフレームワークであり、一連の機能を鎖(チェーン)のように繋げて実行することに主眼を置く。主にシーケンシャルな処理に適している。構造は有向非巡回グラフ(DAG)である。
- LangGraph は、LangChainエコシステム内の専門ライブラリであり、状態を持つ(ステートフルな)マルチエージェントシステムの構築に特化している。複雑で非線形なワークフローや、ループ処理、状態の再訪が可能なグラフ構造を持つ。
- 両者の主な違いは、ワークフローの構造(シーケンシャルか、より複雑なグラフか)と状態管理の堅牢性にある。LangGraphは、より複雑なインタラクションや状態の維持が求められる場合に強みを発揮する。
詳細解説
近年、大規模言語モデル(LLM)の進化は目覚ましく、これらを活用した新しいアプリケーションが次々と登場しています。その開発を効率化し、より高度な機能を実現するために、LangChainやLangGraphのようなフレームワークが重要な役割を担っています。
まず、これらのフレームワークを理解する上で基本となるいくつかの用語を簡単に説明します。
- 大規模言語モデル(LLM): 大量のテキストデータで学習し、人間のように自然な文章を生成したり、質問に答えたり、要約したりできるAIモデルのことです。
- オープンソースフレームワーク: ソースコードが公開されており、誰でも自由に利用、改変、配布ができるソフトウェアの骨組みや土台のことです。
- エージェント(AIにおける): 特定の目標を達成するために、自律的に環境を認識し、判断し、行動するプログラムやシステムのことです。複数のエージェントが協調して動作するシステムをマルチエージェントシステムと呼びます。
- ステートフル: アプリケーションが過去のインタラクションやイベントの履歴(状態)を記憶し、その後の動作に影響を与える性質のことです。
LangChainとは?
LangChainは、LLMを活用したアプリケーションを構築するためのフレームワークで、その核心は一連の機能を鎖(チェーン)のように繋げて実行するという考え方です。例えば、あるウェブサイトからデータを取得し、そのデータを要約し、最後にその要約に基づいてユーザーの質問に答える、といった一連の処理フローを構築できます。
このワークフローは、「取得(Retrieve) → 要約(Summarize) → 回答(Answer)」というステップで構成されます。LangChainは、これらの各ステップを助けるための様々なコンポーネントを提供します。
- データ取得コンポーネント:
- ドキュメントローダー (Document Loader): 様々なデータソース(ウェブサイト、PDF、データベースなど)からコンテンツを取得し、読み込みます。
- テキストスプリッター (Text Splitter): 大きなドキュメントを、意味的にまとまりのある小さなチャンクに分割します。これは、LLMが一度に処理できるテキスト量に制限がある場合に特に有効です。
- 要約コンポーネント:
- チェーン (Chain): 要約プロセス全体を調整します。
- プロンプトコンポーネント (Prompt Component): LLMに対して、どのように要約を実行すべきかを指示するプロンプト(指示文)を構築します。
- LLMコンポーネント: 選択したLLM(例えばOpenAIのGPTシリーズやGoogleのGeminiなど)にリクエストを送信します。
- 回答コンポーネント:
- 別のチェーン (Another Chain): 回答生成プロセスを調整します。
- メモリコンポーネント (Memory Component): 会話の履歴や文脈を保存し、より自然で文脈に沿った回答を生成するために利用します。
- プロンプトコンポーネントとLLMコンポーネント: 要約された内容と保存された文脈に基づいて回答を生成します。
LangChainのモジュール化されたアーキテクチャにより、これらの高レベルなコンポーネントを組み合わせることで、複雑なワークフローを構築できます。重要な点として、要約に使用するLLMと回答生成に使用するLLMは、全く異なるモデルを選択することも可能です。
LangChainの構造は、有向非巡回グラフ(DAG:Directed Acyclic Graph)として機能します。これは、タスクが特定の順序で実行され、常に前進することを意味します。例えば、タスク1から始まり、タスク2とタスク3に分岐し、その後タスク4に合流するといった流れです。この構造は、必要なステップの順序が明確な場合に非常に有効です。
状態管理については、LangChainは情報をチェーンを通じて前方に渡すことはできますが、複数の実行をまたいで永続的な状態を簡単に維持することは得意ではありません。ただし、前述のメモリコンポーネントを使用することで、インタラクション間である程度の状態を維持することは可能です。
LangChainの主なユースケースは、データの取得、処理、結果の出力といったシーケンシャルなタスクです。エージェント機能を使えば、ある程度ノンシーケンシャルなタスクも扱えますが、本質的には直線的な処理フローを得意とします。
LangGraphとは?
LangGraphは、LangChainエコシステム内の一つのライブラリで、特に状態を持つ(ステートフルな)マルチエージェントシステムや、複雑で非線形なワークフローを構築するために設計されています。LangChainがシーケンシャルな処理の流れに強いのに対し、LangGraphはよりダイナミックで、状況に応じて処理の流れが変わるようなアプリケーションに適しています。
例として、タスク管理アシスタントエージェントを考えてみましょう。このエージェントのワークフローは、ユーザーの入力を処理し、タスクの追加、タスクの完了、タスクの要約といったアクションを実行できるようにします。
LangGraphは、このようなシステムをグラフ構造として作成するのに役立ちます。
- ノード (Nodes): 各アクション(例:タスク追加、タスク完了、要約)がノードとして表現されます。
- プロセス入力ノード (Process Input Node): ユーザー入力がここに入り、LLMコンポーネントがユーザーの意図を理解し、適切なアクションノードに処理を振り分けます。
- エッジ (Edges): ノード間の遷移(処理の流れ)がエッジとして表現されます。
- 状態 (State): LangGraphの非常に中心的なコンポーネントで、全てのインタラクションを通じてタスクリストなどの状態を維持します。
- 「タスク追加」ノードは新しいタスクを状態に追加します。
- 「タスク完了」ノードはタスクを完了済みとしてマークします。
- 「要約」ノードはLLMを使用して現在のタスクの概要を生成します。
- 全てのノードがこの状態にアクセスし、変更することができるため、文脈に応じたステートフルなインタラクションが可能になります。
LangGraphのグラフ構造は、アシスタントが様々なユーザーリクエストを任意の順序で処理し、アクション完了後には常に「プロセス入力ノード」に戻ることを可能にします。これにより、ループ処理や以前の状態への再訪も実現できます。例えば、状態Aから状態Bや状態Cへ進み、また状態Aに戻るような柔軟なフローが構築可能です。これは、次のステップが変化する条件やユーザー入力に依存するインタラクティブなシステムにとって有益です。
状態管理に関して、LangGraphは非常に堅牢です。状態は、全てのノードがアクセスし変更できるコアコンポーネントであり、より複雑で文脈を意識した振る舞いを可能にします。
LangGraphの主なユースケースは、継続的なインタラクションと適応を必要とする複雑なシステムです。例えば、長時間の会話にわたって文脈を維持し、様々なタイプのリクエストを処理する必要がある仮想アシスタントなどが挙げられます。
LangChainとLangGraphの比較
特徴 | LangChain | LangGraph |
主な焦点 | LLM操作をLLMアプリケーションに連鎖させるための抽象化レイヤーの提供 | マルチエージェントシステムとワークフローの作成・管理 |
構造 | チェーン構造(有向非巡回グラフ – DAG)。タスクは特定の順序で前進する。 | グラフ構造。ループや以前の状態への再訪が可能。 |
コンポーネント | メモリ、プロンプト、LLM、エージェントなど | ノード、エッジ、状態など、グラフの一部として機能するコンポーネント |
状態管理 | 限定的。情報をチェーン内で渡せるが、複数実行にまたがる永続的な状態維持は不得手。メモリコンポーネントで一部対応。 | 堅牢。状態はコアコンポーネントで、全ノードがアクセス・変更可能。複雑で文脈に応じた振る舞いを実現。 |
ユースケース | データ取得・処理・出力などのシーケンシャルなタスク。エージェント機能で一部非シーケンシャルなタスクも対応可能。 | 継続的なインタラクションと適応が必要な複雑なシステム(例:仮想アシスタント)。 |
まとめ
LangChainとLangGraphは、どちらも大規模言語モデルを活用したアプリケーションを構築するための強力なフレームワークですが、それぞれに得意な領域があります。
- LangChainは、処理のステップが明確で、シーケンシャルなワークフローを構築する場合に非常に有効です。比較的シンプルなアプリケーションや、一連のタスクを順番に実行するような場合に適しています。
- LangGraphは、より複雑で、状態を維持しながら非線形なワークフロー(例えば、ユーザーとの対話がループしたり、複数のエージェントが協調したりするようなシステム)を構築する場合にその真価を発揮します。インタラクティブなアシスタントや、長期的な文脈を必要とするアプリケーション開発において強力な選択肢となります。
どちらのフレームワークを選択するかは、開発しようとしているアプリケーションの要件、特にワークフローの複雑さや状態管理の必要性によって決まります。
コメント