導入
大規模言語モデル(LLM)の進化により、AIアプリケーション開発の可能性が拡大しています。しかし、単体でのLLM利用では実用的な応用が難しく、データ連携や動作制御の実装が課題となっています。LangChainは、LLMを外部データソースや計算ロジックと統合するためのフレームワークとして登場し、開発効率を大幅に向上させています。
基本概念
主要コンポーネント
LangChainは以下の主要モジュールで構成されます:
- モデルインターフェース: LLMとチャットモデルの標準化されたインタフェースを提供
- データ接続: ドキュメントローダー、埋め込み、ベクトルストアを統合
- チェーン: 複雑なワークフローを組み合わせるための構造化されたコンポーネント
- エージェント: 動的な動作選択を実現する知的エージェントシステム
コード例: 画像生成ワークフロー
from langchain.agents import initialize_agent, AgentType
from langchain.chat_models import ChatOpenAI
from langchain.tools import Tool
from pydantic import BaseModel, Field
def produce_artwork(prompt: str) -> str:
"""画像生成APIを呼び出す処理"""
api_url = "https://api.artgen.example/v1/txt2img"
payload = {
"prompt": prompt,
"negative_prompt": "low quality, blurry, disfigured",
"steps": 30,
"style": "digital art"
}
response = requests.post(api_url, json=payload)
return response.json().get("image_path", "")
def get_poem() -> str:
"""ランダムな中国詩を取得"""
llm = ChatOpenAI(temperature=0.8)
return llm("中国の風景をテーマにした詩を1つ生成してください")
def translate_prompt(idea: str) -> str:
"""日本語を英語プロンプトに変換"""
llm = ChatOpenAI(temperature=0.1)
return llm(f"日本語のアイデアを詳細な英語プロンプトに変換してください: {idea}")
class ArtPromptInput(BaseModel):
concept: str = Field(description="画像のコンセプト")
tools = [
Tool(
name="詩取得",
func=get_poem,
description="中国詩のランダムな生成"
),
Tool(
name="プロンプト変換",
func=translate_prompt,
description="日本語アイデアを英語プロンプトに変換",
args_schema=ArtPromptInput
),
Tool(
name="アート生成",
func=produce_artwork,
description="英語プロンプトから画像を生成"
)
]
if __name__ == "__main__":
llm = ChatOpenAI(temperature=0.2)
agent = initialize_agent(
tools,
llm,
agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION,
verbose=True
)
agent.run("風景をテーマにした中国詩の画像を生成してください")
データ連携の実装例
from langchain.document_loaders import TextLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain.embeddings import OpenAIEmbeddings
from langchain.vectorstores import FAISS
loader = TextLoader("knowledge_base.txt", encoding="utf-8")
documents = loader.load()
splitter = RecursiveCharacterTextSplitter(
chunk_size=500,
chunk_overlap=50
)
texts = splitter.split_documents(documents)
embeddings = OpenAIEmbeddings()
vector_db = FAISS.from_documents(texts, embeddings)
retriever = vector_db.as_retriever(
search_kwargs={"k": 3}
)
qa_chain = RetrievalQA.from_chain_type(
llm=ChatOpenAI(temperature=0.1),
retriever=retriever,
chain_type="stuff"
)
print(qa_chain.run("システムのインストール手順を教えてください"))
応用事例
構造化データ出力の実装
from langchain.tools import StructuredTool
from pydantic import BaseModel, Field
def submit_request(req_type: str, params: dict) -> str:
"""外部APIにリクエストを送信"""
api_url = "https://api.example.com/v1/analyze"
response = requests.post(api_url, json={"type": req_type, "data": params})
return f"Result: {response.status_code}"
class RequestInput(BaseModel):
request_type: str = Field(description="crowd/analyze/questionのいずれか")
data: dict = Field(description="リクエストパラメータ")
tool = StructuredTool(
name="データ分析リクエスト",
func=submit_request,
description="分析リクエストを送信",
args_schema=RequestInput
)
agent = initialize_agent(
[tool],
ChatOpenAI(temperature=0),
agent=AgentType.STRUCTURED_CHAT_ZERO_SHOT_REACT_DESCRIPTION
)
agent.run("180日以内に淘特を利用した男性ユーザーの集団を生成してください")
今後の展開
LangChainの進化は以下の方向性を示しています:
- エージェントの高度化:複雑なタスクを自動で分解・実行する能力
- データ連携の拡大:より多様なデータソースとの統合
- エコシステムの拡充:専用ツールキットの増加
- パフォーマンス最適化:低リソース環境での実行能力向上