ブログ 学習 機械学習 深層学習 自然言語処理

【プロンプトエンジニアリング】ChatGPTの応答の質を上げる方法!

皆さんはChatGPTの応答文に不満を持ったことはありませんか?
例えば、簡単な質問なのに間違える、思い通りの仕事をしてくれないなど様々あると思います。以下の例を見てください。

これは、算数の問題を解いてもらう前に、例題とその答えを記載したもので、その答えの記載内容の違いがChatGPTからの応答文にどのような影響を与えるかを試したものです。左側の例は答えのみを記載しもので、右側の例は解き方を含めて記載したものです。結果、左側は誤った解答を、右側は正しい解答を出力しました。

このようにChatGPTでは入力文章によって応答文の正確性が異なるという現象がみられます(厳密にはChatGPT以外のAIも同様)。ですので、思い通りの応答を得たければ、そのための工夫が必要になります。

世の中には、ChatGPTから高い性能を引き出すための文章を見つけようと様々試している人がいます。そのような作業をプロンプトエンジニアリングと言います。プロンプトエンジニアリングにより、ChatGPTから良い出力が得られる傾向の高い入力文を発見できれば、ChatGPTから満足度の高い応答を得ることが可能になります。

ということで、本記事では、ChatGPTの応答の質を上げる方法として、プロンプトエンジニアリングを説明していきます。

※ちなみに、上の例のような問題であれば、例題を示さずに問題を入力しても正しい答えを導いてくれます。私の解釈ですが、左の場合は、例題の解答において値のみしか示さなかったため、その表記に従おうとして、いきなり答えとなる値を出して間違ってしまったと考えられます。ChatGPTは言語モデルであり、その性質上、入力文から次の単語を予測するため、8000という数値は計算式を立てて求められた値ではなく、問題文から求められた値です。初めに答えとなる値を記載してしまっているため、後から修正することができず、やむを得ず足し算の答えを強引に間違わせて、全体としてなんとなく正しそうに取り繕っただけでしょう。決してChatGPTに四則演算能力が無くて間違ったというわけではありません。ChatGPTは例題程度の四則演算なら容易に熟せます。

プロンプト

言語生成AIのChatGPTや、お絵描きAIのStable Diffusionなど、テキスト入力をインタフェースとして持つAIの入力をプロンプトと言います。日本語では呪文と呼ばれることがあります。

以下は、HuggingFaceで公開されているブラウザ経由で利用できるStable Diffusionのデモページです。テキストは、「Enter your prompt」「Enter a negative prompt」と書かれている部分に入力します。前者には作成して欲しい絵に関するテキストを、後者には生成時に除外して欲しいものに関するテキストを記載します。

もう1つの例として、ChatGPTのページを以下に示します。以下の画像中、一番下にテキストの入力欄があり、そこにテキストを入力します。これもプロンプトと呼びます。

このように、AIに入力するテキストをプロンプトと呼ぶのです。

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

プロンプトには、項目ごとにカンマで区切るような表現を使うこともできますし、私たち人間が会話するような自然な文章を入力することもできます。伝えたいことは明確でも、その表現方法は多種多様です。表現が少し異なるだけでAI(以降、モデル)の出力は大きく異なります

以下の図を見てください。今、あなたは左の「タスク」の記載内容をモデルに解かせたいとします。以降、本記事では、あなたがモデルで実現したい明確な内容を「タスク」と呼ぶことにします。タスクに記載の内容をそのままプロンプトとしてモデルに入力しても良いですが、様々な表現・言い回し、文章の追加などを行ったものをプロンプトとしてモデルに入力することを考えます。今回は、3種類のプロンプト1~3を考えます。このとき、3種類の出力1~3が得られました。得られた出力ごとに受け取りての人間の満足度は異なり、最も良い出力は2番だったとします。このとき、出力2を生成するときに用いたプロンプト2が良い入力表現だったと考えることができます。そして、プロンプト2の表現は、別の類似タスクにも有効であると考えられます。このように、良い出力が得られるようなプロンプトを探すのが重要であり、それをプロンプトエンジニアリングと言います。プロンプトエンジニアリングは、近年登場したばかりの新しい研究分野です。

プロンプトエンジニアリングの種類

本記事では、ChatGPTのプロンプトエンジニアリングに限定して代表的なものを2つ説明します。ChatGPT以外のモデルでは、今回示す方法が必ずしも最適であるとは言えませんのでご了承ください。

タイプ1

1つ目として、タスクの前に類似タスクを例示してあげる方法を紹介します。この場合のプロンプトの構造は以下のようになります。

幾つか例をみてみましょう。まず、イニシャリズムの例です。以下の場合は、イニシャリズムから元となっている英語を予測するタスクです。ここで実現したいタスクは、「CNN->」です。本当は、問題文も記載すべきなのかもしれませんが、問題文を記載しなくても直前の例示のみから、何をやっているかを理解し、適切な応答文を生成してくれます。

これよりも複雑な場合に対しても適用することができて、以下のように問題を解く前に類似の例題を示してあげることで、同じような手順・流れで解答を出してくれるようになります。以下の例では、「問題:~16000mLである。」までが例示、「それでは、~」がタスクです。

タイプ2

2つ目として、タスクの後に解答の一部分を記載する方法を紹介します。このときのプロンプトの構造は以下のようになります。
(図中、手順と記載していますが、そのワードが適切なのかは分かりません・・・)

タスクの内容をプロンプトとするだけでは、解答方法が全てChatGPTに任せられてしまうため、ChatGPT自身が解き方を知らない問題の場合、信じられないような解き方をしてくる可能性があります。それを防ぐ方法として、解答の初めの部分を示してあげる方法があります。先ほど示した算数の問題の例を以下に示します。このとき、タスクは「以下の~ですか?」であり、手順は「まず最初に、~求めると、」です。このようにすることで、手順に示した流れに適合する続きの文章を生成してくれます。

プロンプトエンジニアリングの注意点

プロンプトエンジニアリングは、モデルの応答精度を上げることができる素晴らしい手法であると思われるかもしれませんが、必ずしも応答精度を上げる方向に働くとは限りません。プロンプトが悪いと、タスクの内容をそのままプロンプトにした場合よりも性能は下がります。冒頭でも紹介したものを再掲します。

間違った理由については、私の解釈ですが冒頭の米印(※)で述べています。要するに、間違いを誘発させるようなプロンプトだったということです。

プロンプトエンジニアリングにおいて重要なこと

ChatGPTなどの学習済みのAIは既に言葉を理解できるようになっていて、デフォルトでもある程度の精度でタスクを達成してくれますが、より良いプロンプトを与えれば、応答精度がより向上し、一方で悪いプロンプトを与えれば逆に応答精度は低下します。ですので、プロンプトエンジニアリングは重要なのです。とはいっても専門家でもないとプロンプトエンジニアリングは大変だと思いますので、簡単な方針を示すと、ChatGPTの応答の質を上げたければ初めて会う人に仕事をお願いすると思って丁寧に説明してみましょう

プロンプトが変わると応答精度が変わることに関する私の解釈ですが、私たちは頭の中にあるワーキングメモリに思考内容を記録しながら、思考を整理し相手に伝えるうえで必要なことを言語化して話しますよね。ChatGPTも同じことができるのかと思いきや、ChatGPTにはワーキングメモリはありません。簡単な内容であればビッグデータを用いた機械学習により直感が鍛えられいおり、正しい答えを導ける場合もあるかもしれませんが、複雑な問題になると途端に精度が下がるのは、ChatGPTにワーキングメモリが無く、私たちが口に出さずに頭の中で思考するようなことが不可能だからだと考えています。では、ChatGPTにはワーキングメモリが無いから私たち人間が行うような複雑な思考はできないかと言えば、そうではありません。私たちとChatGPTとの対話履歴がChatGPTのワーキングメモリになると考えることができます。ですので、あなたが言葉にせずに頭の中で考えるようなこともChatGPTには逐一画面に出力させるように指示することで、段階的に複雑な思考を実現できるようになります。ですので段階的に答えを求めるように指示すると難しい数学や物理の問題でも解ける現象が起こるのも納得です。あなたは、AIのワーキングメモリに直接アクセスできるのです。そう思えば、どの様に説明してあげれば性能が高くなるか、なんとなく分かってくるのではないでしょうか?

まとめ

プロンプトとはChatGPTなどのAIへの入力テキストのことです。同じ内容でも表現方法によってはAIの出力が異なるため、自分の欲しい情報を出してくれるようにプロンプトを調整することが重要で、それをプロンプトエンジニアリングと言います。より良いプロンプトを与えれば応答精度が上がり、一方で悪いプロンプトを与えれば応答精度が下がります。

ChatGPTで使用される代表的なプロンプトエンジニアリングには、タスクの前に例をいくつか示してあげる手法と、タスクの後に解き方の手順などを途中まで示してあげる手法があります。ここでは紹介していない手法も多数ありますが、数学や物理のような問題であれば基本的には段階的に答えるように指示することで精度を高めることができます。迷ったら、初めて会う人に仕事をお願いすると思って丁寧に説明してあげましょう。

あなたはChatGPTのワーキングメモリを握っているのです。より良い出力を出してもらうためには、自分だったらどのような情報が欲しいかを考えて、情報を教えあげれば精度が上がるのではないでしょうか?

内容は以上になります。最後までお読みいただきありがとうございました。

  • この記事を書いた人
管理人

管理人

このサイトの管理人です。 人工知能や脳科学、ロボットなど幅広い領域に興味をもっています。 将来の目標は、人間のような高度な身体と知能をもったパーソナルロボットを開発することです。 最近は、ロボット開発と強化学習の勉強に力を入れています(NOW)。

-ブログ, 学習, 機械学習, 深層学習, 自然言語処理

PAGE TOP