🦜️🔗LangChain : モジュール : モデル I/O – プロンプト : プロンプトテンプレート : コンポジション / シリアライゼーション (翻訳/解説)
翻訳 : (株)クラスキャット セールスインフォメーション
作成日時 : 08/25/2023
* 本ページは、LangChain の以下のドキュメントを翻訳した上で適宜、補足説明したものです:
- Modules : Model I/O – Prompts : Prompt templates : Composition
- Modules : Model I/O – Prompts : Prompt templates : Serialization
* サンプルコードの動作確認はしておりますが、必要な場合には適宜、追加改変しています。
* ご自由にリンクを張って頂いてかまいませんが、sales-info@classcat.com までご一報いただけると嬉しいです。
- 人工知能研究開発支援
- 人工知能研修サービス(経営者層向けオンサイト研修)
- テクニカルコンサルティングサービス
- 実証実験(プロトタイプ構築)
- アプリケーションへの実装
- 人工知能研修サービス
- PoC(概念実証)を失敗させないための支援
- お住まいの地域に関係なく Web ブラウザからご参加頂けます。事前登録 が必要ですのでご注意ください。
◆ お問合せ : 本件に関するお問い合わせ先は下記までお願いいたします。
- 株式会社クラスキャット セールス・マーケティング本部 セールス・インフォメーション
- sales-info@classcat.com ; Web: www.classcat.com ; ClassCatJP
🦜️🔗 LangChain : モジュール : モデル I/O – プロンプト : プロンプトテンプレート : コンポジション
このノートブックは複数のプロンプトを一緒に組み合わせる方法を調べます。これはプロンプトの一部を再利用したいときに有用です。これは PipelinePrompt を使用して成されます。PipelinePrompt は 2 つの主要パートから構成されます :
- 最終的なプロンプト : 返される最終的なプロンプト。
- パイプライン・プロンプト : タプルのリストで、文字列名とプロンプト・テンプレートから構成されます。各プロンプトテンプレートは整形されてから、同じ名前の変数として未来のプロンプトテンプレートに渡されます。
from langchain.prompts.pipeline import PipelinePromptTemplate
from langchain.prompts.prompt import PromptTemplate
full_template = """{introduction}
{example}
{start}"""
full_prompt = PromptTemplate.from_template(full_template)
introduction_template = """You are impersonating {person}."""
introduction_prompt = PromptTemplate.from_template(introduction_template)
example_template = """Here's an example of an interaction:
Q: {example_q}
A: {example_a}"""
example_prompt = PromptTemplate.from_template(example_template)
start_template = """Now, do this for real!
Q: {input}
A:"""
start_prompt = PromptTemplate.from_template(start_template)
input_prompts = [
("introduction", introduction_prompt),
("example", example_prompt),
("start", start_prompt)
]
pipeline_prompt = PipelinePromptTemplate(final_prompt=full_prompt, pipeline_prompts=input_prompts)
pipeline_prompt.input_variables
['example_a', 'person', 'example_q', 'input']
print(pipeline_prompt.format(
person="Elon Musk",
example_q="What's your favorite car?",
example_a="Tesla",
input="What's your favorite social media site?"
))
You are impersonating Elon Musk. Here's an example of an interaction: Q: What's your favorite car? A: Tesla Now, do this for real! Q: What's your favorite social media site? A:
🦜️🔗 LangChain : モジュール : モデル I/O – プロンプト : プロンプトテンプレート : シリアライゼーション
プロンプトを Python コードとしてではなくファイルとしてストアすることは好ましい場合が多いです。これはプロンプトの共有、ストア、そしてバージョン管理を簡単にします。このノートブックはそれを LangChain で行なう方法をカバーし、様々な種類のプロンプトと様々なシリアライゼーションのオプションすべてをウォークスルーします。
高いレベルで、以下の設計原理がシリアライゼーションに適用されます :
- JSON と YAML の両方がサポートされます。ディスク上で可読なシリアライゼーション手法をサポートしたいです、そして YAML と JSON はそのための最もポピュラーな手法の 2 つです。このルールはプロンプトに適用されることに注意してください。サンプルのような他のアセットについては、異なるシリアライゼーション手法がサポートされるかもしれません。
- すべてを一つのファイル内にと指定することや、様々なコンポーネント (テンプレート、サンプル等) を異なるファイルにストアして、それらを参照することをサポートしています。ある場合には、すべてをファイルにストアすることが最も合理的ですが、他の場合についてはアセット (長いテンプレート、大規模なサンプル、再利用可能なコンポーネント) の一部を分割することが望ましいです。LangChain は両方をサポートしています。
ディスクからプロンプトをロードする単一のエントリポイントもあり、任意の種類のプロンプトのロードも簡単にします。
# All prompts are loaded through the `load_prompt` function.
from langchain.prompts import load_prompt
API リファレンス :
PromptTemplate
このセクションは PromptTemplate をロードする例をカバーします。
YAML からのロード
これは YAML から PromptTemplate をロードするサンプルを示します。
cat simple_prompt.yaml
_type: prompt
input_variables:
["adjective", "content"]
template:
Tell me a {adjective} joke about {content}.
prompt = load_prompt("simple_prompt.yaml")
print(prompt.format(adjective="funny", content="chickens"))
Tell me a funny joke about chickens.
JSON からのロード
これは JSON から PromptTemplate をロードするサンプルを示します。
cat simple_prompt.json
{
"_type": "prompt",
"input_variables": ["adjective", "content"],
"template": "Tell me a {adjective} joke about {content}."
}
prompt = load_prompt("simple_prompt.json")
print(prompt.format(adjective="funny", content="chickens"))
Tell me a funny joke about chickens.
ファイルからテンプレートをロードする
これは、テンプレートを個別のファイルにストアしてからそれを config で参照する例を示します。キーが template から template_path に変更されていることに注意してください。
cat simple_template.txt
Tell me a {adjective} joke about {content}.
cat simple_prompt_with_template_file.json
{
"_type": "prompt",
"input_variables": ["adjective", "content"],
"template_path": "simple_template.txt"
}
prompt = load_prompt("simple_prompt_with_template_file.json")
print(prompt.format(adjective="funny", content="chickens"))
Tell me a funny joke about chickens.
FewShotPromptTemplate
このセクションは few-shot プロンプトテンプレートをロードする例をカバーします。
サンプル
これは json としてストアされたサンプルがどのようなものかを示す例です。
cat examples.json
[
{"input": "happy", "output": "sad"},
{"input": "tall", "output": "short"}
]
そしてここに yaml としてストアされた同じ例がどのようなものかがあります。
cat examples.yaml
- input: happy
output: sad
- input: tall
output: short
YAML からのロード
これは YAML から few-shot サンプルをロードする例を示します。
cat few_shot_prompt.yaml
_type: few_shot
input_variables:
["adjective"]
prefix:
Write antonyms for the following words.
example_prompt:
_type: prompt
input_variables:
["input", "output"]
template:
"Input: {input}\nOutput: {output}"
examples:
examples.json
suffix:
"Input: {adjective}\nOutput:"
prompt = load_prompt("few_shot_prompt.yaml")
print(prompt.format(adjective="funny"))
Write antonyms for the following words.
Input: happy
Output: sad
Input: tall
Output: short
Input: funny
Output:
yaml ファイルからサンプルをロードした場合でも同じように動作します。
cat few_shot_prompt_yaml_examples.yaml
_type: few_shot
input_variables:
["adjective"]
prefix:
Write antonyms for the following words.
example_prompt:
_type: prompt
input_variables:
["input", "output"]
template:
"Input: {input}\nOutput: {output}"
examples:
examples.yaml
suffix:
"Input: {adjective}\nOutput:"
prompt = load_prompt("few_shot_prompt_yaml_examples.yaml")
print(prompt.format(adjective="funny"))
Write antonyms for the following words.
Input: happy
Output: sad
Input: tall
Output: short
Input: funny
Output:
JSON からのロード
これは JSON から few-shot サンプルをロードする例を示します。
cat few_shot_prompt.json
{
"_type": "few_shot",
"input_variables": ["adjective"],
"prefix": "Write antonyms for the following words.",
"example_prompt": {
"_type": "prompt",
"input_variables": ["input", "output"],
"template": "Input: {input}\nOutput: {output}"
},
"examples": "examples.json",
"suffix": "Input: {adjective}\nOutput:"
}
prompt = load_prompt("few_shot_prompt.json")
print(prompt.format(adjective="funny"))
Write antonyms for the following words.
Input: happy
Output: sad
Input: tall
Output: short
Input: funny
Output:
config の例
これは config でサンプルを直接参照する例を示します。
cat few_shot_prompt_examples_in.json
{
"_type": "few_shot",
"input_variables": ["adjective"],
"prefix": "Write antonyms for the following words.",
"example_prompt": {
"_type": "prompt",
"input_variables": ["input", "output"],
"template": "Input: {input}\nOutput: {output}"
},
"examples": [
{"input": "happy", "output": "sad"},
{"input": "tall", "output": "short"}
],
"suffix": "Input: {adjective}\nOutput:"
}
prompt = load_prompt("few_shot_prompt_examples_in.json")
print(prompt.format(adjective="funny"))
Write antonyms for the following words.
Input: happy
Output: sad
Input: tall
Output: short
Input: funny
Output:
ファイルからのサンプルプロンプト
これは個別のファイルからのサンプルを整形するために使用される PromptTemplate をロードする例を示します。キーが example_prompt から example_prompt_path に変更されていることに注意してください。
cat example_prompt.json
{
"_type": "prompt",
"input_variables": ["input", "output"],
"template": "Input: {input}\nOutput: {output}"
}
cat few_shot_prompt_example_prompt.json
{
"_type": "few_shot",
"input_variables": ["adjective"],
"prefix": "Write antonyms for the following words.",
"example_prompt_path": "example_prompt.json",
"examples": "examples.json",
"suffix": "Input: {adjective}\nOutput:"
}
prompt = load_prompt("few_shot_prompt_example_prompt.json")
print(prompt.format(adjective="funny"))
Write antonyms for the following words.
Input: happy
Output: sad
Input: tall
Output: short
Input: funny
Output:
OutputParser による PromptTemplate
これはファイルから OutputParser と共にプロンプトをロードする例を示します。
cat prompt_with_output_parser.json
{
"input_variables": [
"question",
"student_answer"
],
"output_parser": {
"regex": "(.*?)\\nScore: (.*)",
"output_keys": [
"answer",
"score"
],
"default_output_key": null,
"_type": "regex_parser"
},
"partial_variables": {},
"template": "Given the following question and student answer, provide a correct answer and score the student answer.\nQuestion: {question}\nStudent Answer: {student_answer}\nCorrect Answer:",
"template_format": "f-string",
"validate_template": true,
"_type": "prompt"
}
prompt = load_prompt("prompt_with_output_parser.json")
prompt.output_parser.parse(
"George Washington was born in 1732 and died in 1799.\nScore: 1/2"
)
{'answer': 'George Washington was born in 1732 and died in 1799.',
'score': '1/2'}
以上