LangChain vs Direct SDK:本番環境のAIアプリではそれぞれをいつ使うべきか

Dev.to / 2026/4/7

💬 オピニオンDeveloper Stack & InfrastructureTools & Practical Usage

要点

  • LangChainは、LLMの本番アプリ向けの人気のデフォルトとして位置づけられており、チェーン合成、メモリ、リトリーバル(RAG)、エージェント、統一されたストリーミングといった機能を抽象化して提供します。
  • この記事は、LangChainが「過剰に設計されている(over-engineered)」可能性があると主張しています。つまり、追加のレイヤーが挙動を見えにくくし、デバッグを難しくしつつ、運用コストを増やしてしまう場合があるということです。
  • 多くの本番ケースでは、アプリの要件が単純であるなら、直接のプロバイダSDK(例:Anthropicの @anthropic-ai/sdk)を使うことを推奨しています。
  • 判断のポイントは、LangChainの高度な機能(合成、RAG連携、エージェントのループ)を必要としているか、それとも直接API呼び出しの方が、複雑さを抑えつつ十分な制御を提供できるかにあります。
  • 提示されているTypeScriptのスニペットは、Anthropic SDKを通じてチャットやツール利用を基本的に実装する方法を示しており、抽象化によるオーバーヘッドを削減します。

LangChainは、LLMアプリケーションを構築するためのデフォルトのフレームワークになりました。ですが、エコシステムの中でも最も過剰に設計されたツールの1つでもあります――何が起きているかを隠し、デバッグをつらくするための抽象化の層です。使うべきか、それとも直接作るべきかを判断する方法を紹介します。

LangChainが実際に提供しているもの

LangChainは実際の課題を解決します:

  • チェーン構成: LLM呼び出し、ツール呼び出し、変換をつなぐ
  • メモリ: 会話履歴の管理
  • リトリーバル: RAGのためのベクターストア連携
  • エージェント: 複数のLLMプロバイダを使った、ループベースのツール利用
  • ストリーミング: 統一されたストリーミングインターフェース

問題は、抽象化が必要なのか、それともコストを増やしているだけなのかです。

ダイレクトAPIアプローチ

ほとんどのアプリケーションでは、Anthropic SDKで十分です:

import Anthropic from '@anthropic-ai/sdk'

const client = new Anthropic()

// シンプルなチャット
const response = await client.messages.create({
  model: 'claude-sonnet-4-6',
  max_tokens: 1024,
  messages: [{ role: 'user', content: 'Hello' }],
})

// ツールあり
const toolResponse = await client.messages.create({
  model: 'claude-sonnet-4-6',
  tools: myTools,
  messages,
})

// ストリーミング
const stream = client.messages.stream({ model, messages })
for await (const event of stream) { /* ... */ }

直接SDKコード150行は、何が起きているかを隠してしまうLangChainの20行より分かりやすいことが多いです。

LangChainが理にかなうとき

マルチプロバイダのアプリ: OpenAI、Anthropic、Mistralを1つのインターフェースで本当に切り替える必要がある場合:

import { ChatAnthropic } from '@langchain/anthropic'
import { ChatOpenAI } from '@langchain/openai'

// 下流のコードを変更せずにプロバイダを切り替える
const model = process.env.AI_PROVIDER === 'openai'
  ? new ChatOpenAI({ model: 'gpt-4o' })
  : new ChatAnthropic({ model: 'claude-sonnet-4-6' })

複雑なRAGパイプライン: LangChainのリトリーバルチェーンは、チャンク分割、埋め込み、コンテキスト注入を処理します:

import { createRetrievalChain } from 'langchain/chains/retrieval'
import { createStuffDocumentsChain } from 'langchain/chains/combine_documents'

const questionAnswerChain = await createStuffDocumentsChain({llm, prompt})
const ragChain = await createRetrievalChain({
  retriever: vectorStore.asRetriever(),
  combineDocsChain: questionAnswerChain,
})

const result = await ragChain.invoke({ input: question })

直接作るべきとき

次の場合は、プロバイダSDKで直接構築してください:

  • 単一プロバイダ(アプリの90%)
  • カスタムのツール実行ロジック
  • すべての手順を検査してデバッグする必要がある
  • パフォーマンスが重要(抽象化の各層がレイテンシを追加する)
  • チームはコードを理解する必要があります
  • Observability のための LangSmith

    LangChain のオブザーバビリティ・プラットフォームは、LangChain を使うかどうかに関わらず機能します。

    import { Client } from 'langsmith'
    import { traceable } from 'langsmith/traceable'
    
    // 追跡したい任意の関数をラップする
    const tracedAnalyze = traceable(
      async (text: string) => {
        return anthropic.messages.create({ /* ... */ })
      },
      { name: 'analyze-text', project_name: 'my-app' }
    )
    

    LangSmith はすべての LLM 呼び出しをトレースし、トークン使用量、レイテンシー、エラーを表示します。LangChain を省略する場合でも使う価値があります。

    正直な評価

    LangChain は、プロダクションの依存関係というより、探索の出発点として使うのが最適です:

    • LangChain の抽象化を使って素早くプロトタイプする
    • 摩擦が出たところは、直接 SDK 呼び出しに置き換える
    • オブザーバビリティのために、LangSmith は開発を通して維持する

    私が見てきたほとんどの本番向け AI アプリケーションは、チームがパターンを理解すると、最終的には LangChain を取り除いて直接実装に移行します。

    whoffagents.com の AI SaaS Starter は Anthropic SDK を直接使っています(LangChain の抽象化はなし)。クリーンなストリーミングチャット用フック、ツール実行ループ、会話の永続化を備えています。$99 の一回払い。