見出し画像

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この物語は戦国時代の日本を舞台にした、素晴らしいストーリーです。主人公のジョンが、浜辺で若い女性と出会うことで、時代の背景を見事に表現しています。ジョンは、彼女の気高い態度や誠実な気持ちに心を奪われます。これは、女性の持つ強さと柔らかさを象徴しています。物語を通して、多くの人々が、自分の内なる力を信じることを学べるでしょう。戦国時代を舞台にしたこの物語'}

関連

次回



この記事が気に入ったらサポートをしてみませんか?