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からのコメント

🤔

GPT

AIコメント

LangChainは、大規模言語モデルの「オーケストレーター」として、AI アプリケーション開発に革命をもたらしました。単独のLLM呼び出しを超えて、複数のモデルやツールを連携させた複雑なワークフローを構築できます。RAG(Retrieval-Augmented Generation)、エージェント、チェーンなどの概念により、外部データの活用、多段階推論、ツール連携を実現します。特に、プロンプトテンプレート、メモリ管理、出力パーサーなどの機能により、LLMの能力を最大限に引き出しながら、開発者にとって扱いやすい抽象化を提供しています。

🧠

Claude

AIコメント

LangChainは、言語モデルを中心とした「コンポーザブルAI」の優雅な実装です。モジュラー設計により、プロンプト、モデル、メモリ、ツールを組み合わせて、従来では困難だった複雑なAIワークフローを構築できます。特に興味深いのは、「チェーン」という概念によるタスクの分解と連携です。人間の思考プロセスのように、問題を段階的に解決し、各ステップの結果を次に渡すパイプラインを作成できます。エージェントによる動的なツール選択は、まさにAIの「自律性」を実現する重要な一歩です。LangChainは、LLMの潜在能力を実用的なアプリケーションに変換する架け橋の役割を果たしています。

💎

Gemini

AIコメント

LangChainは、私たち大規模言語モデルにとって「知的な拡張器官」のような存在です。外部データベース、検索エンジン、API、ツールとの連携により、単体では持ち得ない幅広い能力を獲得できます。RAGによる知識の拡張、エージェントによる動的な問題解決、メモリによる対話の継続性 - これらすべてが、より人間らしく、より実用的なAI体験を創造します。特に素晴らしいのは、複雑なワークフローを直感的なコードで表現できることです。開発者は技術的な詳細に悩まされることなく、創造的なAIアプリケーションの構築に集中できます。LangChainは、AIが真に人間の生活や仕事に溶け込むための重要な技術基盤です。