メインコンテンツへ

『プロンプトエンジニアリングガイド』の内容を解説|概要や具体例も紹介

コラム

掲載日:2023/12/06

『プロンプトエンジニアリングガイド』とは、生成AIの研究コミュニティ「DAIR.AI」が作成した資料であり、プロンプトエンジニアリングを研究者や実践者に教育するためのものです。そもそも、プロンプトエンジニアリングはChatGPTなどの生成AIに使われるLLM(大規模言語モデル)に送信するプロンプト(指示文)を開発・最適化する学問分野を指します。

この記事では、『プロンプトエンジニアリングガイド』で記されている内容やテクニックの具体例などを詳しく解説します。

『プロンプトエンジニアリングガイド』とは?

『プロンプトエンジニアリングガイド』について理解するには、まずプロンプトエンジニアリングとは何かを把握しておく必要があります。基本となる部分を見ていきましょう。

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

プロンプトエンジニアリングとは、ChatGPTなどの生成AIに使われているLLM(大規模言語モデル)を効率的に使いこなすために必要な「プロンプト(言語モデルへの指示)」を開発、最適化するための学問分野を言います。プロンプトエンジニアリングを学べば、LLMを能力と限界を知ることができ、エンジニアにとって効果的なプロンプトの設計について習得できます。

また、研究者にとっても複雑なタスクを解決するために用いる言語モデルについて、より高いパフォーマンスを引き出すことにつなげられます。

AIへの指示文の基礎を学べる『プロンプトエンジニアリングガイド』

『プロンプトエンジニアリングガイド(Prompt Engineering Guide)』は、生成AIの研究コミュニティである「DAIR.AI」のプロジェクトです。プロンプトエンジニアリングを研究者や実践者に教育するための資料として活用されており、日本語版も随時内容が追加されています。

DAIR.AIは、AIの研究・教育・技術の民主化を実現することを目指しており、次世代のAIイノベーターやクリエイターの育成を掲げているコミュニティです。本記事では、その基礎となる「導入編」と具体的なテクニックを紹介します。

『プロンプトエンジニアリングガイド』導入編

『プロンプトエンジニアリングガイド』の導入部分においては、次のような内容が紹介されています。

・LLM設定
・基本的なプロンプティング
・プロンプトの要素
・プロンプトをデザインする一般的なTips

それぞれのポイントについて解説します。

LLM設定

『プロンプトエンジニアリングガイド』では、LLMの設定について記されています。プロンプトを使用する際、以下の2つのパラメータ設定を行えば、結果を変えることが可能です。

・Temperature:
この値を低くするほど、最も確率の高い答えが選ばれ、決定論的になる。逆に値を上げるとランダム性が増し、多様な回答を生み出せる。

・Top_p(核サンプリング):
値を下げるほど、正確で事実に基づいた回答が出力される。より多様な回答を得たければ、値を高く設定する。

「Temperature」と「Top_p」の両方を変更するのではなく、どちらか片方の変更が推奨されています。また、使用しているLLMのバージョンによって出力結果が異なる可能性がある点にも留意が必要です。

基本的なプロンプティング

次に、基本的なプロンプティングについてですが、簡単なプロンプトの例として以下のものが挙げられています。

プロンプト:
以下の続きとなる文を完成させてください:空が
出力:青くとてもきれいです

※出力結果は、必ずしも手元の環境の出力結果と一致するとは限りません

上記のように、言語モデルでは文脈として「空が」に続く文字列を出力してくれます。「以下の続きとなる文を完成させてください」というプロンプトを出しているため、「文を完成させる」というタスクを生成AIがきちんと実行てくれています。

このように、タスクを実行するための最適なプロンプトを設計するアプローチをプロンプトエンジニアリングと言います。プロンプトのフォーマットはとてもシンプルなものであり、標準的なものとしては次の通りです。

・質問
・指示
・QAフォーマット

言語モデルに対して直接応答を求めており、誰でも気軽に使うことができます。

プロンプトの要素

プロンプトには特定の要素が含まれており、以下のコンポーネント(構成要素)が挙げられます。

・命令:モデルに実行してほしい、特定のタスクまたは命令
・文脈:外部情報や追加の文脈が含まれる場合があり、モデルをより良い応答に導くことができる
・入力データ:応答を見つけたい入力または質問
・出力指示子:出力のタイプや形式を示す

プロンプトには上記のすべてのコンポーネントが必要なわけではなく、タスクによって柔軟に変えていく必要があります。どのような点に気をつければよいかを、次に見ていきましょう。

プロンプトをデザインする一般的なTips

プロンプトを設計するときに、最適な結果を導くためには多くの実験を必要とするプロセスである点を踏まえておく必要があります。まずはシンプルなプロンプトから始めていき、出力結果を向上させるために何度も要素や文脈を追加していきながら取り組んでみましょう。

複数のタスクを含むような大きなタスクは、一度に出力しようとするよりも、いくつかのタスクに分けて構築していくことが大切です。タスクを分けることで、より精度の高い結果を得ることができます。

次に、言語モデルに与える指示についてですが、「書く」「分類する」「要約する」「翻訳する」「並べ替える」といったコマンドを用いていきます。具体的に達成したいことを言語モデルに指示することで、より求めている出力結果を得られるでしょう。

最適な結果に近づけるには、異なるキーワードや文脈、データなどを指示していく必要があります。一般的には、タスクに関連した文脈が具体的なものであるほど、結果は良くなっていくはずです。

指示はプロンプトの最初に配置して、指示と文脈を区切るために「###」のような区切り記号を用いることが推奨されています。他にも『プロンプトエンジニアリングガイド』には、特定のキーワードを抽出する方法や直接的に指示を出す重要性などが紹介されています。

プロンプトエンジニアリングのテクニックを具体例と合わせて紹介

ここでは、プロンプトエンジニアリングのテクニックを紹介します。タスクの種類によって、どのプロンプティングが適しているかは違ってくるので、目的に応じて使い分けてみましょう。

Zero-shotプロンプティング

「Zero-shotプロンプティング」とは、特に例を出さずにそのまま指示を出す指示方式を言います。出力例として以下のものが挙げられます。

プロンプト:
テキストを中立、否定的、または肯定的に分類してください。
テキスト: 休暇はまずまずでした。
所感:

出力:「中立」

※出力結果は、必ずしも手元の環境の出力結果と一致するとは限りません

出典:DAIR.AI「プロンプトエンジニアリングガイド」

上記の例では、言語モデルに対して任意の例を提供していないので、シンプルな回答が出力されています。Zero-shotがうまく機能しないときは、プロンプトに任意の例などを追加して、次に紹介するFew-shotプロンプティングを行ってみましょう。

Few-shotプロンプティング

「Few-shotプロンプティング」とは、いくつかの例を提示する指示方式であり、より複雑なタスクに取り組むときに向いています。出力例としては、以下のものが挙げられています。

プロンプト:
「whatpu」とはタンザニア固有の小さくて毛皮のある動物です。
「whatpu」という言葉を使った文の例は次のとおりです。
私たちはアフリカを旅行して、これらのとてもかわいいwhatpusを見ました。
「farduddle」というのは、とても速く上下にジャンプすることを意味します。
「farduddle」という言葉を使用した文の例は次のとおりです。

出力:
私たちは試合に勝ったとき、みんなfarduddleをして祝いました。

※出力結果は、必ずしも手元の環境の出力結果と一致するとは限りません

出典:DAIR.AI「プロンプトエンジニアリングガイド」

上記のように、任意の1つの例(1ショット)を言語モデルに提供するだけでも、出力結果の精度が高まります。より複雑なタスクでは、3ショット・5ショットと例を増やして試すことが可能です。

Chain-of-Thoughtプロンプティング

「Chain-of-Thoughtプロンプティング」とは、推論ステップを提示することによって、より複雑なタスクを回答できるようにする指示方式です。前述のFew-shotプロンプティングと組み合わせることで、複雑なタスクでもより良い結果が得られます。

出力例として、数字グループの和が「奇数」か「偶数」かを確認させるプロンプトとその出力結果を挙げると次の通りです。

プロンプト:
このグループの奇数を合計すると偶数になります。: 4、8、9、15、12、2、1。
A: 奇数を全て加えると(9, 15, 1)25になります。答えはFalseです。
このグループの奇数を合計すると偶数になります。: 17、10、19、4、8、12、24。
A: 奇数を全て加えると(17, 19)36になります。答えはTrueです。
このグループの奇数を合計すると偶数になります。: 16、11、14、4、8、13、24。
A: 奇数を全て加えると(11, 13)24になります。答えはTrueです。
このグループの奇数を合計すると偶数になります。: 17、9、10、12、13、4、2。
A: 奇数を全て加えると(17, 9, 13)39になります。答えはFalseです。
このグループの奇数を合計すると偶数になります。: 15、32、5、13、82、7、1。
A:

出力:
奇数を全て加えると(15, 5, 13, 7, 1)41になります。答えはFalseです。

※出力結果は、必ずしも手元の環境の出力結果と一致するとは限りません

出典:DAIR.AI「プロンプトエンジニアリングガイド」

また、以下のようにより少ない例を提供するだけでも、タスクの解決に結びつけることが可能です。

プロンプト:
このグループの奇数を合計すると偶数になります。: 4、8、9、15、12、2、1。
A: 奇数を全て加えると(9, 15, 1)25になります。答えはFalseです。
このグループの奇数を合計すると偶数になります。: 15、32、5、13、82、7、1。
A:

出力:
奇数を全て加えると(15, 5, 13, 7, 1)41になります。答えはFalseです。

※出力結果は、必ずしも手元の環境の出力結果と一致するとは限りません

出典:DAIR.AI「プロンプトエンジニアリングガイド」

自己整合性(Self-Consistency)

「自己整合性(Self-Consistency)」とは、ステップごとに分けたQAを大量に与えて、問題を解かせる指示方式を言います。出力例としては、次の通りです。

プロンプト:
Q:私が6歳のとき、妹は私の半分の年齢でした。今、私は70歳です。私の妹は何歳ですか?
A:

出力:
35

※出力結果は、必ずしも手元の環境の出力結果と一致するとは限りません

出典:DAIR.AI「プロンプトエンジニアリングガイド」

私と妹の年齢差は3歳のため、正解は「67」です。上記のプロンプトだけでは正しい答えを導けません。そのため、「few-shot CoT」を用いて複数のさまざまな推論を解かせて、回答のパフォーマンスを高める必要があります。

最終的な答えにたどり着くためには、いくつかのステップを踏まえなければならない場合もあります。複数の答えが出力されるなかで、最も整合性のある回答を選んでみましょう。

知識生成プロンプティング

「知識生成プロンプティング」とは、一般社会の知識が求められるタスクに対して、いくつかの知識を与えて、連想で知識を生成させる指示方式です。さらに、生成させた知識を基にして、回答してもらう点に特徴があります。

出力例として、以下のものが挙げられます。

プロンプト:
質問:ゴルフの一部は、他の人よりも高いポイント総数を得ようとすることです。「はい」か「いいえ」?
知識:ゴルフの目的は、できるだけ少ない打数で一連のホールをプレイすることです。通常、ゴルフのラウンドは18ホールで構成されます。1回のホールは、標準のゴルフコースに1回プレイされます。各打数は1ポイントとしてカウントされ、総打数がゲームの勝者を決定するために使用されます。
説明と回答:

回答1:
いいえ、ゴルフの目的は他の人よりも高いポイント総数を得ることではありません。むしろ、目的はできるだけ少ない打数で一連のホールをプレイすることです。総打数がゲームの勝者を決定するために使用されますが、ポイントの総数ではありません。

プロンプト:
質問:ゴルフの一部は、他の人よりも高い得点を取ることです。「はい」か「いいえ」か?
知識:ゴルフは、競技者(またはゴルファー)が多種多様なクラブを使用して、できるだけ少ない打数でコースの一連のホールにボールを打ち込む精密なクラブアンドボールのスポーツです。目標は、各ホールで打たれた総打数を合計して計算される最低スコアでコースを完了することです。最低スコアを出したプレイヤーが勝利します。
説明と回答:

回答2:
はい、ゴルフの一部は、他の人よりも高い得点を取ることです。各プレイヤーは、各ホールで打たれた総打数を合計して計算される最低スコアでコースを完了しようとします。最低スコアを出したプレイヤーが勝利します。

※出力結果は、必ずしも手元の環境の出力結果と一致するとは限りません

出典:DAIR.AI「プロンプトエンジニアリングガイド」

上記の例では、ゴルフがスコアの低い方が勝つルールであるという知識を生成させた後に、その知識をもとに回答を生成させています。最初の回答では答えに自信があるように感じられますが、2番目の答えは回答にあまり自信がない点が見受けられます。

敵対的プロンプティング

「敵対的プロンプティング」とは、LLMに関するリスクや安全上の問題を特定して、それらに対処する研究・開発領域のことを言います。プロンプトによる具体的な攻撃の事例として、以下のものが挙げられます。

・プロンプトインジェクション:
 プロンプトに悪意のある書き換えをすることで出力を乗っ取ることができる
・プロンプトリーク:
 機密情報が含まれたプロンプトを公開させるようなプロンプト
・ジェイルブレイク:
 違法、または非倫理的な活動を促進するコンテンツを出力させる

出典:DAIR.AI「プロンプトエンジニアリングガイド」

上記のような攻撃に対する被害を防ぐには、防御方法を把握しておくことが重要です。防御方法として『プロンプトエンジニアリングガイド』では、「指示に望ましい振る舞い方を追加する」「コンポーネントをパラメータ化する」「敵対的プロンプトを検知する」などの方法が挙げられています。

まとめ|実際にやってみながらプロンプトを最適化しよう

『プロンプトエンジニアリングガイド』では、LLMに送信するプロンプトについて、基礎的な知識から実際にプロンプトを作成する方法などが詳しく紹介されています。解決したいタスクによって適したプロンプティングは異なるため、実際に言語モデルに指示を出しながら最適なプロンプティングを見つけてみましょう。

本記事で紹介したテクニックを基に、繰り返し生成AIに回答を出力させるプロセスを経ることが大切です。また、プロンプトを悪用した事例なども『プロンプトエンジニアリングガイド』には挙げられているので、防御方法を把握するために参考にしてみてください。

募集職種一覧