🦜️🔗LangChain : モジュール : モデル I/O – プロンプト : プロンプトテンプレート : MessagePromptTemplate の種類 / 部分化プロンプトテンプレート (翻訳/解説)
翻訳 : (株)クラスキャット セールスインフォメーション
作成日時 : 08/24/2023
* 本ページは、LangChain の以下のドキュメントを翻訳した上で適宜、補足説明したものです:
- Modules : Model I/O – Prompts : Prompt templates : Types of MessagePromptTemplate
- Modules : Model I/O – Prompts : Prompt templates : Partial prompt templates
* サンプルコードの動作確認はしておりますが、必要な場合には適宜、追加改変しています。
* ご自由にリンクを張って頂いてかまいませんが、sales-info@classcat.com までご一報いただけると嬉しいです。
- 人工知能研究開発支援
- 人工知能研修サービス(経営者層向けオンサイト研修)
- テクニカルコンサルティングサービス
- 実証実験(プロトタイプ構築)
- アプリケーションへの実装
- 人工知能研修サービス
- PoC(概念実証)を失敗させないための支援
- お住まいの地域に関係なく Web ブラウザからご参加頂けます。事前登録 が必要ですのでご注意ください。
◆ お問合せ : 本件に関するお問い合わせ先は下記までお願いいたします。
- 株式会社クラスキャット セールス・マーケティング本部 セールス・インフォメーション
- sales-info@classcat.com ; Web: www.classcat.com ; ClassCatJP
🦜️🔗 LangChain : モジュール : モデル I/O – プロンプト : プロンプトテンプレート : MessagePromptTemplate の種類
LangChain は様々な種類の MessagePromptTemplate を提供します。最も一般的に使用されるものは AIMessagePromptTemplate, SystemMessagePromptTemplate そして HumanMessagePromptTemplate で、これらは AI メッセージ、システムメッセージとヒューマン・メッセージをそれぞれ作成します。
けれども、チャットモデルが任意のロールのチャットメッセージの受け取りをサポートする場合には、ChatMessagePromptTemplate が使用できます、これはユーザにロール名を指定することを可能にします。
from langchain.prompts import ChatMessagePromptTemplate
prompt = "May the {subject} be with you"
chat_message_prompt = ChatMessagePromptTemplate.from_template(role="Jedi", template=prompt)
chat_message_prompt.format(subject="force")
API リファレンス :
- ChatMessagePromptTemplate from langchain.prompts
ChatMessage(content='May the force be with you', additional_kwargs={}, role='Jedi')
LangChain はまた MessagesPlaceholder を提供します、これはフォーマット中にどのメッセージがレンダリングされるかを完全に制御します。これは、メッセージプロンプトテンプレートのためにどのロールを使用するべきかわからないときや、フォーマット中にメッセージのリストを挿入したいときに有用です。
from langchain.prompts import MessagesPlaceholder
human_prompt = "Summarize our conversation so far in {word_count} words."
human_message_template = HumanMessagePromptTemplate.from_template(human_prompt)
chat_prompt = ChatPromptTemplate.from_messages([MessagesPlaceholder(variable_name="conversation"), human_message_template])
API リファレンス :
- MessagesPlaceholder from langchain.prompts
human_message = HumanMessage(content="What is the best way to learn programming?")
ai_message = AIMessage(content="""\
1. Choose a programming language: Decide on a programming language that you want to learn.
2. Start with the basics: Familiarize yourself with the basic programming concepts such as variables, data types and control structures.
3. Practice, practice, practice: The best way to learn programming is through hands-on experience\
""")
chat_prompt.format_prompt(conversation=[human_message, ai_message], word_count="10").to_messages()
[HumanMessage(content='What is the best way to learn programming?', additional_kwargs={}), AIMessage(content='1. Choose a programming language: Decide on a programming language that you want to learn. \n\n2. Start with the basics: Familiarize yourself with the basic programming concepts such as variables, data types and control structures.\n\n3. Practice, practice, practice: The best way to learn programming is through hands-on experience', additional_kwargs={}), HumanMessage(content='Summarize our conversation so far in 10 words.', additional_kwargs={})]
🦜️🔗 LangChain : モジュール : モデル I/O – プロンプト : プロンプトテンプレート : 部分化プロンプトテンプレート
他のメソッドと同様に、プロンプトテンプレートを「部分化 (partial)」することは意味があります – 例えば、値の残りのサブセットだけを期待する新しいプロンプトテンプレートを作成するように、必要な値のサブセットを渡します。
LangChain は 2 つの方法でこれをサポートします :
- 文字列値による部分的な整形。
- 文字列値を返す関数による部分的な整形。
これら 2 つの異なる方法が様々なユースケースをサポートします。以下の例では、両方のユースケースに対する動機とそれを LangChain で行なう方法を調べます。
文字列による部分化
プロンプトテンプレートの部分化を望む一つの一般的なユースケースは、変数の一部を他の変数の前に取得する場合です。例えば、2 つの変数、foo と baz を必要とするプロンプトテンプレートがあるとします。チェインの早期に foo 値を取得し、その後で baz 値を取得する場合、それらをプロンプトテンプレートに渡すために同じ場所で両方の値を持つまで待つことは煩わしい可能性があります。代わりに、プロンプトテンプレートを foo 値で部分化してから、部分化されたプロンプトテンプレートを渡してそれを使用することができます。以下はこれを行なう例です :
from langchain.prompts import PromptTemplate
prompt = PromptTemplate(template="{foo}{bar}", input_variables=["foo", "bar"])
partial_prompt = prompt.partial(foo="foo");
print(partial_prompt.format(bar="baz"))
foobaz
プロンプトを部分化された変数で初期化だけすることもできます。
prompt = PromptTemplate(template="{foo}{bar}", input_variables=["bar"], partial_variables={"foo": "foo"})
print(prompt.format(bar="baz"))
foobaz
関数による部分化
他の一般的な使用方法は関数で部分化することです。このユースケースは、常に共通の方法で取得したいことがわかっている変数の場合です。この主要な例は日付や時刻です。常に現在の日付を持ちたいプロンプトがあると想像してください。それをプロンプト内にハードコードすることはできませんし、それを他の入力変数とともに渡すことは少しわずらわしいです。この場合、常に現在の日付を返す関数でプロンプトを部分化できることは非常に便利です。
from datetime import datetime
def _get_datetime():
now = datetime.now()
return now.strftime("%m/%d/%Y, %H:%M:%S")
prompt = PromptTemplate(
template="Tell me a {adjective} joke about the day {date}",
input_variables=["adjective", "date"]
);
partial_prompt = prompt.partial(date=_get_datetime)
print(partial_prompt.format(adjective="funny"))
Tell me a funny joke about the day 02/27/2023, 22:15:16
You can also just initialize the prompt with the partialed variables, which often makes more sense in this workflow.
prompt = PromptTemplate(
template="Tell me a {adjective} joke about the day {date}",
input_variables=["adjective"],
partial_variables={"date": _get_datetime}
);
print(prompt.format(adjective="funny"))
Tell me a funny joke about the day 02/27/2023, 22:15:16
以上