🚀

[LangGraph]Nodeが繋がらない。Σ(゚Д゚;≡;゚д゚)

2024/09/14に公開

この記事の概要

こんにちは、気合系エンジニア齊藤@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を用いて、条件分岐させたい場合の処理です。

問題点

実装想定は以下の通りです

  1. START
  2. task_assignmentノード
  3. caslling_writting_agentで以下ノードに分ける
    【marketing_plan_....】or【creative_.....】or【brand_position.....】
  4. 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)に戻り値のヒントがなかったためでした。
https://langchain-ai.github.io/langgraph/reference/graphs/#langgraph.graph.message.MessageGraph.add_conditional_edges

解決方法
パス関数(calling_writing_agent)に戻り値を指定しましょう。
今回の場合で言うとこんな感じ。

def calling_writing_agent(state) -> Literal[
    "marketing_plan_agent_calling",
    "creative_brief_agent_calling",
    "brand_positioning_agent_calling"
]:

間違い等あれば、コメントくださいー
ありがとうございました。

Discussion