LangGraph で構築されたオブザーバーエージェント

LangGraph LangChain を使用して、ステートフルなマルチエージェント・ワークフローを構築するためのフレームワークです。 これにより、循環的な実行フロー、状態管理、およびエージェント間の条件付きルーティングを備えた複雑なエージェントシステムの構築が可能になります。

Instana LangGraph アプリケーションの可観測性を提供し、マルチエージェントワークフロー、状態遷移、およびLLMとのやり取りをリアルタイムで監視できるようにします。

前提条件

以下の前提条件が満たされていることを確認してください。

  • Python 3.8 以降がインストールされている。

  • Anthropic、 OpenAI,、または LangGraph でサポートされているその他のLLMプロバイダーなどのLLM API キー。

  • 検索 API キー(オプション。検索ツール機能用 - Tavilyまたは DuckDuckGo )。

  • Instana アプリケーションに合わせて設定されているか確認するには、 「はじめに」 を参照してください。

LangGraph アプリケーションへの計測機能の組み込み

LangGraph アプリケーションに Instana を導入するには、以下の手順を実行してください:

  1. LangGraph および OpenLLMetry に必要なパッケージをインストールしてください。

    pip install langgraph langchain-anthropic duckduckgo-search traceloop-sdk
  2. LLMプロバイダーと検索ツールの認証情報を設定してください。

    export ANTHROPIC_API_KEY="<your-api-key>"
    export TAVILY_API_KEY="<your-tavily-api-key>"
    注:

    別のプロバイダーを使用している場合は、そのプロバイダーの環境変数に置き換えてください(例: OpenAIOPENAI_API_KEY の場合)。 別の検索ツールを使用している場合は、Tavilyの API キーは任意です。

  3. LangGraph アプリケーションを作成してください。

    以下の例は、研究者とライターによるマルチエージェント・ワークフローを示しています:

    import os
    from typing import Literal
    from langchain_anthropic import ChatAnthropic
    from langchain_community.tools import DuckDuckGoSearchRun
    from langchain_core.messages import BaseMessage, HumanMessage
    from langgraph.prebuilt import create_react_agent
    from langgraph.graph import MessagesState, StateGraph, START, END
    from langgraph.types import Command
    from traceloop.sdk import Traceloop
    from traceloop.sdk.decorators import workflow
    
    # Initialize OpenLLMetry
    Traceloop.init(app_name="langgraph_demo")
    
    # Define search tool
    search_tool = DuckDuckGoSearchRun()
    
    # Define LLM
    llm = ChatAnthropic(
        model="claude-3-5-sonnet-20241022",
        temperature=0.7,
        max_tokens=600
    )
    
    def get_next_node(last_message: BaseMessage, goto: str):
        if not last_message.content:
            return END
        return goto
    
    # Research agent and node
    research_agent = create_react_agent(
        llm,
        tools=[search_tool],
        state_modifier="You are a research assistant. Your job is to conduct thorough research."
    )
    
    def research_node(state: MessagesState) -> Command[Literal["writer", END]]:
        result = research_agent.invoke(state)
        goto = get_next_node(result["messages"][-1], "writer")
        result["messages"][-1] = HumanMessage(
            content=result["messages"][-1].content,
            name="researcher"
        )
        return Command(
            update={"messages": result["messages"]},
            goto=goto
        )
    
    # Writer agent and node
    writer_agent = create_react_agent(
        llm,
        tools=[search_tool],
        state_modifier="You are a blog writer. Your task is to create a well-structured blog post."
    )
    
    def writer_node(state: MessagesState) -> Command[Literal[END]]:
        result = writer_agent.invoke(state)
        result["messages"][-1] = HumanMessage(
            content=result["messages"][-1].content,
            name="writer"
        )
        return Command(
            update={"messages": result["messages"]},
            goto=END
        )
    
    # Define workflow graph
    workflow = StateGraph(MessagesState)
    workflow.add_node("researcher", research_node)
    workflow.add_node("writer", writer_node)
    workflow.add_edge(START, "researcher")
    graph = workflow.compile()
    
    # Execute workflow
    @workflow(name="langgraph_multi_agent_workflow")
    def run_workflow():
        events = graph.stream(
            {
                "messages": [
                    (
                        "user",
                        "First, research AI trends in 2025. "
                        "Then, based on that research, create a well-structured blog post."
                    )
                ]
            },
            {"recursion_limit": 150}
        )
    
        # Print workflow execution steps
        for event in events:
            print(event)
            print("----")
    
    if __name__ == "__main__":
        run_workflow()
  4. LangGraph アプリケーションを実行してください。

    python langgraph_app.py

    このアプリケーションはマルチエージェント・ワークフローを実行し、実行手順を表示します:

    図 1. LangGraph 出力
    LangGraph 出力
  5. Instana でデータを表示します。

    アプリケーションを実行すると、データが Instana のGen AI可観測性ダッシュボードに表示されます:

    図 2. LangGraph Instana 内の痕跡
    LangGraph Instana 内の痕跡

    ダッシュボードには次のように表示されます:

    • マルチエージェントによるワークフローの実行

    • エージェント間の状態遷移

    • ツールの実行(検索操作)

    • LLMの応答における遅延とトークン使用量

    • 条件付きルーティングの決定

トラブルシューティング

トレースが表示されない、または接続エラーが発生するなどの一般的な問題については、 「トラブルシューティング」 を参照してください。

create_react_agent によるインポートエラー

問題 :. を使用すると create_react_agent、メトリクスまたはトレースが不完全になる。

考えられる原因 :データが間違ったパッケージからインポートされています。

この問題の解決には、以下から create_react_agent インポートしてみてください langgraph.prebuilt

# Correct import
from langgraph.prebuilt import create_react_agent

# Don't use this
from langchain.agents import create_react_agent

ワークフローの実行エラー

問題 :再帰制限エラーによりワークフローが失敗する。

この問題を解決するには、ワークフローの複雑さに応じて、呼び出し stream() 内のパラメータ recursion_limit を調整してみてください。 複雑なマルチエージェント・ワークフローの場合、デフォルト値よりも大きく設定する必要がある場合があります。