LangChainの概要
LangChainは、大規模言語モデル(LLM)を活用したアプリケーションを効率的に構築するためのオープンソースフレームワークです。単なるAPI呼び出しにとどまらず、複数のコンポーネントを組み合わせた複雑なワークフロー、外部データとの連携、エージェントによる自律的なタスク実行などを容易に実現します。
LangChainのエコシステムは、以下のフェーズをサポートするように設計されています。
- 開発(Development): 標準化されたコンポーネントとサードパーティ製の統合機能(OpenAI, Hugging Faceなど)を使用してアプリケーションを構築。
- 運用化(Productionization): LangSmithを利用してチェーンのデバッグ、テスト、モニタリングを行い、パフォーマンスを最適化。
- デプロイ(Deployment): LangServeを使用して、構築したロジックをREST APIとして公開。
コア・コンポーネント
LangChainは、柔軟なシステム構築を可能にする6つの主要コンポーネントで構成されています。
| コンポーネント | 役割 |
|---|---|
| Models | 各種LLM(ChatOpenAIなど)への統一されたインターフェース。 |
| Prompts | ユーザー入力をモデルが理解しやすい形式に変換するテンプレート管理。 |
| Indexes | 外部ドキュメントを検索・参照するためのデータ接続機能(RAGの中核)。 |
| Memory | 会話の文脈(コンテキスト)を保存・再利用する仕組み。 |
| Chains | 複数のコンポーネントを連結して一連の処理フローを定義。 |
| Agents | LLMがツール(検索、計算など)を自律的に選択してタスクを完遂する仕組み。 |
環境構築と基本操作
まず、必要なパッケージをインストールします。
pip install langchain langchain-openai langchain-community
次に、OpenAI APIを利用するための環境変数を設定し、基本的な呼び出しを行います。
import os
from langchain_openai import ChatOpenAI
# 環境変数の設定
os.environ["OPENAI_API_KEY"] = "your_api_key_here"
# インスタンスの生成
chat_instance = ChatOpenAI(model="gpt-4")
# 基本的な実行
response = chat_instance.invoke("LangChainを学習するメリットは何ですか?")
print(response.content)
プロンプトテンプレートと出力解析
生のユーザー入力をそのまま渡すのではなく、テンプレートを使用して構造化します。また、StrOutputParserを利用して結果を文字列として抽出します。
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.output_parsers import StrOutputParser
# 役割を指定するテンプレート
it_expert_prompt = ChatPromptTemplate.from_messages([
("system", "あなたは優秀なエンジニアリングマネージャーです。"),
("user", "{topic}")
])
# 出力解析器
string_parser = StrOutputParser()
# パイプライン(Chain)の構築
expert_chain = it_expert_prompt | chat_instance | string_parser
# 実行
result = expert_chain.invoke({"topic": "マイクロサービス化の注意点を教えて"})
print(result)
ベクトルストアとRAGの実装
外部データを取得し、それを基に回答を生成するRAG(検索拡張生成)の流れを実装します。ここでは、ウェブサイトから情報を取得し、FAISSというベクトルストアに格納します。
pip install beautifulsoup4 faiss-cpu
from langchain_community.document_loaders import WebBaseLoader
from langchain_openai import OpenAIEmbeddings
from langchain_community.vectorstores import FAISS
from langchain_text_splitters import RecursiveCharacterTextSplitter
# 1. ドキュメントの読み込み
web_loader = WebBaseLoader("https://python.langchain.com/docs/get_started/introduction")
raw_docs = web_loader.load()
# 2. テキスト分割
text_splitter = RecursiveCharacterTextSplitter(chunk_size=500, chunk_overlap=50)
split_docs = text_splitter.split_documents(raw_docs)
# 3. 埋め込み(Embedding)とベクトル化
vector_db = FAISS.from_documents(split_docs, OpenAIEmbeddings())
# 4. 検索チェーンの作成
from langchain.chains.combine_documents import create_stuff_documents_chain
from langchain.chains import create_retrieval_chain
qa_prompt = ChatPromptTemplate.from_template("""
以下の情報を参考にして質問に答えてください:
{context}
質問: {input}
""")
doc_chain = create_stuff_documents_chain(chat_instance, qa_prompt)
retriever = vector_db.as_retriever()
retrieval_chain = create_retrieval_chain(retriever, doc_chain)
# 5. 質問の実行
query_res = retrieval_chain.invoke({"input": "LangChainのコンポーネントについて要約して"})
print(query_res["answer"])
エージェント(Agent)による自律実行
エージェントは、検索ツールなどを必要に応じて自分で使い分けます。ここでは検索APIであるTavilyを統合した例を紹介します。
from langchain.agents import create_openai_functions_agent, AgentExecutor
from langchain import hub
from langchain_community.tools.tavily_search import TavilySearchResults
# ツールの定義
os.environ["TAVILY_API_KEY"] = "your_tavily_key"
search_tool = TavilySearchResults()
tools = [search_tool]
# プロンプトの取得(標準的な関数呼び出し用)
agent_prompt = hub.pull("hwchase17/openai-functions-agent")
# エージェントの初期化
smart_agent = create_openai_functions_agent(chat_instance, tools, agent_prompt)
executor = AgentExecutor(agent=smart_agent, tools=tools, verbose=True)
# 実行
executor.invoke({"input": "現在の東京の天気と、それに適した服装を提案してください。"})
LangServeによるAPIサーバーの構築
構築したアプリケーションをAPIとして公開するためのフレームワークがLangServeです。FastAPIをベースにしています。
pip install "langserve[all]"
from fastapi import FastAPI
from langserve import add_routes
app = FastAPI(title="LLM Assistant Server")
# 先ほど作成したexpert_chainをAPIとして登録
add_routes(
app,
expert_chain,
path="/expert"
)
if __name__ == "__main__":
import uvicorn
uvicorn.run(app, host="localhost", port=8001)
実行後、http://localhost:8001/expert/playground/にアクセスすることで、ブラウザ上で直接チェーンをテストできるプレイグラウンドが利用可能になります。