🚀
[LangGraph]Nodeが繋がらない。Σ(゚Д゚;≡;゚д゚)
この記事の概要
こんにちは、気合系エンジニア齊藤@tweet
です。
LangGraphを使ってAgentを作成しようとしたときにNodeをどうしをEdgeで結ぶときに、苦戦した点が2点あるので、解決方法と一緒に共有します。
LangGraphのバージョンは0.2です(LLMフレームワークはアップデートで大幅に仕様変更されるので、バージョンには注意してください)
最近LangChainのコミュニティー運営もやっているので、ぜひよければこちらのアカウント@tweet
もフォローしていただけると嬉しいです。
1つ目:単純なnodeの結合編
問題点
実装内容は以下の通りです
clickというノードとENDを繋げたい。(単純やー)
tool ={
"click":click
}
graph_builder = StateGraph(AgentState)
graph_builder.add_node("click", click)
graph_builder.add_node("agent", agent)
graph_builder.add_edge(START, "agent")
graph_builder.add_edge("agent", "click")
graph_builder.add_edge("click", END)
memory = MemorySaver()
graph = graph_builder.compile(checkpointer = memory)
しかし下記画像のようにENDだけが独立してしまっていますww
解決方法
画像表示に使うMermaidでキーワード設定にされていたことが原因だったのかもしれないです。
自分の中で落とし込めていない部分多いですが、安牌のためこれからNodeの名前は全部大文字にした方がいいかもですね。。。
2つ目:add_conditional_edge編
add_conditional_edgeを用いて、条件分岐させたい場合の処理です。
問題点
実装想定は以下の通りです
- START
- task_assignmentノード
- caslling_writting_agentで以下ノードに分ける
【marketing_plan_....】or【creative_.....】or【brand_position.....】 - END
しかし、画像のように実際はtask_assignmentノードがENDノードと繋がってしまいます。
参考コード
workflow.add_node("task_assignment", task_assignment)
workflow.add_node("marketing_plan_agent_calling", marketing_plan_agent_calling)
workflow.add_node("creative_brief_agent_calling", creative_brief_agent_calling)
workflow.add_node("brand_positioning_agent_calling", brand_positioning_agent_calling)
# Build Graph
workflow.add_edge(START, "task_assignment")
workflow.add_conditional_edges(
"task_assignment",
calling_writing_agent,
)
workflow.add_edge("marketing_plan_agent_calling", END)
workflow.add_edge("creative_brief_agent_calling", END)
workflow.add_edge("brand_positioning_agent_calling", END)
# compile the graph
app = workflow.compile()
and here is the function definition for calling_writing_agent:
def calling_writing_agent(state):
"""
Determines which writing agent will be called (next node in the sequence)
Args:
state (dict): current graph state
Returns:
Literal['Marketing Plan', 'Creative Brief', 'Brand Positioning Statement']: decides the next agent node to be called
"""
writing_category = state['writing_category']
if writing_category == "Marketing Plan":
return "marketing_plan_agent_calling"
elif writing_category == "Creative Brief":
return "creative_brief_agent_calling"
elif writing_category == "Brand Positioning Statement":
return "brand_positioning_agent_calling"
原因と解決方法
原因はパス関数(calling_writing_agent)に戻り値のヒントがなかったためでした。
解決方法
パス関数(calling_writing_agent)に戻り値を指定しましょう。
今回の場合で言うとこんな感じ。
def calling_writing_agent(state) -> Literal[
"marketing_plan_agent_calling",
"creative_brief_agent_calling",
"brand_positioning_agent_calling"
]:
間違い等あれば、コメントくださいー
ありがとうございました。
Discussion