LangChain 入門 — LLM アプリを Python で作るためのフレームワーク

LangChain は、OpenAI や Anthropic などの LLM を使ったアプリを簡単に構築するための Python フレームワークです。この記事では、基本的な概念からコード例、業務での活用シーンまでを初心者向けに解説します。

LangChain とは

LangChain は LLM(大規模言語モデル)を「部品」として組み合わせ、実用的な AI アプリを構築するためのフレームワークです。2022年に Harrison Chase が開発し、現在は バージョン 1.x 系(2026年3月時点で 1.2.12)が安定版です。

単純な「プロンプト → 回答」の一問一答だけでなく、以下のような複雑な処理を実現できます。

  • 外部ドキュメントを参照しながら回答する(RAG)
  • Web 検索や計算などの外部ツールを自律的に使う(エージェント)
  • 複数の LLM 呼び出しを連鎖させる(チェーン)

LangChain は現在、LangGraph(エージェントの状態管理・オーケストレーション)の上に構築された高レベルレイヤーとして位置づけられており、シンプルなユースケースはまず LangChain から始めるのが推奨です。

インストール

pip install langchain langchain-openai
# または Anthropic Claude を使う場合
pip install langchain langchain-anthropic

OpenAI の API キーを環境変数に設定します。

export OPENAI_API_KEY="sk-..."

基本: LLM を呼び出す

LangChain を使った最小限の LLM 呼び出しです。

from langchain_openai import ChatOpenAI
from langchain_core.messages import HumanMessage

llm = ChatOpenAI(model="gpt-4o-mini", temperature=0)

response = llm.invoke([HumanMessage(content="Pythonの特徴を3点で教えてください")])
print(response.content)

invoke() にメッセージのリストを渡すだけで呼び出せます。

プロンプトテンプレート

毎回プロンプトを手書きするのではなく、テンプレートとして定義できます。

from langchain_core.prompts import ChatPromptTemplate
from langchain_openai import ChatOpenAI

prompt = ChatPromptTemplate.from_messages([
    ("system", "あなたは{language}の専門家です。"),
    ("human", "{question}"),
])

llm = ChatOpenAI(model="gpt-4o-mini")

# LCEL(LangChain Expression Language)でチェーンを構築
chain = prompt | llm

response = chain.invoke({
    "language": "Python",
    "question": "リスト内包表記はいつ使うべきですか?"
})
print(response.content)

| 演算子でコンポーネントを繋ぐ記法を LCEL(LangChain Expression Language) と呼びます。

出力パーサー: 構造化データとして受け取る

LLM の回答を文字列ではなく、Python オブジェクトとして受け取れます。

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

# 1. 文字列として受け取る(最シンプル)
chain = ChatPromptTemplate.from_template("{topic}とは何ですか?") | ChatOpenAI() | StrOutputParser()
result = chain.invoke({"topic": "機械学習"})
print(result)  # str 型で返ってくる

Pydantic モデルを使うと JSON 形式で構造化できます。

from langchain_openai import ChatOpenAI
from pydantic import BaseModel, Field

class MovieReview(BaseModel):
    title: str = Field(description="映画のタイトル")
    score: int = Field(description="10点満点の評価")
    summary: str = Field(description="50文字以内のまとめ")

llm = ChatOpenAI(model="gpt-4o-mini").with_structured_output(MovieReview)

result = llm.invoke("インターステラーを評価してください")
print(result.title)   # インターステラー
print(result.score)   # 9
print(result.summary) # 宇宙と時間の神秘を...

RAG: ドキュメントを参照して回答する

RAG(Retrieval-Augmented Generation)は、自社ドキュメントや外部ファイルを参照して LLM が回答するパターンです。

from langchain_community.document_loaders import TextLoader
from langchain_text_splitters import RecursiveCharacterTextSplitter
from langchain_openai import OpenAIEmbeddings, ChatOpenAI
from langchain_community.vectorstores import FAISS
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.runnables import RunnablePassthrough
from langchain_core.output_parsers import StrOutputParser

# 1. ドキュメントを読み込む
loader = TextLoader("company_manual.txt", encoding="utf-8")
docs = loader.load()

# 2. チャンク分割
splitter = RecursiveCharacterTextSplitter(chunk_size=500, chunk_overlap=50)
chunks = splitter.split_documents(docs)

# 3. ベクトルストアに格納
embeddings = OpenAIEmbeddings()
vectorstore = FAISS.from_documents(chunks, embeddings)
retriever = vectorstore.as_retriever(search_kwargs={"k": 3})

# 4. RAG チェーンを組む
prompt = ChatPromptTemplate.from_template("""
以下のコンテキストを参照して質問に答えてください。

コンテキスト:
{context}

質問: {question}
""")

def format_docs(docs):
    return "\n\n".join(doc.page_content for doc in docs)

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

answer = rag_chain.invoke("有給休暇の申請方法を教えてください")
print(answer)

エージェント: LLM がツールを自律的に使う

エージェントは LLM 自身が「何をすべきか」を判断し、必要なツールを呼び出します。

from langchain_openai import ChatOpenAI
from langchain_core.tools import tool
from langgraph.prebuilt import create_react_agent

# カスタムツールを定義
@tool
def get_weather(city: str) -> str:
    """指定した都市の天気を返す"""
    # 実際は外部 API を呼ぶ
    return f"{city}の天気: 晴れ、気温 22°C"

@tool
def calculate(expression: str) -> str:
    """数式を計算する"""
    try:
        return str(eval(expression))
    except Exception as e:
        return f"エラー: {e}"

# エージェントを作成(LangGraph の create_react_agent を使用)
llm = ChatOpenAI(model="gpt-4o-mini")
agent = create_react_agent(llm, tools=[get_weather, calculate])

# 実行
result = agent.invoke({
    "messages": [{"role": "user", "content": "東京の天気を教えて。また 12345 * 678 はいくつ?"}]
})
print(result["messages"][-1].content)

LangChain v1.x 以降、エージェントの実行は LangGraph ベースに移行しています。create_react_agentlanggraph パッケージから import します。

pip install langgraph

メモリ(会話履歴)の管理

会話履歴を保持してコンテキストを引き継ぎます。

from langchain_openai import ChatOpenAI
from langchain_core.messages import HumanMessage, AIMessage

llm = ChatOpenAI(model="gpt-4o-mini")

# 手動で履歴を管理(シンプルな方法)
history = []

def chat(user_input: str) -> str:
    history.append(HumanMessage(content=user_input))
    response = llm.invoke(history)
    history.append(response)
    return response.content

print(chat("私の名前はタロウです"))   # 「タロウさん、はじめまして...」
print(chat("私の名前を覚えていますか?"))  # 「はい、タロウさんですね」

業務での使いどころ

シーン実装パターン
社内ドキュメント Q&ARAG(PDF・社内 Wiki を参照)
カスタマーサポート Botエージェント + CRM ツール連携
データ分析レポート自動生成チェーン(データ取得 → 分析 → 文章化)
コードレビュー補助プロンプトテンプレート + 構造化出力
多言語翻訳パイプラインLCEL チェーン

ハマりやすいポイント

1. import するパッケージが分散している

LangChain は langchainlangchain-corelangchain-openailangchain-community など複数のパッケージに分かれています。エラーが出たら pip list | grep langchain で何がインストールされているか確認しましょう。

2. 廃止された API を使ってしまう

v0.1 以前の LLMChainConversationalRetrievalChain などの高レベルチェーンは deprecated になっています。現在は LCEL(| で繋ぐ書き方)を使うのが推奨です。

# NG(古い書き方 / deprecated)
from langchain.chains import LLMChain

# 後方互換が必要な場合(非推奨)
from langchain_classic.chains import LLMChain

# OK(現在の推奨: LCEL)
chain = prompt | llm | StrOutputParser()

3. エージェントは LangGraph に移行済み

langchain.agents.initialize_agent などの従来のエージェント API は deprecated です。新しく書く場合は langgraph.prebuilt.create_react_agent を使いましょう。

4. トークン消費に注意

チェーンや RAG でドキュメントを大量に渡すとトークン数が増えてコストが上がります。chunk_sizek(取得するチャンク数)を適切に調整してください。

関連ツールとの比較

ツール特徴向いているシーン
LangChain豊富なインテグレーション・抽象化RAG・エージェントを素早く試作
LlamaIndexドキュメント検索・RAG に特化ドキュメント Q&A に専念したい場合
LangGraphステートフルなエージェント制御複雑なマルチエージェント構成
直接 SDKシンプル・コントロールしやすいLangChain が重すぎると感じたとき

まとめ

  • LangChain はプロンプト・チェーン・RAG・エージェントを統一的に扱えるフレームワーク
  • 現在の推奨スタイルは LCEL(| 記法)
  • エージェントは LangGraph ベースに移行している
  • 社内ドキュメント Q&A や自律的なタスク実行など、業務での活用シーンは幅広い
  • まずは langchain-openai だけで小さなチェーンを試してみるのがおすすめ

LangChain は「LLM を部品として組み合わせる」という考え方を提供してくれます。まずはシンプルなプロンプトチェーンを動かし、徐々に RAG やエージェントへステップアップしていきましょう。