基本的なチャットボットを構築します。このチャットボットは以降の一連のチュートリアルのベースとなります。より洗練された機能を段階的に追加し、同時に主要な LangGraph コンセプトが紹介されます。
LangGraph : Get started : 基本 – 基本的なチャットボットの構築
作成 : クラスキャット・セールスインフォメーション
作成日時 : 05/30/2025
* 本記事は langchain-ai.github.io の以下のページを独自に翻訳した上で、補足説明を加えてまとめ直しています :
* サンプルコードの動作確認はしておりますが、必要な場合には適宜、追加改変しています。
* ご自由にリンクを張って頂いてかまいませんが、sales-info@classcat.com までご一報いただけると嬉しいです。
◆ お問合せ : 下記までお願いします。
- クラスキャット セールス・インフォメーション
- sales-info@classcat.com
- ClassCatJP
LangGraph : Get started : 基本 – 基本的なチャットボットの構築
このチュートリアルでは、基本的なチャットボットを構築します。
このチャットボットは以降の一連のチュートリアルのベースとなります、そこではより洗練された機能を段階的に追加し、同時に主要な LangGraph コンセプトが紹介されます。Let’s dive in! 🌟
1. パッケージのインストール
必要なパッケージをインストールします :
pip install -U langgraph langsmith
Tip : LangSmith にサインアップして問題を素早く特定して LangGraph プロジェクトのパフォーマンスを改善しましょう。LangSmith はトレースデータを使用して、LangGraph で構築された LLM アプリケーションをデバッグ、テストそして監視を行うことを可能にします。For more information on how to get started, see LangSmith docs.
StateGraph の作成
これで LangGraph を使用して基本的なチャットボットを作成できます。このチャットボットはユーザメッセージに直接応答します。
StateGraph の作成から始めます。StateGraph オブジェクトはチャットボットの構造を「ステートマシン」として定義します。チャットボットが呼び出せる llm と関数を表すノードと、ボットがこれらの関数間を遷移する方法を指定するエッジを追加します。
API リファレンス: StateGraph | START | add_messages
StateGraph : ノードが共有状態への読み書きにより通信するグラフ。各ノードのシグネチャは State -> Partial.
各状態キーはオプションで reducer 関数によりアノテートされます、これは複数のノードから受け取ったキーの値を集約するために使用されます。reducer 関数のシグネチャは (Value, Value) -> Value です。
START : グラフスタイル Pregel 内の最初の (maybe 仮想的な) ノード。
add_messages : デフォルトでは (新しいメッセージが既存のメッセージと同じ ID を持たない限りは) 状態が “append-only” であることを保証します。
from typing import Annotated
from typing_extensions import TypedDict
from langgraph.graph import StateGraph, START
from langgraph.graph.message import add_messages
class State(TypedDict):
# messages は "list" 型です。アノテーションの `add_messages` 関数はこの状態キーの更新方法を定義します。
# (この場合、それはメッセージを上書きするのではなく、リストに追加します)
messages: Annotated[list, add_messages]
graph_builder = StateGraph(State)
グラフは 2 つの主要なタスクを処理できるようになりました :
- 各 node は入力として現在の State を受け取り、状態への更新を出力します。
- Annotated 構文とともに使用される構築済みの add_messages 関数により、messages への更新は既存のリストを上書きするのではなく、追加されます。
コンセプト : グラフを定義するとき、最初のステップはその State を定義することです。State はグラフのスキーマと、状態更新を処理する reducer 関数 を含みます。この例では、State は一つのキー: messages をもつ TypedDict です。add_messages reducer 関数はリストを上書きするのではなく、新しいメッセージをリストに追加するために使用されます。reducer アノテーションのないキーは以前の値を上書きします。To learn more about state, reducers, and related concepts, see LangGraph reference docs.
3. ノードの追加
次に、”chatbot” ノードを追加します。ノードは処理単位を表し、通常は一般的な (regular) Python 関数です。
まずチャットモデルを選択しましょう :
OpenAI
pip install -U "langchain[openai]"
import os
from langchain.chat_models import init_chat_model
os.environ["OPENAI_API_KEY"] = "sk-..."
llm = init_chat_model("openai:gpt-4.1")
Anthropic
pip install -U "langchain[anthropic]"
import os
from langchain.chat_models import init_chat_model
os.environ["ANTHROPIC_API_KEY"] = "sk-..."
llm = init_chat_model("anthropic:claude-3-5-sonnet-latest")
init_chat_model はモデル名とプロバイダーから ChatModel を初期化します。
Chat Model は、(プレーンテキストを使用するのとは対照的に) 入力としてメッセージのシークエンスを使用して、出力としてメッセージを返す言語モデルです。
これでチャットモデルを単純なノードに組み込むことができるようになりました :
def chatbot(state: State):
return {"messages": [llm.invoke(state["messages"])]}
# 最初の引数は一意なノード名です。
# 2 番目の引数は、ノードが使用されるたびに呼び出される関数またはオブジェクトです。
graph_builder.add_node("chatbot", chatbot)
Note : チャットボット・ノード関数が入力として現在の State を受け取り、キー “messages” のもとで更新されたメッセージ・リストを含む辞書を返す方法に注目してください。これは、すべての LangGraph ノード関数に対する基本パターンです。
この State の add_messages 関数は LLM の応答メッセージを状態に既にあるメッセージに追加します。
4. エントリポイントの追加
グラフが実行されるたびに、どこから開始するかをグラフに伝えるエントリポイントを追加します :
graph_builder.add_edge(START, "chatbot")
5. グラフのコンパイル
グラフを実行する前に、それをコンパイルする必要があります。graph builder 上で compile() を呼び出すことでそれを行うことができます。これは、ステート上で invoke できる CompiledGraph を作成します。
graph = graph_builder.compile()
6. グラフの可視化 (オプション)
get_graph メソッドと draw_ascii や draw_png のような “draw” メソッドの一つを使用してグラフを可視化できます。それぞれの draw メソッドは追加の依存関係が必要です。
from IPython.display import Image, display
try:
display(Image(graph.get_graph().draw_mermaid_png()))
except Exception:
# This requires some extra dependencies and is optional
pass
チャットボットの実行
それではチャットボットを実行しましょう!
Tip : You can exit the chat loop at any time by typing quit, exit, or q.
def stream_graph_updates(user_input: str):
for event in graph.stream({"messages": [{"role": "user", "content": user_input}]}):
for value in event.values():
print("Assistant:", value["messages"][-1].content)
while True:
try:
user_input = input("User: ")
if user_input.lower() in ["quit", "exit", "q"]:
print("Goodbye!")
break
stream_graph_updates(user_input)
except:
# fallback if input() is not available
user_input = "What do you know about LangGraph?"
print("User: " + user_input)
stream_graph_updates(user_input)
break
Assistant: LangGraph is a library designed to help build stateful multi-agent applications using language models. It provides tools for creating workflows and state machines to coordinate multiple AI agents or language model interactions. LangGraph is built on top of LangChain, leveraging its components while adding graph-based coordination capabilities. It's particularly useful for developing more complex, stateful AI applications that go beyond simple query-response interactions. Goodbye!
Congratulations! LangGraph を使用して最初のチャットボットを構築しました。このボットは、ユーザ入力を受け取り LLM を使用して応答を生成することで基本的な会話を行なうことができます。You can inspect a LangSmith Trace for the call above.
以下はこのチュートリアル用の完全なコードです :
from typing import Annotated
from langchain.chat_models import init_chat_model
from typing_extensions import TypedDict
from langgraph.graph import StateGraph, START
from langgraph.graph.message import add_messages
class State(TypedDict):
messages: Annotated[list, add_messages]
graph_builder = StateGraph(State)
llm = init_chat_model("anthropic:claude-3-5-sonnet-latest")
def chatbot(state: State):
return {"messages": [llm.invoke(state["messages"])]}
# The first argument is the unique node name
# The second argument is the function or object that will be called whenever
# the node is used.
graph_builder.add_node("chatbot", chatbot)
graph_builder.add_edge(START, "chatbot")
graph = graph_builder.compile()
以上