ノード、エッジ、状態
TypedDictの状態を定義し、それを変更するノード関数を記述して、有向エッジで接続します。
「ノード、エッジ、状態」はCoddyKit上の無料AI Agentsレッスンです。 これはレッスン2/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはAI Agents学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 AI Agentsコースには全4レッスンが含まれています。
このレッスンの一部はまだ翻訳されておらず、英語で表示されています。
状態オブジェクト
すべてのLangGraphエージェントには型付きの状態があり、通常はTypedDictを使用します:
from typing import TypedDict
from typing_extensions import Annotated
import operator
class AgentState(TypedDict):
messages: Annotated[list, operator.add] # appends instead of replaces
plan: str
answer: str状態の更新方法
各ノードは部分的なdictを返します。LangGraphは次の処理を行います:
- 現在の状態を読み取る
- その状態を渡してノードを呼び出す
- 返された部分的なdictを状態にマージする
operator.addを使うリストフィールドでは、既存の値が上書きされず、新しい項目が追加されます。
Defining a Node
def planner(state: AgentState) -> dict:
prompt = f'User wants: {state["messages"][-1].content}'
plan = llm.invoke(prompt).content
return {'plan': plan}Registering the Node
from langgraph.graph import StateGraph, END
graph = StateGraph(AgentState)
graph.add_node('planner', planner)エッジの定義
静的エッジは無条件に実行されます:
graph.set_entry_point('planner')
graph.add_edge('planner', 'researcher')
graph.add_edge('researcher', 'writer')
graph.add_edge('writer', END)条件付きエッジ
分岐には、次のノードを選択する関数を登録します:
def route(state: AgentState) -> str:
if state['needs_research']:
return 'researcher'
return 'writer'
graph.add_conditional_edges(
'planner',
route,
{'researcher': 'researcher', 'writer': 'writer'}
)ENDは特別です
ENDは終端ノードです。ENDへのエッジがあるとグラフは終了し、現在の状態を返します。
Compiling the Graph
app = graph.compile()
result = app.invoke({'messages': [...]})
print(result['answer'])状態更新のストリーミング
状態の変化をリアルタイムで確認します:
for event in app.stream({'messages': [...]}):
print(event)
# Each event is the state diff from the just-completed node.リデューサー関数
複雑な状態のマージには、カスタムリデューサーを使用します:
def merge_facts(old, new):
return {**old, **new}
class State(TypedDict):
facts: Annotated[dict, merge_facts]サブグラフ
ノード自体を別のコンパイル済みグラフにできます。階層型エージェントに便利です:
subgraph = StateGraph(SubState).compile()
graph.add_node('subprocess', subgraph)非同期ノード
ノードには非同期関数を指定できます:
async def fetch_node(state):
data = await fetch_async(state['url'])
return {'data': data}
result = await app.ainvoke({...})ノード内のエラー
ノードで例外が発生すると、LangGraphはそのエラーを伝播させて停止します。適切に処理したい場合は、ノード内で捕捉してください:
def safe_search(state):
try:
return {'results': search(state['query'])}
except Exception as e:
return {'error': str(e), 'results': []}状態の更新
ノードがdictとして{'plan': '...'}を返すと、何が起こりますか?
まとめ
TypedDictで状態を定義し、部分的な更新を返す関数を記述し、ノードとエッジを追加して、コンパイルして実行します。これがLangGraphです。
よくある質問
「ノード、エッジ、状態」レッスンは無料ですか?
はい。「ノード、エッジ、状態」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、AI Agentsコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 AI Agentsコースには全4レッスンが含まれています。
「ノード、エッジ、状態」で何を学びますか?
TypedDictの状態を定義し、それを変更するノード関数を記述して、有向エッジで接続します。 ブラウザで直接実行するハンズオンコードでAI Agentsを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
AI Agentsを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのAI Agentsは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン2/4です。
「ノード、エッジ、状態」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このAI Agentsレッスンでコードを書いて実行できますか?
はい。すべてのAI Agentsレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。