2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

LangGraph入門:LLMなしで基本ワークフローを構築してみる

Posted at

LangGraphは、生成AI(LLM)を活用したアプリケーションのワークフローを簡潔に定義・実行できるライブラリです。

ワークフローは「ノード」と「エッジ」を使って構築し、エッジによって処理の順序や条件分岐を定義します。

この仕組みによって、複雑なロジックもグラフ(有向グラフ)として整理でき、生成AIを絡めた高度な処理フローもスムーズに表現可能です。

今回は、LLMを使わずにまずはシンプルな関数をノードとして組み込み、基本的な挙動を確認します。

後々、LLMによるテキスト生成や外部APIへの問い合わせなどを繋げる下準備として、まずは基礎構築に慣れてみましょう。

環境

  • Python 3.12
  • langgraphライブラリ(poetry add langgraph などでインストールできます)

最初の一歩:シンプルなグラフ

シンプルなノードとエッジ

以下は、add_oneという単純な関数をノードとしてグラフに追加した例です。

STARTからadd_oneへ繋ぐエッジを張ることで、処理の入口としてadd_oneが実行されます。

from typing_extensions import TypedDict
from langgraph.graph import StateGraph, START

# 状態を表すためのTypedDict
class State(TypedDict):
    total: int

def add_one(state: State):
    # totalを1加算する単純な処理
    return {"total": state["total"] + 1}

graph_builder = StateGraph(State)
graph_builder.add_node("add_one", add_one)
graph_builder.add_edge(START, "add_one")  # START → add_one
graph = graph_builder.compile()

print(graph.invoke({"total": 5}))

実行結果

{'total': 6}

{"total": 5}{"total": 6}に変わりました。

ここで、ENDへのエッジを明示しなくても、エラーにはなりません。

add_edge(START, "add_one")set_entry_point("add_one")で置き換えることも可能で、最初に実行されるノードを指定する方法が複数ある点も覚えておきましょう。

これで、START -> add_one -> ENDという非常にシンプルなフローが定義できました。

条件分岐を導入する

add_conditional_edgesで条件分岐

LangGraphでは、add_conditional_edgesメソッドを使うことで、特定のノード実行後に条件判定を行い、結果に応じて次のノードを分岐させることができます。

以下の例では、add_fivetotalに5を足した後、even_or_odd関数で偶数・奇数を判定し、その結果に応じてshow_evenまたはshow_oddを呼び出しています。

from typing_extensions import TypedDict
from langgraph.graph import StateGraph

class State(TypedDict):
    total: int

def add_five(state: State):
    return {"total": state["total"] + 5}

def even_or_odd(state: State):
    return "even" if state["total"] % 2 == 0 else "odd"

def show_even(state: State):
    print(f"{state['total']} is even")

def show_odd(state: State):
    print(f"{state['total']} is odd")

graph_builder = StateGraph(State)
graph_builder.add_node("add_five", add_five)
graph_builder.set_entry_point("add_five")
graph_builder.add_node("show_even", show_even)
graph_builder.add_node("show_odd", show_odd)
graph_builder.add_conditional_edges(
    source="add_five",    # add_five実行後に条件分岐
    path=even_or_odd,     # 偶数・奇数を判定する関数
    path_map={"even": "show_even", "odd": "show_odd"},
)
graph = graph_builder.compile()

graph.invoke({"total": 6})

実行結果

11 is odd

{'total': 6}で開始し、add_five{'total': 11}となり、even_or_odd"odd"を返したため、show_oddノードが実行されました。

これにより、条件に応じたフロー分岐が簡単に実装できます。

繰り返し処理(ループ)の実装

条件を満たすまで繰り返す

add_conditional_edgesを用いて、特定の条件が満たされるまで同じノードを繰り返すことも可能です。

以下はtotal10を超えるまでadd_oneを繰り返し実行する例です。

from typing_extensions import TypedDict
from langgraph.graph import StateGraph, END

class State(TypedDict):
    total: int

def add_one(state: State):
    return {"total": state["total"] + 1}

def is_over_10(state: State):
    # totalの値分"☆ "を出力し、totalが10を超えるか判定
    print("" * state["total"])
    return state["total"] > 10

graph_builder = StateGraph(State)
graph_builder.add_node("add_one", add_one)
graph_builder.set_entry_point("add_one")
graph_builder.add_node("is_over_10", is_over_10)
graph_builder.add_conditional_edges(
    source="add_one",
    path=is_over_10,
    path_map={True: END, False: "add_one"},
)
graph = graph_builder.compile()

graph.invoke({"total": 0})

実行結果

☆
☆ ☆
☆ ☆ ☆
☆ ☆ ☆ ☆
☆ ☆ ☆ ☆ ☆
☆ ☆ ☆ ☆ ☆ ☆
☆ ☆ ☆ ☆ ☆ ☆ ☆
☆ ☆ ☆ ☆ ☆ ☆ ☆ ☆
☆ ☆ ☆ ☆ ☆ ☆ ☆ ☆ ☆
☆ ☆ ☆ ☆ ☆ ☆ ☆ ☆ ☆ ☆
☆ ☆ ☆ ☆ ☆ ☆ ☆ ☆ ☆ ☆ ☆

totalが0から始まり、add_oneを繰り返し呼び出してtotalを increment し続け、is_over_10がTrueを返すまでループします。

最終的にtotalが11になった段階で終了しました。

まとめ

  • LangGraphは、ノード(関数)とエッジ(処理フロー)によって構造的にワークフローを定義できるライブラリです。
  • LLMを用いずとも、基本的なノード追加・条件分岐・ループの仕組みを理解できます。
  • 複雑な処理やLLMとの連携を見据える前に、このようなシンプルな例で基礎を固めておくと、後々応用が容易になります。

本記事ではあくまで基本的な使い方の一端を紹介しましたが、LangGraphはこれ以外にもさまざまな機能を持っています。

是非公式ドキュメントや実際のコード例を参照し、LLMや外部APIなどを組み合わせたより高度なワークフロー構築にも挑戦してみてください。

参考リンク

以上で、LangGraphの基本ワークフロー構築例の紹介でした。

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?