MENU
やすひら
やすひらと申します。
長靴を履いたタヌキ(ITエンジニア)です。
モノ作りの楽しさを発信中。
X(旧Twitter)のフォローもお願いします。

[Pyhton]LangGraphの使い方

Pythonでは、グラフ理論を利用したLangGraphというフレームワークがあります。
本記事では、PythonによるLangGraphの使い方を紹介します。

やすひら

LangGraphの使い方を紹介します

この記事でわかること
  • LangGraphとは
  • LangGraphでできること
  • Pythonを用いたLangGraphの使い方
目次

LangGraphとは

LangGraphは、グラフ理論を利用して、複雑な分岐処理を持つグラフ構造を構築できるフレームワークです。
LangGraphを利用することで、複雑な処理をグラフ構造で管理することができます。
LangGraph自体はオープンソースなので、無料で利用することができます。

グラフ理論とは

グラフ理論は、点(ノード)と線(エッジ)で、関係性を表す抽象化された概念です。
グラフ理論によって、処理フローなどを表現することができます。

LangGraphでは、グラフ理論を用いて、グラフ構造の処理フローを構築します。

LangGraphの構成要素

LangGraphの構成要素を紹介します。

要素内容
Graph(グラフ)グラフ構造を示す。ノードとエッジの集合体
Node(ノード)対象のものを示す
Edge(エッジ)関係性を示す
State(状態)共有データを保持する
Router(ルーター)条件付きで次ノードを決める

上記4つの要素を利用して、グラフ構造の処理フローを構築します。

LangGraphを利用したグラフ構造の定義方法

LangGraphを利用したグラフ構造の定義方法を紹介します。

  1. State(状態)を定義する内容
  2. Node(ノード内容)の処理内容を関数で記述する
  3. Graph(グラフ)を初期化する
  4. Node(ノード)を定義する
  5. Edge(エッジ)を定義する
  6. Graph(グラフ)をコンパイルする
  7. Graph(グラフ)を実行する

上記の手順でグラフ構造の処理フローを定義して、処理を実行します。

LangGraphでできること

LangGraphでできることを紹介します。

グラフ構造で処理フローを制御

グラフ構造で処理フローを制御することができます。

AIエージェント処理フローを構築

AIエージェント処理フローを構築して、複雑な分岐処理をAIエージェントとしてシステムを構築することができます。

グラフの状態管理

グラフの途中経過の状態を保持することで、処理を分岐させることができます。

LangGraphをPythonで使う方法

Pythonを用いたLangGraphの使い方を紹介します。

ライブラリのインストール

pipでopenaiライブラリをインストールします。

コマンドライン

pip install langgraph grandalf

langgraphライブラリをインストールします。

LangGraphの使い方

LangGraphの使い方を紹介します。

シンプルにLangGraphを利用する

シンプルにLangGraphを利用して、グラフ構造で処理を実行。

ソースコード

from langgraph.graph import StateGraph, END

# State定義
class State(dict):
    text: str
    result: str

# ノード1:入力処理
def input_node(state: State):
    state["result"] = state["text"].upper()
    return state


# ノード2:出力処理
def output_node(state: State):
    print("RESULT:", state["result"])
    return state

# グラフ初期化
graph = StateGraph(State)

# ノード定義
graph.add_node("input", input_node)
graph.add_node("output", output_node)

# エッジ定義
graph.set_entry_point("input")
graph.add_edge("input", "output")
graph.add_edge("output", END)

# コンパイル
app = graph.compile()

# 実行
app.invoke({"text": "LangGraphで入出力処理"})

# グラフ表示
app.get_graph().print_ascii()

コマンド実行結果

$ python3 -B python-langgraph.py 
RESULT: LangGraphで入出力処理
+-----------+  
| __start__ |  
+-----------+  
      *        
      *        
      *        
  +-------+    
  | input |    
  +-------+    
      *        
      *        
      *        
  +--------+   
  | output |   
  +--------+   
      *        
      *        
      *        
 +---------+   
 | __end__ |   
 +---------+   

シンプルにLangGraphを利用して、グラフ構造で入出力処理を実行しました。

条件分岐ありでLangGraphを利用する

条件分岐ありでLangGraphを利用して、グラフ構造で処理を実行。

ソースコード

from langgraph.graph import StateGraph, END

# State定義
class State(dict):
    text: str
    length: int


# ノード:文字数を計算
def count_length(state: State):
    state["length"] = len(state["text"])
    return state


# 分岐先ノード(短い場合)
def short_text(state: State):
    print("SHORT:", state["text"])
    return state


# 分岐先ノード(長い場合)
def long_text(state: State):
    print("LONG:", state["text"])
    return state


# ルーター(条件分岐)
def router(state: State):
    if state["length"] < 10:
        return "short"
    else:
        return "long"


# グラフ初期化
graph = StateGraph(State)

# ノード定義
graph.add_node("count", count_length)
graph.add_node("short", short_text)
graph.add_node("long", long_text)

# 初期ノード定義
graph.set_entry_point("count")

# 条件付きエッジ定義
graph.add_conditional_edges(
    "count",
    router,
    {
        "short": "short",
        "long": "long",
    },
)

# エッジ定義
graph.add_edge("short", END)
graph.add_edge("long", END)

# コンパイル
app = graph.compile()

# 実行
app.invoke({"text": "LangGraph"})
app.invoke({"text": "LangGraphで長文を判定する"})

# グラフ表示
app.get_graph().print_ascii()

コマンド実行結果

$ python3 -B python-langgraph-router.py 
SHORT: LangGraph
LONG: LangGraphで長文を判定する
      +-----------+        
      | __start__ |        
      +-----------+        
            *              
            *              
            *              
        +-------+          
        | count |          
        +-------+          
        .       ..         
      ..          .        
     .             .       
+------+        +-------+  
| long |        | short |  
+------+        +-------+  
        *       **         
         **    *           
           *  *            
       +---------+         
       | __end__ |         
       +---------+  

分岐処理で文字数を判定しています。

LangGraphを利用してチャットアプリを作成

LangGraphを利用してチャットアプリを作成します。

設定ファイル

OPENAI_API_KEY=$OPENAI_API_KEY

ソースコード

from dotenv import load_dotenv
from typing import TypedDict, List
from langgraph.graph import StateGraph, END
from langchain_openai import ChatOpenAI
from langchain_core.messages import HumanMessage, AIMessage

# .envを読み込む
load_dotenv()

# LLM定義
llm = ChatOpenAI(model="gpt-4o-mini")

# State定義
class ChatState(TypedDict):
    messages: List
    count: int
    user_input: str

# ノード1:ユーザー入力
def user_input_node(state: ChatState):
    text = input("You: ")
    state["user_input"] = text
    state["messages"].append(HumanMessage(content=text))
    return state

# ノード2:カウント
def counter_node(state: ChatState):
    state["count"] += 1
    return state

# ノード3:LLMチャット
def chat_node(state: ChatState):
    response = llm.invoke(state["messages"])
    state["messages"].append(AIMessage(content=response.content))
    print("AI:", response.content)
    return state

# ノード4:終了メッセージ
def end_message_node(state: ChatState):
    message = "会話回数の上限に達しました。終了します。"
    state["messages"].append(AIMessage(content=message))
    print("AI:", message)
    return state

# 条件分岐
def check_limit(state: ChatState):
    if state["count"] >= 5:
        return "end_message"
    return "chat"

# グラフ初期化
graph = StateGraph(ChatState)

# ノード定義
graph.add_node("user_input", user_input_node)
graph.add_node("counter", counter_node)
graph.add_node("chat", chat_node)
graph.add_node("end_message", end_message_node)

# 開始ノード定義
graph.set_entry_point("user_input")

# エッジ定義
graph.add_edge("user_input", "counter")

# 条件付きエッジ定義
graph.add_conditional_edges(
    "counter",
    check_limit,
    {
        "end_message": "end_message",
        "chat": "chat",
    },

)

# エッジ定義
graph.add_edge("chat", "user_input")
graph.add_edge("end_message", END)

# コンパイル
app = graph.compile()

# 実行
state: ChatState = {
    "messages": [],
    "count": 0,
    "user_input": "",
}

print("LangGraph Chat (5回で終了)")
app.invoke(state)

# グラフ表示
app.get_graph().print_ascii()

コマンド実行結果

$ python3 -B python-langgraph-chatbot.py 
LangGraph Chat 5回で終了)
You: AIとは何か教えてください。
AI: AI(人工知能)とは、コンピュータや機械が人間の知能を模倣する技術やシステムのことを指します。AIは、大きく分けて以下の2つのカテゴリに分類されます。

1. **弱いAI(Narrow AI)**: 特定のタスクや問題を解決するために設計されたAIで、例えば音声アシスタント(SiriやAlexa)、画像認識ソフトウェア、自動運転車の一部機能などがあります。これらは特定の領域に特化しており、人間のような一般的な知能は持っていません。

2. **強いAI(General AI)**: 人間と同等の知能を持つAIで、どんな知的作業にも対応できる能力を持つとされています。現在のところ、強いAIはまだ実現されていません。

AIの技術は、機械学習、深層学習、自然言語処理(NLP)、画像処理などの分野に基づいています。これらの技術を用いることで、AIはデータから学習し、予測を行ったり、意思決定を支援したりします。

AIはさまざまな分野で利用されており、医療、金融、製造、エンターテインメントなど多岐にわたっています。AIの進化は、効率の向上や新しいサービスの創出に寄与していますが、一方で倫理的な問題や職業への影響についての議論も続いています。
You: 生成AIとは何か教えてください。
AI: 生成AI(Generative AI)とは、データを基にして新しいコンテンツや情報を生成する人工知能の一形態です。生成AIは、大量の既存データを分析し、そのパターンや特徴を学習することで、新たなテキスト、画像、音声、動画などを自動的に作成する能力を持っています。

### 主な特徴:
- **データ駆動型**: 生成AIは訓練データから学習し、そこから新しい情報を生成します。たとえば、テキスト生成では、過去の文書を学習することで、新しい文章を作成します。
- **創造性**: 生成AIは、実際には存在しない未使用のアイデアや作品を生み出すことができます。芸術作品や音楽、ストーリーなど、多様な形式のコンテンツを作り出すことが可能です。

### 応用例:
- **テキスト生成**: 作文、ニュース記事、技術文書などの自動生成。GPT(Generative Pre-trained Transformer)が代表的な例です。
- **画像生成**: 新しい画像を創出する、たとえば、DALL-EやMidjourneyなどのAIツールが挙げられます。
- **音声合成**: 人間の声を模倣して音声を生成する技術も、生成AIの一部です。これはポッドキャストや自動音声アシスタントなどで用いられています。

### 課題と懸念:
生成AIには利点がある一方で、倫理面や法的な問題も指摘されています。たとえば、偽情報の生成や著作権の侵害、差別的なコンテンツの生成といった問題が挙げられます。これに対処するためには、適切なガイドラインや規制が求められています。

生成AIは、創作活動や問題解決の新しいアプローチを提供する一方、責任を持った使用が重要です。
You: LLMとは何か教えてください。
AI: LLM(Large Language Model、大規模言語モデル)とは、多量のテキストデータを基にして訓練された自然言語処理(NLP)モデルのことを指します。これらのモデルは、言語の構造やパターンを学習し、人間の言語を理解し生成する能力を持っています。具体的には、文章の生成、質問応答、翻訳、要約、対話システムなど、様々なタスクに利用されています。

### 主な特徴:
1. **大規模な訓練データ**: LLMは、インターネット上の膨大なテキスト(書籍、記事、ウェブページなど)を用いて訓練されます。これにより、さまざまな文脈や知識を保持しています。

2. **自己回帰モデルまたはトランスフォーマーアーキテクチャ**: 多くのLLMは、トランスフォーマーアーキテクチャに基づいています。これにより、長文のコンテキストを考慮しながら最適な単語を生成することができます。

3. **転移学習**: LLMは、一般的な言語理解を学習した後、特定のタスクに適応する形でさらに訓練されることがあります。このプロセスは転移学習と呼ばれます。

### 代表的な例:
- **GPT(Generative Pre-trained Transformer)シリーズ**: OpenAIが開発したもので、文章生成や対話システムに広く利用されています。
- **BERT(Bidirectional Encoder Representations from Transformers)**: Googleによって提案されたもので、文の理解や検索結果の向上に使われます。
- **T5(Text-To-Text Transfer Transformer)**: 文脈に基づいたタスクをテキスト変換として扱うモデルです。

### 応用範囲:
LLMは、多くの分野で応用されています。たとえば、カスタマーサービスのチャットボット、コンテンツ生成、プログラムコードの自動生成、教育分野での個別指導などです。

### 課題と懸念:
LLMには利点がある一方、いくつかの懸念も存在します。例えば、誤情報の生成、偏見のある結果、人間の監督の欠如などがあります。したがって、適切な使用と倫理的な考慮が求められています。
You: ChatGPTとは何か教えてください。
AI: ChatGPTとは、OpenAIが開発した大規模言語モデル(LLM)で、特に対話形式での応答生成に特化したAIシステムです。このモデルは、ユーザーとの自然な会話を行うために設計されており、質問に答えたり、情報を提供したり、様々なトピックについての議論を行ったりします。

### 主な特徴:
1. **対話型の設計**: ChatGPTは、テキストベースの会話を通じて、ユーザーとのインタラクションを重視しています。エンターテインメント、学習、問題解決など、さまざまな目的で利用できます。

2. **大規模な訓練データ**: ChatGPTは、インターネット上の大量のテキストデータを使用して訓練されています。このため、多くのトピックに関する情報を提供する能力があります。

3. **文脈理解**: 会話の中での文脈を理解し、前の発言に基づいて適切な応答を生成できます。この能力によって、より自然な対話が可能になります。

4. **カスタマイズと微調整**: ChatGPTは、特定の用途に応じて微調整することができます。このため、特定の業界やニーズに合わせた応答が可能です。

### 主な利用用途:
- **カスタマーサポート**: 顧客からの質問に自動で応答したり、問題解決をサポートします。
- **教育**: 学習者に対して情報を提供したり、質問に答えたりして、教育的な支援を行います。
- **アイデア生成**: クリエイティブなプロジェクトや文章作成のためのブレインストーミングに利用されます。
- **エンターテインメント**: ゲームやインタラクティブな物語のキャラクターとして活用されます。

### 課題と懸念:
ChatGPTにはいくつかの課題もあります。たとえば:
- **誤情報生成**: 必ずしも正確な情報を提供するわけではなく、誤った情報を生成する可能性があります。
- **偏見の問題**: 訓練データに基づく偏見があり、その影響が応答に現れることがあります。
- **倫理的な考慮**: 悪用される可能性についての懸念もあり、適切な使用を促進する必要があります。

OpenAIは、ChatGPTを利用する際には、利用規約や倫理ガイドラインに従うことを推奨しています。これにより、技術が有効かつ安全に利用されることを目指しています。
You: LangGraphの概要と使い方を教えてください。
AI: 会話回数の上限に達しました。終了します。
           +-----------+         
           | __start__ |         
           +-----------+         
                  *              
                  *              
                  *              
          +------------+         
          | user_input |         
          +------------+         
            **        **         
          **            **       
         *                **     
  +---------+               *    
  | counter |               *    
  +---------+...            *    
        .       ....        *    
        .           ...     *    
        .              ..   *    
+-------------+         +------+ 
| end_message |         | chat | 
+-------------+         +------+ 
        *                        
        *                        
        *                        
  +---------+                    
  | __end__ |                    
  +---------+ 

LangGraphで簡単なチャットアプリを作成しました。

まとめ

Pythonを用いたLangGraphの活用方法について紹介しました。

LangGraphは
  • Pythonで利用可能
  • グラフ構造で処理フローを定義できる

LangGraphは、Pythonで容易に利用することができます。
LangGraphを利用することで、グラフ構造を用いて、分岐処理を実装することができます。
LangGraph利用して、Pythonでグラフ構造で処理フローを実装してみると良いと思います。

  • URLをコピーしました!
目次