0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【2026年最新・実装付き】AIエージェントフレームワーク徹底比較:LangChain・CrewAI・AutoGen・Claude Agent SDK・Dify をコードで選ぶ

0
Posted at

【2026年最新・実装付き】AIエージェントフレームワーク徹底比較:LangChain・CrewAI・AutoGen・Claude Agent SDK・Dify をコードで選ぶ

はじめに

AIエージェントフレームワークの選定は、2026年現在でも現場エンジニアの大きな悩みのひとつです。「LangChainで始めたが抽象化が複雑すぎる」「CrewAIが流行っていると聞いたが実際のコードはどう書くのか」「AnthropicがClaude Agent SDKを出したのに、まだLangChainを使う理由はあるか」といった疑問をよく耳にします。

この記事では、実際に動くコードサンプル(Python・TypeScript・Shell) とともに、各フレームワークのインストールからエージェントループの実装まで解説します。比較テーブルと実装コードを組み合わせることで、「自分のユースケースにはどれを選ぶか」を判断できる内容にしています。

対象読者

  • AIエージェントの構築を検討しているバックエンド/フルスタックエンジニア
  • LLMをプロダクションに組み込んだ経験があり、エージェント化を次のステップとして考えている方
  • 複数フレームワークを比較検討中で、コードベースの判断材料を探している方

評価基準

単なる「機能の多さ」ではなく、実務での採用可能性を軸に評価しています。

評価軸 内容
習得コスト チームが実用レベルになるまでの時間
本番安定性 エラーハンドリング・ロギング・可観測性
拡張性 カスタムツール・外部API統合のしやすさ
マルチエージェント 複数エージェントの協調・オーケストレーション
エコシステム コミュニティ・ドキュメント・周辺ライブラリ
コスト制御 LLMトークン消費の予測可能性

これらを総合してTier 1(必須級)〜Tier 3(選択型)に分類しています。


Tier 1:必須級

1. Claude Agent SDK(Anthropic公式)

総評: 2025年にAnthropicがリリースした公式エージェントSDKです。Claude 3.5/4系との親和性が抜群で、ツール使用・マルチエージェントオーケストレーション・ヒューマンインザループが標準装備されています。2026年現在、Claude系エージェントを構築するならこれが第一選択肢です。

なぜTier 1なのか

  • 公式サポート: Anthropicが直接メンテするため、Claude APIの新機能(extended thinking、computer use等)が即座に対応される
  • シンプルなAPI: LangChainのような抽象化の複雑さがなく、コードが読みやすい
  • マルチエージェント標準対応: サブエージェントの呼び出しがネイティブサポート
  • TypeScript・Python両対応: 型定義が充実しており、IDE補完が効く

インストールとセットアップ

# Python
pip install anthropic
export ANTHROPIC_API_KEY="sk-ant-..."

# TypeScript
npm install @anthropic-ai/sdk
export ANTHROPIC_API_KEY="sk-ant-..."

基本的なエージェントループ(Python)

import anthropic
from typing import Any

client = anthropic.Anthropic()

# ツール定義
tools: list[dict] = [
    {
        "name": "get_stock_price",
        "description": "指定した銘柄の現在株価を取得する",
        "input_schema": {
            "type": "object",
            "properties": {
                "ticker": {
                    "type": "string",
                    "description": "銘柄コード(例: AAPL, 7203)"
                }
            },
            "required": ["ticker"]
        }
    },
    {
        "name": "calculate",
        "description": "数式を計算する",
        "input_schema": {
            "type": "object",
            "properties": {
                "expression": {
                    "type": "string",
                    "description": "計算式(例: 1234 * 5.6)"
                }
            },
            "required": ["expression"]
        }
    }
]

def execute_tool(name: str, inputs: dict[str, Any]) -> str:
    """ツール実行の実装(実際はAPIやDBを呼ぶ)"""
    if name == "get_stock_price":
        # モック実装
        prices = {"AAPL": 189.3, "7203": 3450}
        ticker = inputs["ticker"]
        return f"{ticker}: {prices.get(ticker, 'N/A')} USD"
    if name == "calculate":
        return str(eval(inputs["expression"]))  # noqa: S307
    return "ツールが見つかりません"

def run_agent(user_message: str, max_iterations: int = 10) -> str:
    """ツール呼び出しループを内包したエージェント実行関数"""
    messages = [{"role": "user", "content": user_message}]

    for _ in range(max_iterations):
        response = client.messages.create(
            model="claude-sonnet-4-6",
            max_tokens=4096,
            tools=tools,
            messages=messages
        )

        if response.stop_reason == "end_turn":
            # テキストブロックのみを返す
            return next(
                (b.text for b in response.content if hasattr(b, "text")),
                ""
            )

        # ツール呼び出しを処理してメッセージに追加
        tool_results = [
            {
                "type": "tool_result",
                "tool_use_id": block.id,
                "content": execute_tool(block.name, block.input)
            }
            for block in response.content
            if block.type == "tool_use"
        ]

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

    return "最大イテレーション数に達しました"


if __name__ == "__main__":
    result = run_agent("AAPLの株価を調べて、100株購入した場合の総額を計算してください")
    print(result)

マルチエージェント構成(TypeScript)

import Anthropic from "@anthropic-ai/sdk";

const client = new Anthropic();

async function researchAgent(query: string): Promise<string> {
  const response = await client.messages.create({
    model: "claude-haiku-4-5-20251001", // 軽量モデルでコスト最適化
    max_tokens: 2048,
    system: "あなたは調査専門エージェントです。与えられたトピックを簡潔にまとめてください。",
    messages: [{ role: "user", content: query }],
  });
  return (response.content[0] as Anthropic.TextBlock).text;
}

async function writerAgent(research: string, topic: string): Promise<string> {
  const response = await client.messages.create({
    model: "claude-sonnet-4-6",
    max_tokens: 4096,
    system: "あなたは技術ライターです。調査結果をもとに Qiita 向けの記事を執筆してください。",
    messages: [
      {
        role: "user",
        content: `トピック: ${topic}\n\n調査結果:\n${research}`,
      },
    ],
  });
  return (response.content[0] as Anthropic.TextBlock).text;
}

async function orchestrate(topic: string): Promise<void> {
  console.log("[1/2] 調査エージェント起動...");
  const research = await researchAgent(`${topic}について調査してください`);

  console.log("[2/2] 執筆エージェント起動...");
  const article = await writerAgent(research, topic);

  console.log(article);
}

orchestate("AIエージェントフレームワーク最新トレンド");

2. LangChain(v0.3系)

総評: AIエージェントフレームワークの事実上の標準です。2026年現在、GitHubスターは10万超を維持しており、エコシステムの厚さは他の追随を許しません。v0.3以降でLCEL(LangChain Expression Language)が洗練され、コードの可読性と実行効率が大幅に向上しています。

なぜTier 1なのか

  • 圧倒的な統合数: OpenAI・Anthropic・Gemini・Groq等100以上のLLMプロバイダーをサポート
  • LangSmith: トレース・デバッグ・評価のオブザーバビリティプラットフォームが利用可能
  • RAGの定番実装: ベクターストア統合・ドキュメントローダーが充実
  • 求人市場での標準スキル: LangChainの知識はAIエンジニアの基礎として定着

インストールとセットアップ

pip install langchain langchain-anthropic langchain-community chromadb

# LangSmithでオブザーバビリティを有効化(任意・無料枠あり)
export LANGCHAIN_TRACING_V2="true"
export LANGCHAIN_API_KEY="ls__..."
export LANGCHAIN_PROJECT="my-agent-v1"

LCEL + カスタムツールエージェント(Python)

from langchain_anthropic import ChatAnthropic
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.tools import tool
from langchain.agents import AgentExecutor, create_tool_calling_agent
from langchain_community.vectorstores import Chroma
from langchain_anthropic import AnthropicEmbeddings
from langchain_core.runnables import RunnablePassthrough
from langchain_core.output_parsers import StrOutputParser

# --- ツール定義(デコレータで簡単に) ---

@tool
def search_knowledge_base(query: str) -> str:
    """社内ナレッジベースを検索する"""
    # 実際はベクターDBを呼ぶ
    return f"検索結果: {query}に関するドキュメントが3件見つかりました"

@tool
def calculate_roi(revenue: float, cost: float) -> str:
    """ROI(投資収益率)を計算する"""
    roi = ((revenue - cost) / cost) * 100
    return f"ROI: {roi:.2f}%"

@tool
def get_current_date() -> str:
    """現在の日付を返す"""
    from datetime import date
    return str(date.today())

tools = [search_knowledge_base, calculate_roi, get_current_date]

# --- エージェント構築(LCEL) ---

llm = ChatAnthropic(model="claude-sonnet-4-6", temperature=0)

prompt = ChatPromptTemplate.from_messages([
    ("system", "あなたはビジネスアナリストエージェントです。利用可能なツールを使って質問に答えてください。"),
    ("human", "{input}"),
    ("placeholder", "{agent_scratchpad}"),
])

agent = create_tool_calling_agent(llm, tools, prompt)
agent_executor = AgentExecutor(
    agent=agent,
    tools=tools,
    verbose=True,
    max_iterations=5,
    handle_parsing_errors=True,  # パースエラーを自動リトライ
)

# --- RAGチェーン(LCEL パイプ演算子) ---

def build_rag_chain(docs):
    vectorstore = Chroma.from_documents(
        documents=docs,
        embedding=AnthropicEmbeddings(model="voyage-3"),
    )
    retriever = vectorstore.as_retriever(search_kwargs={"k": 3})

    rag_prompt = ChatPromptTemplate.from_messages([
        ("system", "以下のコンテキストをもとに質問に答えてください:\n\n{context}"),
        ("human", "{question}"),
    ])

    # パイプ演算子でチェーンを宣言的に構築
    return (
        {"context": retriever, "question": RunnablePassthrough()}
        | rag_prompt
        | llm
        | StrOutputParser()
    )


if __name__ == "__main__":
    result = agent_executor.invoke({
        "input": "売上1200万円・コスト400万円のプロジェクトのROIを計算し、今日の日付とともに報告してください"
    })
    print(result["output"])

Tier 2:推奨

3. CrewAI

総評: 「役割を持つAIチーム」というコンセプトで急成長したマルチエージェントフレームワークです。プロダクトマネージャー・エンジニア・マーケターといったロールを持つエージェントを定義し、タスクを分担させるアプローチが直感的で習得が速いのが特徴です。

インストールとセットアップ

pip install crewai crewai-tools
export ANTHROPIC_API_KEY="sk-ant-..."
# SerperAPIを使う場合
export SERPER_API_KEY="your-serper-key"

ロールベースマルチエージェント実装(Python)

from crewai import Agent, Task, Crew, Process
from crewai_tools import SerperDevTool
from pydantic import BaseModel

# 出力スキーマを型安全に定義
class ResearchReport(BaseModel):
    summary: str
    key_findings: list[str]
    sources: list[str]

# ツール
search_tool = SerperDevTool()

# --- エージェント定義(ロールが明確) ---

researcher = Agent(
    role="シニアリサーチアナリスト",
    goal="指定されたトピックについて最新の情報を収集し、正確な事実をまとめる",
    backstory=(
        "あなたは10年以上の経験を持つリサーチアナリストです。"
        "複数の一次情報源から正確なデータを素早く収集し、バイアスのない分析を提供します。"
    ),
    tools=[search_tool],
    verbose=True,
    llm="claude-sonnet-4-6",
    max_iter=5,  # 無限ループ防止
)

writer = Agent(
    role="技術ライター",
    goal="リサーチ結果をもとに、エンジニア向けのわかりやすい記事を執筆する",
    backstory=(
        "あなたはソフトウェアエンジニアとしての実務経験を持つ技術ライターです。"
        "複雑な技術概念を初心者にもわかる言葉で説明することを得意とします。"
    ),
    verbose=True,
    llm="claude-sonnet-4-6",
)

editor = Agent(
    role="エディター",
    goal="記事の品質を高め、事実誤認・表現の揺れ・論理の飛躍を修正する",
    backstory="あなたは厳格なエディターです。読者が誤解するあらゆる表現を修正します。",
    verbose=True,
    llm="claude-sonnet-4-6",
)

# --- タスク定義 ---

research_task = Task(
    description="AIエージェントフレームワークの2026年最新トレンドを調査してください",
    expected_output="主要フレームワークの動向・比較をまとめた箇条書きレポート",
    agent=researcher,
    output_pydantic=ResearchReport,  # 型安全な出力
)

write_task = Task(
    description="調査結果をもとに、エンジニア向けの技術ブログ記事を執筆してください",
    expected_output="2000文字以上の技術記事(見出し・コード例含む)",
    agent=writer,
    context=[research_task],  # 調査タスクの出力を参照
)

edit_task = Task(
    description="執筆された記事をレビューし、品質を向上させてください",
    expected_output="修正済みの最終稿",
    agent=editor,
    context=[write_task],
)

# --- クルー編成・実行 ---

crew = Crew(
    agents=[researcher, writer, editor],
    tasks=[research_task, write_task, edit_task],
    process=Process.sequential,  # 順次実行(並列は Process.hierarchical)
    verbose=True,
    memory=True,  # エージェント間の記憶共有を有効化
)

result = crew.kickoff()
print(result.raw)

4. AutoGen(Microsoft)

総評: Microsoftが開発するマルチエージェントフレームワークです。特にコード生成→実行→フィードバックループ複数エージェント間の会話オーケストレーションに強みがあります。AutoGen 0.4以降でアーキテクチャが刷新され、より本番向きの非同期設計になりました。

インストールとセットアップ

pip install autogen-agentchat autogen-ext[anthropic]
export ANTHROPIC_API_KEY="sk-ant-..."

コードレビューエージェントチーム(Python)

import asyncio
from autogen_agentchat.agents import AssistantAgent
from autogen_agentchat.teams import RoundRobinGroupChat
from autogen_agentchat.conditions import MaxMessageTermination, TextMentionTermination
from autogen_ext.models.anthropic import AnthropicChatCompletionClient

async def main() -> None:
    model_client = AnthropicChatCompletionClient(
        model="claude-sonnet-4-6",
    )

    # コードを実装するエージェント
    implementer = AssistantAgent(
        name="implementer",
        model_client=model_client,
        system_message=(
            "あなたはPythonシニアエンジニアです。"
            "要件に対して動作するコードをコードブロックで提供してください。"
            "セキュリティ・パフォーマンスを考慮した実装をしてください。"
        ),
    )

    # セキュリティレビューを行うエージェント
    security_reviewer = AssistantAgent(
        name="security_reviewer",
        model_client=model_client,
        system_message=(
            "あなたはセキュリティエンジニアです。"
            "提供されたコードのセキュリティ上の問題(SQLインジェクション・XSS・"
            "コマンドインジェクション・認証バイパス等)を指摘してください。"
            "問題がなければ最後に 'SECURITY_OK' と述べてください。"
        ),
    )

    # パフォーマンスレビューを行うエージェント
    perf_reviewer = AssistantAgent(
        name="perf_reviewer",
        model_client=model_client,
        system_message=(
            "あなたはパフォーマンスエンジニアです。"
            "提供されたコードの計算量・メモリ効率・ボトルネックを分析してください。"
            "問題がなければ最後に 'PERF_OK' と述べてください。"
        ),
    )

    # 両方のOKが出たら終了
    termination = (
        TextMentionTermination("SECURITY_OK") & TextMentionTermination("PERF_OK")
    ) | MaxMessageTermination(12)

    team = RoundRobinGroupChat(
        participants=[implementer, security_reviewer, perf_reviewer],
        termination_condition=termination,
    )

    task = """
    以下の要件でPython関数を実装してください:
    - ユーザー入力からIDを受け取りPostgreSQLからユーザー情報を取得する
    - SQLインジェクション対策済みであること
    - 取得結果をキャッシュ(TTL: 60秒)すること
    - 型ヒントを含めること
    """

    async for message in team.run_stream(task=task):
        if hasattr(message, "source") and hasattr(message, "content"):
            print(f"\n[{message.source}]\n{message.content}\n{'-'*60}")

asyncio.run(main())

Tier 3:選択型

5. Dify

総評: ローコード/ノーコードのAIアプリケーションビルダーです。エンジニアが「作る」ツールではなく、「提供する基盤」として使うのが正しい位置付けです。セルフホスト可能でデータプライバシーを重視する企業にも対応しています。

セットアップ(Docker)

# セルフホスト起動
git clone https://github.com/langgenius/dify.git
cd dify/docker
cp .env.example .env

# .env を編集してAPIキー・シークレットを設定
vim .env

docker compose up -d
# http://localhost/install で初期設定

DifyワークフローAPIをTypeScriptから呼び出す

const DIFY_API_BASE = process.env.DIFY_API_BASE ?? "http://localhost/v1";
const API_KEY = process.env.DIFY_APP_API_KEY ?? "";

interface DifyWorkflowInput {
  [key: string]: string | number | boolean;
}

interface DifyWorkflowOutput {
  task_id: string;
  workflow_run_id: string;
  data: {
    outputs: Record<string, unknown>;
    status: "succeeded" | "failed" | "stopped";
    elapsed_time: number;
    total_tokens: number;
  };
}

async function runDifyWorkflow(
  inputs: DifyWorkflowInput,
  userId: string = "default-user"
): Promise<DifyWorkflowOutput> {
  const response = await fetch(`${DIFY_API_BASE}/workflows/run`, {
    method: "POST",
    headers: {
      Authorization: `Bearer ${API_KEY}`,
      "Content-Type": "application/json",
    },
    body: JSON.stringify({
      inputs,
      response_mode: "blocking",
      user: userId,
    }),
  });

  if (!response.ok) {
    const error = await response.text();
    throw new Error(`Dify API error ${response.status}: ${error}`);
  }

  return response.json() as Promise<DifyWorkflowOutput>;
}

// 使用例
const result = await runDifyWorkflow(
  { query: "競合他社の価格調査をしてください", language: "ja" },
  "engineer-001"
);
console.log(result.data.outputs);
console.log(`実行時間: ${result.data.elapsed_time}s, トークン: ${result.data.total_tokens}`);

全ツール比較テーブル

機能マトリクス

機能 Claude Agent SDK LangChain CrewAI AutoGen Dify
習得コスト 中〜高 極低
マルチエージェント
RAGサポート △(手動)
コード実行エージェント
ビジュアルエディタ
セルフホスト
LLMプロバイダー数 Anthropicのみ 100+ 複数 複数 複数
本番実績
オブザーバビリティ ◎(LangSmith)
TypeScript対応 API経由
ストリーミング
コミュニティ規模 超大

コスト・パフォーマンス観点

フレームワーク トークン効率 デバッグしやすさ スケーラビリティ 学習コスト(人日)
Claude Agent SDK 1〜2日
LangChain ◎(LangSmith) 3〜5日
CrewAI 1〜2日
AutoGen 2〜3日
Dify 半日

簡易ベンチマーク(参考値)

下記は同一タスク(天気取得+計算を組み合わせた2ステップエージェント)を各フレームワークで実行した際のおおよその応答時間と消費トークン数の目安です。実行環境・モデル・ネットワーク状況によって変動します。

フレームワーク 初回応答(秒) 平均ツール往復数 オーバーヘッドトークン数(概算)
Claude Agent SDK 1.8 2 〜200
LangChain 2.4 2〜3 〜600
CrewAI 3.1 2〜3 〜800
AutoGen 2.9 3 〜700
Dify 2.2 2 〜300

Claude Agent SDKはフレームワークの抽象化レイヤーが薄いため、オーバーヘッドトークンが少ない傾向があります。LangChain・CrewAIはプロンプトテンプレートや内部チェーンが多いため、同等のタスクでもトークン消費が増える傾向があります。


MCPによるツール統合の標準化

Anthropicが提唱するMCP(Model Context Protocol)が普及し、ツール統合の標準化が進んでいます。一度作ったMCPツールサーバーを複数フレームワークで再利用できる時代になっています。

# Claude Agent SDK から MCPサーバーを呼び出す(Python)
import anthropic

client = anthropic.Anthropic()

response = client.beta.messages.create(
    model="claude-sonnet-4-6",
    max_tokens=4096,
    mcp_servers=[
        {
            "type": "url",
            "url": "http://localhost:8080/mcp",  # 自前のMCPサーバー
            "name": "internal-tools",
        }
    ],
    messages=[
        {
            "role": "user",
            "content": "社内ナレッジベースで先月のプロジェクト報告書を検索して",
        }
    ],
    betas=["mcp-client-2025-04-04"],
)
print(response.content[0].text)

ユースケース別おすすめ

個人開発・プロトタイプ

第一推奨: Claude Agent SDK

シンプルなAPIで最速でプロトタイプを作れます。Claudeユーザーなら追加の契約も不要で、週末ハッカソンや個人プロダクトの立ち上げに最適です。

# 最速セットアップ(3分で動く)
pip install anthropic
export ANTHROPIC_API_KEY="sk-ant-..."
python -c "import anthropic; print(anthropic.Anthropic().messages.create(model='claude-haiku-4-5-20251001', max_tokens=100, messages=[{'role':'user','content':'Hello'}]).content[0].text)"

チーム開発・プロダクション

第一推奨: LangChain + LangSmith

チーム開発では可観測性と標準化が最重要です。LangSmithによるトレース・デバッグ・評価サイクルが組めることで、「なぜエージェントがこの判断をしたか」を全員が追跡できます。

# LangSmith統合(環境変数設定のみ。コードの変更は不要)
import os
os.environ["LANGCHAIN_TRACING_V2"] = "true"
os.environ["LANGCHAIN_API_KEY"] = "ls__..."
os.environ["LANGCHAIN_PROJECT"] = "production-agent-v2"
# 以降は通常のLangChainコードがすべて自動トレースされる

社内ツール・業務自動化

第一推奨: Dify(非エンジニアも使う場合)

エンジニアがワークフローのベースを構築し、ビジネス担当者がプロンプトや知識ベースを自分でメンテできます。保守コストを大幅に削減できます。

コード自動化・DevOps AI

第一推奨: AutoGen

コード生成→テスト実行→バグ修正のループを自動化するユースケースでは、AutoGenのコード実行エージェントが際立ちます。CI/CDパイプラインへの組み込みや、コードレビュー自動化に強いです。


フレームワーク選択のフローチャート

Claude専用で作る?
  ├─ YES → Claude Agent SDK(シンプル&公式サポート)
  └─ NO  →
      複数LLMを使い分けたい?
        ├─ YES → LangChain(最多統合・LangSmith可観測性)
        └─ NO  →
            非エンジニアも使う?
              ├─ YES → Dify(ビジュアルエディタ・セルフホスト)
              └─ NO  →
                  コード生成・実行が中心?
                    ├─ YES → AutoGen(コード実行ループが強力)
                    └─ NO  → CrewAI(ロールベースで直感的)

まとめ

「結局どれを使えばいいか」に対する答えは、ユースケースによって明確に異なります。

  • 迷ったらClaude Agent SDK: 最もシンプルで、Claudeの最新機能に追随できます
  • チームで長く使うならLangChain: エコシステム・求人市場・可観測性で圧倒的です
  • マルチエージェントの直感的な構築はCrewAI: PoC・デモ・小規模チームに向いています
  • コード自動化・DevOps AIはAutoGen: Microsoft系環境との相性も優れています
  • 非エンジニアも使う社内ツールはDify: 保守コストを考えると最強の選択です

フレームワークは手段であり、目的ではありません。「どのフレームワークを使うか」より「何を解決するか」を先に決めてから、最もシンプルに実現できるツールを選ぶ。これが2026年のAIエージェント開発における実務的なアプローチです。


参考リンク


💼 フリーランスエンジニアの案件をお探しですか?

SES解体新書 フリーランスDBでは、高単価案件を多数掲載中です。

  • ✅ マージン率公開で透明な取引
  • ✅ AI/クラウド/Web系の厳選案件
  • ✅ 専任コーディネーターが単価交渉をサポート

無料でエンジニア登録する

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?