ChatGPTを初めとする生成AIの爆発的人気に伴い、この気まぐれなAIにこちらの意図したとおりの出力をさせるための手法「プロンプト・エンジニアリング」がここ数ヶ月脚光を浴びている。
中には、このプロンプト・エンジニアリングを専門に行う職業「プロンプト・エンジニア」も出現し、ソフトウェアエンジニアよりも高額な報酬を得ている状況も起こり始めている等、AI分野の活況を物語る話題もあるが、今回そんな生成AI分野において、今や中心的存在となったOpenAIの最大のパートナーでもあるMicrosoftが、「プロンプト・エンジニアリングための新たなガイド」を公開しているので、ご紹介しよう。
目次
プロンプト・エンジニアリングとは?
プロンプト・エンジニアリングとは、プロンプトを構成するプロセスやテクニックのことで、より希望する意図に近いアウトプットを生成する手法のことだ。
プロンプトの構成
プロンプトは、以下の2つの要素から構成されている:
- タスク/クエリ
- コンテキスト
例えば、以下のようなプロンプトがあるとする。
これを小学2年生向けに要約して下さい:
木星は太陽から5番目の惑星で、太陽系で最も大きな惑星である。質量は太陽の1000分の1、太陽系の他の惑星を合わせると2.5倍にもなる巨大なガス惑星である。木星は、夜空に肉眼で見える最も明るい天体のひとつであり、記録に残る以前から古代文明に知られていた。地球から見ると、木星はその反射光で目に見える影ができるほど明るく、月と金星に次いで夜空で平均して3番目に明るい自然天体であることがわかります。
このプロンプトの構成を分解すると以下のようになる。
タスク/クエリは、「これを小学2年生向けに要約して下さい」という、AIに対して行う指示内容。
コンテキストは「木星は太陽から5番目の惑星で、太陽系で最も大きな惑星である。質量は太陽の1000分の1、太陽系の他の惑星を合わせると2.5倍にもなる巨大なガス惑星である。木星は、夜空に肉眼で見える最も明るい天体のひとつであり、記録に残る以前から古代文明に知られていた。地球から見ると、木星はその反射光で目に見える影ができるほど明るく、月と金星に次いで夜空で平均して3番目に明るい自然天体であることがわかります。」という、AIに対して、タスクを達成するために必要な追加される情報のことだ。
プロンプトを作成する際のポイント
プロンプトや出力の質を高めるためのヒントとして、以下のようなものがある:
- 明確で具体的であること
- アウトプットのサンプルを提供する
- 関連する文脈を提供する
- 洗練に洗練を重ねる
明確で具体的であること
生成AIの特徴として、詳細な情報を提供しないほど、モデルはより多くの仮定を立てる必要が出てくる。そのため、人間側でプロンプトに境界線と制約を設けることで、モデルが人間の望む結果を出力しやすいように制御する必要がある。
たとえば、次のようなプロンプトを使用して、ソーシャルメディア投稿の感情を分類する場合を考えてみる:
この記事を分類して下さい
“愛猫がかわいい ❤️❤️”
だが、この場合タスクは曖昧すぎる。そのため、「この投稿は、声明や意見として分類される」というような回答が返ってくる可能性がある。
本来は感情について分類してほしいのならば、プロンプトでより多くのガイダンスと制約を提供することで、モデルが望む出力を生成するように導くことが出来る。
以上を踏まえて、プロンプトをより正確に更新すると、出力が投稿の感情を表し、ポジティブ、ニュートラル、ネガティブの3つのカテゴリーから選択するようにモデルに通知することになる。具体的には、以下のようなプロンプトを与える。
この投稿の感情をポジティブ、ニュートラル、ネガティブに分類する
“愛猫がかわいい ❤️❤️”
この場合、「ポジティブ」という結果が得られ、感情を分類するという当初の意図により近いものになるはずだ。
アウトプットのサンプルを提供する
出力の生成を開始する最も手っ取り早い方法は、学習させたモデルの事前設定を使用することだ。これはゼロショット学習と呼ばれるもので、これから扱うデータと似たようなデータを使って例を示すことで、モデルがより良い出力を出すように導くことが出来る。
例えば、電子メールのような文書から情報を抽出し、JSONオブジェクトを生成したいとする。
このテキストから都市名と空港コードをJSONとして抽出する:
“I want to fly from Los Angeles to Miami.”
このプロンプトでは、以下のような回答が返ってくるかも知れない。
{
"From": {
"City": "Los Angeles",
"Airport Code": "LAX"
},
"To": {
"City": "Miami",
"Airport Code": "MIA"
}
}
確かにこれはこれで正しいが、生成されるJSONオブジェクトのスキーマが、自分が望む形式のスキーマと一致するとは限らない。この場合、自分が期待する出力のサンプルを提供することで、モデルの出力を自分が希望するようなフォーマットに適合するように誘導することができる。例としては次のプロンプトの様な形だ:
このテキストから都市名と空港コードをJSONとして抽出する:
Text: “I want to fly from Los Angeles to Miami.” JSON Output: { “Origin”: { “CityName”: “Los Angeles”, “AirportCode”: “LAX” }, “Destination”: { “CityName”: “Miami”, “AirportCode”: “MIA” } }
Text: “I want to fly from Orlando to Boston” JSON Output:
このモデルでは、以下のような出力が得られると予想される:
{
"Origin": {
"CityName": "Orlando",
"AirportCode": "MCO"
},
"Destination": {
"CityName": "Boston",
"AirportCode": "BOS"
}
}
関連する文脈を提供する
GPTのようなモデルは、インターネット上にある何百万もの文書や成果物を使って訓練されたものだ。したがって、質問に対する回答のようなタスクを実行させ、回答を生成するために使用できるリソースの範囲を制限しない場合、最良のケースでは実現可能な回答(間違っているかもしれないが)が得られ、最悪のケースでは回答が捏造される可能性がある。
例えば、「ハリー・ポッターの要約を書いてください」と言われた場合、映画、本、ビデオゲームなど、いくつかのもの媒体を指している可能性がある。登場人物やいくつかの要素はこれらの媒体で似ているかも知れないが、ストーリーラインはそれぞれで異なる可能性がある。その結果、もっともらしいが正しくない、異なる答えが返ってくる可能性がある。
モデルが生成すると予想される出力の例を提供するゼロショット学習や数ショット学習と同様に、プロンプトで事実や追加の関連情報を提供し、モデルが質問に答えたり、他のさまざまなタスクを実行するように誘導することが出来る。このテクニックは、モデルを事実に基づかせることから、グラウンディングと呼ばれている。非常に高いレベルで、BingのAI機能の一部はこのように動作する。まず検索を行い、クエリに答えるために最も関連性の高いドキュメントを探す。次に、最も関連性の高いWebページの内容が、プロンプトの追加コンテキストとして提供され、AIモデルはこの情報を使用して、より関連性の高い応答を生成するのだ。
例えば、ある文書に関する質問に答えたいとする。この文書は、Wikipediaのような公共のWebページであったり、社内のナレッジベースの文書であったりする。文脈の追加情報を含むプロンプトは、次のようなものになるかも知れない:
木星は太陽から5番目の惑星で、太陽系で最も大きな惑星です。質量は太陽の1000分の1、太陽系の他の惑星を合わせると2.5倍にもなる巨大ガス惑星です。木星は、夜空に肉眼で見える最も明るい天体のひとつであり、記録に残る以前から古代文明に知られていた。地球から見ると、木星はその反射光で目に見える影ができるほど明るく、月と金星に次いで夜空で平均して3番目に明るい自然天体であることがわかります。
次の問いに答えなさい:
Q: 太陽から5番目の惑星はどれでしょう? A:木星
Q:木星の質量は、太陽と比べてどのくらいか?
以下のような回答が返ってくる可能性がある:A: 木星の質量は、太陽の1000分の1です。
この例では、モデルに事実と情報を提供し、その回答の一部として使用させるだけでなく、どのように回答させたいかの例も示している。これにより、人間の意図したとおりの回答を生成するように、モデルを誘導することが出来るのだ。
洗練に洗練を重ねる
アウトプットの生成は、試行錯誤の連続だ。最初の試行で期待通りの出力が得られなくても、落胆しないで、あなたのユースケースに最適なものを見つける必要がある。あなたの意図したようにモデルによって生成された最初の出力セットを再利用して、あなたのプロンプトに追加のコンテキストとガイダンスを提供するのも良いだろう。
Sources
コメントを残す