Skip to content
Published on

LLMエージェント & Agentic AI 完全ガイド — ReAct、マルチエージェント、MCPまで

Authors

はじめに

2024年から2026年にかけて、AIのパラダイムは単純な「質問・回答」チャットボットから**自律的に行動するエージェント(Agent)**へと完全に移行しました。

LLMエージェントは目標を与えられると、自ら計画を立て、ツールを呼び出し、結果を検討しながら目標を達成します。DevinがGitHubのIssueを自律的に解決し、Claudeがコンピューターの画面をクリックしながら作業を行う時代が到来しました。

このガイドでは、LLMエージェントの基本概念から実践的な実装まで包括的に解説します。


1. エージェントとは何か?

従来のLLM vs エージェント

従来のLLMは入力 → 出力というシンプルな構造です。エージェントはそれとは異なり:

  • 知覚(Perceive): 環境(ツール結果、ユーザー入力、メモリ)から情報を収集
  • 計画(Plan): 目標達成のための行動シーケンスを決定
  • 行動(Act): ツール呼び出し、APIリクエスト、コード実行
  • 内省(Reflect): 結果を評価し、次の行動を調整

エージェントの主要コンポーネント:

コンポーネント説明
LLMコア推論と意思決定エンジン
ツール(Tools)Web検索、コード実行、APIなど
メモリ短期・長期コンテキスト管理
オーケストレーターエージェントループ制御

2. ReActフレームワーク:推論 + 行動

ReActとは?

ReAct(Reasoning + Acting)は2022年にYao et al.が提案したフレームワークで、LLMが**思考(Thought)→ 行動(Action)→ 観察(Observation)**のサイクルを繰り返しながら問題を解決します。

Thought:     現在の状況を分析し、次の行動を決定
Action:      tool_name(arguments)の形式でツールを呼び出す
Observation: ツール実行結果を受け取る
...繰り返し...
Final Answer: 最終回答を導出

なぜReActが幻覚を減らすのか?

一般的なLLMは回答全体を一度に生成するため、途中で事実を「でっちあげる」傾向があります。ReActでは:

  1. リアルタイムな根拠確認: 各Observationが事実に基づくアンカーとして機能
  2. 段階的な検証: 中間結果を確認しながら誤りを早期修正
  3. 外部知識の活用: 推論中に実際のツールで検索・計算

Python実装例

from langchain.agents import create_react_agent
from langchain_anthropic import ChatAnthropic
from langchain.tools import DuckDuckGoSearchRun, PythonREPLTool
from langchain import hub

llm = ChatAnthropic(model="claude-opus-4-5", temperature=0)
tools = [DuckDuckGoSearchRun(), PythonREPLTool()]

# ReActプロンプトテンプレートをロード
prompt = hub.pull("hwchase17/react")

agent = create_react_agent(llm, tools, prompt)

from langchain.agents import AgentExecutor
agent_executor = AgentExecutor(agent=agent, tools=tools, verbose=True)

result = agent_executor.invoke({
    "input": "2026年に最も人気のあるAIエージェントフレームワーク3つを検索して比較表を作成してください"
})

3. Chain-of-Thought & Tree-of-Thought

Chain-of-Thought(CoT)

CoTは「ステップバイステップで考えましょう」というプロンプトだけで、LLMの推論能力を劇的に向上させます。

cot_prompt = """
問題をステップバイステップで解いてください:

問題: {problem}

解答プロセス:
1. まず与えられた情報を整理します。
2. 必要な計算・推論を実行します。
3. 中間結果を検証します。
4. 最終答えを導出します。
"""

Tree-of-Thought(ToT)

ToTはCoTを拡張し、複数の推論経路をツリー構造で探索します。BFS/DFSで最も有望な経路を選択します。

from langchain_experimental.tot.base import ToTChain
from langchain_experimental.tot.thought_generation import ProposePromptStrategy

tot_chain = ToTChain.from_llm(
    llm=llm,
    checker=checker,
    k=3,    # 各レベルで生成する枝の数
    c=4,    # 評価の深さ
    verbose=True
)

4. メモリシステム

メモリの4つのタイプ

エージェントのメモリは人間の記憶システムと同様に設計されています:

メモリタイプ保存場所特徴
感覚メモリ入力コンテキスト現在の入力処理
短期メモリコンテキストウィンドウ現在の会話セッション
長期メモリベクトルDB / KVストア永続的な知識保存
エピソードメモリベクトルDB過去の経験をインデックス化

mem0:長期メモリの統合

mem0はエージェントにパーソナライズされた長期メモリを追加するオープンソースライブラリです。

from mem0 import Memory

# mem0の初期化(ベクトルDBとしてQdrantを使用)
config = {
    "vector_store": {
        "provider": "qdrant",
        "config": {
            "collection_name": "agent_memory",
            "host": "localhost",
            "port": 6333,
        }
    },
    "llm": {
        "provider": "anthropic",
        "config": {
            "model": "claude-opus-4-5",
            "temperature": 0,
        }
    }
}

memory = Memory.from_config(config)
user_id = "user_123"

# メモリを保存
memory.add(
    messages=[
        {"role": "user", "content": "私はPythonをよく使い、FastAPIが好きです"},
        {"role": "assistant", "content": "了解しました!Python/FastAPIの好みを覚えておきます。"}
    ],
    user_id=user_id
)

# メモリを検索して活用
relevant_memories = memory.search(
    query="ユーザーが好むプログラミング言語は?",
    user_id=user_id
)

context = "\n".join([m["memory"] for m in relevant_memories])
print(f"関連メモリ: {context}")

ベクトルストアベースのエピソードメモリ

from langchain_openai import OpenAIEmbeddings
from langchain_community.vectorstores import Chroma
from datetime import datetime

class EpisodicMemory:
    def __init__(self):
        self.embeddings = OpenAIEmbeddings()
        self.store = Chroma(
            collection_name="episodes",
            embedding_function=self.embeddings,
            persist_directory="./episodic_memory"
        )

    def store_episode(self, content: str, metadata: dict = None):
        """会話・タスクエピソードをメモリに保存"""
        metadata = metadata or {}
        metadata["timestamp"] = datetime.now().isoformat()
        self.store.add_texts([content], metadatas=[metadata])

    def recall(self, query: str, k: int = 3):
        """関連エピソードを検索"""
        docs = self.store.similarity_search(query, k=k)
        return [doc.page_content for doc in docs]

# 使用例
memory = EpisodicMemory()
memory.store_episode(
    "ユーザーがFastAPIのプロジェクト構造について質問し、正常に回答した",
    {"task_type": "coding", "success": True}
)

5. ツール統合(Tool Integration)

標準ツールカテゴリ

エージェントが使用する主要ツール:

  1. Web検索: Tavily、SerpAPI、DuckDuckGo
  2. コード実行: Python REPL、Jupyterカーネル
  3. ファイルシステム: ファイルの読み書き・検索
  4. API呼び出し: REST、GraphQL
  5. データベース: SQL、ベクトルDBクエリ
  6. コンピューター制御: 画面キャプチャ、クリック、キーボード入力

カスタムWeb検索ツールの実装

from langchain.tools import BaseTool
from pydantic import BaseModel, Field
import httpx

class WebSearchInput(BaseModel):
    query: str = Field(description="検索するクエリ")
    max_results: int = Field(default=5, description="返す結果の数")

class TavilySearchTool(BaseTool):
    name: str = "web_search"
    description: str = "最新情報をWebで検索します。リアルタイム情報が必要なときに使用してください。"
    args_schema: type[BaseModel] = WebSearchInput
    api_key: str = ""

    def _run(self, query: str, max_results: int = 5) -> str:
        url = "https://api.tavily.com/search"
        payload = {
            "api_key": self.api_key,
            "query": query,
            "max_results": max_results,
            "include_answer": True,
        }
        response = httpx.post(url, json=payload)
        data = response.json()

        results = []
        if data.get("answer"):
            results.append(f"要約: {data['answer']}\n")
        for r in data.get("results", []):
            results.append(f"- {r['title']}: {r['content'][:200]}...")
        return "\n".join(results)

    async def _arun(self, query: str, max_results: int = 5) -> str:
        async with httpx.AsyncClient() as client:
            response = await client.post(
                "https://api.tavily.com/search",
                json={"api_key": self.api_key, "query": query, "max_results": max_results}
            )
        return self._process_response(response.json())

MCP(Model Context Protocol)

MCPはAnthropicが2024年末に発表した標準化されたツール統合プロトコルです。従来のFunction Callingが各LLMごとに異なる形式を使っていたのに対し、MCPはサーバー・クライアントモデルでツールを標準化します。

MCPの主な利点:

  • 再利用性: 一度作ったMCPサーバーをどのLLMとも接続可能
  • 豊富なコンテキスト: Resources、Prompts、Toolsの3つの抽象化を提供
  • 動的な発見: 利用可能なツール一覧を実行時に動的に取得
# MCPサーバーの実装例(Python SDK)
from mcp.server import Server
from mcp.server.stdio import stdio_server
from mcp import types

app = Server("my-tool-server")

@app.list_tools()
async def list_tools() -> list[types.Tool]:
    return [
        types.Tool(
            name="get_weather",
            description="特定の都市の現在の天気を取得します",
            inputSchema={
                "type": "object",
                "properties": {
                    "city": {"type": "string", "description": "都市名"},
                    "units": {"type": "string", "enum": ["celsius", "fahrenheit"]}
                },
                "required": ["city"]
            }
        )
    ]

@app.call_tool()
async def call_tool(name: str, arguments: dict) -> list[types.TextContent]:
    if name == "get_weather":
        city = arguments["city"]
        weather_data = await fetch_weather(city)
        return [types.TextContent(type="text", text=str(weather_data))]

async def main():
    async with stdio_server() as (read_stream, write_stream):
        await app.run(read_stream, write_stream, app.create_initialization_options())

6. LangGraph:ステートフルエージェント

LangGraphはLangChainチームが開発したグラフベースのエージェントオーケストレーションフレームワークです。DAGベースのLangChain Expression Language(LCEL)とは異なり、サイクル(cycle)をサポートし、エージェントループを自然に表現できます。

ステートフルエージェントの実装

from langgraph.graph import StateGraph, END
from langchain_anthropic import ChatAnthropic
from langchain_core.messages import HumanMessage, AIMessage, ToolMessage
from typing import TypedDict, Annotated, Sequence
import operator

# 1. 状態の定義
class AgentState(TypedDict):
    messages: Annotated[Sequence, operator.add]
    tool_calls: list
    iteration_count: int

# 2. LLMとツールのセットアップ
llm = ChatAnthropic(model="claude-opus-4-5")
tools = [WebSearchTool(), PythonREPLTool()]
llm_with_tools = llm.bind_tools(tools)

# 3. ノードの定義
def call_model(state: AgentState) -> AgentState:
    """LLM呼び出しノード"""
    response = llm_with_tools.invoke(state["messages"])
    return {
        "messages": [response],
        "iteration_count": state["iteration_count"] + 1
    }

def call_tools(state: AgentState) -> AgentState:
    """ツール実行ノード"""
    last_message = state["messages"][-1]
    tool_results = []

    for tool_call in last_message.tool_calls:
        tool = next(t for t in tools if t.name == tool_call["name"])
        result = tool.invoke(tool_call["args"])
        tool_results.append(
            ToolMessage(content=str(result), tool_call_id=tool_call["id"])
        )
    return {"messages": tool_results}

# 4. ルーティング関数(条件付きエッジ)
def should_continue(state: AgentState) -> str:
    last_message = state["messages"][-1]
    if hasattr(last_message, "tool_calls") and last_message.tool_calls:
        if state["iteration_count"] < 10:  # 無限ループ防止
            return "tools"
    return "end"

# 5. グラフの構築
graph = StateGraph(AgentState)
graph.add_node("agent", call_model)
graph.add_node("tools", call_tools)

graph.set_entry_point("agent")
graph.add_conditional_edges(
    "agent",
    should_continue,
    {"tools": "tools", "end": END}
)
graph.add_edge("tools", "agent")  # ツール実行後、エージェントに戻る

# 6. メモリチェックポイントの追加
from langgraph.checkpoint.memory import MemorySaver
checkpointer = MemorySaver()
app = graph.compile(checkpointer=checkpointer)

# 実行(thread_idで会話セッションを管理)
config = {"configurable": {"thread_id": "session_001"}}
result = app.invoke(
    {"messages": [HumanMessage(content="2026年のAIエージェントトレンドを検索してまとめてください")], "iteration_count": 0},
    config=config
)

7. マルチエージェントシステム

CrewAI:役割ベースのマルチエージェント

from crewai import Agent, Task, Crew, Process
from crewai_tools import SerperDevTool, FileWriterTool

search_tool = SerperDevTool()
file_writer = FileWriterTool()

researcher = Agent(
    role="AIリサーチャー",
    goal="最新のAIエージェント技術トレンドを深く調査する",
    backstory="""あなたはAI分野の専門リサーチャーです。
    最新の論文、ブログ、GitHubを分析し、重要なインサイトを抽出します。""",
    tools=[search_tool],
    llm="claude-opus-4-5",
    verbose=True
)

writer = Agent(
    role="テクニカルライター",
    goal="リサーチ結果を読みやすい技術レポートに書き上げる",
    backstory="""あなたは複雑なAI概念を明確に説明するプロのライターです。""",
    tools=[file_writer],
    llm="claude-opus-4-5",
    verbose=True
)

research_task = Task(
    description="2026年のLLMエージェントトレンドTop 5を調査してください。各トレンドに具体的な事例と影響を含めてください。",
    expected_output="5つのトレンドの詳細分析(各500字以上)",
    agent=researcher
)

writing_task = Task(
    description="リサーチ結果をもとに技術ブログポストを書いてください。",
    expected_output="Markdown形式の2000字技術ブログポスト",
    agent=writer,
    output_file="ai_trends_2026.md"
)

crew = Crew(
    agents=[researcher, writer],
    tasks=[research_task, writing_task],
    process=Process.sequential,
    verbose=True
)

result = crew.kickoff()

AutoGen:会話ベースのマルチエージェント

AutoGenはMicrosoftが開発したマルチエージェントフレームワークで、エージェント間の会話による協調が特徴です。

import autogen

config_list = [{"model": "claude-opus-4-5", "api_key": "YOUR_KEY"}]

orchestrator = autogen.AssistantAgent(
    name="Orchestrator",
    system_message="""あなたはチームを調整するオーケストレーターです。
    タスクを分析し、適切な専門エージェントに委任します。
    すべての結果を統合して最終回答を生成します。""",
    llm_config={"config_list": config_list}
)

coder = autogen.AssistantAgent(
    name="Coder",
    system_message="あなたはPythonコードを書いて実行する専門家です。",
    llm_config={"config_list": config_list}
)

user_proxy = autogen.UserProxyAgent(
    name="UserProxy",
    human_input_mode="NEVER",
    max_consecutive_auto_reply=10,
    code_execution_config={"work_dir": "coding", "use_docker": False}
)

groupchat = autogen.GroupChat(
    agents=[orchestrator, coder, user_proxy],
    messages=[],
    max_round=12
)
manager = autogen.GroupChatManager(groupchat=groupchat)
user_proxy.initiate_chat(manager, message="データ可視化コードを書いてください")

8. Claude API Tool Useの実装

import anthropic
import json

client = anthropic.Anthropic()

tools = [
    {
        "name": "get_stock_price",
        "description": "特定銘柄の現在株価と変動率を取得します",
        "input_schema": {
            "type": "object",
            "properties": {
                "symbol": {
                    "type": "string",
                    "description": "株式ティッカーシンボル(例:AAPL、MSFT)"
                },
                "currency": {
                    "type": "string",
                    "enum": ["USD", "JPY"],
                    "description": "表示通貨"
                }
            },
            "required": ["symbol"]
        }
    }
]

def process_tool_call(tool_name: str, tool_input: dict) -> str:
    if tool_name == "get_stock_price":
        return json.dumps({
            "symbol": tool_input["symbol"],
            "price": 185.92,
            "change_percent": "+2.3%",
            "currency": tool_input.get("currency", "USD")
        })

messages = [{"role": "user", "content": "Appleの株価を教えてください"}]

while True:
    response = client.messages.create(
        model="claude-opus-4-5",
        max_tokens=4096,
        tools=tools,
        messages=messages
    )

    messages.append({"role": "assistant", "content": response.content})

    if response.stop_reason == "end_turn":
        final_text = next(
            block.text for block in response.content
            if hasattr(block, "text")
        )
        print(f"最終回答: {final_text}")
        break

    if response.stop_reason == "tool_use":
        tool_results = []
        for block in response.content:
            if block.type == "tool_use":
                result = process_tool_call(block.name, block.input)
                tool_results.append({
                    "type": "tool_result",
                    "tool_use_id": block.id,
                    "content": result
                })
        messages.append({"role": "user", "content": tool_results})

9. エージェントの評価

主要ベンチマーク

ベンチマーク測定領域特徴
AgentBench8つの環境(OS、DB、ゲームなど)実際の環境ベースの評価
GAIA汎用AI支援能力人間レベルとの比較
SWE-benchソフトウェアエンジニアリング実際のGitHub Issueを解決
WebArenaWebナビゲーション能力実際のWebサイトを操作
OSWorldコンピューター使用能力GUIインタラクション

Trajectory Evaluation vs Outcome Evaluation

エージェント評価には2つの重要な視点があります:

Outcome Evaluation(結果評価):

  • 最終目標の達成度のみを測定
  • Pass@k、Success Rate
  • シンプルだがプロセスを無視

Trajectory Evaluation(軌跡評価):

  • 目標達成のプロセス(行動シーケンス全体)を評価
  • 効率性、安全性、副作用のなさを総合的に測定
  • プロダクション環境では必須
from dataclasses import dataclass
from typing import List

@dataclass
class AgentTrajectory:
    task: str
    steps: List[dict]  # {"thought": ..., "action": ..., "observation": ...}
    final_answer: str
    success: bool
    total_tokens: int

def evaluate_trajectory(trajectory: AgentTrajectory) -> dict:
    """軌跡ベースのエージェント評価"""
    metrics = {
        "task_success": trajectory.success,
        "efficiency": calculate_efficiency(trajectory.steps),
        "redundant_steps": count_redundant_steps(trajectory.steps),
        "error_recovery": check_error_recovery(trajectory.steps),
        "tool_usage_appropriateness": evaluate_tool_usage(trajectory.steps),
        "cost_efficiency": 1000 / trajectory.total_tokens
    }
    return metrics

def count_redundant_steps(steps: List[dict]) -> int:
    """不要な重複ツール呼び出し数をカウント"""
    seen_actions = set()
    redundant = 0
    for step in steps:
        action_key = f"{step.get('action_type')}:{step.get('action_input')}"
        if action_key in seen_actions:
            redundant += 1
        seen_actions.add(action_key)
    return redundant

主なエージェント失敗モード

  1. 無限ループ: 目標達成条件を誤って設定することによる繰り返し
  2. ツール幻覚: 存在しないツールやパラメーターを呼び出す
  3. コンテキストドリフト: 長いセッションで最初の目標を忘れる
  4. 過剰な計画: 単純なタスクへの不必要な計画立案
  5. ツールの乱用: 不要なツールを繰り返し呼び出す

10. 2026年トレンド:Computer-use & Coding Agents

Computer-useエージェント

ClaudeのComputer Use APIとGPT-4oのコンピューター制御機能により、エージェントが実際のコンピューター画面を見て操作できるようになりました。

import anthropic
import base64
from PIL import ImageGrab

def take_screenshot() -> str:
    """画面をキャプチャしてbase64エンコード"""
    screenshot = ImageGrab.grab()
    screenshot.save("/tmp/screenshot.png")
    with open("/tmp/screenshot.png", "rb") as f:
        return base64.b64encode(f.read()).decode()

client = anthropic.Anthropic()

response = client.messages.create(
    model="claude-opus-4-5",
    max_tokens=4096,
    tools=[
        {"type": "computer_20241022", "name": "computer", "display_width_px": 1920, "display_height_px": 1080},
        {"type": "text_editor_20241022", "name": "str_replace_editor"},
        {"type": "bash_20241022", "name": "bash"}
    ],
    messages=[{
        "role": "user",
        "content": [
            {"type": "text", "text": "ブラウザを開いて、GitHubの最新トレンドリポジトリを確認してください"},
            {"type": "image", "source": {"type": "base64", "media_type": "image/png", "data": take_screenshot()}}
        ]
    }]
)

コーディングエージェント:DevinとSWE-agent

2026年のSWE-benchにおけるコーディングエージェントのパフォーマンス:

エージェントSWE-bench Verified特徴
Claude Code約72%ターミナル統合、コードベース理解
Devin 2.0約65%完全な開発ワークフロー
SWE-agent約58%オープンソース、研究用途
Aider約55%ローカルコードベース特化

11. OpenAI Assistants API

from openai import OpenAI
import time

client = OpenAI()

assistant = client.beta.assistants.create(
    name="AI技術アナリスト",
    instructions="あなたはAI/ML技術の専門家です。最新の論文と技術ドキュメントを分析してインサイトを提供します。",
    model="gpt-4o",
    tools=[
        {"type": "file_search"},      # ファイルベースのRAG
        {"type": "code_interpreter"}   # コード実行
    ]
)

# ファイルのアップロードとベクトルストアの作成
vector_store = client.beta.vector_stores.create(name="AI論文リポジトリ")
with open("ai_papers_2026.pdf", "rb") as f:
    client.beta.vector_stores.file_batches.upload_and_poll(
        vector_store_id=vector_store.id,
        files=[("ai_papers_2026.pdf", f)]
    )

thread = client.beta.threads.create()
client.beta.threads.messages.create(
    thread_id=thread.id,
    role="user",
    content="アップロードされた論文からAgentic AIの主要な限界を分析してください"
)

run = client.beta.threads.runs.create(
    thread_id=thread.id,
    assistant_id=assistant.id
)

while run.status in ["queued", "in_progress"]:
    run = client.beta.threads.runs.retrieve(thread_id=thread.id, run_id=run.id)
    time.sleep(1)

messages = client.beta.threads.messages.list(thread_id=thread.id)
print(messages.data[0].content[0].text.value)

クイズ:核心概念の確認

Q1. ReActフレームワークのThought-Action-Observationサイクルが幻覚を減らす原理は?

答え: リアルタイムな外部根拠による段階的検証

解説: 一般的なLLMは回答全体を一度に生成するため、途中で事実を「でっちあげる」ことがあります。ReActは各推論ステップで実際のツール(検索、計算など)を呼び出し、Observationで事実を確認します。この実際の結果が「事実アンカー」として機能し、その後の推論が根拠なく逸脱することを防ぎます。また、中間ステップを明示的に記録するため、誤りが発生した箇所を特定して修正することが容易になります。

Q2. LangGraphでサイクルのあるグラフが、DAGベースのLangChainと異なる点は?

答え: ステートベースの反復実行と動的ルーティングが可能

解説: LangChainのLCELは有向非巡回グラフ(DAG)のため、一度実行されると戻ることができません。LangGraphはサイクルをサポートするため、「ツール呼び出し → 結果確認 → 再試行」のようなエージェントループを自然に表現できます。条件付きエッジ(conditional edge)により現在の状態に応じて次のノードを動的に決定し、チェックポインター(checkpointer)で状態を永続化してセッション間のメモリを維持します。これは人間の「試行錯誤・修正」という思考プロセスをコードで表現したものです。

Q3. MCP(Model Context Protocol)が従来のFunction Callingより柔軟な理由は?

答え: 標準化されたサーバー・クライアントアーキテクチャがLLM非依存のツールエコシステムを形成

解説: 従来のFunction CallingはOpenAI、Anthropic、Googleがそれぞれ異なる形式を使うため、特定のLLMに依存します。MCPはstdioやHTTPベースの標準プロトコルを定義するため、一度作成したMCPサーバーをMCPをサポートするすべてのクライアント(Claude、Cursor、VS Codeなど)で再利用できます。また、Tools(実行可能な関数)だけでなく、Resources(ファイル、DBなどのデータ)とPrompts(再利用可能なプロンプトテンプレート)の抽象化を提供し、エージェントにより豊富なコンテキストを提供します。

Q4. マルチエージェントシステムでオーケストレーターと実行エージェントを分離する利点は?

答え: 関心の分離、専門化、並列処理、エラーの局所化

解説: オーケストレーターは全体の計画立案と調整のみに集中し、実行エージェントは特定のドメイン(コーディング、検索、ライティングなど)に特化します。利点は次のとおりです:(1) 各エージェントを独立して最適化できる、(2) 複数の実行エージェントが並列で作業でき速度が向上する、(3) 1つのエージェントの失敗がシステム全体を停止させない(エラーの局所化)、(4) 新しい専門エージェントを簡単に追加できる(拡張性)、(5) 各エージェントの行動を独立して監査・ロギングできる。

Q5. エージェント評価においてtrajectory evaluationとoutcome evaluationの違いは?

答え: Outcomeは最終成功の有無のみ、Trajectoryはプロセスの効率性と安全性まで評価

解説: Outcome Evaluationは目標達成の有無のみを測定します(0または1)。シンプルですが、悪いプロセスで正しい結果に到達したり、副作用があっても合格してしまいます。Trajectory Evaluationは行動シーケンス全体を分析します:不必要なステップがないか(効率性)、安全でない行動はないか(安全性)、エラーを適切に回復したか、トークン・APIコストが合理的かを総合的に評価します。プロダクションエージェントでは「目標を達成しても過度なコストや副作用があれば失敗」と判断する必要があるため、Trajectory Evaluationが不可欠です。


おわりに

LLMエージェントは研究段階を超え、実際のプロダクションで価値を生み出しています。2026年の主要トレンド:

  1. Computer-useエージェント: 画面を見て直接操作する汎用エージェント
  2. 長期メモリの標準化: mem0やZepのようなメモリレイヤーの普及
  3. MCPエコシステムの拡大: 数千のMCPサーバーとツール
  4. エージェントの安全性: エージェント行動の監査、権限制限、人間による監督
  5. マルチモーダルエージェント: テキスト、画像、音声の統合処理

次のステップとして、LangGraphを使ったプロダクションエージェントの構築や、MCPサーバーの開発に挑戦してみましょう!