見出し画像

ChatGPTの返答の信頼性を上げる、古畑任三郎式プロンプト構築

ChatGPTの返答の信頼性を上げるには、段階的に回答に近づくよう手順を指示すると効果的です。古畑任三郎は警視庁捜査一課の殺人事件担当である古畑任三郎が主役のドラマで、最初に明かされる犯人が張り巡らせたアリバイを古畑任三郎が一つ一つ崩していくことで逃げ場をなくし、最終的に自白に追い込むスリリングな展開が魅力です。ChatGPTの元となったGPT-3は古畑任三郎よろしく段階的に回答への道を絞り込み最後に回答させるようにすると信頼性が高まることが確認されています。ChatGPTでも同様の手法で返答の信頼性を上げられることが期待できます。

本記事では、主にOpenAI公式のOpenAI CookbookとGPT-3からChatGPTに至るために使用された学習方法に近いと推定されるInstructGPTの論文を参照して古畑任三郎式プロンプト構築が有効である理由を示します。

ChatGPTに対しどのようなプロンプトの与え方が良いのか、研究が進んでいるところですがまだ追い切れていません。ChatGPTは実際のところどう学習されているのか詳細は明らかでなく内部のモデルも更新が継続しています。そのため、確からしい傾向が特定されるのはまだ時間がかかるように思います。その間にChatGPTのベースとなっているGPT-3、またInstructGPTから推定される有効な手法を知っておくことは悪くないでしょう。

OpenAI Cookbookで示されているテクニック

OpenAI CookbookはOpenAIオフィシャルのAPIの利用ガイドです。単にAPIの利用方法だけでなく、効果的なプロンプトの与え方についても言及があります。"Techniques to improve reliability"には、GPT-3が複雑なタスクを直接解くことに失敗する場合があること、失敗を回避するには結論に至る段階的なステップ(Chain of Thought)を出力させる/支持することが有効であることが記載されています。

ガイド内で言及されている効果が確認できた事例をいくつか挙げます。

  • 数値演算を含む推論タスクを解かせる際、回答させる前に"Let's think step by step."を付与すると精度が17.7%から79%に向上。ただ、常識を問う質問や回答を導く形式の推論以外のタスクでの効果は限定的(Large Language Models are Zero-Shot Reasoners)。

  • 回答例を与えるプロンプト(Few-shot)の場合、回答例に回答に至った段階的なプロセス(Chain of Thought)を与えることで、スポーツの理解など数値演算を含む推論以外のタスクでも効果があることを確認(Language Models Perform Reasoning via Chain of Thought)。

後者の論文にテニスボールの数を計算するプロンプトの例が紹介されています。ChatGPTでもChain of Thoughtを与える場合と与えない場合で効果が確認できました。まずは与えない場合です。答えは23 - 20 + 6 = 9個ですが、めっちゃ間違っています。

テニスボールの計算(2023/5/1時点のGPT-3.5で検証)

次に、段階的な計算方法を例示した場合です。

段階的指示を与えたテニスボールの計算(2023/5/1時点のGPT-3.5で検証)

段階的な指示を与える場合と与えない場合、それぞれ5回回答を生成しましたが与えない場合は正解数0に対し、与えた場合は毎回正解でした。ChatGPTにおいても、段階的な指示が回答の安定性に寄与することがわかります。

テクニックの背景にあるモデルの性質

なぜ段階的な指示が有効なのでしょうか? これは、GPT-3が言語モデルであることと学習に使用されたデータが影響しています。

言語モデルは現在のトークンから次のトークンを予測するモデルです。「東京」から「タワー」を予測する、といったイメージです。このようなモデルの性質を考慮すると、回答に至る根拠が事前に生成されているほど最後の回答の精度が高まることが想像できます。まさに古畑任三郎。半面、最初に回答を出力させ後に理由を述べさせる形式だと安定しないことも理解できます。最初の生成は事前のコンテキストがないため不安定であり、不安定な回答に続く理由はすべて誤りから連鎖した記述になるため意味がなくなります。

学習に使用されたデータに近いほど正答が得やすいのは自明です。ChatGPTはGPT-3を対話形式のデータで学習したと想定されるモデルであり、学習方法はOpenAIより公開されているInstructGPTに近いと推察されます。InstructGPTの論文の付録、"A.2 API user prompts"で、どのようなデータが使われたのかいくつか参照することができます。データからは、1) 全体的に短文であること、 2) 具体的な指示を与える場合は、例示を与えることが多いこと、がわかります(データはOpenAI APIに実際送られたリクエストが使われています)。

"Training language models to follow instructions with human feedback"より引用

このことから、ChatGPTへ指示を与える場合は 1) 長い指示は学習時に稀であるため対応できない可能性がある、 2) 指示を与える場合は例示が効果的、であることが推察できます。ChatGPTへ指示を与える際は、これらを意識するとよさそうです。

個人的に英語の添削でChatGPTを使用しているので、本記事執筆で得られた知見を添削のプロンプトの改善に活かしてみたいと思います。皆様のプロンプトの改善にお役に立てば幸いです!


この記事が気に入ったらサポートをしてみませんか?