LangChain

ラングチェーン

LangChain とは

LangChain は、大規模言語モデル(LLM)を使ったアプリケーションを簡単に構築できるフレームワークです。

例え話をしましょう。あなたが料理を作るとします。

LLM API を直接使う(フレームワークなし)

  • 材料を一から準備
  • 調理器具を揃える
  • すべての工程を自分で考える
  • 時間がかかり、大変

LangChain を使う

  • レシピ(チェーン)が用意されている
  • 便利な調理器具(ツール)が揃っている
  • 手順が明確で、組み合わせも簡単
  • 効率的に料理が完成

LangChain は、LLM アプリケーション開発の「レシピと調理器具」を提供します。

LangChain の主要コンポーネント

LangChain は、いくつかの主要コンポーネントで構成されています。

Models(モデル)

様々な LLM へのインターフェース

対応モデル:
- OpenAI(GPT-4、GPT-3.5)
- Anthropic(Claude)
- Google(Gemini)
- オープンソースモデル(Llama、Mistral)

統一されたインターフェースで簡単に切り替え可能

Prompts(プロンプト)

プロンプトテンプレートの管理

例:
template = "次の文章を{language}に翻訳してください: {text}"

再利用可能で、保守しやすい

Chains(チェーン)

複数のステップを連鎖させる

例: 文書要約チェーン
1. 文書を読み込む
2. 長文を分割
3. 各部分を要約
4. 要約を結合

一連の処理を簡単に構築

Agents(エージェント)

LLM が自律的にツールを使って問題解決

動作:
1. ユーザーの質問を受け取る
2. どのツールを使うべきか判断
3. ツールを実行
4. 結果を確認
5. 必要なら別のツールを使う
6. 最終的な答えを返す

Memory(メモリ)

会話履歴の保持

種類:
- ConversationBufferMemory: 全履歴を保存
- ConversationSummaryMemory: 要約して保存
- ConversationBufferWindowMemory: 最新N件のみ保存

長い対話でも文脈を維持

Retrievers(検索)

関連情報の検索

例:
Vector Database から類似文書を検索
→ RAG(Retrieval Augmented Generation)の実装

LangChain の使用例

LangChain を使った実装例を紹介します。

シンプルな質問応答

from langchain.llms import OpenAI
from langchain.prompts import PromptTemplate
from langchain.chains import LLMChain

# LLM の初期化
llm = OpenAI(temperature=0.7)

# プロンプトテンプレート
template = "質問: {question}\n回答:"
prompt = PromptTemplate(template=template, input_variables=["question"])

# チェーンの作成
chain = LLMChain(llm=llm, prompt=prompt)

# 実行
response = chain.run(question="Pythonとは何ですか?")

Sequential Chain(順次チェーン)

from langchain.chains import SimpleSequentialChain

# チェーン1: 商品アイデアを生成
chain_1 = LLMChain(llm=llm, prompt=idea_prompt)

# チェーン2: 商品名を生成
chain_2 = LLMChain(llm=llm, prompt=name_prompt)

# 順次実行
overall_chain = SimpleSequentialChain(
    chains=[chain_1, chain_2]
)

result = overall_chain.run("スマートフォンアクセサリー")

Agent with Tools(ツール付きエージェント)

from langchain.agents import load_tools, initialize_agent
from langchain.agents import AgentType

# ツールの読み込み
tools = load_tools(
    ["serpapi", "llm-math"],  # Google検索、計算
    llm=llm
)

# エージェントの初期化
agent = initialize_agent(
    tools,
    llm,
    agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION
)

# 実行
agent.run("2024年の東京の人口は?それを2で割ると?")

# エージェントが自動的に:
# 1. Google で検索
# 2. 計算ツールを使用
# 3. 最終的な答えを返す

RAG(検索拡張生成)

from langchain.vectorstores import Chroma
from langchain.embeddings import OpenAIEmbeddings
from langchain.chains import RetrievalQA

# Vector Database の準備
embeddings = OpenAIEmbeddings()
vectordb = Chroma.from_documents(
    documents=docs,
    embedding=embeddings
)

# RAG チェーンの作成
qa_chain = RetrievalQA.from_chain_type(
    llm=llm,
    retriever=vectordb.as_retriever()
)

# 質問
qa_chain.run("会社の休暇ポリシーは?")

# 自動的に関連文書を検索して回答

LangChain のメリット

LangChain を使うことで、多くのメリットがあります。

メリット 1: 開発速度の向上

従来:
- プロンプト管理を自前で実装
- 複数のステップを手動で連携
- エラーハンドリングを都度実装
→ 数日〜数週間

LangChain:
- 既存のコンポーネントを組み合わせ
- エラーハンドリングも標準装備
→ 数時間〜数日

メリット 2: 保守性

プロンプトの管理:
- テンプレート化
- バージョン管理
- 再利用

モデルの切り替え:
- 統一されたインターフェース
- 簡単に別のモデルに変更可能

メリット 3: ベストプラクティス

LangChain には、実績のあるパターンが組み込まれている:
- Chain-of-Thought プロンプト
- ReAct パターン
- RAG の実装

車輪の再発明を避ける

メリット 4: エコシステム

豊富な統合:
- Vector Databases(Pinecone、Chroma)
- LLM プロバイダー(OpenAI、Anthropic)
- ツール(Google Search、Wikipedia)

すぐに使える

LangChain の主要パターン

LangChain で実装できる主要なパターンです。

パターン 1: Simple Chain

単純な連鎖

例:
入力 → LLM → 出力

用途:
- 単純な質問応答
- テキスト生成

パターン 2: Sequential Chain

複数のステップを順次実行

例:
入力 → ステップ1 → ステップ2 → ステップ3 → 出力

用途:
- 複雑な変換
- 段階的な処理

パターン 3: Router Chain

入力に応じて異なるチェーンを選択

例:
質問 → 分類 → 専門チェーンA or B or C → 回答

用途:
- マルチドメインの質問応答
- 専門的な処理の振り分け

パターン 4: Agent Pattern

LLM が自律的にツールを選択・実行

例:
質問 → エージェント → ツール選択 → 実行 → 回答

用途:
- 複雑な問題解決
- 動的なタスク

パターン 5: RAG Pattern

関連情報を検索して回答を生成

例:
質問 → 検索 → 関連文書 → LLM → 回答

用途:
- ドキュメント検索
- 社内ナレッジベース

LangChain の課題

LangChain にもいくつかの課題があります。

課題 1: 抽象化のオーバーヘッド

問題:
抽象化レイヤーが多く、パフォーマンスが低下する場合

対策:
- 必要に応じて低レベル API を使用
- パフォーマンスが重要な部分は最適化

課題 2: 学習曲線

問題:
多くのコンポーネントと概念を理解する必要

対策:
- 公式ドキュメントを読む
- 簡単な例から始める
- コミュニティのサンプルを参考に

課題 3: バージョンの変更

問題:
活発に開発されており、API が変わることがある

対策:
- バージョンを固定
- 変更履歴を確認
- マイグレーションガイドを参照

課題 4: デバッグの難しさ

問題:
複雑なチェーンのデバッグが困難

対策:
- verbose モードを有効化
- 各ステップの出力をログに記録
- 小さなチェーンから始めて徐々に拡張

LangChain の代替

LangChain 以外のフレームワークもあります。

LlamaIndex

特徴:
- データ接続に特化
- RAG の構築に強い

用途:
- ドキュメント検索
- ナレッジベースの構築

Semantic Kernel(Microsoft)

特徴:
- C# と Python で利用可能
- エンタープライズ向け

用途:
- Microsoft エコシステムとの統合
- 企業向けアプリケーション

Haystack

特徴:
- 検索と NLP に特化
- エンドツーエンドの NLP パイプライン

用途:
- 検索システム
- 質問応答システム

直接 API を使う

シンプルなユースケースでは、LLM API を直接使う方が良い場合も

メリット:
- シンプル
- 完全なコントロール
- 依存関係が少ない

LangChain のベストプラクティス

LangChain を効果的に使うためのベストプラクティスです。

1. 小さく始める

最初から複雑なチェーンを作らない

アプローチ:
1. 単純なチェーンから始める
2. 動作を確認
3. 徐々に機能を追加

2. プロンプトを管理する

プロンプトテンプレートを活用

メリット:
- 再利用可能
- バージョン管理しやすい
- テストしやすい

3. ログを活用する

verbose モードを有効化

例:
chain = LLMChain(llm=llm, prompt=prompt, verbose=True)

各ステップの動作が可視化される

4. エラーハンドリング

try-except でエラーを適切に処理

例:
try:
    result = chain.run(input)
except Exception as e:
    # エラー処理
    logging.error(f"Chain failed: {e}")

5. コストの監視

LLM の使用量を監視

対策:
- トークン数をカウント
- キャッシュを活用
- 不要な API コールを削減

まとめ

LangChain は、大規模言語モデルを使ったアプリケーション開発を大幅に簡単にする強力なフレームワークです。チェーン、エージェント、メモリなど、豊富な機能を提供します。

重要なポイント

  1. コンポーネント - Models、Prompts、Chains、Agents、Memory
  2. パターン - Simple、Sequential、Router、Agent、RAG
  3. 開発速度 - 既存のコンポーネントで迅速に開発
  4. 保守性 - プロンプトの管理、モデルの切り替えが容易
  5. エコシステム - 豊富な統合とツール

LangChain が最適な場面

  • RAG(検索拡張生成)の実装
  • 複数ステップの処理が必要
  • エージェント型アプリケーション
  • 迅速なプロトタイピング

直接 API を使うべき場面

  • 非常にシンプルなユースケース
  • パフォーマンスが最優先
  • 完全なコントロールが必要

LangChain は、LLM アプリケーション開発のデファクトスタンダードの一つです。適切に活用することで、開発時間を大幅に短縮し、保守しやすいコードを書くことができます。