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

プロンプトエンジニアリングとは、自然言語モデルに対する入力(プロンプト)を開発する技術のことを言います。通常ChatGPTを使うのに、特別な知識や技術は必要ありません。ただ、効率的に欲しい情報を得ようとした時には、工夫が必要です。

今までは、サンプルを見ながら試行錯誤でプロンプトを作ってきましたが、公式のドキュメントを読みながら、少し整理したいと思います。

OpenAI Cookbook

OpenAIが自社のモデルを使うための参考資料をGitHubで公開しています。こちらを参考にしながら、実際に確認していきたいと思います。

How to work with large language models

まずは、基本のプロンプトについてです。こちらはgpt-3.5-turboよりも汎用的なtext-davinci-003を用います。

プロンプトの記述方法は、大きく3つあります。

  • Instruction: 命令プロンプト。AIに対して具体的な命令を記述します。
  • Completion: 完了プロンプト。モデルからの出力を誘導するように、前段部分を記述します。
  • Demonstration: デモプロンプト。いくつかの例を示した上で、タスクを記述します。(few-shot学習)

それぞれの例は、以下のようになっています。

1) 命令プロンプト

Extract the name of the author from the quotation below.

“Some humans theorize that intelligent species go extinct before they can expand into outer space. If they're correct, then the hush of the night sky is the silence of the graveyard.”
― Ted Chiang, Exhalation
https://github.com/openai/openai-cookbook/blob/main/how_to_work_with_large_language_models.md

命令プロンプトでは最初に、「以下の引用文から著者名を抜き出してください。」と指示をして、その後に入力となる文章を続けています。

2)完了プロンプト

“Some humans theorize that intelligent species go extinct before they can expand into outer space. If they're correct, then the hush of the night sky is the silence of the graveyard.”
― Ted Chiang, Exhalation

The author of this quote is
https://github.com/openai/openai-cookbook/blob/main/how_to_work_with_large_language_models.md

完了プロンプトではまず引用文を示し、「この引用の著者は、・・」としてそれに続く単語を抽出させています。

3)デモプロンプト

Quote:
“When the reasoning mind is forced to confront the impossible again and again, it has no choice but to adapt.”
― N.K. Jemisin, The Fifth Season
Author: N.K. Jemisin

Quote:
“Some humans theorize that intelligent species go extinct before they can expand into outer space. If they're correct, then the hush of the night sky is the silence of the graveyard.”
― Ted Chiang, Exhalation
Author:
https://github.com/openai/openai-cookbook/blob/main/how_to_work_with_large_language_models.md

デモプロンプトでは、引用から著者を抽出する回答例を一つ挙げ、それに続けて本題の引用文を記述しています。

ChatGPTのようなインタラクティブな処理の場合、命令プロンプトがよく使われているかと思います。例えば、「以下の文章を翻訳して」とか「〇〇について説明して」などです。所望の結果が得られなかった場合にも、言い方を変えたり、条件を追加したりして、最終的に必要な結果を導きます。

一方、出力の形式を揃えたい場合などには、デモプロンプトが有効に思います。例えばシステムに組み込む場合や、その後Excelなどで処理する必要がある場合です。

ファインチューニングされたプロンプトの例もありますが、これはあらかじめ用意したデータ(この例では引用と著者の組み合わせ)で学習させる必要があります。この場合には、”引用”を入力すれば、”著者”が出力されることになります。

More prompt advice

プロンプトを記述する上では、以下のようなアドバイスがされています。

  • もっと明確な指示を出してください。たとえば、出力をコンマ区切りのリストにしたい場合は、コンマ区切りのリストを返すように要求します。答えがわからないときに「わかりません」と言わせたい場合は、「答えがわからない場合は「わかりません」と言ってください」と伝えます。
  • より良い例を提供してください。プロンプトで例を示す場合は、例が多様で高品質であることを確認してください。
  • モデルに専門家のように答えてもらいます。高品質の出力または専門家によって書かれたかのように出力を生成するようにモデルに明示的に要求すると、モデルは、より高品質の回答を与えることができます。たとえば、「次の回答は正確で、質が高く、専門家によって書かれています。」とプロンプトに記述することで、品質を高めることができます。
  • モデルに、その理由を説明する一連のステップを書き留めるよう促します。たとえば、「 Let's think step by step .」のような文を回答の先頭に追加します。最終的な答えの前にその理由を説明するようにモデルに促すことで、最終的な答えが一貫して正しい可能性を高めることができます。
https://github.com/openai/openai-cookbook/blob/main/how_to_work_with_large_language_models.md

通常のGPTを使っていると「わかりません」とはあまり言いません。それらしい答えを返そうとします。

例えば、text-davinci-003で「京都駅前の美味しい和食のお店を教えてください。」と入力すると、以下のようになります。

しかし、知らない時には「知らない」というように追加すると、以下のようになります。

これは、デモプロンプトでも使えます。PlaygroundのQ&Aサンプルプロンプトは以下のようになっており、「答えのない質問やナンセンスな質問には”Unknown”と回答します」と言っています。そして、例では「バナナの平方根は?」の問いに対しては「UnKnown」としています。

GPT-3は推論を必要とするようなタスクにおいて、答えを間違えることがあります。そんな時は「ステップバイステップで考えてみましょう」と追記することで、正解導くことができることがあるようです。


正解は10個なので、間違いです。このような推論を必要とするタスクは、間違うことがあります。そこで、「ステップバイステップで考えてみましょう」を追加してみます。

正解しました。

このような段階的な推論を促すようなプロンプトをChain-of-Thought(CoT)というそうです。今回は、サンプルなし(Zero-shot)のプロンプトだったので、Zero-shot COT Promptingと言います。類似の問題例を追加したFew-shot-COTの正答率はさらによくなる可能性があります。詳細は、以下の論文を参照してください。

Kojima et al. (2022)

理屈は分かりませんが、段階的に考えるように促すだけで正答率が上がることには驚きです。