はじめに
前回までの記事では、ChatGPTに興味はあるものの、活用イメージがわかない方々に向けて、ChatGPT APIを利用するとどのようなサービスが開発できるのかを中心に具体定な実装を交えてご紹介してきました。今回は最終回として、ChatGPTのみならず全てのLLMを扱う上で重要となる、プロンプトエンジニアリングについて解説します。
プロンプトエンジニアリングとは
大規模言語モデル(LLM)を利用するにあたって、モデルに入力する文章を主に「プロンプト」と呼びます。このプロンプトはLLMを扱う上で非常に重要で、その良し悪しによって出力結果の品質や安定性は大きく左右されます。昨今、このプロンプトの内容をどのように入力すればLLMが良質な回答を生成できるのかという研究が世界中で盛んに行われており、そのような研究分野やテクニックは「プロンプトエンジニアリング」と呼ばれています。
LLMと人間との違いを明確に理解する
まるで人間のように言葉による指示で動作するLLMですが、良質なプロンプトとは、ただ単に「わかりやすく具体的な指示を出す」や「前提条件を明確にする」といった、対人間のコミュニケーションにも当てはまるようなものばかりではありません。LLMはもはや人間以上の読解力を持っているとも言われていますが、やはり人間とは根本的に異なる存在なのです。効果的なプロンプトを考案するためには、私たち人間が会話をするときに頭の中で行なっていることと、LLMの内部処理として行われていることとの違いを明確に理解しておくのが重要です。それらの点について、勘違いされがちなポイントを中心にいくつか例を挙げて解説します。
LLMは「会話」をしているわけではない
まるで人間のような受け答えが生成できてしまうため、LLMは人間のように会話を行なっていると考えられがちですが、実際には、現在主流となっているLLMの主な機能は、与えられたテキストの続きを予測することにあります。その予測能力は、事前に大量のテキストデータを分析し、言葉やフレーズがどのような文脈で使用されるかを学習することによって成り立っています。
ChatGPTを通して私たちが体験しているまるで会話のようなやりとりは、実際のところ、会話文という形態の文章の続きを補完するという挙動に他なりません。LLMは私たちの言葉を理解し、それに応えているわけではないのです。つまり、私たちがLLMを使う時、あたかも人間に話しかけるように要望を伝えることが多いと思いますが、必ずしもそれがベストとは限らないということです。
もしこれまで通りの語りかけるようなプロンプトで期待する出力が得られない場合は、例えばマークダウン形式などで、欲しい部分の直前までを記述した書きかけの文書を提示し、続きを補完してもらうアプローチを取ると、違った結果が得られるかもしれません。
LLMは自身の知識を自由に引き出せるわけではない
ChatGPTに「文章を上手く書くコツ」と尋ねれば、きっと何か具体的な方法論を提供してくれると思います。これは、ChatGPTは文章作成における説明可能なノウハウを「知っている」と解釈できます。しかし、異なる文脈で「特定のトピックにおける上手な文章」を依頼すると、それらの技術が適用されていないことが多々あります。
人間に置き換えると少し奇妙に思えますが、この現象はLLMが内部の知識を自身で参照できないために起こると考えれば腑に落ちてくるのではないでしょうか。膨大なテキストデータで訓練されたLLMには、相当な量の情報がデータベースのように保存されていると思われがちですが、実際はそうではありません。LLMが生成する文章に含まれる知識や情報は、文章補完を行った結果として初めてそこに発現したものであり、参照可能なデータとしてあらかじめ内部に存在していたわけではないのです。それらは文脈上に文字として出力されて初めて明確な情報として形を成します。そのため、LLMは自身で出力可能な知識を、出力する前に参照することはできないのです。
ですから、LLMの性能をフルに引き出すには、最終的に欲しい答えを得るまでの過程で、必要な情報を一旦言葉としてアウトプットさせることが非常に重要になります。
LLMは「思考」する能力を持たない
意外に思う方もいるかもしれませんが、LLMは計算や論理的な推論が得意ではありません。例えば、五目並べなどのゲームでLLMと対戦するプログラムを開発してみると、初めのうちはそのあまりの弱さに驚かされることでしょう。LLMがそのような特定のタスクで性能を発揮できない主な理由は、本質的に「思考」する能力を持たないためです。
私たち人間は、会話をする時に多かれ少なかれ頭の中で思考を伴うので、それに近いやりとりを行えるLLMにも同様の思考力が備わっていると勘違いしてしまいがちですが、それは誤りです。LLMとは、膨大なパラメーターを持つニューラルネットワークであり、わかりやすく言うと巨大な計算式です。巨大であれ何であれただの数式ですから、入力と出力の間の見えないところで記憶を探ったり、あれこれ考えたり、思いを巡らせるといった機能はそもそも備わっていません。
しかしながら、昨今の研究では、LLMの使い方を工夫すれば、ある程度の思考能力は実装できることがわかってきました。LLM単体では実現困難な、複雑な思考過程を必要とするタスクでは、LLMを多段的に使いながら最終的に一つの結論を導くようなプログラムを組むことで解決できるかもしれません。
もちろんLLMと人間との違いはこれだけではありませんが、これらの内容を踏まえ、LLMの特性や、ただ単純に指示するだけでは実現できないことなどを念頭に置いてプロンプトを考えれば、アウトプットの品質向上が見込めます。
さらに、これまでの研究により、体系化されたプロンプトの作り方が数多く発表されています。それらの知識を取り入れながら、状況に合わせてアレンジしていくことで、あなたのプロンプト作成技術はより強固なものとなるでしょう。主要なものをいくつかご紹介します。