アーパボー(ARPABLE)
アープらしいエンジニア、それを称賛する言葉・・・アーパボー
AI

LangChainの使い方完全ガイド|最短実装からRAG・本番運用まで【2026年版】

LangChainとOpenAI GPTAPI
最終更新:

たとえ話で学ぶLangChainとOpenAI GPT API|最短実装→RAG→運用まで(2026対応)


「GPT APIは触った。でも、RAG(社内文書検索)やツール連携、運用の“地獄”が始まった」——その瞬間から、LangChainの出番です。

📌 この記事を読むと、こうなります
  • 5分後: LangChainの最小チェーンが動いている
  • 30分後: RAG(社内文書検索)が実装できている
  • 1時間後: 本番運用の設計判断ができるようになる
1分でわかる結論
  • LangChainが効く場面:プロンプトだけでなく、検索(RAG)ツール呼び出し会話状態評価/監視まで“部品化して再利用”したいとき。
  • LangChainが不要な場面:単発のチャット生成だけ/検証だけで終わるPoC/API直叩きの方が早い小規模スクリプト。
  • 最短ルート:LCEL(パイプ構文)で「Prompt → Model → Parser」をまず1本通し、そこにRAGとツールを足す。

重要:この記事の前提(2026年の“APIの現実”)

  • OpenAI側はAPIが進化し続けます。記事内の表現は、特定のモデル名に依存しすぎない形で書いています。
  • LangChain側も langchain / langchain-core / langchain-community / langchain-openai のように分割が進んでいます。導入時は公式ドキュメントで最新を確認してください。

📍 この記事の進行イメージ


LangChain学習ロードマップ:環境構築(5分)→ LCEL最短実装(10分)→ RAG実装(30分)→ 本番運用(継続)の4ステップで進む学習フロー図
基礎 → 実装 → 応用 → 運用 の順に進みます。
各ステップで「動くもの」を作りながら、徐々に本番レベルに近づけます。

0. たとえ話で理解する:LangChainとは何か?【配管工のたとえ】

「たとえ話」の直後 単なるAPI利用(蛇口)と、LangChain(複雑な配管)の違いを可視化OpenAI APIを直に叩くのは、蛇口から直接水を飲む感じです。早いし、気持ちいい。
でも実運用では「浄水(RAG)」「分岐(ツール)」「貯水(会話履歴)」「漏水検知(監視)」が必要になります。
LangChainは、そのための配管(部品)を規格化して、つなぎ替え可能にするフレームワークです。

1. LangChainを使う/使わない判断(最初に迷いを潰す)

LangChain採用判断(目安)※比較条件:開発規模と運用要件/期間:2026年2月時点/データ源:筆者の実装経験+公式ドキュメント
状況 LangChainが向く API直叩きが向く
単発生成・検証 △(学習目的ならOK) ◎(最速)
RAG / ツール / 会話状態 ◎(部品が揃う) △(自作が増える)
本番運用(監視/評価/再試行) ◎(LangSmith等と相性) △(作り込みが必要)
判定根拠 “LLM呼び出し”だけなら直叩きで十分。周辺機能(検索・ツール・状態・評価)が増えるほどLangChainのメリットが指数的に増える。

LangChain環境構築:Pythonインストールから5分で完了

2-1. インストール

pip install -U langchain langchain-openai openai python-dotenv tiktoken
# RAGで使う場合(例:FAISS)
pip install -U faiss-cpu

2-2. APIキー(.env推奨)

# .env
OPENAI_API_KEY="your_api_key_here"
import os
from dotenv import load_dotenv

load_dotenv()
assert os.environ.get("OPENAI_API_KEY"), "OPENAI_API_KEY が未設定です"
運用TIP:ローカルは .env、クラウドはシークレットマネージャ(例:AWS Secrets Manager 等)を推奨。
さらに、キーの権限分離(開発/本番)とローテーションは最初から設計しておくと後で救われます。

3. 【5分で動く】LangChain最短実装:LCELで作る最初のチェーン

「最短で動かす」のコードブロック前 Prompt | Model | Parser という記法が、データの「物理的な流れ」であることを示します

langchain 使い方:最初にやるべきは「部品の接着」ではなく、最小のパイプを通して“水が出る”状態を作ることです。

from langchain_openai import ChatOpenAI
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.output_parsers import StrOutputParser

# 1) モデル
llm = ChatOpenAI(
    model="gpt-4o-mini", 
    temperature=0.2
)

# 2) プロンプト
prompt = ChatPromptTemplate.from_messages([
    ("system", "あなたは日本語で簡潔に説明する技術アシスタントです。"),
    ("human", "{question}")
])

# 3) パーサー
parser = StrOutputParser()

# 4) LCEL (パイプで連結)
chain = prompt | llm | parser

print(chain.invoke({"question": "LangChainって何? たとえ話で30秒で。"}))

# 実行結果(例)
"""
LangChainは、LLMアプリを部品化して繋ぐフレームワークです。
たとえるなら、レゴブロックのように「検索」「生成」「ツール」を
組み替え可能な形で設計できます。
"""
詰まりポイント:モデル名・エンドポイント・パッケージが環境でズレることがあります。
まずは「この最小チェーンが動く」ことを確認してから、RAGやツールに進むのが最短です。

4. 会話履歴(メモリ)を“安全に”持つ

「会話履歴を入れれば賢くなる」は半分正解で、半分危険です。
履歴が増えるほど、コスト情報漏洩誤誘導のリスクも増えます。
まずは「必要最小限の履歴」+「要約/圧縮」戦略を前提にしてください。

from langchain_core.messages import HumanMessage, AIMessage
from langchain_core.chat_history import InMemoryChatMessageHistory

history = InMemoryChatMessageHistory()
history.add_message(HumanMessage(content="LangChainって何?"))
history.add_message(AIMessage(content="LLMアプリを部品化して繋ぐフレームワークです。"))

# 履歴をプロンプトに差し込む場合のイメージ(詳細は用途により実装が分岐)

5. ストリーミング / 並列化 / リトライ(運用で効く三種の神器)

5-1. ストリーミング(体感速度を上げる)

from langchain_openai import ChatOpenAI

llm = ChatOpenAI(model="gpt-4.1-mini", temperature=0.2, streaming=True)

for chunk in llm.stream("短く:LangChainの価値は?"):
    print(chunk.content, end="")

5-2. タイムアウト / リトライ(落ちない設計)

from langchain_openai import ChatOpenAI

llm = ChatOpenAI(
    model="gpt-4.1-mini",
    temperature=0.2,
    timeout=30,     # 秒
    max_retries=2,  # 失敗時の再試行
)

6. 構造化出力(JSONで返せ)を“楽にする”

本番アプリは結局、テキストよりJSONを欲しがります。
LangChainは、「スキーマを与えて、モデルに“型”で喋らせる方向に寄せられます。

from pydantic import BaseModel, Field
from langchain_openai import ChatOpenAI

class Summary(BaseModel):
    title: str = Field(description="要約タイトル")
    bullets: list[str] = Field(description="要点(箇条書き)")

llm = ChatOpenAI(model="gpt-4.1-mini", temperature=0.2)

# 環境によりメソッド名は変化する場合があります(公式に合わせてください)
structured = llm.with_structured_output(Summary)

out = structured.invoke("LangChainのメリットを3点で。")
print(out)
運用TIP:構造化出力は「失敗する前提」で、バリデーション→再試行を組み込むと安定します。

7. ツール呼び出し(Function calling的なやつ)を最短で掴む

LLMを“喋るだけ”から“行動できる”へ変えるのがツールです。
ただし、ツールは便利な反面、セキュリティと暴走も連れてきます(重要)。

from langchain_core.tools import tool
from langchain_openai import ChatOpenAI

@tool
def calc_tax(price: int, tax_rate: float = 0.1) -> int:
    """税込価格を計算する"""
    return int(price * (1 + tax_rate))

llm = ChatOpenAI(model="gpt-4.1-mini", temperature=0.2)
llm_tools = llm.bind_tools([calc_tax])

msg = llm_tools.invoke("価格が1200円なら税込はいくら? 関数を使って。")
print(msg)
安全設計:ツールは必ず 許可制(allowlist)入力検証監査ログ
「モデルが呼んだら実行」ではなく、「モデルが提案→アプリが検証→実行」が基本です。

LangChainでRAG実装:社内文書検索を30分で構築する方法

RAGは“魔法”ではなく、配管の組み合わせです。
特に重要なのは、「分割(chunking)」が品質の8割という現実です。

8-1. テキスト分割(最小例)

from langchain_text_splitters import RecursiveCharacterTextSplitter

text = "ここに長い文章(社内規定やマニュアル等)が入る想定です。"

splitter = RecursiveCharacterTextSplitter(
    chunk_size=600,
    chunk_overlap=80,
)

docs = splitter.create_documents()
print(len(docs), docs[0].page_content[:120])

8-2. 埋め込み→ベクトル検索(FAISS例)

from langchain_openai import OpenAIEmbeddings
from langchain_community.vectorstores import FAISS

emb = OpenAIEmbeddings(model="text-embedding-3-large")  # 例:環境に合わせて変更
vs = FAISS.from_documents(docs, emb)

retriever = vs.as_retriever(search_kwargs={"k": 3})
hits = retriever.invoke("この文章の要点は?")
print(hits[0].page_content[:120])

8-3. 検索結果をプロンプトに注入して回答(RAGチェーン)

from langchain_core.prompts import ChatPromptTemplate
from langchain_openai import ChatOpenAI
from langchain_core.output_parsers import StrOutputParser
from langchain_core.runnables import RunnablePassthrough

llm = ChatOpenAI(model="gpt-4.1-mini", temperature=0.2)
prompt = ChatPromptTemplate.from_messages([
    ("system", "あなたは社内文書の検索結果だけを根拠に回答します。根拠がない場合は不明と言ってください。"),
    ("human", "質問: {question}\n\n参考情報:\n{context}")
])

def format_docs(docs):
    return "\n\n".join([d.page_content for d in docs])

rag_chain = (
    {"context": retriever | format_docs, "question": RunnablePassthrough()}
    | prompt
    | llm
    | StrOutputParser()
)

print(rag_chain.invoke("この文書は何について述べている?"))

8-4. 【実例】RAGが失敗する典型パターンと対処法

❌ 失敗例1: chunk_sizeが大きすぎて精度が落ちる

問題: chunk_size=2000 → 関係ない情報まで混入
対処: chunk_size=400~800、overlap=80~120 で調整

 ❌ 失敗例2: 検索数k=1だと安定しない

問題: k=1 → 検索ミスで即死
対処: k=3~5 で複数取得し、リランキング

 ❌ 失敗例3: プロンプトに「根拠を示せ」がない

問題: 幻覚(Hallucination)が発生
対処: 「参考情報以外は使わないでください」を明示


LangChain本番運用ガイド:コスト・速度・安全性の最適化

  • コスト:トークン上限、要約、キャッシュ、RAGのk最適化
  • レイテンシ:ストリーミング、並列検索、バッチ化、タイムアウト
  • 品質:RAGの分割戦略、引用(根拠提示)、評価データセット
  • 安全:プロンプトインジェクション対策、ツール実行の検証、機密ログマスキング
  • 監視:失敗率、遅延、コスト、幻覚率(観測可能性を持つ)
現場感のある一言:LLMアプリは「モデルが賢い」より「運用が堅い」方が勝ちます。
順位を取りに行く記事は、実装例だけでなく“落とし穴と回避策”まで書くと強いです。

10. まとめ:LangChainは「LLMを使う」から「LLMで組む」への橋

OpenAI API直叩きは最短です。
でもRAG・ツール・状態・監視が入る瞬間、設計は“配管工事”になります。
LangChainはその配管を規格化し、試作→改善→運用を前に進めるための道具箱です。

専門用語まとめ

LCEL
LangChainのパイプ記法でチェーンを組む表現。
RAG
検索で根拠を拾ってから生成する(社内文書に強い)。
Chunking
文書を切る設計。品質の要(雑だと全部崩れる)。
Tool calling
LLMが関数/APIを呼ぶ(実行はアプリ側で検証)。

よくある質問(FAQ)

Q1. LangChainは結局、何を楽にしてくれる?

A1. RAG・ツール連携・会話状態・評価/監視など、LLMアプリで避けられない“周辺機能”を部品化し、つなぎ替え可能にします。単なる「APIクライアント」ではなく、配管(パイプライン)を再利用可能な形で設計するためのフレームワークです。

Q2. RAGの品質が安定しません。最初に疑うべきは?

A2. 分割(chunking)です。 サイズやオーバーラップ、見出し単位の扱い、表やリストの切り方で精度が大きく変わります。まずは chunk サイズ(例:400〜800 tokens相当)と overlap を変えながら、小さな検証セットで当たり外れを観測してください。

Q3. ツール(関数呼び出し)を使うと危なくない?

A3. 危険性はあります。 必ず「モデルが提案 → アプリが検証 → 実行」という三段階に分け、ツールは allowlist 方式で限定し、入力検証と監査ログを入れてください。モデルに直接 OS コマンドや決済API を叩かせる設計は避けましょう。

Q4. OpenAI API直叩きと比べて、LangChainは遅くなりませんか?

A4. 単純な1回きりの呼び出しだけを見ると、直叩きの方が薄い分だけ速いことが多いです。 ただし、RAG・ツール・再試行・ログなど“周辺機能”を自前で積み始めると、LangChainで最初からパターン化しておいた方が、全体の開発速度と運用の安定性は高くなりがちです。

Q5. 現場で最初に手を付けるべきステップは?

A5. まず「最小のチェーン(Prompt → Model → Parser)」を LCEL で通して、環境のズレを解消します。 そのうえで、RAG なら chunking と埋め込み→検索、ツールなら安全なスキーマと承認フロー、と制約の強い部分から小さく PoC するのが堅実です。


参考サイト / 出典

本記事の実装・設計判断に直結する一次情報(公式ドキュメント)を厳選しました。

  • OpenAI Responses API(公式リファレンス)
    Responses API Reference
    最新のAPI設計(入力/出力形式、ストリーミング等)を確認するための基準資料。
  • OpenAI Function calling / Tools(公式ガイド)
    Function calling Guide
    ツール呼び出し設計(スキーマ、呼び出し制御、運用上の注意点)を一次情報で押さえる。
  • OpenAI Structured Outputs(公式ガイド)
    Structured Outputs Guide
    JSON等の構造化出力を「仕様として」扱うための設計指針(堅牢化・検証・失敗時戦略)。
  • LangChain Expression Language(LCEL / 公式)
    LCEL Documentation
    チェーンを「宣言的に」組む発想の中核。Runnable設計・合成・可観測性の考え方に直結。
  • LangChain × OpenAI Integration(公式)
    OpenAI Provider Integration
    LangChain側のOpenAI接続(パッケージ、初期化、代表的な利用パターン)を正確に合わせる。

更新履歴

  • 初版公開
  • 最新情報にアップデート、読者支援機能の強化
  • 全体リライト(検索意図の再整理、構成刷新、LCEL最短実装→RAG→運用チェックを強化)

ABOUT ME
ケニー 狩野
★記事に対する質問や要望などがありましたら以下のメールアドレスまでお願いします。 kano.kuniomi@arp-corp.co.jp