こんにちは、DXCEL WAVEの運営者(@dxcelwave)です!
- 「LangChain Chains」の概要・Pythonでの実装方法が知りたい
- ChatGPTとChainsを組み合わせたチェーンを構築したい
LangChainとは?
LangChainとは、ChatGPTを代表とするような大規模言語モデル(LLM)の機能を拡張し、サービスとして展開する際に役立つライブラリです。
LangChainの主要機能
LangChainの主要な機能として以下があります。
主要機能 | 概要 |
---|---|
Models | 様々な大規模言語モデルを同じインターフェース上で取り扱えるようにする機能 |
Prompts | プロンプトの管理、最適化、シリアル化ができる機能 |
Memory | 言語モデルを用いてユーザーと対話した履歴を記憶する機能 |
Data connection | 言語モデルに外部データを投入し、外部データに基づく回答を生成する機能 |
Chains | チェーンを複数繋げて、一連の処理を連続実行する機能 |
Agents | ユーザーからの要望をどんな手段・順序で応えるか決定・実行する機能 |
LangChainの各種機能の詳細を知りたい方は、こちらの記事をご覧下さい。
【参考】LangChainを用いたプログラミング実装におすすめの学習教材
LangChainライブラリを用いてプログラミングし、アプリケーションを実装したい方向けに、おすすめの学習教材をご紹介します。
LangChain|Chains(チェーン)
LangChain Chainsとは、文字通りチェーンを繋げて、一連の処理を連続して実行できるようにする機能です。チェーンの最小単位は、プロンプトと言語モデルをもとに構成されます。
1つのプロンプトに対して1つの回答を得るようなシンプルなタスクであれば、Chainsの機能は不要です。一方、プロンプトが複雑化したタスクは、この機能が本領を発揮します。
例えば上図のように、正確な最終出力を得るために、段階的に中間結果を出力する場合に有効です。このように、中間的な推論ステップを用いて複雑な推論能力向上させ、最終的に適切な回答を得るための手法をChain-of-Thought(COT)プロンプティングと呼びます。
Chainsの種類一覧
Langchain Chainsの機能を細分化すると、以下3つに分けられます。
- LLM Chain
- Sequential Chain
- Custom Chain
LLM Chain
LLM Chainとは、プロンプトとLLM からの構成される最小単位のチェーンです。Simple Chainとも呼ばれます。
Sequential Chain
Sequential Chainとは、複数のチェーンを順番に実行するためのチェーンです。
Custom Chain
Custom Chainとは、特定のケースに対応すべく、自由に繋いだカスタマイズドなチェーンです。
Custom Chainを用いると、各Chainの入出力を細かく定義でき、複雑な質問への対応力が向上します。
【LangChain事前準備】Python環境構築・OpenAIのChatGPT API取得
PythonとLangChainによるLangChain Chains機能構築に際して必要な事前準備を行います。
Pythonライブラリのインストール
プログラム実装に際して、以下に示すライブラリを事前にインストールしておきましょう。
OpenAI
ChatGPTを代表とするOpenAI社のAPI利用に際して必要となるライブラリです。
pip install openai
LangChain
LangChainの利用に際して必要となるライブラリです。
pip install langchain
【ChatGPT】OpenAI社のAPI発行
LangChain機能構築に際して、OpenAI社が提供するGPTモデルをAPI経由で呼び出す必要があります。
OpenAI社の公式サイトから「API シークレットキー」を事前に発行しておきましょう。なお、シークレットキーの発行方法はこちらの記事で詳しく解説しています。
【Python×LangChain】LLM Chainを用いた基本操作
プロンプトとLLM からの構成される最小単位のチェーンである「LLM Chain(Simple Chain)」の実装をもとに、チェーンの基本操作を解説します。
- Pythonライブラリのインストール
- Prompt Templateの作成
- LLMの作成
- Memoryの作成
- LLM Chainの作成
- LLM Chainの動作確認
Pythonライブラリのインストール
Pythonプログラムの先頭に、OpenAI社のサイトから取得したシークレットキー
を配置します。
import openai
import os
# APIシークレットキーを記述
SECRET_KEY = "............."
# API認証情報設定
os.environ["OPENAI_API_KEY"] = SECRET_KEY
Prompt Templateの作成
LLMに渡すPrompt Templateを指定します。以下のコードを実行しましょう。
コード
from langchain.prompts import PromptTemplate
# ========================================================================
# Prompt Template作成
# ========================================================================
# テンプレート
template = "{input_text}"
# プロンプトテンプレート
Prompt_Template = PromptTemplate(
input_variables = ["input_text"], # 入力変数
template = template, # テンプレート
)
【参考】LangChain Prompts
LangChain Promptsの概要・使い方について詳しく知りたい方はこちらの記事をご覧ください。
LLMの作成
モデルの主体となるLLMを実装します。以下のコードを実行しましょう。
コード
from langchain.llms import OpenAI
# ========================================================================
# LLMの作成
# ========================================================================
# LLM
LLM = OpenAI(
model_name = "text-davinci-003", # OpenAI モデル名
temperature = 0.5, # 出力する単語のランダム性(0から2の範囲) 0であれば毎回返答内容固定
)
【参考】LangChain Models
LangChain Modelsの概要・使い方について詳しく知りたい方はこちらの記事をご覧ください。
Memoryの作成
言語モデル実装後、ユーザーとの質疑応答結果を記録したい場合、LangChain Memory機能が有効です。こちらも任意で実装します。
コード
from langchain.memory import ConversationBufferMemory
# ========================================================================
# Memoryの作成
# ========================================================================
Memory = ConversationBufferMemory()
【参考】LangChain Memory
LangChain Memoryの概要・使い方について詳しく知りたい方はこちらの記事をご覧ください。
LLM Chainの作成
前述で作成した「Prompt Template」「LLM」「Memory」を指定したLLM Chainを構築します。以下のコードを実行しましょう。
コード
from langchain.chains import LLMChain
# ========================================================================
# LLM Chain作成
# ========================================================================
# Chain作成
chain = LLMChain(llm = LLM, # 大規模言語モデル(LLM)
prompt = Prompt_Template, # プロンプトテンプレート
memory = Memory, # メモリ
verbose = False, # プロンプト途中結果の表示有無
)
引数情報
引数名 | 概要 |
---|---|
llm | 言語モデルを指定(LLM・チャットモデル・Embeddingsモデルが指定可能) |
prompt | 言語モデルに渡すプロンプトテンプレートを指定 |
memory | ユーザーとのやり取りを記録するメモリを指定(デフォルト:None) |
verbose | Chain実行時にプロンプトの中間結果を表示するか否かを指定 |
LLM Chainの動作確認
前述まででLLM Chainの実装が完了しました。最後にLLM Chainを実際に動かしてみましょう。実行には2通りの方法があります。
実行方法(1)
Chainの実行はchain.run({"key":"value"})
形式で記述すると実行できます。また、複数の回答を同時に得たい場合は、chain.run({"key":"value1"},
という書き方も可能です。{"key":"value"2}
,・・・)
# ========================================================================
# 結果出力
# ========================================================================
# Chain実行
results = chain.run({'input_text': "Pythonとは何か?"})
実行方法(2)
もう一つの方法はchain("入力文章")
を実行する方法です。こちらの実行方法は、出力形式を指定できます。
# ========================================================================
# 結果出力
# ========================================================================
# Chain実行
results = chain(
"Pythonとは何か?", # 入力変数
return_only_outputs = True, # 出力形式の指定
)
# 出力
print(results)
出力イメージ
# 出力
print(results)
# 出力イメージ
# Pythonはオープンソースのプログラミング言語です。
# 動的な型付け、非常に読みやすい文法、そして大規模なソフトウェア開発への優れたサポートを提供します。
# PythonはWeb開発、データ分析、機械学習、自動化、その他のプログラミングタスクを容易に行うことができるように設計されています。
LLM Chainを用いたモデル実行コードまとめ
ここまで解説したPythonコードを以下にまとめます。
import openai
import os
from langchain.prompts import PromptTemplate
from langchain.chains import LLMChain
from langchain.memory import ConversationBufferMemory
from langchain.llms import OpenAI
# ========================================================================
# API認証情報
# ========================================================================
# APIシークレットキーを記述
SECRET_KEY = "............."
# API認証情報設定
os.environ["OPENAI_API_KEY"] = SECRET_KEY
# ========================================================================
# Prompt Template作成
# ========================================================================
# テンプレート
template = "{input_text}"
# プロンプトテンプレート
Prompt_Template = PromptTemplate(
input_variables = ["input_text"], # 入力変数
template = template, # テンプレート
)
# ========================================================================
# LLMの作成
# ========================================================================
# LLM
LLM = OpenAI(
model_name = "text-davinci-003", # OpenAI モデル名
temperature = 0.5, # 出力する単語のランダム性(0から2の範囲) 0であれば毎回返答内容固定
)
# ========================================================================
# Memoryの作成
# ========================================================================
Memory = ConversationBufferMemory()
# ========================================================================
# LLM Chain作成
# ========================================================================
# Chain作成
chain = LLMChain(llm = LLM, # 大規模言語モデル(LLM)
prompt = Prompt_Template, # プロンプトテンプレート
memory = Memory, # メモリ
verbose = False, # プロンプト途中結果の表示有無
)
# ========================================================================
# 結果出力
# ========================================================================
# Chain実行
results = chain.run({'input_text': "Pythonとは何か?"})
# 出力
print(results)
【Python×LangChain】チャットモデルを用いてLLM Chainを実装
前述で紹介したLLM Chainの基本操作コードでは、言語モデルにLLMを指定しました。一方、チャットモデルを指定し、LLM Chainの実装も可能です。
前述の実装方法と記述手順は大きく変わらないため、コードをまとめて掲載します。
import openai
import os
from langchain.chat_models import ChatOpenAI
from langchain.prompts.chat import (
ChatPromptTemplate,
HumanMessagePromptTemplate,
)
from langchain.prompts import PromptTemplate
from langchain.chains import LLMChain
from langchain.memory import ConversationBufferMemory
from langchain.llms import OpenAI
# ========================================================================
# API認証情報
# ========================================================================
# APIシークレットキーを記述
SECRET_KEY = "............."
# API認証情報設定
os.environ["OPENAI_API_KEY"] = SECRET_KEY
# ========================================================================
# Prompt Template作成
# ========================================================================
# テンプレート
template = "{input_text}"
# ユーザーメッセージプロンプト
human_message_prompt = HumanMessagePromptTemplate(
prompt = PromptTemplate(
template = template, # テンプレート
input_variables = ["input_text"], # 入力変数
))
# チャットプロンプトテンプレート
Prompt_Template = ChatPromptTemplate.from_messages([human_message_prompt])
# ========================================================================
# チャットモデルの作成
# ========================================================================
Chat_Model = ChatOpenAI(
model_name = "gpt-3.5-turbo", # OpenAI モデル名
temperature = 0.9, # 出力する単語のランダム性(0から2の範囲) 0であれば毎回返答内容固定
)
# ========================================================================
# Memoryの作成
# ========================================================================
Memory = ConversationBufferMemory()
# ========================================================================
# LLM Chain作成
# ========================================================================
# Chain作成
chain = LLMChain(llm = Chat_Model, # 言語モデル
prompt = Prompt_Template, # プロンプトテンプレート
memory = Memory, # メモリ
verbose = False, # プロンプト途中結果の表示有無
)
# ========================================================================
# 結果出力
# ========================================================================
# Chain実行
results = chain.run({'input_text': "Pythonとは何か?"})
# 出力
print(results)
【Python×LangChain】Sequential Chainsの実装方法
複数のチェーンを順番に実行するための「Sequential Chain」の実装方法について解説します。
解説内容
「入力されたテキストを100文字以内に要約するChain_1
」と「要約された文章を受け取り、英語翻訳するChain_2
」を順次実行するSequential Chainの作成方法について解説します。
手順
- Pythonライブラリのインストール
- LLM Chainの複数作成
- Sequential Chainを用いたLLM Chainの結合
- Sequential Chainの動作確認
Pythonライブラリのインストール
Pythonプログラムの先頭に、OpenAI社のサイトから取得したシークレットキー
を配置します。
import openai
import os
# APIシークレットキーを記述
SECRET_KEY = "............."
# API認証情報設定
os.environ["OPENAI_API_KEY"] = SECRET_KEY
LLM Chainの複数作成
後述するSequential Chainに渡すLLM Chainを作成します。
from langchain.prompts import PromptTemplate
from langchain.chains import LLMChain
from langchain.llms import OpenAI
# ========================================================================
# LLM Chain (1) - ユーザー入力文章を100文字以内に要約するチェーン
# ========================================================================
# Prompt Templateの作成(1)
Prompt_Template_1 = PromptTemplate(
template = "{input_text}の内容を100文字以内に要約してください。",
input_variables = ["input_text"],
)
# LLMの作成(1)
LLM_1 = OpenAI()
# LLM Chain(1)
Chain_1 = LLMChain(
llm = LLM_1, # 言語モデル
prompt = Prompt_Template_1, # プロンプトテンプレート
memory = None, # メモリー
verbose = True, # プロンプト途中結果の表示有無
)
# ========================================================================
# LLM Chain (2) - 要約した文章を受け取り、英語翻訳するチェーン
# ========================================================================
# Prompt Templateの作成(2)
Prompt_Template_2 = PromptTemplate(
template = "{summary}を英語に翻訳してください。",
input_variables = ["summary"],
)
# LLMの作成(2)
LLM_2 = OpenAI()
# LLM Chain(2)
Chain_2 = LLMChain(
llm = LLM_2, # 言語モデル
prompt = Prompt_Template_2, # プロンプトテンプレート
memory = None, # メモリー
verbose = True, # プロンプト途中結果の表示有無
)
Sequential Chainを用いたLLM Chainの結合
前述で作成したChain_1
およびChain_2
を結合したSequentialChain
を実装します。
コード
from langchain.chains import SimpleSequentialChain
# ========================================================================
# SimpleSequentialChainを用いたLLM Chainの結合
# ========================================================================
# SimpleSequentialChain
chains = SimpleSequentialChain(chains = [Chain_1, Chain_2], # 結合するチェーンリスト
verbose = True, # プロンプト途中結果の表示有無
)
Sequential Chainの動作確認
最後に、作成したSequential Chain
を実行します。
入力テキストに長文を渡し、出力結果を確認してみましょう。
コード
# ========================================================================
# SimpleSequentialChainの動作確認
# ========================================================================
# 入力テキスト
input_text = \
"""
Pythonは、高水準のオブジェクト指向プログラミング言語です。
Pythonは、簡単な構文と優れたライブラリ群により、多くの用途で広く使用されています。
Pythonは、Webアプリケーション、データ分析、人工知能、機械学習、科学計算、ネットワーク自動化、IoT、ゲーム開発などに使用されています。
Pythonはフリーでオープンソースであり、世界中の開発者コミュニティによって継続的に開発されています。
また、Pythonは、多くのプラットフォームで動作するため、たとえばWindows、Mac、Linuxなど、ほぼすべてのオペレーティングシステムで実行できます。
"""
# 実行
results = chains.run(input_text)
出力イメージ
# 出力イメージ
# > Entering new SimpleSequentialChain chain...
# > Entering new LLMChain chain...
# Prompt after formatting:
# Pythonは、高水準のオブジェクト指向プログラミング言語です。
# Pythonは、簡単な構文と優れたライブラリ群により、多くの用途で広く使用されています。
# Pythonは、Webアプリケーション、データ分析、人工知能、機械学習、科学計算、ネットワーク自動化、IoT、ゲーム開発などに使用されています。
# Pythonはフリーでオープンソースであり、世界中の開発者コミュニティによって継続的に開発されています。
# また、Pythonは、多くのプラットフォームで動作するため、たとえばWindows、Mac、Linuxなど、ほぼすべてのオペレーティングシステムで実行できます。
# の内容を100文字以内に要約してください。
# > Finished chain.
# Pythonはオープンソースのオブジェクト指向プログラミング言語で、Webアプリケーション開発やデータ分析、人工知能などの多くの用途に使用されています。Windows, Mac, Linuxなどの多くのプラットフォームで動作するため、世界中の開発者コミュニティによって継続的に開発されています。
# > Entering new LLMChain chain...
# Prompt after formatting:
# Pythonはオープンソースのオブジェクト指向プログラミング言語で、Webアプリケーション開発やデータ分析、人工知能などの多くの用途に使用されています。Windows, Mac, Linuxなどの多くのプラットフォームで動作するため、世界中の開発者コミュニティによって継続的に開発されています。を英語に翻訳してください。
# > Finished chain.
# Python is an open source object-oriented programming language, used for many applications such as web application development, data analysis, and artificial intelligence, and runs on many platforms such as Windows, Mac, Linux, and is continuously developed by the global developer community.
# > Finished chain.
【参考】Python × LangChain Chains|機能拡張
LangChain Chainsを用いると、様々な機能拡張が可能です。最後に、LangChain Chainsを応用した参考記事をご紹介します。
SQLDatabaseChain
自然言語の問い合わせをもとに、SQLを発行し、データベースを参照・結果を出力するSQLDatabaseChainについて、概要・実装方法をご紹介します。
【参考】PythonによるLLM実装|ChatGPT・LangChain
本記事では、PythonでLLMを構築し、様々なタスクをこなす機能の実装方法を多数解説しています。
Python × ChatGPT関連記事
Python × LangChain関連記事
自然言語処理の学習におすすめの書籍
自然言語処理の概要について詳しく学びたい方向けに、厳選したおすすめの学習教材を紹介しています。
最後に
お問い合わせフォーム
上記課題に向けてご気軽にご相談下さい。
お問い合わせはこちら