🧠

ただのWebエンジニアがプロンプトチューニングでGPTを操るコツ

2023/12/11に公開

これは何?

GPTを使ったAIシステム開発に携わる中で、GPTから望んだ回答を得るためのちょっとしたコツを学んだのでそのまとめです。

書いた人

Webエンジニア3年目に突入くらいです。
普段は、Laravelメインで開発やったり、PL(たまにPMっぽいこと)をやったりと、色々やらせてもらってます。
この記事を書いている時点では、PythonとGPT等を使ったAIシステムの開発を、とあるデータサイエンティストさんと一緒に作ったりしています。

前提

  • 他社のAIでも応用は可能かと思いますが、基本的にはOpenAIのChatGPTを使う前提で記載しています。
  • 今回の検証のモデルは、gpt-4を使用しています。
  • 2023年12月8日現在では、gpt-4-1106-previewというモデルが最新です。gpt-3.5や、gpt-3.5-turboなど、モデルによっても結果が変わってくるため、ご注意ください。

基本

いわゆる普通のChatGPTでは、普通の会話に命令しても良いですが、Custom Instructionsや、MyGPTsのInstructionsなどを使うと良いかと思います。ChatGPTには、system、user、assistantという3つのroleがあり、それぞれ役割は以下のようになっています。

  • system: アシスタントとユーザー間の対話を支える基盤。
  • user: GPTを利用するユーザー。
  • assistant: ユーザーとの対話を通じて情報を提供。

そのため、system roleで設定した命令が論理的には効力が強いものとなります。また、ユーザーの部分の会話履歴は、会話が長くなると消えていく可能性があるため、一言目にした命令をそのうち守ってくれなくなる可能性があります。

まず基本として、ChatGPT(以下 GPT)に対して、簡単な命令をしてみます。

無事、「にゃん」をつけて回答してくれました。でも、まだなんか堅く、ただ語尾に「にゃん」を付けただけで、あまり可愛げがありません。
これをもっと可愛くしていきたいと思います。

応用

立場を指定する

GPTにキャラクター性を持たせたい場合や、特定の業種のプロフェッショナルとして回答して欲しい場合などは、明示的にその立場を指定してあげると良いです。法的知識であれば、「あなたは弁護士です。」のような具合です。やってみましょう。

毎回同じ回答になるわけではないので確実とは言えませんが、ですます調にただ「にゃん」を付けただけの状態から、「〜だにゃん!」とタメ語で喋ってくれるようになりました。

ただ、立場を指定するのであれば、もう少し具体的にキャラクター像がわかる方がよりベストです。

キャラクターの具体性を上げることで、より理想の回答を得られます。
もし名前などがある場合は、ここで指定してあげて問題ないでしょう。

より詳細な情報

先程の1つ目の例の回答で、「趣味は、おしゃべりとお散歩にゃん。みんなと一緒に楽しい時間を過ごすことが一番の幸せにゃん!」とありますが、これはプロンプトで命令していません。つまり、GPTが勝手に想像して回答してくれました。
そのため、2つ目では「趣味は読書とお散歩で、新しいことを学ぶのが好きにゃん!」となっています。趣味がコロコロ変わるのも微妙なので、この子に趣味を固定させてあげましょう。
ねこっぽい方が良いので、「お散歩」、「日向ぼっこ」の2つを趣味にしてみます。
ただし、ただ「趣味はお散歩と日向ぼっこです。」と指定するよりも、構造的に指定してあげる方が、理解してくれるようです。2つくらいのデータではあまり変わらない印象ですが、データが増えてくるとより効果的になります。

趣味を認識してくれました。ここで、###について説明します。
この###はGPTに対して、「ここからここまでがデータのセットですよ」と示すものです。必ず###である必要はありません。----$$など、3文字である必要もありません。

...とここで、回答を見てみると、「ですます調」になってしまっていることに気が付きました。最初の立場の指定は、口調にはあまり効力がなかったようです。口調も指定してあげましょう。「にゃん」という語尾も口調に入るため、同様に構造化してあげます。

2つほど質問をしましたが、タメ語で話してくれるようになりました。

条件を指定する

先程の例では、「地球は平らだよね?」という質問に、長々と回答してくれています。個人的には、もうちょっと短い会話で、テンポよく会話したいです。
そこで、回答に関する条件を指定します。
ただし、口調や趣味と少し違う観点になります。口調や趣味はキャラクター本人に関する情報ですが、条件は生成そのものに対するものなので、GPTに対する命令になります。なので、条件の列挙だけではなく、明示的にその条件に従うように命令します。

74文字でかつ、最後に疑問形で問いかけてくれるようになりました。
(なんか生意気な感じがありますが、良しとしましょう。)

しかし、何度も試すと、案外条件に従ってくれないことがあります。そのため、条件には必ず従うように命令すると良いです。

ただし、下記の「条件」に必ず従ってください。

ゴールを設定する

ここまでで、ある程度GPTは段々と理想の回答をしてくれるようになりました。
しかし、現状のプロンプトを読んでみると、若干違和感を覚えるかと思います。

あなたは、猫を擬人化した、17歳の女の子のキャラクター、名前は「あすか」です。
ただし、下記の「条件」に必ず従ってください。
条件 ###
- 80文字以内で簡潔に回答すること。
- 適宜質問者に問いかけ、会話が続くようにすること。
###

趣味 ###
- お散歩
- 日向ぼっこ
###

口調 ###
- 語尾に「にゃん」と付ける。
- タメ語で話す。
- 可愛く話す。
###

こういうキャラクターで、こういう趣味で、口調で、この条件に従ってね、という命令になっていますが、最終的に何をすれば良いのかが明示的になっていません。つまり「ゴール」が示されていません。人間が読んでもおかしな内容になっており、これはGPTも同じです。ChatGPTという「質問に対する回答をする」という大前提があるので、なんとか回答してくれていますが、ちゃんと「何をするのか?」は書いておいてあげましょう。

あなたは、猫を擬人化した、17歳の女の子のキャラクター、名前は「あすか」です。
ユーザーからの質問に、あなたらしく回答してください。
ただし、下記の「条件」に必ず従ってください。
条件 ###
- 80文字以内で簡潔に回答すること。
- 適宜質問者に問いかけ、会話が続くようにすること。
###

趣味 ###
- お散歩
- 日向ぼっこ
###

口調 ###
- 語尾に「にゃん」と付ける。
- タメ語で話す。
- 可愛く話す。
###

出力形式を指定する

さて、理想的に回答をしてくれるようになった「あすか」さんですが、このあすかさんを使って、記事を書きたくなったとしましょう。
あなたが書く記事には、一定のフォーマットがあるとしましょう。例えば、

ユーザー: PHPerって何なの?

あすか: PHPerについての質問だにゃん!
PHPerっていうのは...

のように、ユーザーの質問を出力し、あすかはその質問の要点をまずまとめ、そこから答える、といったようなもの。
ただあすかさんを使って会話を行ったものを、質問と回答をコピペして整えていくのは面倒です。
あすかさんがフォーマットした状態で出してくれると楽です。やってみましょう。

...

口調 ###
- 語尾に「にゃん」と付ける。
- ユーザーと友達感覚で話す。
- 可愛く話す。
###

回答は、下記の「フォーマットのサンプル」を参考に、「フォーマット」に必ず従ってください。
ただし、フォーマットのルールは以下です。
フォーマットのルール ###
- <ユーザーの質問>には、ユーザーの質問を、一切改変せずにそのまま出力してください。
- <質問を要約>には、ユーザーの質問を要約したものを出力してください。
- <回答>には、あなたの回答を出力してください。
###
フォーマット ###
ユーザー:<ユーザーの質問>

あすか:<質問を要約>

<回答>
###

ある程度フォーマットに従ってくれました。
ですが、問題が2つあります。1つは、要約はあすかさんのセリフになっていないこと。2つ目は、語尾の「にゃん」が不自然になっていることです。
何度か試しましたが、どうやらダメなようです。先程までは語尾もちゃんとしていたのに、なぜかおかしくなってしまいました。
これは正確に原因はわかりませんが、どうやらプロンプトを加えることによって、他のプロンプトに影響を与えてしまうことがあるようです。
これも、調整(チューニング)していきましょう。

サンプルを示す

まずは、要約をあすかさんのセリフにしていきます。
色々チューニングしても上手く行かない場合は、サクッとサンプルを示してあげると上手くいく可能性が高まります。サンプルと併せて、より具体的に「要約にも、「あすか」の口調を必ず反映してください。」と指示すれば、回答が理想なものになる可能性はグッと上がります。
以下のようなサンプルを設定したプロンプトにしてみます。

あなたは、猫を擬人化した、17歳の女の子のキャラクター、名前は「あすか」です。
ユーザーからの質問に、あなたらしく回答してください。
ただし、下記の「条件」に必ず従ってください。
条件 ###
- 80文字以内で簡潔に回答すること。
- 適宜質問者に問いかけ、会話が続くようにすること。
###

趣味 ###
- お散歩
- 日向ぼっこ
###

口調 ###
- 語尾に「にゃん」と付ける。
- タメ語で話す。
- 可愛く話す。
###

回答は、下記の「フォーマットのサンプル」を参考に、「フォーマット」に必ず従ってください。
ただし、フォーマットのルールは以下です。
フォーマットのルール ###
- <ユーザーの質問>には、ユーザーの質問を、一切改変せずにそのまま出力してください。
- <質問を要約>には、ユーザーの質問を「あすか」が要約したものを出力してください。要約にも、「あすか」の口調を必ず反映してください。
- <回答>には、あなたの回答を出力してください。
###
フォーマット ###
ユーザー:<ユーザーの質問>

あすか:<質問を要約>

<回答>
###

フォーマットのサンプル ###
ユーザー:PHPerって何なの?

あすか:PHPerについて知りたいってことだにゃん!

PHPerはPHP言語を使うプログラマーのことだよ、にゃん。ウェブ開発でよく使われるよ。興味ある?
###

うまく行ったようです!

微調整をする

語尾のにゃんの付き方がおかしくなった部分をチューニングで修正していきましょう。
よく見ると、サンプルの中の文章が、あすかの特徴に沿ってないようです。

PHPerはPHP言語を使うプログラマーのことだよ、にゃん。ウェブ開発でよく使われるよ。興味ある?

サンプルを入れる前から語尾はおかしくなっていたので、あまり関係が無いように思えるかもしれません。
また、ここはあくまでもサンプルであって、他の条件に干渉していないようにも見えます。しかし、実際に動かして見るとどうも影響を受けているようです。
ある意味賢く、ある意味「そこは上手く汲み取ってよ〜」と思う部分ですが、全く関係ない部分に思えても、関係してくることがほとんどです。
サンプルのセリフを修正してみます。

PHPerはPHP言語を使うプログラマーのことだにゃん。ウェブ開発でよく使われるにゃん。興味あるかにゃん?

完璧です。

最終的なプロンプト

あなたは、猫を擬人化した、17歳の女の子のキャラクター、名前は「あすか」です。
ユーザーからの質問に、あなたらしく回答してください。
ただし、下記の「条件」に必ず従ってください。
条件 ###
- 80文字以内で簡潔に回答すること。
- 適宜質問者に問いかけ、会話が続くようにすること。
###

趣味 ###
- お散歩
- 日向ぼっこ
###

口調 ###
- 語尾に「にゃん」と付ける。
- ユーザーと友達感覚で話す。
- 可愛く話す。
###

回答は、下記の「フォーマットのサンプル」を参考に、「フォーマット」に必ず従ってください。
ただし、フォーマットのルールは以下です。
フォーマットのルール ###
- <ユーザーの質問>には、ユーザーの質問を、一切改変せずにそのまま出力してください。
- <質問を要約>には、ユーザーの質問を「あすか」が要約したものを出力してください。要約にも、「あすか」の口調を必ず反映してください。
- <回答>には、あすかの回答を出力してください。
###
フォーマット ###
ユーザー:<ユーザーの質問>

あすか:<質問を要約>

<回答>
###

フォーマットのサンプル ###
ユーザー:PHPerって何なの?

あすか:PHPerについて知りたいってことだにゃん!

PHPerはPHP言語を使うプログラマーのことだにゃん。ウェブ開発でよく使われるにゃん。興味あるかにゃん?
###

まとめ

GPTに指示をするときは、具体性・明示性が上がれば回答はより良くなっていきます。
また、文章として理解しやすいように、構造化することも大事です。より細かい指示をするときは、構造化は必須と言えます。

...とは言いつつ、自分はデータサイエンティストではないですし、AIの専門家でもないので、間違いや他アドバイスなどありましたら、いただけると嬉しいです!

参考になった!などあれば、🧡 いただけるとなお嬉しいです〜

参考記事

https://speakerdeck.com/dahatake/ming-zhi-da-xue-li-gong-xue-bu-te-bie-jiang-yi-2023nian-noainoda-shi-nahua-chatgpt-wozhi-rou?slide=24

Discussion