5.

LangChain とは?LLM アプリ開発フレームワークの使い方・RAG

編集

本稿は 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
LangServeFastAPI ベースのチェーン公開ヘルパ
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. ドキュメント読込LoaderPyPDFLoaderWebBaseLoader
2. テキスト分割Text SplitterRecursiveCharacterTextSplitter
3. 埋め込み生成EmbeddingsOpenAIEmbeddingsHuggingFaceEmbeddings
4. ベクトル DB に格納VectorStoreChromaFAISSPGVector
5. 質問 → 関連文書検索Retrievervectorstore.as_retriever()
6. LLM へプロンプト構築Prompt + LLMChatPromptTemplate + ChatOpenAI
7. 出力Output ParserStrOutputParserPydanticOutputParser

最小サンプル: 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) が強み
本番運用補助LangSmithLlamaCloud

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-openailangchain-anthropiclangchain-community 等)。必要なものだけ入れます。

運用上のヒント

Tips
  • LCEL を覚える: prompt | llm | parser 形式は invokebatchastream 全てに対応
  • LangSmith: 本番で必ず入れる。トレース・トークン消費・遅延を可視化
  • Streaming: chain.astream(...) でトークン単位の体感速度を向上
  • ベクトル DB: ローカル試作は Chroma、本番は pgvector / Pinecone
  • マルチプロバイダ運用は ChatOpenAI / ChatAnthropic / ChatGoogleGenerativeAI を同じ API で差替
  • 本番化は LangServe(FastAPI)または自前 FastAPI + chain.invoke で十分

注意点

よくある落とし穴
  • API が頻繁に変わる — メジャー版・パッケージ分割が断続的に起こる。requirements.txt で固定必須
  • 古いチュートリアルLLMChaininitialize_agent非推奨。LCEL / LangGraph へ
  • ベクトル DB の永続化: Chroma.from_documents は揮発しがち。persist_directory を指定
  • トークン消費: RAG は文脈に大量に詰める。コスト監視必須
  • 機密データ: 公開 LLM API へ送る前に PII マスキング
  • 長いプロンプトでモデル制限を超えるとサイレント切り捨て。Tokenizer 事前計測
  • エージェントの暴走: ループ・ツール乱用に備え、ステップ上限・タイムアウトを設定

関連

編集
Post Share
子ページ

子ページはありません

同階層のページ
  1. PyTorch
  2. TensorFlow(テンソルフロー)
  3. scikit-learn
  4. Hugging Face Transformers
  5. LangChain
  6. LlamaIndex
  7. JAX
  8. ONNX Runtime

最近更新/作成されたページ