Prompt Engineering
プロンプトエンジニアリングは、再学習せずにAIモデルの出力を調整するため、モデルに与える指示、コンテキスト、例を設計する手法です。LLMからビジョンモデルまでを対象とします。
プロンプトエンジニアリングとは、モデルの重みを変更せずにモデルの出力を導くため、指示、コンテキスト、例、要求する出力形式など、生成モデルに与える入力を設計する実践です。GPT-3の登場とともに広まりました。Language Models are Few-Shot Learners(2020年)でOpenAIは、タスクを説明していくつかの例を示すプロンプトがあれば、1750億パラメーターのモデルは勾配更新なしで新しいタスクを実行できることを示しました。この能力を論文ではインコンテキスト学習と呼んでいます。現在、プロンプトは大規模言語モデル(LLM)、ビジョン言語モデル(VLM)、テキストから画像を生成するモデル、プロンプト可能なビジョンモデルを制御する主な手段です。
主な手法#
- 指示とロール: システムプロンプトでモデルの役割、ルール、対象読者を設定し、見出しやXML形式のタグなどの区切り文字で、指示と処理対象のデータを分離します。
- Few-shot例: 入出力の例を示すことで、説明だけの場合よりタスクと回答形式を正確に伝えられます。例を含まないプロンプトはzero-shotです。
- 出力形式: リストや、指定したキーを含むJSONなど、プロンプトで形式を指定します。コードで結果を解析する必要がある場合、構造化出力ではリクエストに頼るのではなく、デコード時にスキーマを適用します。
- Chain-of-thoughtプロンプティング: 回答の前に中間推論ステップを求める手法で、複数段階の問題の精度を高めます。
- プロンプトチェーン: 複雑なタスクを、コードでつないだ、範囲を絞った個別タスクを持つ複数のプロンプトに分割します。
- 取得したコンテキスト: 検索で見つかった文書やデータを挿入し、モデルが記憶ではなく提供された事実に基づいて回答できるようにします。
提供された事実によってハルシネーションは減少します。また、その配置も重要です。Lost in the Middleの研究では、長いコンテキストウィンドウの冒頭または末尾にある情報をモデルが最もよく利用し、中央に埋もれた情報を最も利用しにくいことが明らかになりました。
例の効果は、命令チューニングを一度も受けていないベースモデルで最もよく分かります。このコード例では、Hugging Face Transformersで読み込んだGPT-2に、3つの例を含む場合と含まない場合で同じ指示を与えます。
from transformers import AutoModelForCausalLM, AutoTokenizer
tokenizer = AutoTokenizer.from_pretrained("gpt2")
model = AutoModelForCausalLM.from_pretrained("gpt2")
# The same instruction, without and with three worked examples that show the answer format
instruction = "Convert each country to its capital city.\n"
prompts = {
"zero-shot": instruction + "Italy:",
"few-shot": instruction + "France: Paris\nJapan: Tokyo\nCanada: Ottawa\nItaly:",
}
for name, prompt in prompts.items():
inputs = tokenizer(prompt, return_tensors="pt")
output = model.generate(**inputs, max_new_tokens=4, do_sample=False, pad_token_id=tokenizer.eos_token_id)
completion = tokenizer.decode(output[0, inputs.input_ids.shape[1] :])
print(f"{name}: {completion!r}")zero-shot: '\n\nItaly is'とfew-shot: ' Rome\nSpain:'が出力されます。指示だけの場合、GPT-2はイタリアについての文章を書きましたが、3つの例を与えると期待される形式で「Rome」と回答し、次の国についてもパターンに沿って続けました。
プロンプト設計は経験的に行います#
わずかな表現やレイアウトの変更でも、結果は大きく変わることがあります。Melanie Sclarらは、区切り文字、大文字・小文字、空白などの書式変更だけで、LLaMA-2-13Bの精度に最大76ポイントの差が生じることを測定しました。この感度は、モデルの大型化、例の増加、命令チューニング後も残りました。そのため、プロンプトはコードと同じように開発します。既知の正解出力がある固定入力セットでテストし、失敗をもとに改訂して、バージョン管理します。これはLLMOpsの定型的な作業です。
このサイクルは自動化できます。Yongchao Zhouらが開発したAutomatic Prompt Engineer(APE)は、LLMに指示の候補を提案させ、例で最も高いスコアを得たものを採用します。Large Language Models Are Human-Level Prompt Engineersでは、24個のタスクのうち19個で、APEの指示が人間の作成した指示と同等以上の成績を示しました。
ビジョンモデル向けのプロンプト#
コンピュータービジョンでは、プロンプトにはいくつかの形式があります。Stable Diffusionなどのテキスト画像生成モデルは、被写体、スタイル、照明、構図の説明と、避ける対象を列挙したネガティブプロンプトに応答します。プロンプト可能なセグメンテーションモデルは、点やボックスなどのビジュアルプロンプトを受け付けます。また、MetaのSAM 3は短い名詞句も受け付け、指定された概念のすべてのインスタンスをセグメント化します。Ultralytics Platformはこれをテキストプロンプトによる自動アノテーションに使用します。
オープンボキャブラリー検出器は、クラス名をプロンプトに変換します。Ultralytics YOLOEは、set_classes()で指定されたクラス(「forklift」や「double-decker bus」など)を検出・セグメント化します。領域特徴とその名前のテキスト埋め込みを比較するため、表現によって検出対象が直接変わります。外観に基づいて照合するため、「damaged」「left-most」「the one being carried」など、状態、位置、比較に依存するプロンプトには信頼できる視覚的手掛かりがありません。日常的なカテゴリに近い名前が最も効果的です。
プロンプトエンジニアリングと関連用語#
- プロンプトチューニング: ラベル付きデータに対する勾配降下法で連続値のプロンプトベクトルを学習します。プロンプトエンジニアリングでは、自然言語でプロンプトを手動作成します。
- ファインチューニング: ラベル付きデータセットで学習し、モデルの重みを変更します。プロンプトエンジニアリングではモデルを変更せず、推論時に処理します。
- コンテキストエンジニアリング: 取得したドキュメント、ツールの結果、メモリーなど、アプリケーションでモデルのコンテキストに入るすべてを扱います。プロンプトエンジニアリングは、指示と例の作成を扱う領域です。
- プロンプトインジェクション: モデルが読み取るテキストや画像に指示を隠し、開発者のプロンプトを上書きさせる攻撃です。










