ChatGPTなどの大規模言語モデル(LLM)の登場により、自然言語処理の分野は大きく進化しました。しかし、LLMを単体で利用するだけでは、実現できることに限りがあります。LangChainは、LLMと様々なデータソースやツールを連携させ、より高度で実用的なアプリケーションを開発するためのフレームワークです。この記事では、LangChainの基本的な概念と構成要素を解説し、LLMの機能を拡張するLangChainの機能と活用方法を解説します。
LangChainとは
LangChainは、LLMを活用したアプリケーション開発を支援する、PythonおよびJavaScriptで利用可能なオープンソースのフレームワークです。LLMの言語処理能力を外部データソースや他のツールと組み合わせることで、文章生成や翻訳にとどまらない、高度なアプリケーションを構築できます。
LangChainを利用すると、例えば以下のようなことが実現できます。
- 質問応答システム: Web検索や社内ドキュメントを参照し、ユーザーの質問に回答するシステム。
- チャットボット: ユーザーとの対話を通じて、情報提供やタスク実行を支援するボット。
- データ分析: 大量のテキストデータから情報を抽出・分析するツール。
このように、LangChainは、LLMの能力を拡張し、実用的なアプリケーションを開発するための基盤を提供します。
LangChainの基本概念
LangChainは、以下の主要な要素で構成されています。これらを組み合わせることで、LLMの機能を拡張し、複雑なタスクを実行するアプリケーションを構築できます。
プロンプトテンプレート(Prompt Templates): LLMへの指示を効率的に作成
LLMはプロンプトと呼ばれる指示文に基づいて応答を生成します。適切なプロンプトを作成することが、LLMから望ましい出力を得るために重要です。LangChainのプロンプトテンプレートは、プロンプトを効率的に作成・管理するための機能です。
例えば、製品レビューを要約するプロンプトをテンプレート化することで、製品名を変更するだけで様々な製品のレビュー要約を生成できます。
from langchain.prompts import PromptTemplate # プロンプトテンプレートの作成 template = """ 以下の製品レビューを要約してください: 製品名: {product_name} レビュー: {review_text} 要約: """ prompt = PromptTemplate( input_variables=["product_name", "review_text"], template=template ) # テンプレートに変数を入力してプロンプトを生成 product_name = "スーパー掃除機X" review_text = "吸引力がすごいです!音も静かで、夜でも使えます。" formatted_prompt = prompt.format(product_name=product_name, review_text=review_text) print(formatted_prompt)
このコードでは、product_nameとreview_textという変数を埋め込むテンプレートを作成し、prompt.format()で具体的な値を指定してプロンプトを生成しています。
LLMラッパー:様々なLLMを統一的に利用
LangChainは、OpenAI、Cohere、Hugging Faceなど、様々なLLMプロバイダーに対応しています。LLMラッパーは、これらの異なるLLMのAPIを抽象化し、統一的なインターフェースを提供します。これにより、開発者は特定のLLMプロバイダーに依存せず、アプリケーションの要件に応じて最適なLLMを選択・切り替えできます。
例えば、OpenAIのGPT-3を使う場合:
from langchain.llms import OpenAI # OpenAIのLLMラッパーを初期化 llm = OpenAI(temperature=0.7) # プロンプトをLLMに渡して応答を取得 response = llm("日本の首都はどこですか?") print(response)
Hugging Face Hubのモデルを使う場合:
from langchain.llms import HuggingFaceHub # Hugging Face HubのLLMラッパーを初期化 (要APIトークン) llm = HuggingFaceHub(repo_id="google/flan-t5-xl", model_kwargs={"temperature":0.7}) # プロンプトをLLMに渡して応答を取得 response = llm("日本の首都はどこですか?") print(response)
ツール(Tools):LLMの能力を拡張
LLMは学習データに基づいて応答を生成するため、最新情報や特定のドメイン知識を持たない場合があります。LangChainのツールは、LLMと外部の情報源や機能を連携させる仕組みを提供します。
LangChainには以下のようなツールがあります。
- 検索ツール: Google検索、Wikipediaなどを利用して、LLMの応答を補完・事実確認。
- 計算ツール: Pythonの
eval()などを利用して、LLMに計算を実行させる。 - API連携ツール: 様々なWeb APIと連携。
具体例: requestsを使ったWeb API連携
import requests from langchain.tools import tool @tool def get_weather(city: str) -> str: """指定された都市の現在の天気を取得します。""" # 実際にはAPIキーなどが必要になることが多いです url = f"https://api.openweathermap.org/data/2.5/weather?q={city}&appid=YOUR_API_KEY" response = requests.get(url) data = response.json() weather = data["weather"][0]["description"] return f"{city}の天気は{weather}です。" # ツールの利用例 (LLMやチェーンの中で呼び出す) # print(get_weather.run("Tokyo"))
このように、LangChainの@toolデコレータを使うと、Pythonの関数を簡単にツール化できます。
チェーン(Chains):タスクを繋ぎ合わせるワークフロー
チェーンはLangChainの中核となる概念です。複数のLLM、プロンプトテンプレート、ツールを連結し、一連の処理を自動実行するワークフローを構築します。
例えば、「特定トピックの最新ニュース記事を検索し、要約する」チェーンは、以下のステップで構成されます。
- 検索ツール: ニュース記事を検索。
- プロンプトテンプレート: 記事要約用のプロンプトを作成。
- LLM: プロンプトに基づいて記事を要約。
LangChainでのチェーンの例
from langchain.llms import OpenAI from langchain.chains import LLMChain from langchain.prompts import PromptTemplate from langchain.utilities import GoogleSearchAPIWrapper #Google Serper API # 環境変数の設定が必要 (例: GOOGLE_API_KEY, GOOGLE_CSE_ID) search = GoogleSearchAPIWrapper() # 検索結果から最初の3件を取得するツール def top3_results(query): return search.results(query, 3) # プロンプトテンプレート template = """ 以下の検索結果に基づいて質問に答えてください: {search_results} 質問: {query} """ prompt = PromptTemplate( input_variables=["search_results", "query"], template=template, ) # LLMChainの作成 llm_chain = LLMChain(llm=OpenAI(temperature=0), prompt=prompt) # チェーンの実行 query = "LangChainの最新情報" search_results = top3_results(query) response = llm_chain.run(query=query, search_results=search_results) print(response)
この例では、GoogleSearchAPIWrapperを使って検索を行い、その結果をプロンプトテンプレートに埋め込み、LLMChainを使ってLLMに処理させています。
最後に
LangChainは、LLMの能力を最大限に引き出すためのフレームワークです。
- モジュール性: LLM、プロンプト、ツールを自由に組み合わせ、アプリケーションを構築できます。
- 拡張性: 新しいLLMやツールを容易に追加できます。
- 汎用性: 様々なLLMプロバイダーに対応しています。
LangChainを活用することで、LLM単体では実現が難しい複雑なタスクを実行するアプリケーションを効率的に開発できます。質問応答、チャットボット、データ分析など、様々な応用を試してみてください。