OpenAI Cookbookで学ぶChatGPTプロンプトの基礎の基礎ChatGPT入門

OpenAIが提供しているCookbookでは大規模言語モデルからの出力をどうすればよいものにできるか、そのノウハウが紹介されています。その基本部分を見てみましょう。

» 2023年02月03日 05時00分 公開
[かわさきしんじDeep Insider編集部]

この記事は会員限定です。会員登録(無料)すると全てご覧いただけます。

「ChatGPT入門」のインデックス

連載目次


かわさき

 筆者がネタに苦しんでいるうちに、マイクロソフトがAzureにChatGPTを含むOpenAIのサービスを採用すると発表したり、ChatGPT Professionalのウェイトリストが用意されたりと、世の情勢は活発にうごいていますね(かわさき)。


OpenAI Cookbook

 OpenAIは「OpenAI Cookbook」と呼ばれるリポジトリをGitHubで公開しています。これは、OpenAIが提供するAPIを使って何らかのタスクを行うためのサンプルコードやガイドを示したものです。今回はそのうちのGPT 3に関連する内容を幾つか紹介しましょう。ただし、OpenAI Cookbookで紹介されているノウハウはChatGPTに特化して書かれているわけではないことには注意してください。

OpenAI Cookbook OpenAI Cookbook

 このCookbookの「How to work with large language models」ページでは大規模言語モデルを「テキストとテキストをマップする」機能だとしています。純粋なGPTであればテキストを入力すると次にくるテキスト(単語列)を推測するし、InstructGPTやChatGPTであればテキストを入力するとユーザーが入力したテキストの指示に従った返答が得られるということです。

 そして、モデルからの出力の質を高めるには、入力するテキストつまりプロンプトがとても重要です。このプロンプトには以下のような種類があります。

  • Instructionプロンプト
  • Completionプロンプト
  • Demonstrationプロンプト

 以下ではこれらのプロンプトについて見ていきましょう。

Instructionプロンプト

 Instructionプロンプトとは「ユーザーがモデルに何をしてほしいかを伝える」プロンプトのことです。例えば、「○○について教えてください」とか「以下の文章の概要をまとめて」のようなプロンプトのことだと考えられます。

 ちょっとした例を以下に示します。

Instructionプロンプト Instructionプロンプト

 上の画像は本フォーラムの用語辞典の記事「ファインチューニング(Fine-tuning:微調整)とは?」の内容を要約するように指示(instruct)したものです。もう少し文字数が多めでもいいんじゃない? と思いますが、いい具合の要約になっているようです。

Completionプロンプト

 Completionプロンプトとは「ユーザーが入力したテキストに続くテキストをモデルに推測してほしい」ときに使用します。例えば「機動戦士」と人にいわれたら、「ガンダム」と続けたくなりますよね。これと同様に、入力されたテキストに続くテキストをモデルに補完(completion)させるようなプロンプトのことです。


かわさき

 「Zガンダム」や他のガンダム作品の名前を続けたくなる人がいることは承知しています(笑)。


 実際にChatGPTに「機動戦士」と入力した結果を以下に示します(必ずしもこうなるとは限りません)。

Completionプロンプト Completionプロンプト

 「機動戦士」に続くテキストとして「ガンダム」を推測できましたが、余計なところまで出力してしまっています。Instructionプロンプトとは異なり、Completionプロンプトを受け取った場合、モデルは入力されたプロンプトに続くテキストを推測しますが、推測をどこで終わればよいかは分かりません。そのためにこのような結果になっています。

 こうした事態を避けるには、「ストップシーケンス」を指定します。ストップシーケンスはテキスト生成を終了させるトリガーとなります(つまり、ストップシーケンスに指定したテキストにぶつかった時点で、テキストの生成が終了します。また、ストップシーケンスに指定したテキストは生成された出力に含まれません)。

 ChatGPTにはストップシーケンスを指定する機能がありません。そこで、InstructGPTのPlaygroundで試してみましょう。こちらには「Stop sequences」欄があるので、ここでストップシーケンスを「ガンダム」に指定します。

生成されたテキストが「ガンダム」で終わったらテキストの生成を終了する 生成されたテキストが「ガンダム」で終わったらテキストの生成を終了する

 上の画像を見ると、InstructGPTからの出力が表示されていません。これは恐らく、「機動戦士」に続けてモデルが「ガンダム」(または「ガ」→「ン」→「ダ」→「ム」のような列)を推測したところ、これがストップシーケンスに合致したために推測がそこで終了し、ストップシーケンスに指定したテキストが出力には含まれないようになっているために、何も出力されなかったところです。

Demonstrationプロンプト

 Demonstrationプロンプトとはユーザーがモデルに対して、何らかの例を提示(demonstration)した上で、例を基にモデルに何らかの推測を行ってもらうためのものです。例が少ないfew-shot学習と多数の例を提示してのファインチューニングの2種類があります。

 多数の例を用意するのは大変なので、ここではfew-shot学習の例を見てみます。ここでは変数xとyの値を指定して、その加算をしていますが、2つの変数の値の和を求めようとしています。が、ここでは単に加算するのではなく、間に2つの値の2進表記も含めるようにしています。

few-shot学習 few-shot学習

 上の2行がここではデモです。下の2行は2つの変数の値が上とは異なっています。ここで求めたい結果は「x + y =」に続いて「0000 + 0001 = 0001 = 1」のように間に2進表記を含めて和を求めることです。果たして1つの例だけを見て、こうした形式を学習できるのでしょうか。

実行結果 実行結果

 このように思った通りの結果が求まりました。モデルがたった1つの例を見て、どんな形式の出力がほしいかをうまく学習できているようです。

 次の例もDemonstrationプロンプトといえるでしょう。1〜3の階乗の計算方法をデモした上で4の階乗はどうなるかを尋ねてみました。

階乗の定義とその計算例 階乗の定義とその計算例

 デモから階乗の定義を読み取って、「4!」が「4×3!」とした上で、それが「4×3×2×1=24」であると正しく計算してくれました。


かわさき

 それどころか、チャットを新規作成して「4! =」と入力するだけできちんと4の階乗を計算してくれましたから、階乗がどんなものかをChatGPTはすでに学習しているようです(じゃあ、デモする意味なかったじゃん?)。



一色

 その場合、階乗の「4! =」に続くテキストを補完したのでCompletionプロントが働いたということなのでしょうかね(一色)。


よりよいプロンプトとは

Copyright© Digital Advantage Corp. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。