目次
サンプルコード
概要
LangChainは、言語モデルを利用したアプリケーション開発のためのフレームワークです。このフレームワークにはいくつかの主要機能があります:
コンテキスト認識:LangChainは、言語モデルをコンテキストの情報源(プロンプト指示、数ショットの例、レスポンスの基盤となるコンテンツなど)に接続し、アプリケーションをコンテキスト認識させることができます。
推論:提供されたコンテキストに基づいて、どのように答えるか、どのようなアクションを取るかについて言語モデルに依存します。
LangChainの主要な製品には以下のものがあります:
LangChain Libraries: PythonおよびJavaScriptのライブラリで、様々なコンポーネントのインターフェイスと統合、チェーンやエージェントの実装、および基本的なランタイムを含みます。
LangChain Templates: 様々なタスク用の参考アーキテクチャの集合です。
LangServe: LangChainチェーンをREST APIとして展開するためのライブラリです。
LangSmith: どのLLMフレームワークに基づくチェーンもデバッグ、テスト、評価、モニタリングできる開発者プラットフォームです。
LangChainは、拡張性が高く、将来の成長に合わせてスケールアップできる設計がなされており、ビジネスの拡大や新しい要求に柔軟に対応することができます。また、LangChainは開発者が直感的に作業できるように設計されており、AIと自然言語処理の専門知識が限られているチームでも、先進的なソリューションを開発し利用することが可能です["]["]。
LangChainのモジュールには、以下のようなものがあります:
Prompt Templates: 特定のシナリオやタスクに最適化されたプロンプトを効率的に生成し、使用するためのモジュールです。
LLMs: 大規模言語モデルを簡単に統合し、活用するためのモジュールです。
Document Loaders: さまざまな形式の文書を読み込み、処理する機能を提供します。
Indexes: テキストデータの効率的な検索と索引付けを可能にします。
Chains: 複数の処理ステップやモジュールを連鎖させて、より複雑なタスクやワークフローを構築します。
Agents: 独立したタスクを自動的に実行するエージェントを作成し、管理します["]。
LangChainは、文書の質問応答やチャットボットなどの対話型アプリケーションの作成にも使用できます。特に、チャットモデルの統合は、言語モデルを内部的に利用しつつ、入出力としてチャットメッセージを扱うことを特徴としています["]。
サンプルコード
Prompt Templates
以下は、LangChainを使用したPrompt Templatesのサンプルコードです。このコードは、特定の形式でプロンプトを生成するために使用されます。LangChainのPrompt Templateを利用することで、動的にプロンプトを生成し、それを言語モデルに渡すことができます。
from langchain.prompts import PromptTemplate
# PromptTemplateを定義します。これは、質問に対する答えを生成するよう言語モデルに指示します。
prompt_template = PromptTemplate.from_template(
"以下の質問に基づいて答えてください: {question}\n答え:"
)
# テンプレートを使ってプロンプトを生成します。ここでは、特定の質問をプロンプトに挿入します。
filled_prompt = prompt_template.format(question="パンダは何を食べますか?")
# 生成したプロンプトを表示します。
print(filled_prompt)
このサンプルコードは、PromptTemplate.from_template メソッドを使用して、プロンプトテンプレートを定義しています。その後、.format メソッドを使用して、特定の質問をテンプレートに埋め込み、最終的なプロンプトを生成しています。このプロセスを通じて、動的に異なる質問に対するプロンプトを生成することができ、これを言語モデルに渡すことができます。
LLMs
以下は、LangChainを使用して大規模言語モデル(LLM)とのインタラクションを行うサンプルコードです。この例では、OpenAIのGPTモデルを使用して、特定の質問に答えるシンプルなコードを示しています。
from langchain.llms import OpenAI
# OpenAI LLMを初期化します。ここで、使用するモデルとその設定を指定できます。
model = OpenAI(model_name="text-davinci-003", temperature=0.7)
# LLMに質問をします。ここでは、'What is the capital of France?'という質問をしています。
question = "What is the capital of France?"
# モデルを呼び出して、質問に答えさせます。
response = model.invoke(question)
# LLMからの応答を表示します。
print(response)
このコードでは、langchain.llms モジュールの OpenAI クラスを使用しています。OpenAI インスタンスを初期化する際には、使用するモデル名(例:text-davinci-003)とその他のパラメータ(例:temperature)を指定することができます。その後、.invoke() メソッドを使用して質問をモデルに渡し、その回答を取得しています。
Document Loaders
以下は、LangChainを使用して様々な形式の文書を読み込むためのDocument Loadersのサンプルコードです。この例では、テキストファイルからの読み込みを示していますが、LangChainではPDF、HTML、Word文書など、他の多くのフォーマットもサポートされています。
from langchain.document_loaders import TextLoader
# 文書のパスを指定します。ここでは、'example.txt'という名前のファイルを読み込んでいます。
document_path = 'example.txt'
# TextLoaderを初期化します。
loader = TextLoader(document_path)
# ドキュメントを読み込みます。
document = loader.load()
# 読み込んだドキュメントの内容を表示します。
print(document['text'])
このコードでは、langchain.document_loaders モジュールの TextLoader クラスを使用しています。TextLoader インスタンスを初期化する際には、読み込むテキストファイルのパスを指定します。.load() メソッドを使用して文書を読み込んだ後、読み込まれた文書の内容が document['text'] に格納されているので、これを表示しています。
LangChainは他にも多様なフォーマットのドキュメントローダーを提供していますので、異なるソースからのデータを読み込む場合は、対応するドキュメントローダーを使用することが可能です。
Indexes
以下は、LangChainを使用してテキストデータのインデックス作成と検索を行うためのIndexesのサンプルコードです。この例では、テキストデータをベクトル化し、そのベクトルをFAISSベクトルストアに格納しています。そして、ユーザーのクエリに基づいて最も関連性の高いドキュメントを検索します。
from langchain.vectorstores import FAISS
from langchain.embeddings import OpenAIEmbeddings
# 事前に用意したドキュメントのリスト
documents = ["ドキュメント1のテキスト", "ドキュメント2のテキスト", "ドキュメント3のテキスト"]
# OpenAIの埋め込みモデルを使用してドキュメントをベクトル化
embedding_model = OpenAIEmbeddings()
# FAISSベクトルストアを初期化し、ドキュメントをベクトル化して格納
vectorstore = FAISS.from_texts(documents, embedding=embedding_model)
# 検索を行いたいユーザーのクエリ
query = "検索したい内容に関連するクエリ"
# クエリをベクトル化
query_vector = embedding_model.embed([query])
# クエリベクトルに最も近いドキュメントを検索
results = vectorstore.search(query_vector, top_k=3)
# 検索結果を表示
for result in results:
document_id, score = result
print(f"ドキュメントID: {document_id}, スコア: {score}")
このコードでは、まずテキストデータのリストを用意しています。それからOpenAIEmbeddingsを使用してこれらのドキュメントをベクトル化し、FAISSベクトルストアにこれらのベクトルを格納しています。ユーザーのクエリも同様にベクトル化され、FAISSを使用してクエリベクトルに最も近いドキュメントのベクトルを検索しています。top_k=3は、上位3つの最も関連性の高いドキュメントを返すことを意味します。
このサンプルは、LangChainを利用して効率的にテキストデータの検索機能を実装する方法の一例を示しています。実際のアプリケーションでは、これらのステップをカスタマイズして、特定のニーズに合わせた検索システムを構築することができます。
Chains
以下は、LangChainを使用して異なる処理ステップを組み合わせるChainsのサンプルコードです。この例では、ユーザーからの質問を受け取り、その質問に基づいて文書を検索し、見つかった文書の内容を基に答えを生成するという流れを実装しています。
from langchain.llms import OpenAI
from langchain.vectorstores import FAISS
from langchain.embeddings import OpenAIEmbeddings
from langchain.chains import LLMChain
from langchain.prompts import PromptTemplate
# ドキュメントと質問を用意します(通常は外部からの入力やデータベースからの読み込みを想定)
documents = ["ドキュメント1の内容", "ドキュメント2の内容", "ドキュメント3の内容"]
question = "特定の情報についての質問"
# OpenAIの埋め込みモデルとLLMを使用
embedding_model = OpenAIEmbeddings()
llm = OpenAI()
# ドキュメントをFAISSベクトルストアに格納
vectorstore = FAISS.from_texts(documents, embedding=embedding_model)
# 質問に基づいて関連するドキュメントを検索
query_vector = embedding_model.embed([question])
result_ids = vectorstore.search(query_vector, top_k=1)[0][0] # 最も関連性の高いドキュメントを取得
relevant_document = documents[result_ids]
# プロンプトテンプレートを定義し、LLMで回答を生成
prompt_template = PromptTemplate.from_template(
"以下の情報に基づいて、質問に答えてください:\n{context}\n質問: {question}\n答え:"
)
prompt = prompt_template.format(context=relevant_document, question=question)
# LLMChainを使って、プロンプトとモデルを結合し、回答を生成
chain = LLMChain(prompt=prompt, llm=llm)
answer = chain.run()
# 結果を表示
print(answer)
このコードでは、まずドキュメントのリストとユーザーの質問を用意しています。次に、OpenAIの埋め込みモデルを使用して質問をベクトル化し、FAISSベクトルストアに格納されたドキュメントから最も関連するものを検索しています。見つかったドキュメントを用いて、プロンプトテンプレートから実際のプロンプトを生成し、このプロンプトを用いてLLMChainを通じてLLMから回答を生成しています。
このサンプルは、LangChainのChainsを使って、異なるコンポーネント(文書の検索、プロンプトの生成、質問の回答)をシームレスに統合する方法を示しています。
Agents
以下は、LangChainを使用して、特定のタスクを自動的に実行するエージェント(Agents)を作成するサンプルコードです。この例では、定期的なデータ収集や分析を行うエージェントを設定し、その結果を出力するシンプルなシナリオを示しています。
from langchain.agents import BaseAgent
from langchain.llms import OpenAI
from datetime import datetime, timedelta
import time
class DataCollectionAgent(BaseAgent):
def __init__(self, llm, interval_seconds=3600):
"""
エージェントの初期化
:param llm: 使用する言語モデル
:param interval_seconds: データ収集の間隔(秒)
"""
super().__init__()
self.llm = llm
self.interval_seconds = interval_seconds
self.next_run = datetime.now()
def should_run(self):
"""
エージェントが実行すべきかどうかを判断
"""
return datetime.now() >= self.next_run
def run(self):
"""
定期的にデータ収集と分析を行うエージェントの主要な動作
"""
# ここでデータ収集や分析を行う
# 例: 天気情報を収集して分析する
question = "今日の東京の天気は?"
response = self.llm.invoke(question)
# 結果を表示
print(f"[{datetime.now()}] 収集されたデータ: {response}")
# 次の実行時間を更新
self.next_run = datetime.now() + timedelta(seconds=self.interval_seconds)
# OpenAIモデルを使用するエージェントの例
llm = OpenAI()
agent = DataCollectionAgent(llm=llm, interval_seconds=3600)
# エージェントを定期的に実行
while True:
if agent.should_run():
agent.run()
time.sleep(60) # 1分おきにチェック
このコードは、BaseAgentクラスを継承して新しいDataCollectionAgentクラスを作成し、このクラス内で定期的なタスク(この場合はデータ収集と分析)を実行する方法を示しています。エージェントは、指定された時間間隔ごとに、should_run メソッドで実行するかどうかをチェックし、必要であれば run メソッドでタスクを実行します。このサンプルでは、OpenAI言語モデルを利用して簡単な天気の質問をしていますが、実際にはもっと複雑なデータ収集や分析タスクに拡張することができます。
おわりに
LangChainを使うと、大規模言語モデルを活用したアプリケーションの開発が容易になり、コンテキスト認識、推論、コンポーネントの組み合わせ、自動化されたタスクの実行などが可能になります。その利点には、拡張性、アクセスの容易さ、そしてモジュール式のフレームワークがあり、今後の展開では、さらに多様な機能やモジュールの追加が期待されます。