本稿は LangChain (ラングチェーン) に関する記事です。
| この記事の要点 |
- LangChain は LLM アプリ開発のためのフレームワーク。プロンプト → モデル → 出力解析を「チェーン」として組み立てる
- OpenAI / Anthropic / Google / Hugging Face など主要 LLM をプロバイダ抽象化。モデル切替が容易
- RAG (検索拡張生成) / ベクトル DB / Tool 呼出のための部品が揃う
- 本格的なエージェントは姉妹プロダクト LangGraph で組む流れに
- 本番運用には LangSmith(ログ・評価・モニタリング)が併用される
- Python / JavaScript の双方で提供
|
LangChain とは?
LangChain は、LLM を中心としたアプリケーション開発のためのフレームワークです。LLM 単体ではなく、プロンプト・ベクトル DB・外部 API・ツール呼出・メモリといった周辺要素を組み合わせて「チェーン」や「エージェント」を構築するのが目的です。
2022 年に登場後、急速に普及し、LLM アプリ開発の事実上の共通言語になりました。当初は機能を詰め込みすぎてレイヤが厚い批判もありましたが、2024 年以降は LangChain Expression Language (LCEL) 中心のシンプル設計へ整理されています。
LangChain ファミリーの全体像
| プロダクト | 役割 |
| LangChain | 本体ライブラリ。プロンプト・モデル・出力・ベクトル DB・Tool の抽象化 |
| LangGraph | 状態機械でエージェント・ワークフローを組むためのライブラリ(本格運用はこちら) |
| LangSmith | 本番運用向けトレース・評価・モニタリング SaaS |
| LangServe | FastAPI ベースのチェーン公開ヘルパ |
| LangChain Hub | プロンプトテンプレート共有 |
主な特徴
- プロバイダ抽象化 — OpenAI / Anthropic / Google / Ollama 等を同じ API で扱える
- LCEL (LangChain Expression Language) —
| 演算子でチェーンを宣言的に組む
- 豊富なローダ — PDF / Web / Notion / Confluence / S3 など 100 種類超の Document Loader
- テキスト分割・埋め込み — RAG 構築の標準部品
- ベクトル DB 連携 — Chroma、Faiss、pgvector、Pinecone、Qdrant、Weaviate 等
- Tool 呼出 (Function Calling) — 計算機・検索・コード実行などツールを LLM が選択
- メモリ — 会話履歴の保持・要約
- 非同期・ストリーミング —
astream でトークン単位の流し込み
典型的な構成: RAG
| ステップ | 担当 | LangChain での部品 |
| 1. ドキュメント読込 | Loader | PyPDFLoader、WebBaseLoader |
| 2. テキスト分割 | Text Splitter | RecursiveCharacterTextSplitter |
| 3. 埋め込み生成 | Embeddings | OpenAIEmbeddings、HuggingFaceEmbeddings |
| 4. ベクトル DB に格納 | VectorStore | Chroma、FAISS、PGVector |
| 5. 質問 → 関連文書検索 | Retriever | vectorstore.as_retriever() |
| 6. LLM へプロンプト構築 | Prompt + LLM | ChatPromptTemplate + ChatOpenAI 等 |
| 7. 出力 | Output Parser | StrOutputParser、PydanticOutputParser |
最小サンプル: LCEL でシンプルチェーン
|
from langchain_openai import ChatOpenAI
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.output_parsers import StrOutputParser
prompt = ChatPromptTemplate.from_template(
"次の質問に簡潔に日本語で答えてください: {q}"
)
llm = ChatOpenAI(model="gpt-4o-mini")
parser = StrOutputParser()
# LCEL: | でチェーンを組む
chain = prompt | llm | parser
print(chain.invoke({"q": "光の三原色は?"}))
|
最小 RAG サンプル
|
from langchain_community.document_loaders import WebBaseLoader
from langchain_text_splitters import RecursiveCharacterTextSplitter
from langchain_openai import ChatOpenAI, OpenAIEmbeddings
from langchain_community.vectorstores import Chroma
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.runnables import RunnablePassthrough
from langchain_core.output_parsers import StrOutputParser
# 1) 読込・分割
docs = WebBaseLoader("https://example.com/manual").load()
splits = RecursiveCharacterTextSplitter(chunk_size=1000, chunk_overlap=100).split_documents(docs)
# 2) 埋め込み・DB
vs = Chroma.from_documents(splits, embedding=OpenAIEmbeddings())
retriever = vs.as_retriever(search_kwargs={"k": 4})
# 3) チェーン
prompt = ChatPromptTemplate.from_template("質問: {question}\\n\\n参考:\\n{context}\\n\\n回答:")
llm = ChatOpenAI(model="gpt-4o-mini")
rag = (
{"context": retriever, "question": RunnablePassthrough()}
| prompt | llm | StrOutputParser()
)
print(rag.invoke("このマニュアルの主旨は?"))
|
LangChain vs LlamaIndex の使い分け
| 観点 |
LangChain |
LlamaIndex |
| 主軸 | 汎用 LLM アプリ・エージェント | データインデックス・検索 (RAG) |
| RAG の作りやすさ | 部品を組合せて作る | 専用 API で短いコードで作れる |
| エージェント | LangGraph で本格組み | Workflow API で組める |
| エコシステム | Tool / Integration が圧倒的に多い | データ取込み (Connector) が強み |
| 本番運用補助 | LangSmith | LlamaCloud |
LangGraph の位置づけ
| エージェントを真面目に作るなら LangGraph |
LangChain の AgentExecutor はプロトには便利ですが、複雑な分岐や状態管理を扱うと破綻しやすい弱点があります。これを状態機械 (StateGraph) として明示的に組み立てるのが LangGraph です。Anthropic Claude / OpenAI / Gemini のTool 呼出ループ、人間の介入 (human-in-the-loop)、チェックポイントなどを 1 つのグラフで扱え、本番運用に耐える設計が可能になります。
|
インストール
|
# Python
pip install langchain langchain-openai langchain-community
pip install langgraph langsmith # エージェント+運用
# JavaScript / TypeScript
npm install langchain @langchain/openai @langchain/core
|
LangChain は用途別に小さなパッケージに分割されています (langchain-openai、langchain-anthropic、langchain-community 等)。必要なものだけ入れます。
運用上のヒント
| Tips |
- LCEL を覚える:
prompt | llm | parser 形式は invoke、batch、astream 全てに対応
- LangSmith: 本番で必ず入れる。トレース・トークン消費・遅延を可視化
- Streaming:
chain.astream(...) でトークン単位の体感速度を向上
- ベクトル DB: ローカル試作は
Chroma、本番は pgvector / Pinecone
- マルチプロバイダ運用は
ChatOpenAI / ChatAnthropic / ChatGoogleGenerativeAI を同じ API で差替
- 本番化は LangServe(FastAPI)または自前 FastAPI + chain.invoke で十分
|
注意点
| よくある落とし穴 |
- API が頻繁に変わる — メジャー版・パッケージ分割が断続的に起こる。
requirements.txt で固定必須
- 古いチュートリアルの
LLMChain や initialize_agent は非推奨。LCEL / LangGraph へ
- ベクトル DB の永続化:
Chroma.from_documents は揮発しがち。persist_directory を指定
- トークン消費: RAG は文脈に大量に詰める。コスト監視必須
- 機密データ: 公開 LLM API へ送る前に PII マスキング
- 長いプロンプトでモデル制限を超えるとサイレント切り捨て。Tokenizer 事前計測
- エージェントの暴走: ループ・ツール乱用に備え、ステップ上限・タイムアウトを設定
|
関連