takuroooのブログ

勉強したこととか

Prompt Enginnering Guideを読んで気になったことのメモ

目次

概要

Prompt Enginnering GuideというChatGPTなどのLLMsを使う時に入力するテキスト(プロンプト)を設計するときのガイドを読んだので自分が使えそうだなと思った箇所だけメモしていく。

Prompt Enginnering Guideの日本語訳 www.promptingguide.ai GitHubリポジトリ github.com

プロンプトエンジニアリングとは

ChatGPTなどを使ってあるタスクを実行するために最適な入力テキスト(プロンプト)を設計するアプローチとのこと。
ChatGPTを使って何かタスクを実行するときに、与えるプロンプトに応じて出力される回答が変化する。このとき自分が望む回答をChatGPTから引き出すには最適なプロンプトを与えてあげる必要がある。Prompt Enginnering Guideには、この最適なプロンプトを構築するヒントが書かれている。

プロンプトの要素

プロンプトに以下の要素が含まれることがあるとのこと。

  • 命令:モデルに実行してほしい特定のタスクまたは命令
  • 文脈:外部情報や追加の文脈
  • 入力データ:入力または質問
  • 出力指示子:出力タイプ、形式

これらすべてが常に必要というわけではない。

自分のタスクに合わせてどれとどれを組み合わせてプロンプトを構成するのか考える必要がありそう。
命令や入力データはほとんどのケースで必要になりそう。出力指示子は表形式とかマークダウンで出力したい場合にプロンプトに追加するものだと思う。おそらく「文脈」は回答の精度を高めたいときに検討するものだと思うので、最適な文脈を見つけてプロンプトに組み込むのが一番難易度が高そう。

プロンプトの設計に関する一般的なヒント

ヒントとして下記のようなことが書かれている。

  • プロンプト設計は反復的なプロセスである。
  • プロンプト設計はシンプルなプロンプトから始める。
  • 結果を向上させるために要素や文脈を追加していく。
  • 大きなタスクは小さなサブタスクに分解する。
  • 指示はプロンプトの最初に配置し、指示と文脈を区切るために「###」のような区切り文字が推奨されている。
### 指示 ###
以下のテキストをスペイン語に翻訳してください。
Text: "hello!"
  • プロンプトは詳細で具体的であるほど、結果はよくなる。
  • プロンプトに例を与えることは、特定のフォーマットで出力を得るために効果的である。
  • 「しないこと」を言わずに、「することを」を言う。

最初から複雑なプロンプト突っ込まないでまずはシンプルなプロンプトから始めていき、出力を見ながらプロンプトを微調整(要素や文脈を追加)していく作業がプロンプトの設計らしい。
「大きなタスクは小さなサブタスクに分解する」というところにもプロンプトの設計の工夫が必要そう。この場合も大きなタスクを投げてみて期待する結果に到達しなさそうだったらタスクを分解してみて依頼する、もしくはその分解自体を依頼するみたいな反復作業が必要なんだろうと思う。

プロンプトの例

プロンプトの使用パターンも載っていた。

  • テキスト要約
  • 情報抽出
  • 質疑応答
  • テキスト分類
  • 会話
  • コード生成
  • 推論

このパートでは「こんな感じでLLMs使えますよ」みたいな紹介が書いてある。
面白そうだったのが「会話」で下記のようなプロンプトが書かれていた。

以下はAI研究アシスタントとの会話です。アシスタントのトーンは技術的で科学的です。
人: こんにちは、あなたは誰ですか?
AI: ご挨拶!私はAI研究アシスタントです。今日は何をお手伝いできますか?
人: ブラックホールの生成について教えてもらえますか?
AI: 

このように役割を与えるようなプロンプトをrole promptingと呼ぶらしい。

Techniques

ここでは実際にプロンプトを設計するときの技が紹介されていた。
下記使えそうなものをピックアップした。

Zero-shot prompting

モデルに例を提示しないプロンプト。一番シンプルなやつ。

入力

次のテキストがポジティブかネガティブか判定してください。
テキスト:仕事が楽しい

出力(GPT-3.5)

このテキストはポジティブな表現です。"仕事が楽しい"という文は、仕事に対してポジティブな感情を示しています。

Few-shot prompting

モデルに例を提示するプロンプト。提示した例からモデルがタスクをどうやって実行するか学習してくれる。

入力

今日はだるい 
この表現はネガティブです。
仕事行きたくない
この表現はネガティブです。
今日は華金だ
この表現はポジティブです。
仕事が楽しい

出力(GPT-3.5)

この表現はポジティブです。

例を示すだけで特に指示しないでも期待通りの形式で出力してくれた。 ただしfew-shot promptingは推論を含むタスクではうまく機能しないとのこと。推論を含むタスクでは口述する「Chain-of-Thought prompting」と「Zero-shot COT prompting」が有効とのこと。

Chain-of-Thought prompting

中間的な推論ステップを示すプロンプト。
下記例はPrompt Enginnering Guideに掲載されていた例。「奇数を全て加えると...」の部分で推論をどのようにするかのヒントを与えている。

このグループの奇数を合計すると偶数になります。: 17、9、10、12、13、4、2。
A: 奇数を全て加えると(17, 9, 13)39になります。答えはFalseです。
このグループの奇数を合計すると偶数になります。: 15、32、5、13、82、7、1。
A:

GPT-3.5はChain-of-Thought prompting使わずに「このグループの奇数を合計すると偶数になります。: 15、32、5、13、82、7、1。」だけで正解していた。

Zero-shot COT prompting

こちらは「ステップバイステップで考えてみましょう」という文言をプロンプトに追加するアイデア。 下記例はPrompt Enginnering Guideに掲載されていた例。

私は市場に行って10個のリンゴを買いました。隣人に2つ、修理工に2つ渡しました。それから5つのリンゴを買って1つ食べました。残りは何個ですか?

これをGPT-3.5に入力すると間違えた答えを出力した。

最初に10個のリンゴを買いましたが、隣人と修理工に2つずつ渡したので、2つ+2つ=4つのリンゴを渡しました。したがって、最初の10個のリンゴから4つのリンゴが減り、残りは6つのリンゴです。

その後、5つのリンゴを買いましたが、1つを食べたので、残りは5つ-1つ=4つのリンゴがあります。

したがって、最初に10個のリンゴを買い、隣人と修理工に2つずつ渡し、5つのリンゴを買って1つ食べた後、残りは4つのリンゴです。

次に「ステップバイステップで考えてみましょう」という文言をプロンプトに追加したところ見事に正解になった。

入力

私は市場に行って10個のリンゴを買いました。隣人に2つ、修理工に2つ渡しました。それから5つのリンゴを買って1つ食べました。残りは何個ですか?
ステップバイステップで考えてみましょう。

出力(GPT-3.5)

最初に市場で10個のリンゴを買いました。

リンゴの数:10
その後、隣人に2つのリンゴを渡しました。

リンゴの数:10 - 2 = 8
修理工にも2つのリンゴを渡しました。

リンゴの数:8 - 2 = 6
その後、5つのリンゴを追加で購入しました。

リンゴの数:6 + 5 = 11
最後に、1つのリンゴを食べました。

リンゴの数:11 - 1 = 10
したがって、残りのリンゴの数は10個です。

ただこのプロンプトを何回か試しているとたまに間違った答えを出すので100%正解させるためにはまだまだ工夫が必要そう。

ちなみにZero-shot COT prompting を使わずにGPT-4に同じプロンプトを入力したところ1発で正解した。
入力

私は市場に行って10個のリンゴを買いました。隣人に2つ、修理工に2つ渡しました。それから5つのリンゴを買って1つ食べました。残りは何個ですか?

出力(GPT-4)

最初に10個のリンゴを買い、隣人に2つ、修理工に2つ渡したので、6個のリンゴが残ります。それから5つのリンゴを追加で購入し、1つ食べました。その結果、6個 + 5個 - 1個 = 10個のリンゴが残ります。

まとめ

個人的には「Chain-of-Thought prompting 」や「Zero-shot COT prompting 」が興味深かった。元のプロンプトでは答えにたどり着けないのに、思考のヒントを与えるだけでそのヒントを駆使して答えにたどり着く様子が面白かった。こういうのを見るとプロンプト設計試験とかも今後出てきそう。
一方でGTP-4ではこれらのテクニックを使用しないでも正解を出力できたところを見るとこういったテクニックもモデルの性能が向上するにつれて徐々に不要なものになっていきそう。そうなればそうなったでまた新しいテクニックがでてくると思うけどどうなんだろう。
Few-shot prompting と Role prompting は回答の精度を上げるとか以外にアプリケーションとして色々使い道がありそうなので、この辺のプロンプト例とか漁ってみると面白いアイデアとか出てきそう。