LangGraphを用いてAIエージェントを構築してみた

はじめに

現代においてAI技術は様々な分野で活用されており、特に生成AIは、ChatGPTの公開を機に、ここ数年で大きく注目されるようになりました。

その中で、特定のタスクの遂行だけでなく、目標達成のために必要なタスクの選定から遂行までを自律的に行うAIシステムであるAIエージェントが注目されています。

本記事では、LangGraphを用いたAIエージェントの構築方法について解説します。

LangGraphは、LangChainの拡張として開発され、ステートフルなオーケストレーションワークフローを構築するために利用可能なPythonライブラリです。実際にシンプルなAIエージェントを構築するプロセスを通じて、その構築方法を紹介します。

作成したエージェント

検索したい飲食店の条件を入力すると、条件に合った飲食店をブラウザより検索し、ユーザーの入力文と検索結果に基づいた案内メールを作成&送信するAIエージェントを作成しました。

作成したAIエージェントの利用イメージ

今回はLangGraphを用いたAIエージェントの構築手順の紹介のため、AIエージェントが実行可能なタスクを、以下の3つに限定しています。

  1. ユーザーが入力した条件に一致する飲食店のインターネット検索
  2. 案内メールの自動作成
  3. 案内メールの自動送信

 

実行した例を紹介します。

作成したエージェントを実行すると、検索したい飲食店の条件を問われるので入力します。

入力画面

入力したプロンプトは次の通りです。

 

プロンプトを入力すると、希望条件に沿った飲食店を検索し、ユーザーの入力文と検索結果から案内メールの作成&送信が実行されます。

すべてのタスクが完了し、最終的にユーザーに出力される内容は次の通りです。

※実行結果に実際の店舗情報やURLが含まれている箇所はマスクしています。

 

実際に届いたメールの内容は次の通りです。

受信メール

構築手順

構築手順の前に、LangGraphについて紹介します。

LangGraphの特徴として、エージェントのワークフローをグラフとしてモデル化することができます。モデル化する際には、次の3つの主要なコンポーネントを用いて定義します。

ステート

 ノード遷移時に一貫した情報を連携するためのしくみで、各ノードにおいて参照、更新されます。

ノード

 エージェントが実行する処理を表し、ステートを入力として受け取り、処理実行後、ステートを更新します。

エッジ

 ノード間の接続を表し、決まった遷移に限らず、現在のステートに基づいた条件分岐も可能です。

各コンポーネントの関係を図示すると、次の通りです。

各コンポーネントの関係

各種コンポーネントの構築手順の詳細を、以下の順番で解説します。

  • 手順1:ライブラリのインポート
  • 手順2:ステートの定義
  • 手順3:ノードが処理するタスクに合わせて参照可能なツールの定義
  • 手順4:ノードの定義
  • 手順5:作成したコンポーネントを用いたワークフローの構築

 

それでは構築手順の紹介に移ります。

実際に手元で動かしてみたい方は、Python3の環境(Google Colaboratoryがお手軽です)を用意して、下記パッケージをインストールしてください。

また、TavilyOpenAIのAPIキーを取得して、環境変数に設定し、GmailのクライアントIDをダウンロード(ファイル名:credential.json)し、同フォルダに配置してください。

※Google Colaboratoryの場合、シークレットに追加後、以下を実行してください。

1. ライブラリのインポート

必要なライブラリをインポートします。

 

2. ステートの定義

プログラム内で利用するデータ構造をTypedDictを用いて定義します。

定義したデータ構造とwith_structured_outputを用いて、生成AIモデルの出力データを指定したデータ構造に制御することができます。今回は、案内メール作成時とタスク一覧作成時に出力されるデータ構造を制御するために、次の通りに定義しています。

またステートの型を次の通りに定義しています。

デフォルトでは、ノード遷移時にフィールドを指定して値を更新すると、各フィールドの値は置換されますが、task_resultsフィールドは、タスクを実行するたびに実行結果を追加していくため、Annotatedとaddを用いています。

3. ツールの定義 

タスクを実行する際に利用可能なツールを定義しています。

カスタムツールを定義するには、作成した関数に@toolとツールの説明文を記載するのが一番シンプルな方法になります。

今回は、独自に作成したメール作成ツールとメール送信ツール、そしてLangChainの組み込みツールであるTavilySearchResultsの3種類のツールを利用します。

メールの送信元や宛先を固定し、限定的なツールのみを作成していますが、様々なツールを定義しておくことで、エージェントがより多くのタスクを自律的に処理することが可能となります。

(例)飲食店の空き状況を確認するツール、飲食店を指定された日時で予約するツールなど

4. ノードの定義

各ノードで実行する処理を定義します。

ノードの入力はステートで、返り値のキーに指定したステートのフィールド値が更新されます。

今回、定義したノードは次の通りです。

 list_task_node

ユーザーが入力した希望条件に沿った飲食店の検索において実施するタスク一覧を作成します。

今回は、タスク一覧を動的に生成するのではなく、以下の3個のタスクに限定しています。

  1. ユーザーが入力した希望条件に沿った飲食店を検索
  2. ユーザー入力と検索結果をもとに案内メールを作成
  3. 案内メールを送信

処理実行後、以下のフィールド値を更新します。

  • query:ユーザー入力文
  • tasks:作成したタスク一覧
  • current_task_index: 0

 execute_task_node

list_task_nodeで作成された各タスクをツールを用いて実行し、ステートの以下フィールド値を更新します。

  • task_results: タスクの実行結果
  • current_task_index: 現在のcurrent_task_indexフィールドの値から1加算

create_react_agentは、入力内容をもとにツールの選定から実行までを行う事前構築済みのエージェントです。

 create_response_node

作成されたタスク一覧と各タスクの実行結果をもとに、ユーザーにとって読みやすい形式に文章を再構成し、ステートの以下フィールド値を更新します。

  • response: 再構成された文章

5. ワークフローの構築

ここまで作成したコンポーネントを用いて、全体のワークフローを構築します。

ワークフローの流れは、次の通りです。

  1. ワークフロー開始
  2. list_task_nodeに遷移し、タスク一覧を作成
  3. execute_task_nodeに遷移し、タスクを実行
  4. 全てのタスクが完了していない場合は、3.に移動
  5. create_response_nodeに遷移し、最終的な出力文を作成
  6. ワークフロー終了

上記ワークフローを構築するコードは、次の通りです。

LangGraphでは、最終的なグラフ構造を視覚化して確認することが可能です。

まず必要なパッケージをインストールするために、次コマンドを実行してください。

インストールに成功したら、次コードを実行してください。

実行すると、グラフ構造が画像形式で出力されます。

グラフ構造

6. 実行

これで、エージェントの構築は以上となります。

動作確認時には、次のコードを実行して、イベント内容をコンソールに入力してください。

さいごに

今回は、LangGraphを使用して、条件に沿った飲食店の検索から案内メールの作成&送信を行うAIエージェントを構築しました。LangGraphを使うことで、シンプルな構成でAIエージェントを構築できることがご理解いただけたかと思います。

今回の例では、利用可能なツールとしてブラウザ検索と案内メールの作成・送信のみを定義しましたが、用途に応じてツールを追加することで、より広範なタスクの自動化が実現できます。また、各ノードで定義するプロンプトを工夫することで、エージェントの振る舞いをさらに希望通りに制御することも可能です。この機会に、LangGraphを用いたAIエージェントの開発を検討してみてはいかがでしょうか。

お問い合わせ先

執筆者プロフィール

Shimono Daikitdi AI&データマネジメント部
生成AIを用いたアプリケーション開発やBIツールの導入等を行っています。
最近はネイティブアプリ開発とアルゴリズムに興味があります。

関連記事