プロンプトエンジニアリングの基本【ChatGPT】
プロンプトエンジニアリングとは?
プロンプトエンジニアリングは、生成AIから望む出力を得るために、指示文を適切に設計することです。
言語モデルのプロンプトエンジニアリングに関する体系的な資料として、以下のものがあります。
ChatGPT Prompt Engineering for Developers の Guidelines にプロンプトエンジニアリングの基本のテクニックがわかりやすく書かれていたので紹介します。
2つの原則と6つの戦術
プロンプトエンジニアリングの基本的な考え方として、2つの原則と6つの戦術があるとのことです。
原則1:明確で具体的な指示を書く
- 戦術1:入力の異なる部分を明確に示すための区切り記号を使用する
- 戦術2:構造化された出力を求める
- 戦術3:条件が満たされているかどうかをモデルにチェックさせる
- 戦術4:「少数の成功例」でプロンプトする
原則2:モデルに「考える」時間を与える
- 戦術1:タスクを完了するために必要な手順を明確にする
- 戦術2:結論に急ぐ前に、モデル自身が解決策を考え出すよう指示する
原文は英語なので、日本語で試してみた結果を紹介していきます。
原則1:明確で具体的な指示を書く
戦術1:入力の異なる部分を明確に示すための区切り記号を使用する
翻訳や要約の対象となる文を区切り記号を使って明確にするテクニックです。
簡単な翻訳では区切り記号なしでも問題ありませんが、複雑なタスクを行う場合は必須になります。
三重アスタリスクで区切られた英文を日本語に翻訳してください。
***
Prompting Principles
Principle 1: Write clear and specific instructions
Principle 2: Give the model time to “think”
Tactics
Tactic 1: Use delimiters to clearly indicate distinct parts of the input
Tactic 2: Ask for a structured output
Tactic 3: Ask the model to check whether conditions are satisfied
Tactic 4: "Few-shot" prompting
Tactic 1: Specify the steps required to complete a task
Tactic 2: Instruct the model to work out its own solution before rushing to a conclusion
***
戦術2:構造化された出力を求める
JSONやHTML、テーブルなど出力形式を指定できます。
出力結果を扱いやすくするために使います。
本のタイトルと著者名、ジャンルを3つ選んでください。
以下のキーを持つJSON形式で提供すること:
book_id、title、author、genre
戦術3:条件が満たされているかどうかをモデルにチェックさせる
モデルに条件判断をさせるテクニックです。
対象外の文が入力されたときに意図しない出力をしないために使います。
三連アスタリスクで区切られたテキストが提供される。
その中に一連の命令が含まれている場合は、それらの命令を以下の形式で書き直しなさい:
ステップ1 - ...
ステップ2 - ...
...
ステップN - ...
テキストに一連の指示が含まれていない場合は、単に [ステップなし]と出力しなさい。
***
紅茶を入れるのは簡単だ!まず、お湯を沸かします。その間にカップを持ってティーバッグを入れる。お湯が十分に熱くなったら、ティーバッグの上に注ぐ。紅茶が蒸れるまで少し置いておく。数分後、ティーバッグを取り出す。お好みで砂糖やミルクを入れてもよい。できあがり!美味しい紅茶の出来上がりです。
***
三連アスタリスクで区切られたテキストが提供される。
その中に一連の命令が含まれている場合は、それらの命令を以下の形式で書き直しなさい:
ステップ1 - ...
ステップ2 - ...
...
ステップN - ...
テキストに一連の指示が含まれていない場合は、単に [ステップなし]と出力しなさい。
***
今日はよく晴れて、鳥がさえずる。公園を散歩するにはいい日だ。花は咲き乱れ、木々はそよ風に優しく揺れている。人々は外に出て、この素晴らしい天気を楽しんでいる。ピクニックをしている人もいれば、ゲームをしている人、ただ芝生の上でくつろいでいる人もいる。屋外で自然の美しさを満喫するには絶好の日だ。
***
戦術4:「少数の成功例」でプロンプトする
プロンプトに少数の成功例を含めて、成功例と同じように実際のタスクを処理させるテクニックです。
言語モデルは最も一般的な回答を出力しようとするので、一般的でない回答を求めるときに使います。
あなたの仕事は、一貫したスタイルで答えることです。
<子供>:「根気強い」について教えてください。
<祖父母>:最も深い谷を刻む川は、ささやかな泉から流れる。
最も壮大な交響曲は一つの音から生まれる。
最も複雑なタペストリーは一本の糸から始まる。
<子供>:「楽天的」について教えてください。
原則2:モデルに「考える」時間を与える
戦術1:タスクを完了するために必要な手順を明確にする
いきなり出力を求めずに、出力するための手順を指示することで、複雑なタスクを処理するテクニックです。
求める出力が得られないときに、段階的にタスクを処理させることで結果が改善することがあります。
以下の操作を行ってください:
1 - 三連アスタリスクで区切られた以下のテキストを1文に要約する。
2 - 要約を日本語に翻訳する。
3 - 日本語要約の各名前を列挙する。
4 - 日本語要約と名前の数を含むjsonオブジェクトを出力する。キー:japanese_summary, num_names
以下のフォーマットを使用する:
テキスト: <要約するテキスト>
要約: <要約>
翻訳: <要約を翻訳した文>
名前: <名前のリスト>
出力: <jsonオブジェクト>
***
In a charming village, siblings Jack and Jill set out on a quest to fetch water from a hilltop well. As they climbed, singing joyfully, misfortune struck—Jack tripped on a stone and tumbled down the hill, with Jill following suit. Though slightly battered, the pair returned home to comforting embraces. Despite the mishap, their adventurous spirits remained undimmed, and they continued exploring with delight.
***
戦術2:結論に急ぐ前に、モデル自身が解決策を考え出すよう指示する
タスク処理の手順と出力形式を工夫することで、モデル自身に考えさせるテクニックです。
あなたの課題は、生徒の解答が正しいかどうかを判断することである。
問題を解くには次のようにします:
- まず、あなた自身の解答を作成します。
- 次に、あなたの解答と生徒の解答を比較し、生徒の解答が正しいかどうかを評価します。
自分で問題を解くまで、生徒の解答が正しいかどうかを決めないでください。
次の書式を使用します:
1、問題
===
問題を記述
===
2、生徒の解答
===
生徒の解答を記述
===
3、あなたの解答
===
解答の手順とあなたの解答を記述
===
4、生徒の解答は、今計算したあなたの解答と同じか:
===
イエスまたはノー
===
5、生徒の成績
===
正解または不正解
===
1、問題
===
私は太陽光発電設備を建設しているのですが、資金繰りを手伝ってほしいのです。
- 土地代は100ドル/平方フィート
- ソーラーパネルは250ドル/平方フィートで購入できる
- 年間10万ドルのメンテナンス契約と、1平方フィートあたり10ドルの追加費用を交渉しました。
平方フィート数の関数として、運営初年度の総費用はいくらになりますか。
===
2、生徒の解答
===
設置面積を平方フィートでxとする。
コスト
1. 土地代:100x
2. ソーラーパネル費用:250x
3. メンテナンス費用:100,000 + 100x
総費用:100x + 250x + 100,000 + 100x = 450x + 100,000
===
3、あなたの解答
まとめ
プロンプトエンジニアリングを軽く勉強してみて思ったのは、ChatGPT君むちゃくちゃ優秀!ですね。
最後のタスクは人間でもちょくちょく間違えそうなタスクだし、こういうのが正確に処理できるなら物凄く生産性が上がりそう。
プロンプトエンジニアリング自体はモデルの改善によって変わっていきそうだから、あんまり深く勉強する気はないけど、言語モデルに関してはこれからも注目していきたいと思います。