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 の一回払い。




