4.

LangChain 入門|LCEL / Agent / RAG / LangSmith 完全ガイド

編集
この記事の要点
  • LangChain: LLM アプリ開発のためのフレームワーク、Python と JS / TS の両方で利用可
  • 主要コンポーネント: Models / Prompts / Chains / Agents / Memory / Indexes (Retrievers)
  • LCEL (LangChain Expression Language): パイプ | 演算子でチェーンを宣言的に組み立て
  • LangSmith: 公式デバッグ・観測ツール、本番アプリのトレース・評価必須
  • LangGraph: 状態管理付きの Agent / マルチステップワークフロー構築
  • 代替: LlamaIndex (RAG 特化), Haystack (検索特化), Semantic Kernel (Microsoft)

LangChain とは

LangChain は、LLM (大規模言語モデル) を使ったアプリケーション開発のためのオープンソースフレームワークです。OpenAI / Anthropic / Google / ローカル LLM など多様なモデルを統一的なインターフェースで扱え、RAG・Agent・チェーン処理など複雑なワークフローを少ないコードで構築できます。

2022 年末の ChatGPT 登場と同時期に Harrison Chase 氏が公開して以来、LLM アプリ開発のデファクトスタンダードとなっており、GitHub Star 数も生成 AI 関連 OSS としてはトップクラス。Python 版JS / TS 版が並行開発されています。

LangChain Python と LangChain JS

LangChain PythonLangChain JS / TS
用途データ処理・バッチ・研究Web アプリ・Edge・Serverless
機能の網羅性★ 最新機能が先行主要機能はカバー
パッケージ名langchain@langchain/core
環境FastAPI / Streamlit / JupyterNext.js / Cloudflare Workers / Vercel

セットアップ・準備

# Python 版
pip install langchain langchain-openai langchain-anthropic langchain-community

# JS / TS 版
npm install @langchain/core @langchain/openai @langchain/anthropic langchain

最初のコード — Hello World

Python (LCEL)

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

# モデル
llm = ChatOpenAI(model="gpt-5")

# プロンプトテンプレート
prompt = ChatPromptTemplate.from_messages([
    ("system", "あなたはプロの日本語コピーライターです。"),
    ("user", "{product} のキャッチコピーを 3 つ考えて")
])

# パーサ
parser = StrOutputParser()

# チェーン構築(LCEL)
chain = prompt | llm | parser

# 実行
print(chain.invoke({"product": "低糖質おやつ"}))

JS / TS

import { ChatOpenAI } from "@langchain/openai";
import { ChatPromptTemplate } from "@langchain/core/prompts";
import { StringOutputParser } from "@langchain/core/output_parsers";

const llm = new ChatOpenAI({ model: "gpt-5" });
const prompt = ChatPromptTemplate.fromMessages([
    ["system", "あなたはプロの日本語コピーライターです。"],
    ["user", "{product} のキャッチコピーを 3 つ考えて"]
]);
const parser = new StringOutputParser();

const chain = prompt.pipe(llm).pipe(parser);
console.log(await chain.invoke({ product: "低糖質おやつ" }));

主要コンポーネント

コンポーネント役割主なクラス
ModelsLLM / Chat / Embedding モデルの統一 IFChatOpenAI, ChatAnthropic, OpenAIEmbeddings
Promptsプロンプトテンプレート・Few-shotChatPromptTemplate, FewShotPromptTemplate
Output ParsersLLM 出力を構造化(JSON / Pydantic)JsonOutputParser, PydanticOutputParser
Chains複数ステップの組合せLCEL (| 演算子)
Agentsツールを使う自律 AIcreate_react_agent
Memory会話履歴の保持ConversationBufferMemory
Indexes / RetrieversRAG のためのデータ取得VectorStoreRetriever
Document LoadersPDF / HTML / Notion 等から取込PyPDFLoader, WebBaseLoader
Text Splitters長文をチャンク化RecursiveCharacterTextSplitter

LCEL (LangChain Expression Language)

LCEL は LangChain 0.1 以降の標準チェーン記述方法。Unix パイプのように | で要素を繋いで、データの流れを宣言的に表現します。

LCEL の利点

  • シンプル: 1 行でチェーンが書ける
  • 非同期対応: ainvoke() / astream() を自動で生成
  • バッチ実行: batch() で並列処理
  • ストリーミング: stream() でトークン単位の逐次出力
  • LangSmith 統合: 自動でトレース取得

実践コード例

例 1: RAG をシンプルに構築

from langchain_openai import ChatOpenAI, OpenAIEmbeddings
from langchain_community.vectorstores import Chroma
from langchain_community.document_loaders import PyPDFLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.runnables import RunnablePassthrough
from langchain_core.output_parsers import StrOutputParser

# 1. PDF を読み込んでベクトル化
docs = PyPDFLoader("manual.pdf").load()
chunks = RecursiveCharacterTextSplitter(chunk_size=1000).split_documents(docs)
vectordb = Chroma.from_documents(chunks, OpenAIEmbeddings())
retriever = vectordb.as_retriever()

# 2. RAG チェーン
prompt = ChatPromptTemplate.from_template(
    "以下の文脈を踏まえて回答してください。\n文脈: {context}\n質問: {question}"
)

rag_chain = (
    {"context": retriever, "question": RunnablePassthrough()}
    | prompt
    | ChatOpenAI(model="gpt-5")
    | StrOutputParser()
)

print(rag_chain.invoke("経費精算の手順は?"))

例 2: Agent (Tool Use)

from langchain_openai import ChatOpenAI
from langchain.agents import create_react_agent, AgentExecutor
from langchain_core.tools import tool

@tool
def get_weather(city: str) -> str:
    """指定した都市の現在の天気を返す"""
    # 実際は外部 API を呼ぶ
    return f"{city} の天気: 晴れ、気温 22℃"

@tool
def calculator(expression: str) -> str:
    """簡単な数式を評価する"""
    return str(eval(expression))

tools = [get_weather, calculator]
llm = ChatOpenAI(model="gpt-5")
agent = create_react_agent(llm, tools, prompt="...")
executor = AgentExecutor(agent=agent, tools=tools)

print(executor.invoke({"input": "東京の天気を教えて、それから 23+45 を計算"}))

例 3: 構造化出力(JSON / Pydantic)

from langchain_openai import ChatOpenAI
from langchain_core.prompts import ChatPromptTemplate
from pydantic import BaseModel, Field

class CustomerInfo(BaseModel):
    name: str = Field(description="顧客の名前")
    age: int = Field(description="年齢")
    email: str = Field(description="メールアドレス")

llm = ChatOpenAI(model="gpt-5").with_structured_output(CustomerInfo)
prompt = ChatPromptTemplate.from_messages([
    ("user", "次の自己紹介から情報を抽出: {text}")
])

result = (prompt | llm).invoke({
    "text": "私は山田太郎、35歳、メールは yamada@example.com です"
})
print(result.name, result.age, result.email)
# → CustomerInfo オブジェクトとして取得

LangSmith でのデバッグ

LangSmith は LangChain 公式の観測・デバッグ・評価プラットフォーム。本番運用するなら必須レベル:

  • トレース: チェーン内の各ステップの入出力・所要時間を可視化
  • プロンプトデバッグ: 実際にどんなプロンプトが投げられたか確認
  • データセット: 良い回答・悪い回答を蓄積して評価セット化
  • 評価: GPT-4 等を Judge にして自動評価
  • A/B テスト: プロンプト変更の影響を統計的に検証
# 環境変数を設定するだけで自動でトレース送信される
export LANGCHAIN_TRACING_V2=true
export LANGCHAIN_API_KEY="ls__..."
export LANGCHAIN_PROJECT="my-rag-app"

LangGraph(状態管理)

LangGraph は LangChain チームが開発するグラフベースの Agent / ワークフローフレームワーク。複雑な状態遷移・サイクル・ヒューマン・イン・ザ・ループが必要なケースで威力を発揮:

  • 各ノードが LLM やツールを呼び出す
  • 条件分岐で次のノードを動的に決定
  • 状態 (State) をグラフ全体で共有
  • チェックポイント機能で中断・再開可能
  • 本格的なマルチステップ Agent / ワークフローを構築可能

代替フレームワーク

フレームワーク得意分野特徴
LlamaIndex★ RAG / 検索RAG に特化、インデックス管理が強力
Haystack検索 / NLPdeepset 社製、エンタープライズ実績
Semantic Kernel.NET / C#Microsoft 製、Azure と相性良
DSPyプロンプト自動最適化Stanford 発、プログラムでプロンプトを記述
AutoGenマルチエージェントMicrosoft Research 製、複数 Agent 協調
CrewAIマルチエージェント役割ベースの Agent オーケストレーション

注意点・落とし穴

  • 頻繁な破壊的変更: バージョン間で API が変わることが多い、ピン留め推奨
  • 抽象化のオーバーヘッド: シンプルな用途では生 API のほうが早い
  • パッケージ分割: 0.1 以降 langchain-core / langchain-openai 等に分割、混乱しやすい
  • ドキュメントの古さ: ネット上の古いサンプルが現行 API で動かないことがある、公式ドキュメント優先
  • Agent はまだ実験的: 本番投入は LangGraph 推奨
  • コスト管理: チェーンを多段に組むとトークン消費が膨れる、LangSmith でモニタリング

関連リンク

編集
Post Share
子ページ

子ページはありません

同階層のページ
  1. OpenAI API 入門 — Python / Node.js から GPT-5 を呼ぶ
  2. Anthropic Claude API 入門 — Claude 4 を使い倒す
  3. RAG (Retrieval-Augmented Generation) 入門
  4. LangChain 入門 — LLM アプリ開発フレームワーク

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