【超有料級】プロンプトエンジニアリング解体新書

記事
IT・テクノロジー
プロンプトエンジニアリングは、言語モデル(LLMs)を効率的に使用するためのプロンプトを開発および最適化する比較的新しい学問分野です。プロンプトエンジニアリングのスキルを身につけることで、大規模言語モデル(LLMs)の能力と限界をより理解することができます。

研究者は、プロンプトエンジニアリングを使用して、質問応答や算術推論などの一般的なおよび複雑なタスクのLLMsの能力を向上させます。開発者は、LLMsやその他のツールとのインタフェースとなる強固で効果的なプロンプテクニックを設計するためにプロンプトエンジニアリングを使用します。

プロンプトエンジニアリングは、プロンプトの設計と開発に限らず、LLMsとのインタラクションおよび開発に役立つ幅広いスキルと技術を含みます。これは、LLMsとインタフェースすること、ビルドすること、能力を理解することに重要なスキルであり、LLMsの安全性を向上させたり、ドメイン知識や外部ツールを使用してLLMsの機能を拡張するためにプロンプトエンジニアリングを使用できます。

LLMsでの開発に高い関心があることから、この新しいプロンプトエンジニアリングガイドを作成しました。最新の論文、学習ガイド、モデル、講義、参考文献、新しいLLMの機能、およびプロンプトエンジニアリングに関連するツールがすべて含まれています。

はじめに


プロンプトエンジニアリングは、言語モデル(LM)を効率的に使用するためのプロンプトの開発と最適化のための比較的新しい学問分野です。プロンプトエンジニアリングのスキルは、大規模な言語モデル(LLM)の能力と限界をより良く理解するのに役立ちます。研究者は、プロンプトエンジニアリングを使用して、質問応答や算術推論などの一般的で複雑なタスクの幅広い範囲でLLMの能力を向上させます。開発者は、プロンプトエンジニアリングを使用して、LLMやその他のツールとインターフェースする堅牢で効果的なプロンプティング技術を設計します。

このガイドでは、プロンプトの基本をカバーし、大規模な言語モデル(LLM)とやり取りして指示する方法の概要を提供します。

すべての例は、OpenAIのプレイグラウンドを使用した text-davinci-003 でテストされています。デフォルトの設定、すなわち temperature = 0.7 および top-p = 1 を使用しています。

LLMの設定


プロンプトを使用する場合、APIを経由、または直接LLMと対話することになります。いくつかのパラメータを設定することで、プロンプトに異なる結果を得ることができます。

Temperature - 簡潔に言うと、この値が低ければ低いほど、最も確率が高い回答が常に選ばれるため、結果はより決定論的になります。この値を上げると、ランダム性が増し、より多様で創造的なアウトプットが可能になります。つまり、他の回答の可能性のある重みを増やすことになります。応用例としては、事実に基づくQAなどでは、この値を低くして、より事実に基づいた簡潔な回答を促すとよいでしょう。逆に、詩の生成やその他の創造的なタスクでは、temperatureを上げると効果的かもしれません。

Top_p - 同様に、核サンプリングと呼ばれるサンプリング手法であるtop_pでは、モデルが応答を生成する際の決定性をコントロールすることができます。正確で事実に基づいた回答を求めるのであれば、この値を低くしておきます。より多様な回答を求めるのであれば、より高い値にします。

一般的には、両方ではなく、どちらかを変更することをお勧めします。
基本的な例から始める前に、あなたの使っているLLMのバージョンによって結果が異なる可能性があることを予めご承知おきください。

基本的なプロンプト


シンプルなプロンプトでも多くを達成できますが、結果の品質は提供する情報の量とそのクオリティによって異なります。プロンプトには、モデルに渡す指示や質問のような情報、文脈、入力、または例などの他の詳細を含めることができます。これらの要素を使用して、モデルをより適切に指示し、より良い結果を得ることができます。
まずは、シンプルなプロンプトの基本例について説明しましょう。

プロンプト
空が
出力
青い
晴れた日には空は青く、曇った日には空は灰色や白色になることがあります。
おわかりのように、言語モデルは、文脈「"空が"」に合った文字列の続きを出力します。出力は、予期しないものであったり、私たちが達成したいタスクからかけ離れていたりする可能性があります。

この基本例は、より多くの文脈や指示を提供する必要性を強調するものでもあります。
少し改善してみましょう。

プロンプト:
以下の続きとなる文を完成させてください:
空が
出力:
青くとてもきれいです。
これでより良くなりましたか? これで文を完成するようにモデルに指示したため、結果ははるかに良くなりました(「文を完成する」という指示に忠実に従っているため)。このように、タスクを実行するために最適なプロンプトを設計するアプローチをプロンプトエンジニアリングと呼びます。

上記の例は、LLM(Language Model)で実現できることの基本的な例です。今日のLLMは、テキスト要約から数学的推論、コード生成まで、あらゆる種類の高度なタスクを実行できます。

プロンプトのフォーマット


上記で非常にシンプルなプロンプトを試しました。標準的なプロンプトのフォーマットは次のとおりです。
<質問>?
または
<指示>
これは、質問応答(QA)フォーマットにフォーマットすることができます。これは、多くのQAデータセットで標準的です。
Q: <質問>?
A:
上記のようにプロンプトを行う場合、zero-shot promptingとも呼ばれます。つまり、どんな例やデモンストレーションもなく、直接モデルに応答を求めています。いくつかの大規模言語モデルには、zero-shot promptingを実行できる機能がありますが、それは対象のタスクの複雑さと知識に依存します。

上記の標準フォーマットを考えると、few-shot promptingと呼ばれる人気の高い効果的なプロンプティング技術があります。フューショットプロンプティングでは、サンプル(デモンストレーション)を提供します。フューショットプロンプティングは、以下のようにフォーマットすることができます。
<質問>?
<答え>
<質問>?
<答え>
<質問>?
<答え>
<質問>?

QAフォーマットバージョンは以下のようになります。
Q: <質問>?
A: <答え>
Q: <質問>?
A: <答え>
Q: <質問>?
A: <答え>
Q: <質問>?
A: 

QAフォーマットを使用する必要はないことに注意してください。プロンプトフォーマットは、対象のタスクによって異なります。たとえば、簡単な分類タスクを実行し、以下のようにタスクを示すサンプルを提供することができます。

プロンプト:
これは素晴らしい! // ポジティブ
これは酷い! // ネガティブ
あの映画は最高だった! // ポジティブ
なんてひどい番組なんだ! //
出力:
ネガティブ
few-shot promptingにより、文脈に沿った学習が可能になります。言語モデルがタスクを学習するために、わずかなサンプルを提供することができます。

プロンプトの要素


プロンプトエンジニアリングで可能な例やアプリケーションをカバーするにつれて、プロンプトを構成する特定の要素があることに気づくでしょう。
プロンプトには、以下のいずれかのコンポーネントが含まれることがあります。

命令 - モデルに実行してほしい特定のタスクまたは命令

文脈 - 外部情報や追加の文脈が含まれる場合があり、モデルをより良い応答に導くことができます。

入力データ - 応答を見つけたい入力または質問

出力指示子 - 出力のタイプや形式を示します。

すべてのコンポーネントが必要なわけではなく、フォーマットは手元のタスクに依存します。次のガイドで具体的な例を取り上げます。

プロンプトの設計に関する一般的なヒント

簡単に始める

プロンプトの設計を始める際には、プロンプトの設計が、最適な結果を得るために多くの実験を必要とする反復的なプロセスであることを念頭に置く必要があります。OpenAIやCohereのようなシンプルなプレイグラウンドから始めると良いでしょう。

シンプルなプロンプトから始め、結果を向上させるために要素や文脈を追加していくことができます。そのためにはプロンプトのバージョン管理が重要です。このガイドを読むと、具体性、簡潔さ、明確さがより良い結果をもたらすことがわかるでしょう。

多くの異なるサブタスクを含む大きなタスクがある場合、タスクをよりシンプルなサブタスクに分解し、結果が改善されるにつれて徐々に構築していくことができます。こうすることで、プロンプトの設計プロセスが複雑になりすぎるのを避けられます。

指示

「書く」「分類する」「要約する」「翻訳する」「並べ替える」などのコマンドを使用して、モデルに達成したいことを指示することで、さまざまなシンプルなタスクに対する効果的なプロンプトを設計することができます。

最適な結果を得るためには、異なるキーワード、文脈、データを使用した異なる指示を試して、特定のユースケースやタスクに最適なものを見つける必要があります。通常、タスクに関連した文脈が具体的であるほど、結果が良くなります。次のガイドで、サンプリングやより多くの文脈を追加することの重要性について触れます。

また、指示はプロンプトの最初に配置し、指示と文脈を区切るために「###」のような明確な区切り記号を使用することが推奨されています。

例えば:
プロンプト:
## 指示 ###
以下のテキストをスペイン語に翻訳してください。
Text: "hello!"
出力:
¡Hola!
特異性

モデルに実行してほしい指示やタスクについて、非常に具体的に説明してください。プロンプトが詳細で具体的であるほど、結果はよくなります。特定の出力やスタイルを望む場合には、特に重要です。より良い結果をもたらすトークンやキーワードはありません。良いフォーマットと詳細なプロンプトを用意することが重要です。実際、プロンプトに例を提供することは、特定のフォーマットで出力を得るために非常に効果的です。

プロンプトの長さには制限があるため、プロンプトの設計時にはその長さを念頭に置かねばなりません。どの程度具体的かつ詳細にするかを考える必要があります。余計な詳細を含めることは必ずしも良いアプローチではありません。詳細は関連性があり、課題に貢献する必要があります。これは多くの実験と反復を必要とすることです。アプリケーションに最適なプロンプトを最適化するために、多くの実験と反復をお勧めします。

例えば、次のテキストから特定の場所の名前を抽出する簡単なプロンプトを試してみましょう。

プロンプト:
以下のテキストから場所の名前を抽出してください。
望ましいフォーマット:
Place: <comma_separated_list_of_company_names>
入力:「これらの進展は研究者にとって励みになっていますが、まだ多くのことが謎のままです。リスボンのシャンパリマウド・センター・フォー・ジ・アンノウンの神経免疫学者であるヘンリーク・ヴェイガ・フェルナンデスは、「脳と周辺部で見られる効果の間にはしばしばブラックボックスがあります」「治療的な文脈で使用したい場合、実際には作用機序を理解する必要があります。」」
出力:
Place: リスボンのシャンパリマウド・センター・フォー・ジ・アンノウン
不正確さを避ける

詳細に記述したりフォーマットを改善したりする上記のようなヒントを考慮すると、プロンプトを巧みに操ろうとしたり、不正確な説明を作り出してしまったりするといった罠へ陥りやすくなります。具体的で直接的である方が良い結果が得られます。ここでの類似性は、効果的なコミュニケーションと非常に類似しています--直接的であるほど、効果的にメッセージが伝わります。

例えば、プロンプトエンジニアリングの概念を学びたいと思うかもしれません。
プロンプトエンジニアリングの概念を説明してください。説明は短く、数文で、あまり詳しくしないでください。
上記のプロンプトから、どのように文を数え、スタイルを指定するかは明確ではありません。上記のプロンプトでも、まだ良い回答を得ることができますが、非常に具体的かつ簡潔で、的を射たプロンプトの方が良いでしょう。以下のようなものです。
高校生に対して、プロンプトエンジニアリングの概念を2〜3文で説明してください。
するかしないか?

プロンプトを設計する際のもう一つの一般的なヒントは、「しないこと」を言わず、「すること」を言うことです。これにより、より具体的になり、モデルから良い回答を得るための詳細に焦点が当てられます。
以下は、映画の推薦チャットボットが、私が指示を書いた方法のために、正確にやりたくないことに失敗した例です--何をしないでくださいということに焦点を当てています。

プロンプト:
以下は、顧客に映画を推薦するエージェントです。興味を尋ねないで、個人情報を尋ねないでください。
顧客:私の興味に基づいて映画をお勧めください。
エージェント:
出力:
はい、あなたの興味に基づいて映画をお勧めできます。アクション、コメディ、ロマンス、それともその他の何か、どのような映画がお好きですか?
以下は改善されたプロンプトです:
プロンプト:
以下は、顧客に映画を推薦するエージェントです。エージェントは、上位のグローバルトレンド映画から映画をお勧めする責任があります。ユーザーの好みを尋ねることを避け、個人情報を尋ねることを避ける必要があります。エージェントがおすすめ映画を持っていない場合は、「申し訳ありませんが、今日お勧めする映画が見つかりませんでした。」と返答する必要があります。
顧客:私の興味に基づいて映画をお勧めください。
エージェント:
出力:
申し訳ありませんが、あなたの興味に関する情報はありません。しかし、ここに今一番トレンディーな映画のリストがあります:[リストの映画]。お好きなものが見つかることを願っています!
サービス数40万件のスキルマーケット、あなたにぴったりのサービスを探す