
LLM連携アプリの開発を支援するライブラリ LangChain の使い方 (1) - LLMとプロンプト・チェーン
「LangChain」の「LLMとプロンプト」「チェーン」の使い方をまとめました。
1. LangChain
「LangChain」は、「LLM」 (Large language models) と連携するアプリの開発を支援するライブラリです。
「LLM」という革新的テクノロジーによって、開発者は今まで不可能だったことが可能になりました。しかし、「LLM」を単独で使用するだけでは、真に強力なアプリケーションを作成するのに不十分です。本当の力は、それを他の計算や知識と組み合わせた時にもたらされます。「LangChain」は、そのようなアプリケーションの開発をサポートします。
2. LangChainの支援領域
「LangChain」の支援領域は、次の5つがあります。
(1) LLM とプロンプト
(2) チェーン
(3) データ拡張生成
(4) エージェント
(5) メモリ
(6) 評価 (BETA)
3. ユースケース
「LangChain」のユースケースは、次のとおりです。
・エージェント : 言語モデルを使用して他のツールと対話する。より根拠のある質問応答を実行したり、APIとやり取りしたり、アクションを実行したりすることができる。
・チャットボット : チャットを使用して自動的に会話する。
・例の生成 : 既存の例と同様の例を生成する。
・データ拡張生成 : LLMが学習したデータに基づいてテキスト生成するのではなく、特定のデータに基づいてテキスト生成する。
・特定の文章 (Webサイト・私文書など) の要約。
・特定のテキスト (Webサイト・私文書など) に対する質問応答。
・複数のテキスト (複数のWebサイト・私文書など) に対する質問応答。
・API への外部呼び出しの結果 (SQL クエリ結果など) の使用。
・質問応答 : ドキュメントの内容に関する質問に対して、応答を返す。
・要約 : 複数の長いドキュメントから小さな要約を作成する。
・評価 : 言語モデル自体を使用して言語モデルを評価する。
・モデル比較 : 様々な入力およびオプションで言語モデルを比較する。
4. インストール
Google Colabでのインストール手順は、次のとおりです。
(1) パッケージのインストール。
# パッケージのインストール
!pip install langchain
!pip install openai
(2) 環境変数の準備。
以下のコードの <OpenAI_APIのトークン> にはOpenAI APIのトークンを指定します。(有料)
# 環境変数の準備
import os
os.environ["OPENAI_API_KEY"] = "<OpenAI_APIのトークン>"
5. LLMとプロンプト
5-1. LLMの呼び出し
「LangChain」の最も基本的な構成要素は、「LLMの呼び出し」です。
今回は、「作るものに基づいた会社名」を生成します。
from langchain.llms import OpenAI
# LLMの準備
llm = OpenAI(temperature=0.9)
# LLMの呼び出し
print(llm("コンピュータゲームを作る新会社名の案を1つ出してください"))
ツクルゲームス
5-2. LLMChain と PromptTemplate
通常、LLMを使用する場合、ユーザー入力を直接LLMに渡すことはありません。ユーザー入力を基に、PromptTemplateでプロンプトを作成し、それをLLMに渡します。
今回は、「作るもの」を基に、「作るものに基づいた会社名」を生成します。
from langchain.prompts import PromptTemplate
from langchain.chains import LLMChain
# プロンプトテンプレートの準備
prompt = PromptTemplate(
input_variables=["product"],
template="{product}を作る新会社名の案を1つ出してください",
)
# LLMChainの準備
chain = LLMChain(llm=llm, prompt=prompt)
# LLMChainの実行
print(chain.run("家庭用ロボット"))
ポケットロボットカンパニー
6. チェーン
6-1. SequentialChain
言語モデルの出力を別の言語モデルの入力に渡すチェーンです。決定論的な順序で呼び出します。
次の2種類があります。
・SimpleSequentialChain : 入出力を1つずつ持つチェーンを繋げるシンプルなチェーンです。
・SequentialChain : 入出力を複数持つチェーンを繋げる一般的なチェーン
◎ SimpleSequentialChain
入出力を1つずつ持つチェーンを繋げるシンプルなチェーンです。
今回は、1つ目「劇のタイトルからあらすじを生成」と、2つ目「劇のあらすじからレビューを生成」のチェーンを繋ぎます。
(1) パッケージのインポート。
# パッケージのインポート
from langchain.llms import OpenAI
from langchain.chains import LLMChain
from langchain.prompts import PromptTemplate
(2) 1つ目のチェーンの準備。
# 1つ目のチェーンの準備 : 劇のタイトルからあらすじを生成
# LLMの準備
llm = OpenAI(temperature=.7)
# テンプレートの準備
template = """あなたは劇作家です。劇のタイトルが与えられた場合、そのタイトルのあらすじを書くのがあなたの仕事です。
タイトル:{title}
あらすじ:"""
# プロンプトテンプレートの準備
prompt_template = PromptTemplate(
input_variables=["title"],
template=template
)
# LLMChainの準備
synopsis_chain = LLMChain(llm=llm, prompt=prompt_template)
(3) 2つ目のチェーンの準備。
# 2つ目のチェーン : 劇のあらすじからレビューを生成
# LLMの準備準備
llm = OpenAI(temperature=.7)
# テンプレートの準備
template = """あなたは演劇評論家です。 劇のあらすじが与えられた場合、そのあらすじのレビューを書くのがあなたの仕事です。
あらすじ:
{synopsis}
レビュー:"""
# プロンプトテンプレートの準備
prompt_template = PromptTemplate(
input_variables=["synopsis"],
template=template
)
# LLMChainの準備
review_chain = LLMChain(llm=llm, prompt=prompt_template)
(4) SimpleSequentialChainで2つのチェーンを繋ぐ
from langchain.chains import SimpleSequentialChain
# SimpleSequentialChainで2つのチェーンを繋ぐ
overall_chain = SimpleSequentialChain(
chains=[synopsis_chain, review_chain],
verbose=True
)
(5) SimpleSequentialChainの実行。
# SimpleSequentialChainの実行
review = overall_chain.run("浜辺の夕暮れ時の悲劇")
> Entering new SimpleSequentialChain chain...
浜辺の街で暮らす家族がいます。末っ子のジョエルは、詩を書いたり音楽を作ったりするような夢を持っていましたが、家族からは実家を継ぐことを強く望まれていました。しかし、ジョエルはそんな夢を捨てきれずにいました。
ある夕暮れ時、ジョエルは家族の猛反対を押し切り、自身の夢に向かって大きな一歩を踏み出そうとしましたが、未だ夢を叶えることができず、最後には彼は家族の悲劇を
「浜辺の街」は、一家の悲劇を描いた心温まるドラマです。ジョエルは、詩や音楽に関する夢を抱いていますが、家族は実家を継ぐよう望んでいます。ジョエルは夢を捨てきれずにいますが、家族の猛反対を押し切り、自身の夢に向かうところまでは来ました。しかし、最後に彼は夢を叶えることができず、家族の悲劇が終わるまでずっと心痛む状態にあります。 本作は、家族の愛情を描いた
> Finished SimpleSequentialChain chain.
(6) レビューの表示。
# レビューの表示
print(review)
「浜辺の街」は、一家の悲劇を描いた心温まるドラマです。ジョエルは、詩や音楽に関する夢を抱いていますが、家族は実家を継ぐよう望んでいます。ジョエルは夢を捨てきれずにいますが、家族の猛反対を押し切り、自身の夢に向かうところまでは来ました。しかし、最後に彼は夢を叶えることができず、家族の悲劇が終わるまでずっと心痛む状態にあります。 本作は、家族の愛情を描いた
◎ SequentialChain
入出力を複数持つチェーンを繋げる一般的なチェーンです。
今回は、1つ目「劇のタイトルからあらすじを生成」と、2つ目「劇のあらすじからレビューを生成」のチェーンを繋ぎます。
(1) 1つ目のチェーンの準備。
# 1つ目のチェーン : 劇のタイトルと時代からあらすじを生成
# LLMの準備
llm = OpenAI(temperature=.7)
# テンプレートの準備
# テンプレートの準備
template = """あなたは劇作家です。劇のタイトルと時代が与えられた場合、そのタイトルのあらすじを書くのがあなたの仕事です。
タイトル:{title}
時代:{era}
あらすじ:"""
# プロンプトテンプレートの生成
prompt_template = PromptTemplate(
input_variables=["title", 'era'],
template=template
)
# LLMChainの準備
synopsis_chain = LLMChain(
llm=llm,
prompt=prompt_template,
output_key="synopsis"
)
(2) 2つ目のチェーンの準備。
# 2つ目のチェーン : 劇のあらすじからレビューを生成
# LLMの準備準備
llm = OpenAI(temperature=.7)
# テンプレートの準備
template = """あなたは演劇評論家です。 劇のあらすじが与えられた場合、そのあらすじのレビューを書くのがあなたの仕事です。
あらすじ:
{synopsis}
レビュー:"""
# プロンプトテンプレートの準備
prompt_template = PromptTemplate(
input_variables=["synopsis"],
template=template
)
# LLMChainの準備
review_chain = LLMChain(
llm=llm, prompt=prompt_template,
output_key="review"
(3) SequentialChainで2つのチェーンを繋ぐ。
from langchain.chains import SequentialChain
# SequentialChainで2つのチェーンを繋ぐ
overall_chain = SequentialChain(
chains=[synopsis_chain, review_chain],
input_variables=["era", "title"],
output_variables=["synopsis", "review"],
verbose=True
)
(4) SequentialChainの実行。
# SequentialChainの実行
review = overall_chain({"title":"浜辺の夕暮れ時の悲劇", "era": "戦国時代"})
> Entering new SequentialChain chain...
Chain 0:
{'synopsis': '\n\nこの物語は戦国時代の日本を舞台にしています。ある小さな集落が存在し、そこには若い男女が住んでいました。\n\n主人公の一人は、少し変わった性格である少年のジョンです。ジョンは毎日のように浜辺を散歩していました。ある日、ジョンは浜辺で若い女性と出会いました。その女性は、武士であり、彼女の気高い態度や誠実な気持ちに心を奪われました。\n\nしかし、ジョンは彼女の名前を知り'}
Chain 1:
{'review': '\n\nこの物語は戦国時代の日本を舞台にした、素晴らしいストーリーです。主人公のジョンが、浜辺で若い女性と出会うことで、時代の背景を見事に表現しています。ジョンは、彼女の気高い態度や誠実な気持ちに心を奪われます。これは、女性の持つ強さと柔らかさを象徴しています。物語を通して、多くの人々が、自分の内なる力を信じることを学べるでしょう。戦国時代を舞台にしたこの物語'}
> Finished SequentialChain chain.
(5) レビューの表示。
# レビューの表示
print(review)
{'review': '\n\nこの物語は戦国時代の日本を舞台にした、素晴らしいストーリーです。主人公のジョンが、浜辺で若い女性と出会うことで、時代の背景を見事に表現しています。ジョンは、彼女の気高い態度や誠実な気持ちに心を奪われます。これは、女性の持つ強さと柔らかさを象徴しています。物語を通して、多くの人々が、自分の内なる力を信じることを学べるでしょう。戦国時代を舞台にしたこの物語'}
関連
LangChain-AGI 🤖
— Harrison Chase (@hwchase17) December 23, 2022
A (somewhat) facetious attempt to create AGI using the best agent & tools in @LangChainAI
Can currently use search, do complex math, lookup weather, lookup current news, and more
Notebook here: https://t.co/2UPQ7A7nwl
次回
気軽にクリエイターの支援と、記事のオススメができます!