LangGrahp勉強中です。
LangGraph QuickstartをDatabricksでウォークスルーします。
このチュートリアルでは、LangGraphでサポートチャットボットを構築します。以下の機能を持つことができます:
✅ ウェブ検索で一般的な質問に答える: その2
✅ 呼び出し間で会話の状態を維持する: その3
✅ 人間がレビューできるように複雑なクエリを人間にルーティングする: その4
✅ カスタム状態を使用して動作を制御する: その5
✅ 会話の代替パスを巻き戻して探索する: その6
基本的なチャットボットから始め、徐々により高度な機能を追加しながら、重要なLangGraphの概念を紹介していきます。さあ、始めましょう!🌟
こちらのクイックスタートのPart1 Build a Basic Chatbotを実行します。
パート1: 基本的なチャットボットを構築する
まず、LangGraphを使用してシンプルなチャットボットを作成します。このチャットボットはユーザーのメッセージに直接応答します。シンプルですが、LangGraphでの構築の基本概念を示します。このセクションの終わりまでに、基本的なチャットボットを構築できるようになります。
セットアップ
まず、必要なパッケージをインストールし、環境を設定します:
%%capture --no-stderr
%pip install -U langgraph langsmith langchain_openai openai
%restart_python
import os
os.environ["OPENAI_API_KEY"] = dbutils.secrets.get(scope="demo-token-takaaki.yayoi", key="openai_api_key")
StateGraph
を作成することから始めます。StateGraph
オブジェクトは、チャットボットの構造を「状態機械」として定義します。node
を追加してllmやチャットボットが呼び出せる関数を表し、edge
を追加してこれらの関数間の遷移方法を指定します。
from typing import Annotated
from typing_extensions import TypedDict
from langgraph.graph import StateGraph, START, END
from langgraph.graph.message import add_messages
class State(TypedDict):
# メッセージは "list" 型を持ちます。注釈内の `add_messages` 関数は
# この状態キーがどのように更新されるべきかを定義します
# (この場合、リストにメッセージを追加し、上書きしません)
messages: Annotated[list, add_messages]
graph_builder = StateGraph(State)
コンセプト
グラフを定義する際の最初のステップは、そのState
を定義することです。State
には、グラフのスキーマと状態更新を処理するreducer関数が含まれます。私たちの例では、State
は1つのキーmessages
を持つTypedDict
です。add_messages reducer関数は、新しいメッセージを上書きするのではなく、リストに追加するために使用されます。reducer注釈のないキーは、以前の値を上書きします。State、reducer、および関連する概念についての詳細は、このガイドで学んでください。
次に、「chatbot
」ノードを追加します。ノードは作業単位を表します。通常、これらは通常のPython関数です。
from langchain_openai import ChatOpenAI
llm = ChatOpenAI(model="gpt-4o-mini")
def chatbot(state: State):
return {"messages": [llm.invoke(state["messages"])]}
# 最初の引数は一意のノード名です
# 二番目の引数はノードが使用されるたびに呼び出される関数またはオブジェクトです
graph_builder.add_node("chatbot", chatbot)
chatbot
ノード関数が現在のState
を入力として受け取り、キー「messages
」の下に更新されたmessages
リストを含む辞書を返す方法に注目してください。これはすべてのLangGraphノード関数の基本パターンです。
State
のadd_messages
関数は、llmの応答メッセージを現在の状態に既にあるメッセージに追加します。
次に、entry
ポイントを追加します。これにより、グラフが実行されるたびにどこから作業を開始するかが指定されます。
graph_builder.add_edge(START, "chatbot")
同様にfinish
ポイントを設定します。これは、グラフに 「このノードが実行されるたびに、終了してもよい」 と指示します。
graph_builder.add_edge("chatbot", END)
最後にグラフを実行できるようにしたいと思います。そのためには、グラフビルダーで「compile()
」を呼び出します。これにより、状態で呼び出すことができる「CompiledGraph
」が作成されます。
graph = graph_builder.compile()
グラフは、get_graph
メソッドとdraw_ascii
やdraw_png
のような「draw
」メソッドの1つを使用して視覚化できます。draw
メソッドはそれぞれ追加の依存関係を必要とします。
from IPython.display import Image, display
try:
display(Image(graph.get_graph().draw_mermaid_png()))
except Exception:
# これはいくつかの追加の依存関係を必要とし、オプションです
pass
さあ、チャットボットを実行しましょう!
ヒント: "quit"、"exit"、または "q" と入力することで、いつでもチャットループを終了できます。
Databricksの場合、MLflow Traceが動作してくれます。
おめでとうございます!LangGraphを使用して最初のチャットボットを構築しました。このボットは、ユーザー入力を受け取り、LLMを使用して応答を生成することで基本的な会話を行うことができます。上記の呼び出しに対するLangSmith Traceを提供されたリンクで確認できます。
しかし、ボットの知識はそのトレーニングデータに限定されていることに気付いたかもしれません。次の部分では、ウェブ検索ツールを追加してボットの知識を拡張し、より能力を高めます。
こちらに続きます。