言語モデル用のプロンプトエンジニアリングの経験則と実例

入門/解説

1.言語モデル用のプロンプトエンジニアリングの経験則と実例まとめ

・プロンプトの先頭に指示を入れ、##または”””で指示と文脈を区切る事で区切りを明確に伝える事ができる
・否定形でやってはいけないことだけを言うのではなく、代わりに何をすればいいかを具体的に指示すると良い
・コード生成時などはモデルを特定のパターンに誘導するため「リーディングワード(leading words)」を使用すると良い

2.言語モデル用のプロンプトの基礎知識

以下、help.openai.comより「Best practices for prompt engineering with OpenAI API」の意訳です。元記事はGPT-3用のAPI内でのプロンプトの使い方に関する文章なので、少し古い文章(とは言え、わずか数か月前)です。

ブラウザでchatGPT(無料版はGPT-3.5、有料版はGPT-4.0)と会話していると日本語でも非常に自然な会話が出来てしまうので忘れがちですが、chatGPTが理解しやすいプロンプトの書き方はあるはずで、本稿で書かれている基礎となる考え方は参考になると思っています。

ちょっと話がずれますが、Stable Diffusionなどの画像生成モデル向けのプロンプトは独自の記法が発達しており、本件のような大規模言語モデル用のプロンプトとはだいぶ違って、単語の羅列になる事が多いです。

しかし、私の単なる思い込みなのかもしれませんが「chatGPTなどの大規模言語モデルに欲しい画像を伝えて画像生成モデル向け用のプロンプトを作って貰う」と言う一見、あまり意味のなさそうな手法が「自分でゼロから英文を考えたり、タグを調べて画像生成モデル向け用のプロンプトを作る」より、生成したイラスト内でのモチーフの描き方の的確性や品質が向上する実感があります。

私の後付け解釈は「画像生成モデルも大規模言語モデルもインターネットの画像から学習しており、学習データのかなり部分が重複している。そのため、大規模言語モデルは画像生成モデルが画像や概念と紐づけて学習した単語を具体的に知っており、それらの単語を使ってモチーフを表現するので的確なプロンプトを作成する事が出来る」です。

最終的には、AIイラスト用の独自の呪文(プロンプト)の生成はイラスト生成AIを極めたい人向けの職人芸となって、多くの人は大規模言語モデルの単語選択能力に頼るようになっていくのではないかと感じています。

ですので、AIイラストは作成する事が多いけど、chatGPTには興味はないという方も今回のお話の「否定文を避ける」や「リーディングキーワードの利用」は、おそらく多様なAIに応用が利く話なので抑えておいた方が良いです。

アイキャッチ画像はサイバー空間でプロンプトを操っている感じのアイキャッチ画像を作りたいんですよね、とchatGPT先生に相談して作って貰ったプロンプトに私が手を加えて、カスタムStable Diffusion先生にイラスト化した画像

モデルが学習した方法や学習させたデータにより、特に効果的でタスクに適したプロンプトの書式があります。

以下に、私たちが見つけた信頼性の高いプロンプトの書式をいくつか紹介しますが、あなたのタスクに最も合うかもしれない、さまざまな書式を自由に探ってください。

経験則と実例

注:{ここにテキストを入力}と中カッコに囲まれた部分は、実際のテキストに置き換える部分です。

1. 最新のモデルを使用する

最良の結果を得るためには、一般的に最新の高性能なモデルを使用することをお勧めします。2022年11月現在、テキスト生成には「text-davinci-003」モデル、コード生成には「code-davinci-002」モデルを使う事がベストです。

2. プロンプトの先頭に指示を入れ、##または”””で指示と文脈を区切る事

効果が薄い❌:
以下の文章を、最も重要な点を箇条書きにして要約してください。{ここにテキストを入力}

より効果的✅:
以下の文章を、最も重要な点を箇条書きにして要約してください。テキスト”””
{ここにテキストを入力}
“””

3. 望ましい文脈、成果、長さ、形式、スタイルなどについて、具体的かつ説明的で、できるだけ詳細に説明する

文脈、成果、長さ、形式、スタイルなどについて具体的に説明します。

効果が薄い❌:
OpenAIについて詩を書いてください。
より効果的✅:
OpenAIについて、最近のDALL-E(DALL-Eはテキストから画像へのMLモデルです)の製品発表に焦点を当て、{有名な詩人}のスタイルで、インスピレーションを与える短い詩を書いてください。

4. 例(例1、例2)を通して、望ましい出力形式を明瞭にする

見せる、そして伝える。特定の書式要件を示すと、モデルはよりよく反応します。また、プログラムによる複数の出力の確実な解析が容易になります。

効果が薄い❌:
以下のテキストに記載されている実体(entities)を抽出してください。
企業名、人名、特定の話題、テーマの4種類の実体を抽出してください。テキスト{ここにテキストを入力}

より効果的✅:
以下のテキストで言及されている重要な実体を抽出します。まずすべての会社名を抽出し、次にすべての人名を抽出し、次に内容に合った特定のトピックを抽出し、最後に一般的な包括的テーマを抽出してください。希望する形式会社名: <コンマで区切られた会社名リスト>
人名: -||-
具体的なトピック -||-
一般的なテーマ: -||-テキスト:{ここにテキストを入力}

5. ゼロショット(例を与えない)から始め、次に少数回ショット(2,3の例を与える)、どちらもうまくいかなかったら微調整(fine-tune)

✅ ゼロショット(Zero-shot)。事例を与えずに実行する手法

以下のテキストからキーワードを抽出してください

テキスト:{ここにテキストを入力}
キーワード:

✅ 少数回ショット(Few-shot)。2、3の事例を提供を与えて実行する手法

以下の対応するテキストからキーワードを抽出してください

テキスト1:Stripeは、Web開発者がWebサイトやモバイルアプリケーションに決済処理を組み込むために使用できるAPIを提供している。
キーワード1:Stripe、決済処理、API、Webデベロッパー、Webサイト、モバイルアプリケーション

##
テキスト2:OpenAIは、テキストの理解と生成に非常に優れた最先端の言語モデルを訓練しています。私たちのAPIは、これらのモデルへのアクセスを提供し、言語処理を伴うほぼすべてのタスクを解決するために使用することができます。
キーワード2:OpenAI, 言語モデル, テキスト処理, API.
##

テキスト3:{ここにテキストを入力}
キーワード 3:

✅ 微調整(Fine-tune):微調整のベストプラクティス「Classification best practices (Access: Open to All) 」をご覧ください

6.ふわっと(fluffy)した不正確な記述を減らす

効果が薄い❌:
この製品の説明文はかなり短くする事。数文のみで、それ以上にはしない方が良い。
より効果的 ✅:
この製品の説明には、3~5の段落を使用する事

7. やってはいけないことだけを言うのではなく、代わりに何をすればいいかを指示

効果が薄い❌:
以下は、エージェントとお客様の会話です。ユーザー名やパスワードを尋ねないでください。同じメッセージを繰り返さないでください。顧客: 自分のアカウントにログインできないのですが?
エージェント:

より効果的✅:
以下は、エージェントとお客様との会話です。エージェントは、問題の診断と解決策の提案を試みても、個人の特定に関連する質問は控えてください。ユーザー名やパスワードなどの個人情報を尋ねる代わりに、ヘルプ記事(www.samplewebsite.com/help/faq)を紹介してください。顧客: 自分のアカウントにログインできないのですが?
エージェント:

8.モデルを特定のパターンに誘導するため「リーディングワード(leading words)」を使用(コード生成時)

効果が薄い❌:

# シンプルなpythonの関数を書いてください
# 1. マイルで数字を入力する
# 2. マイルをキロメートルに変換する

以下では、import宣言を追加することで、モデルがPythonで記述を開始すべき事を示唆しています。(同様に “SELECT “はSQL文の開始を示す良いヒントとなります)

より効果的 ✅:

# シンプルなPython関数を書いてください
# 1. マイルで数字を入力する
# 2. マイルをキロメートルに変換する

import

パラメータ

一般的に、モデル出力を変更するために最もよく使われるパラメータは、モデルと熱度(temperature)であることが分かっています。

モデル:高性能なモデルほど高価で、応答遅延も長くなります。

熱度:可能性の低いトークンを出力する頻度を示す指標です。熱度が高いほど、出力はよりランダムに(そして通常は創造的に)なります。しかし、これは「真実性(truthfulness)」とは異なります。データ抽出や真実に関するQ&Aなど、事実に基づいたほとんどの使用例では、熱度は0にする事が最適です。

max_tokens(最大トークン長):出力の長さを制御するのではなく、トークン生成時のハードカットオフ制限を指定します。理想的な状況であれば、この制限に頻繁にぶつかることはありません。モデルは、終了したと思ったときか、定義した停止シーケンスにぶつかったときに停止します。

stop(停止シーケンス):生成された際にテキスト生成を停止させる文字(トークン)のセットです。

その他のパラメータの説明については、APIリファレンスを参照してください。

3.言語モデル用のプロンプトエンジニアリングの経験則と実例関連リンク

1)help.openai.com
Best practices for prompt engineering with OpenAI API

2)docs.google.com
Classification best practices (Access: Open to All)

3)www.promptingguide.ai
Prompt Engineering Guide (もう少し勉強したい方向け。日本語訳あり)

タイトルとURLをコピーしました