モニタリング LangGraph

LangGraph は、 LangChain でステートフルなマルチエージェントワークフローを構築するために使用できるフレームワークです。 LangGraph WatsonX, OpenAI, やClaudeのような大規模言語モデル(LLM)と統合。

Instana を使用して LangGraph を監視し、トレース、メトリクス、ログをキャプチャできます。 このデータは、AIエージェントのインタラクション、実行パス、システムパフォーマンスに関するリアルタイムの洞察を提供します。

LangGraph は、非線形実行によるマルチエージェントワークフローを可能にする。 そのため、LLMのインタラクションとAPIコールを追跡する分散トレースが必要になる。 OpenTelemetry (OTel) と Traceloop の OpenLLMetry, を統合することで、 LangGraph ワークフローを計測してスパンとトレースをキャプチャし、Instana で実行フローを可視化することができます。 リアルタイムの観測が可能なため、リソースの利用状況やパフォーマンスの傾向を分析することで、ワークフローの最適化がさらに強化される。 この統合により、AI主導の自動化を微調整できるようになり、 LangGraph-based アプリケーションの信頼性と効率が向上します。

計装 LangGraph アプリケーション

LangGraph アプリケーションを計測するには、以下の手順を実行する:

あなたの環境がすべての前提条件を満たしていることを確認してください。 詳しくは、 前提条件を参照。

  1. LangGraph, の依存関係をインストールするには、以下のコマンドを実行する:

    pip3 install langgraph langchain_ibm duckduckgo_search
    
  2. LangGraph サンプル・アプリケーションで使用されている WatsonX モデルと検索ツールにアクセスするために、以下の認証情報をエクスポートします。

    export WATSONX_URL="<watsonx-url>"
    export WATSONX_PROJECT_ID="<watsonx-project-id>"
    export WATSONX_API_KEY="<watsonx-api-key>"
    export TAVILY_API_KEY="<tavily-api-key>"
    
  3. 以下のコードを実行して、 LangGraph サンプル・アプリケーションを生成してください:

    import os
    from langchain_community.tools.tavily_search import TavilySearchResults
    from langchain_community.tools import DuckDuckGoSearchRun
    from typing import Literal
    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 langchain_ibm.chat_models import ChatWatsonx
    
    from traceloop.sdk import Traceloop
    from traceloop.sdk.decorators import workflow
    
    # Initialize Traceloop
    Traceloop.init(app_name="langGraph_sample_app")
    
    # Define external tools
    tavily_tool = TavilySearchResults(max_results=10)
    duckDuckGoSearchRun_tool = DuckDuckGoSearchRun()
    
    # Define LLM
    parameters = {
        "decoding_method": "sample",
        "max_new_tokens": 600,
        "min_new_tokens": 1,
        "temperature": 0.5,
        "top_k": 50,
        "top_p": 1,
    }
    llm = ChatWatsonx(
        model_id="ibm/granite-3-2b-instruct",
        url="https://us-south.ml.cloud.ibm.com",
        project_id=os.getenv("WATSONX_PROJECT_ID"),
        apikey=os.getenv("WATSONX_API_KEY"),
        params=parameters,
    )
    
    
    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=[tavily_tool],
        state_modifier="You are a research assistant. Your ONLY job is to conduct thorough research. ",
    )
    
    
    def research_node(
        state: MessagesState,
    ) -> Command[Literal["blogger", END]]:
        result = research_agent.invoke(state)
        goto = get_next_node(result["messages"][-1], "blogger")
        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=[duckDuckGoSearchRun_tool],
        state_modifier="You are a blog writer. Your task is to create a well-structured blog",
    )
    
    
    def writer_node(state: MessagesState) -> Command[Literal["researcher", END]]:
        result = writer_agent.invoke(state)
        result["messages"][-1] = HumanMessage(
            content=result["messages"][-1].content, name="blogger"
        )
        return Command(
            update={
                "messages": result["messages"],
            },
        )
    
    
    # Define workflow graph
    workflow = StateGraph(MessagesState)
    workflow.add_node("researcher", research_node)
    workflow.add_node("blogger", writer_node)
    
    workflow.add_edge(START, "researcher")
    graph = workflow.compile()
    
    # Execute workflow
    events = graph.stream(
        {
            "messages": [
                (
                    "user",
                    "First, conduct a research on AI trend in 2025 "
                    "Then, based on that research, create a well-structured blog post.",
                )
            ],
        },
        {"recursion_limit": 150},
    )
    
    # Print workflow execution steps
    for s in events:
        print(s)
        print("----")
    
  4. 以下のコマンドを実行して、 LangChain アプリケーションを実行する:

    python3 ./<langGraph-sample-application>.py
    

LangGraph は次の例のような応答を生成する:

モニタリングを設定すると、Instana は LangGraph アプリケーションから以下のトレースとメトリクスを収集します:

LangGraph, で使用される LLM から収集されたメトリクスを表示するには、 View metrics を参照してください。