LangGraphで最初のAIエージェントを構築:開発者向け完全ガイド
AIエージェントの構築は、本来あるべき姿よりも複雑に感じられることが多いです。LangGraphは、ネットワーク・ルーティングやゲームAIなどのあらゆるものを強化するのと同じ原理である「グラフ」を使用してAIエージェントを設計できる、構造化された代替手段を提供します。
LangGraphで最初のAIエージェントを構築:開発者向け完全ガイド
AIエージェントの構築は、本来あるべき姿よりも複雑に感じられることが多いです。LangGraphは、ネットワーク・ルーティングやゲームAIなどのあらゆるものを強化するのと同じ原理である「グラフ」を使用してAIエージェントを設計できる、構造化された代替手段を提供します。
1. LangGraphとは?なぜ重要なのか?
LangGraphは、AIエージェントをステートフルなグラフとして構築できるフレームワークです。ノード(アクション、決定、プロンプト)とエッジ(ノード間のパス)の集合としてエージェントを設計します。
- 利点:
- 複雑な会話フローの管理
- メモリの永続化
- 動的な意思決定
- エラー処理とリトライ
- 分岐する会話やワークフロー
2. LangGraphの活用事例
LangGraphは、以下のような分野で真価を発揮します。
- **カスタマーサポート:**エスカレーション、明確化の要求、問題解決の提案
- **AIプロジェクト管理:**目標と期限に基づいたタスク計画、フィードバックに基づいた調整
- **ゲームNPC:**固定スクリプトではなく、動的な意思決定を行うキャラクター
- **データ分析:**入力の収集、モデルの実行、結果の要約、出力に基づくアクション
3. 開発環境のセットアップ
LangGraphを使用するために必要な環境を構築します。
- 必要なもの:
- Python 3.10以上
- pip
- コードエディタ(VS Code推奨)
- 推奨:
- virtualenv(プロジェクト依存関係の分離)
- Pythonのasync/awaitの基礎知識
- LangGraphのインストール:
pip install langgraph langchain openai
- プロジェクトの初期化:
mkdir langgraph_agent cd langgraph_agent python -m venv venv source venv/bin/activate # On Windows: venv\Scripts\activate pip install langgraph langchain openai touch agent.py
- APIキーの設定: OpenAIなどのLLMを使用する場合は、APIキーを環境変数に設定します。
export OPENAI_API_KEY="your-openai-key"
4. LangGraphの基礎:ノード、エッジ、ステート
LangGraphの基本的な概念であるノード、エッジ、ステートについて解説します。
- **ノード:**エージェントの状態(ステート)を入力として受け取り、処理して更新された状態を返すPython関数。
- **エッジ:**ノード間を接続し、エージェントがどのノードに移動するかを決定するパス。
- **ステート:**エージェントがグラフを移動する際に持ち運ぶ辞書。メモリ、入力、出力、コンテキストなどを格納します。
5. 最初のノードを作成(コード付き)
ユーザー名を受け取り、挨拶メッセージを生成するシンプルなノードを作成します。
async def greet_node(state: dict) -> dict:
user_name = state.get("user_name", "friend")
greeting = f"こんにちは、{user_name}さん!ようこそ。"
state["greeting"] = greeting
return state
6. ノードの接続:グラフの構築
複数のノードを接続して、エージェントのワークフローを定義します。
- 2つ目のノードを作成:
async def ask_question_node(state: dict) -> dict: question = "今日はどのようなご用件でしょうか?" state["question"] = question return state
- グラフの定義:
from langgraph.graph import StateGraph, END # ステート構造の定義 class AgentState(dict): pass # 簡単な場合はdictから継承 # グラフの作成 graph = StateGraph(AgentState) # ノードの追加 graph.add_node("greet", greet_node) graph.add_node("ask", ask_question_node) # ノードの接続 graph.set_entry_point("greet") graph.add_edge("greet", "ask") graph.add_edge("ask", END) # グラフのコンパイル app = graph.compile()
7. エージェントの実行とテスト
構築したグラフを実行し、エージェントが動作することを確認します。
import asyncio
async def main():
initial_state = {"user_name": "太郎"}
final_state = await app.invoke(initial_state)
print(final_state)
if __name__ == "__main__":
asyncio.run(main())
8. 実践的なエージェントの例:賢い質疑応答ボット
ユーザーの入力に応じてインテリジェントに応答する、よりスマートなエージェントを構築します。
answer_node
の追加:async def answer_node(state: dict) -> dict: user_input = state.get("user_input", "").lower() if "天気" in user_input: state["response"] = "今日の天気は晴れで、わずかな風が吹いています。" elif "時間" in user_input: state["response"] = "現在時刻は午後2時です。" else: state["response"] = "申し訳ありません。その件についてはわかりませんが、調べてみます!" return state
- エージェントフローの更新:
[greet] → [ask] → [answer] → [END]
9. よくある落とし穴とその回避方法
LangGraphを使用する際に陥りやすい間違いとその解決策を紹介します。
- **非同期処理(Async)の忘れ:**ノード関数は常に
async def
で定義する。 - **ステートの矛盾:**ステートの型やキーを意識し、予期せぬ変更を加えない。
- **早期の複雑化:**最初はシンプルなグラフから始め、徐々に機能を拡張する。
- エラー処理の欠如:
try-except
ブロックを使用して例外を処理する。
10. LangGraphでエージェントを構築する上でのヒント
- ノードの粒度を細かく保つ。
- ステートを効果的に活用する。
- 段階的に複雑さを増していく。
- エラー処理を徹底する。
この記事を参考に、LangGraphを使ったAIエージェント開発に挑戦してみてください。