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_agentはlanggraphパッケージから 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&A | RAG(PDF・社内 Wiki を参照) |
| カスタマーサポート Bot | エージェント + CRM ツール連携 |
| データ分析レポート自動生成 | チェーン(データ取得 → 分析 → 文章化) |
| コードレビュー補助 | プロンプトテンプレート + 構造化出力 |
| 多言語翻訳パイプライン | LCEL チェーン |
ハマりやすいポイント
1. import するパッケージが分散している
LangChain は langchain・langchain-core・langchain-openai・langchain-community など複数のパッケージに分かれています。エラーが出たら pip list | grep langchain で何がインストールされているか確認しましょう。
2. 廃止された API を使ってしまう
v0.1 以前の LLMChain や ConversationalRetrievalChain などの高レベルチェーンは 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_size や k(取得するチャンク数)を適切に調整してください。
関連ツールとの比較
| ツール | 特徴 | 向いているシーン |
|---|---|---|
| LangChain | 豊富なインテグレーション・抽象化 | RAG・エージェントを素早く試作 |
| LlamaIndex | ドキュメント検索・RAG に特化 | ドキュメント Q&A に専念したい場合 |
| LangGraph | ステートフルなエージェント制御 | 複雑なマルチエージェント構成 |
| 直接 SDK | シンプル・コントロールしやすい | LangChain が重すぎると感じたとき |
まとめ
- LangChain はプロンプト・チェーン・RAG・エージェントを統一的に扱えるフレームワーク
- 現在の推奨スタイルは LCEL(
|記法) - エージェントは LangGraph ベースに移行している
- 社内ドキュメント Q&A や自律的なタスク実行など、業務での活用シーンは幅広い
- まずは
langchain-openaiだけで小さなチェーンを試してみるのがおすすめ
LangChain は「LLM を部品として組み合わせる」という考え方を提供してくれます。まずはシンプルなプロンプトチェーンを動かし、徐々に RAG やエージェントへステップアップしていきましょう。