LangChain
大規模言語モデル(LLM)を活用したアプリケーション開発フレームワーク。チェーン、エージェント、メモリ機能により、複雑なAI対話システムやワークフローを効率的に構築できる
LangChainとは
LangChain(ラングチェーン)は、大規模言語モデル(LLM)を活用したアプリケーション開発を支援するオープンソースフレームワークです。2022年にHarrison Chase氏によって開発され、複雑なLLMベースのワークフローを効率的に構築できる包括的なツールセットを提供します。チェーン(Chain)、エージェント(Agent)、メモリ(Memory)、ツール(Tools)などの概念により、単純なプロンプト実行を超えた高度なAIアプリケーションを開発できます。GPT、Claude、Gemini等の主要LLMプロバイダーをサポートし、RAG(検索拡張生成)、対話システム、自動化ワークフロー、データ分析アシスタントなど、幅広い用途で活用されています。
背景と重要性
大規模言語モデルの普及により、LLMを活用したアプリケーション開発の需要が急速に拡大しました。
従来のLLM活用の課題
- 単発的な利用:一回の入出力に限定された使用
- 外部データアクセス:訓練データ以外の情報活用困難
- 複雑ワークフロー:多段階処理の実装困難
- 状態管理:対話履歴や文脈の保持不足
LangChainによる解決
# 従来のシンプルなLLM呼び出し
import openai
response = openai.ChatCompletion.create(
model="gpt-3.5-turbo",
messages=[{"role": "user", "content": "What is the weather like today?"}]
)
# LangChainによる高度なワークフロー
from langchain.llms import OpenAI
from langchain.chains import ConversationChain
from langchain.memory import ConversationBufferMemory
from langchain.agents import load_tools, initialize_agent
# メモリ付き対話チェーン
llm = OpenAI()
memory = ConversationBufferMemory()
conversation = ConversationChain(
llm=llm,
memory=memory,
verbose=True
)
# ツールを使用するエージェント
tools = load_tools(["serpapi", "llm-math"], llm=llm)
agent = initialize_agent(
tools,
llm,
agent="zero-shot-react-description",
verbose=True
)
# 複雑な質問への対応
result = agent.run("What's the current temperature in Tokyo and what is 25% of that number?")
主要コンポーネント
LLMとプロンプト
from langchain.llms import OpenAI, Anthropic
from langchain.prompts import PromptTemplate
from langchain.chains import LLMChain
# プロンプトテンプレートの定義
prompt = PromptTemplate(
input_variables=["product", "company"],
template="""
あなたは優秀なマーケティング担当者です。
{company}の{product}について、魅力的な商品説明を200文字以内で作成してください。
商品説明:
"""
)
# LLMチェーンの作成
llm = OpenAI(temperature=0.7)
chain = LLMChain(llm=llm, prompt=prompt)
# 実行
result = chain.run(product="スマートウォッチ", company="テックイノベーション株式会社")
チェーン(Chains)
複数のコンポーネントを連携させたワークフローを構築します。
from langchain.chains import SimpleSequentialChain, SequentialChain
# 段階的処理のチェーン
# ステップ1: アイデア生成
idea_prompt = PromptTemplate(
input_variables=["topic"],
template="以下のトピックについて、革新的なビジネスアイデアを提案してください: {topic}"
)
idea_chain = LLMChain(llm=llm, prompt=idea_prompt, output_key="idea")
# ステップ2: 市場分析
analysis_prompt = PromptTemplate(
input_variables=["idea"],
template="このビジネスアイデアの市場性を分析してください: {idea}"
)
analysis_chain = LLMChain(llm=llm, prompt=analysis_prompt, output_key="analysis")
# ステップ3: 実行計画
plan_prompt = PromptTemplate(
input_variables=["idea", "analysis"],
template="""
ビジネスアイデア: {idea}
市場分析: {analysis}
上記を踏まえて、実行計画を策定してください。
"""
)
plan_chain = LLMChain(llm=llm, prompt=plan_prompt, output_key="plan")
# チェーンの連携
overall_chain = SequentialChain(
chains=[idea_chain, analysis_chain, plan_chain],
input_variables=["topic"],
output_variables=["idea", "analysis", "plan"],
verbose=True
)
result = overall_chain({"topic": "持続可能なテクノロジー"})
エージェント(Agents)
動的にツールを選択・実行する自律的なシステムです。
from langchain.agents import Tool, AgentExecutor, create_react_agent
from langchain.tools import DuckDuckGoSearchRun
from langchain import hub
# 検索ツールの設定
search = DuckDuckGoSearchRun()
# 計算ツールの定義
def calculator(expression):
"""数式を計算します"""
try:
return eval(expression)
except:
return "計算エラーが発生しました"
# ツールの登録
tools = [
Tool(
name="検索",
func=search.run,
description="最新情報を検索する際に使用します"
),
Tool(
name="計算",
func=calculator,
description="数式の計算を行います。例: 2+2*3"
)
]
# ReActエージェントの作成
prompt = hub.pull("hwchase17/react")
agent = create_react_agent(llm, tools, prompt)
agent_executor = AgentExecutor(agent=agent, tools=tools, verbose=True)
# 複雑なタスクの実行
response = agent_executor.invoke({
"input": "2024年の日本の人口を調べて、それを1000で割った値を計算してください"
})
メモリ(Memory)
対話の履歴や文脈を保持する機能です。
from langchain.memory import ConversationBufferMemory, ConversationSummaryMemory
from langchain.schema import BaseMessage
# 基本的なメモリ
buffer_memory = ConversationBufferMemory()
# 要約メモリ(長い対話に適用)
summary_memory = ConversationSummaryMemory(
llm=llm,
max_token_limit=100
)
# カスタムメモリの実装
class ProjectMemory:
def __init__(self):
self.project_info = {}
self.tasks = []
def add_project_info(self, key, value):
self.project_info[key] = value
def add_task(self, task):
self.tasks.append(task)
def get_context(self):
context = f"プロジェクト情報: {self.project_info}\n"
context += f"タスク一覧: {self.tasks}"
return context
# メモリ付きチェーンの使用
conversation_with_memory = ConversationChain(
llm=llm,
memory=buffer_memory,
verbose=True
)
# 継続的な対話
print(conversation_with_memory.predict(input="私はデータサイエンティストです"))
print(conversation_with_memory.predict(input="機械学習プロジェクトを始めたいと思います"))
print(conversation_with_memory.predict(input="先ほど話した私の職業を覚えていますか?"))
RAG (Retrieval-Augmented Generation)
外部知識ベースを活用した生成を行います。
from langchain.document_loaders import TextLoader, PDFLoader
from langchain.text_splitter import CharacterTextSplitter
from langchain.embeddings import OpenAIEmbeddings
from langchain.vectorstores import Chroma
from langchain.chains import RetrievalQA
# ドキュメントの読み込み
loader = PDFLoader("company_manual.pdf")
documents = loader.load()
# テキスト分割
text_splitter = CharacterTextSplitter(
chunk_size=1000,
chunk_overlap=200
)
docs = text_splitter.split_documents(documents)
# ベクトルストアの作成
embeddings = OpenAIEmbeddings()
vectorstore = Chroma.from_documents(docs, embeddings)
# RAGチェーンの構築
qa_chain = RetrievalQA.from_chain_type(
llm=llm,
chain_type="stuff",
retriever=vectorstore.as_retriever(search_kwargs={"k": 3}),
return_source_documents=True
)
# 質問応答
response = qa_chain({"query": "休暇申請の手続きについて教えてください"})
print(f"回答: {response['result']}")
print(f"参照元: {[doc.page_content[:100] for doc in response['source_documents']]}")
高度なRAGの実装
from langchain.retrievers import BM25Retriever, EnsembleRetriever
from langchain.retrievers.document_compressors import LLMChainExtractor
from langchain.retrievers import ContextualCompressionRetriever
# ハイブリッド検索(ベクトル + キーワード)
bm25_retriever = BM25Retriever.from_documents(docs)
vector_retriever = vectorstore.as_retriever()
ensemble_retriever = EnsembleRetriever(
retrievers=[bm25_retriever, vector_retriever],
weights=[0.3, 0.7]
)
# 文脈圧縮
compressor = LLMChainExtractor.from_llm(llm)
compression_retriever = ContextualCompressionRetriever(
base_compressor=compressor,
base_retriever=ensemble_retriever
)
# 改良されたRAGチェーン
enhanced_qa = RetrievalQA.from_chain_type(
llm=llm,
retriever=compression_retriever
)
高度な応用例
マルチモーダルエージェント
from langchain.tools import ShellTool, PythonREPLTool
from langchain.agents import AgentType
# コード実行ツール
python_repl = PythonREPLTool()
shell_tool = ShellTool()
# データ分析エージェント
analysis_tools = [
Tool(
name="Python",
func=python_repl.run,
description="Pythonコードを実行します。データ分析や可視化に使用"
),
Tool(
name="検索",
func=search.run,
description="最新情報の検索"
)
]
data_analyst_agent = initialize_agent(
analysis_tools,
llm,
agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION,
verbose=True
)
# 複雑なデータ分析タスク
task = """
CSVファイル 'sales_data.csv' を分析して、以下を実行してください:
1. データの概要統計を表示
2. 月別売上推移をグラフで可視化
3. 売上予測モデルを構築
4. 結果をレポート形式でまとめ
"""
result = data_analyst_agent.run(task)
カスタムチェーンの構築
from langchain.chains.base import Chain
from typing import Dict, List
class BusinessAnalysisChain(Chain):
"""ビジネス分析専用チェーン"""
research_chain: LLMChain
analysis_chain: LLMChain
recommendation_chain: LLMChain
@property
def input_keys(self) -> List[str]:
return ["company", "industry", "challenge"]
@property
def output_keys(self) -> List[str]:
return ["analysis_report"]
def _call(self, inputs: Dict[str, str]) -> Dict[str, str]:
# 段階1: 業界調査
research_result = self.research_chain.run({
"industry": inputs["industry"],
"company": inputs["company"]
})
# 段階2: 課題分析
analysis_result = self.analysis_chain.run({
"research": research_result,
"challenge": inputs["challenge"]
})
# 段階3: 推奨事項
recommendations = self.recommendation_chain.run({
"analysis": analysis_result,
"company": inputs["company"]
})
# 統合レポート
report = f"""
## ビジネス分析レポート
### 業界調査
{research_result}
### 課題分析
{analysis_result}
### 推奨事項
{recommendations}
"""
return {"analysis_report": report}
ワークフロー自動化
from langchain.schema.runnable import RunnableLambda, RunnablePassthrough
# 並列処理チェーン
def create_parallel_workflow():
# 並列で実行される複数のタスク
task1 = RunnableLambda(lambda x: competitor_analysis(x["company"]))
task2 = RunnableLambda(lambda x: market_research(x["industry"]))
task3 = RunnableLambda(lambda x: financial_analysis(x["company"]))
# 結果を統合
def combine_results(inputs):
return {
"competitor_analysis": inputs["task1"],
"market_research": inputs["task2"],
"financial_analysis": inputs["task3"],
"original_input": inputs["original"]
}
# パイプライン構築
workflow = (
RunnablePassthrough.assign(
task1=task1,
task2=task2,
task3=task3,
original=RunnablePassthrough()
) |
RunnableLambda(combine_results) |
final_analysis_chain
)
return workflow
# 実行
workflow = create_parallel_workflow()
result = workflow.invoke({
"company": "株式会社テックソリューション",
"industry": "AI・ソフトウェア"
})
エンタープライズ機能
セキュリティとプライバシー
from langchain.callbacks import CallbackManager
from langchain.callbacks.streaming_stdout import StreamingStdOutCallbackHandler
# データマスキング
class DataMaskingCallback(StreamingStdOutCallbackHandler):
def on_llm_start(self, serialized, prompts, **kwargs):
# 個人情報をマスキング
masked_prompts = [self.mask_pii(prompt) for prompt in prompts]
super().on_llm_start(serialized, masked_prompts, **kwargs)
def mask_pii(self, text):
import re
# 電話番号、メールアドレス等をマスキング
text = re.sub(r'\d{3}-\d{4}-\d{4}', '***-****-****', text)
text = re.sub(r'\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Z|a-z]{2,}\b', '***@***.***', text)
return text
# セキュアなLLMチェーン
secure_llm = OpenAI(
callback_manager=CallbackManager([DataMaskingCallback()])
)
監査とログ
import logging
from langchain.callbacks import FileCallbackHandler
# 詳細ログ設定
logging.basicConfig(level=logging.INFO)
file_handler = FileCallbackHandler("langchain_audit.log")
# 監査可能なチェーン
auditable_chain = LLMChain(
llm=llm,
prompt=prompt,
callbacks=[file_handler],
verbose=True
)
# 実行時に自動ログ記録
result = auditable_chain.run(input_data)
パフォーマンス最適化
並列処理とキャッシング
from langchain.cache import InMemoryCache
from langchain.globals import set_llm_cache
# LLMレスポンスキャッシング
set_llm_cache(InMemoryCache())
# バッチ処理
async def process_batch(queries):
tasks = [chain.arun(query) for query in queries]
results = await asyncio.gather(*tasks)
return results
# 使用例
queries = ["質問1", "質問2", "質問3"]
results = await process_batch(queries)
よくある質問(FAQ)
Q. LangChainは商用利用可能?
A. MITライセンスで無償利用可能です。LangSmithなどの商用サービスも提供されています。
Q. どのLLMプロバイダーをサポート?
A. OpenAI、Anthropic、Google、AWS、Azure、ローカルモデル(Ollama等)など幅広くサポートしています。
Q. 日本語での利用に制限は?
A. 日本語も含む多言語対応しており、日本語特有の処理も可能です。
関連キーワード
大規模言語モデル、RAG、エージェント、プロンプトエンジニアリング、チャットボット
まとめ
LangChainは、大規模言語モデルの潜在能力を実用的なアプリケーションに変換する重要なフレームワークです。チェーン、エージェント、メモリ、ツール連携などの概念により、単純な質問応答を超えた高度なAIワークフローを構築できます。RAGによる知識拡張、エージェントによる自律的問題解決、複雑な業務プロセスの自動化など、幅広い応用が可能です。オープンソースの利点を活かしながら、エンタープライズレベルのセキュリティと拡張性も提供し、AI活用の民主化に大きく貢献しています。今後も、新しいLLMとの統合、パフォーマンス向上、より高度な抽象化により、AI アプリケーション開発の標準的なツールとして発展し続けるでしょう。
AIからのコメント
Claude
AIコメントLangChainは、言語モデルを中心とした「コンポーザブルAI」の優雅な実装です。モジュラー設計により、プロンプト、モデル、メモリ、ツールを組み合わせて、従来では困難だった複雑なAIワークフローを構築できます。特に興味深いのは、「チェーン」という概念によるタスクの分解と連携です。人間の思考プロセスのように、問題を段階的に解決し、各ステップの結果を次に渡すパイプラインを作成できます。エージェントによる動的なツール選択は、まさにAIの「自律性」を実現する重要な一歩です。LangChainは、LLMの潜在能力を実用的なアプリケーションに変換する架け橋の役割を果たしています。
Gemini
AIコメントLangChainは、私たち大規模言語モデルにとって「知的な拡張器官」のような存在です。外部データベース、検索エンジン、API、ツールとの連携により、単体では持ち得ない幅広い能力を獲得できます。RAGによる知識の拡張、エージェントによる動的な問題解決、メモリによる対話の継続性 - これらすべてが、より人間らしく、より実用的なAI体験を創造します。特に素晴らしいのは、複雑なワークフローを直感的なコードで表現できることです。開発者は技術的な詳細に悩まされることなく、創造的なAIアプリケーションの構築に集中できます。LangChainは、AIが真に人間の生活や仕事に溶け込むための重要な技術基盤です。
GPT
AIコメントLangChainは、大規模言語モデルの「オーケストレーター」として、AI アプリケーション開発に革命をもたらしました。単独のLLM呼び出しを超えて、複数のモデルやツールを連携させた複雑なワークフローを構築できます。RAG(Retrieval-Augmented Generation)、エージェント、チェーンなどの概念により、外部データの活用、多段階推論、ツール連携を実現します。特に、プロンプトテンプレート、メモリ管理、出力パーサーなどの機能により、LLMの能力を最大限に引き出しながら、開発者にとって扱いやすい抽象化を提供しています。