公式によるプロンプト・エンジニアリングの入門ガイド
今回紹介する「ChatGPT Prompt Engineering for Developers」は機械学習の教材などを提供するDeepLearning.AI社とChatGPTなどの開発元であるOpenAI社が組んでリリースしたプロンプトエンジニアリングに関する教材です。
ChatGPTの開発に伴い、長年OpenAI社員が蓄積してきたノウハウがコンパクトに詰まっており、非常に学びやすい教材となっています。
今回はその教材の中でも全てのプロンプトに通じる基本的な指針について語られたGuideline編についてご紹介します。
対象者
こちらのコースはサービス利用者というより、LLMを使ったサービスを作る開発者向けのプロンプトエンジニアリングガイドです。ChatGPTを使う上でも参考になりますが、少し文脈が異なるのでその点注意ください。
解説のアプローチ
解説を始める前に私のプロンプトに対するアプローチを整理しておきます。プロンプトは自然言語であり、入力も出力も自由度が高いがゆえに非常に多くのテクニックが存在します。正直それらの雑多なテクニックを整理する上での指針が個人的には必要でした。
私は開発者なので、プロンプトエンジニアリングのテクニックを「プログラミング言語で例えると何か?」という目線で見ていきます。ものによってはLLMだからこそ可能な機能というのも存在します。それらはLLMが提供する新機能として捉えます。なので「従来のプログラミングで存在した概念・機能」と「LLMが提供する新概念・新機能」と言う2つに分類してプロンプトテクニックを見ていきます。
またそれぞれのプロンプトテクニックが作用する箇所に着目します。私はプロンプトをプログラミングで言うところの「関数」と捉えます。関数が「入力」、「処理(ロジック)」、「出力」で構成されているのと同様、プロンプトも「入力」、「処理(ロジック)」、「出力」で構成されており、様々なプロンプトテクニックが存在しますが、それらは全て、そのどこかに作用します。
以上の2つの視点でプロンプトエンジニアリングにアプローチしていきたいと思います。
プロンプトを試す下準備
GoogleColabを使う
必要なライブラリを読み込む
基礎編【Guidelines】
基本的な指針としては以下の2つが挙げられています。
- 明確で詳細な指示をする事
- モデルに考える時間を与える事
具体的にポイントを見ていきましょう
① 明確で詳細な指示をする
指示については以下のポイントを最低限抑えましょう
- 対象テキストと指示を明確に区切る
- 構造化データにして出力させる
- 入力をチェックさせる
- 回答例を伝える
1.対象テキストと指示を明確に区切る
既存のテキストを元に回答をさせる場合、対象テキストを記号で囲い、区別しやすくしましょう。記号は分かりやすければ何でも構いません。一般的には
```
や:::
など記号を3つ繋げた区切りを用います。従来のプログラミングでいうと関数の中でプライベートな変数を定義するようなイメージです。
またメリットとしてプロンプトインジェクションを防ぐことにもなり、一石二鳥です。
text = f""" # 要約したい文章をダダダっと記載します """ prompt = f""" ```で囲われた文章を要約して〜〜 ```{text}``` """ get_completion(prompt) #
ちなみに区切り線としては
-
(ダッシュ)が良さそうです。最もトークン数が少なくて済むそうな。2. 構造化データにして出力させる
これは言わずもがなかもしれませんが、開発しやすいようにjsonのような構造化データとして出力させましょう。LLMからの回答を他のプログラムに渡すことができる為、サービス開発では必ず使うテクニックと言えるかもしれません。構造化データの例:json, html, XML, YAMLなど。
3. 入力をチェックさせる
入力が誤っていれば精度の高い返答は返ってきません。入力が指示を実行するのに適した入力か最初に判断させる事で、無駄なやり取りを減らしましょう。
関数を定義した際に、引数が特定の型に準拠しているのかバリデーションをかけるのと似ていますね。LLMの強みとして非構造化データを入力出来るからこそ、入力のバリデーションもLLMにさせましょう。
4. 複数の回答例を伝える
望ましいインプット→アウトプットの例をいくつか最初に提示しておくことで、同様のロジックのアウトプットを出力しやすくなります。これは従来のプログラミングには存在しなかったLLMの「パターン認識」の力を活用するプロンプトといえます。Few-shot Promptingと呼ばれ、確立されたテクニックとして知られています。
② 考える時間を与える
言語モデルは問いに対しすぐに答えを返す習性があります。その結果、ピントのズレた性急な答えを返してしまう事も少なくありません。そういった挙動を以下のテクニックで制御しましょう。
- 思考手順をブレイクダウンする・させる
- LLMの考えを言わせてから答えさせる
思考手順をブレイクダウンする・させる
いきなり答えを導き出させるのではなく、思考する手順を指示、もしくはLLMに回答させてから本題の命令を投げかけるテクニックです。難解なロジックを1つの関数に詰め込むのではなく、よりシンプルな複数の関数に分割することで最終的な出力の正確性を上げる試みにイメージとしては近いかと思います。
これもChain of Thought (CoT)という確立されたテクニックとして知られています。
考えを言わせてから答えさせる
ユーザーの問いに答える前に、LLM自身もしくは有識者の考えを言わせてから、ユーザーの問いに答えさせるテクニックです。このステップを踏むことで、ユーザーの問いを判断する精度が上がります。これはLLM特有の自己整合性を担保しようとする習性を活用したプロンプトです。
まとめ
LLMは揺らぎが大きい
それではHappy Prompting Life!!👋