プロンプトエンジニアリング技法の総合ガイド

最近GoogleのLee Boonstrが最近発表した69ページのプロンプトエンジニアリングに関するホワイトペーパーを読みました。 このホワイトペーパーでは大規模言語モデル(LLM)との対話を最適化するための包括的なガイドを提供されています。 これまでなんとなく経験や勘で作っていたプロンプトを、テクニックとして整理することができます。

By Toshiyuki Yoshida

AI Baseの記事でこのホワイトペーパーが紹介されていたので、 原文を読んでみました。

この論文は、大規模言語モデル(LLM)向けのプロンプトエンジニアリング手法を包括的に解説しています。 データサイエンティストでなくても効果的なプロンプトを作成できること、 LLM の設定(温度、top-K、top-P、トークン制限など)がプロンプトの効果に大きく影響することなどが 強調されています。

プロンプトテクニックとして整理されており、生成 AI と付きあう前提のナレッジとし て有用だと思うのでまとめておきます。

出典情報

  • 論文タイトル:「Prompt Engineering
  • 著者:Lee Boonstra(他複数の貢献者)
  • 発行元:Google
  • 発行日:2024 年 11 月

主要なプロンプト技法

1. ゼロショットプロンプト (Zero-shot Prompting)

例を示さず、直接タスクを指示する基本的な手法です。

映画レビューをPOSITIVE、NEUTRAL、NEGATIVEに分類してください。
レビュー:"Her"は人工知能の進化が人類に与える影響を描いた傑作です。

2. ワンショット/フューショットプロンプト (One-shot & Few-shot Prompting)

1 つまたは複数の例を示すことで、モデルに期待する出力パターンを教える手法です。

顧客のピザ注文をJSONに解析してください。
例: "チーズとペパロニのピザを注文したい" →
{
  "size": "small",
  "ingredients": ["cheese", "pepperoni"]
}
注文: "モッツァレラとバジルのピザをLサイズで"

3. システムプロンプト (System Prompting)

モデルの全体的な目的や動作を設定する手法です。

映画レビューを分類し、結果をJSONフォーマットで返してください。

4. ロールプロンプト (Role Prompting)

モデルに特定の役割を与えて、回答させる手法です。

旅行ガイドとして振る舞ってください。アムステルダムで訪れるべき3つの場所をリ
ストアップしてください。

5. 文脈プロンプト (Contextual Prompting)

関連する背景情報を提供して理解を深める手法です。

文脈:あなたは80年代のレトロゲームについてのブログを書いています。
そのブログ用の記事のトピックを3つ提案してください。

6. ステップバックプロンプト (Step-back Prompting)

特定のタスクを実行させる前に、より一般的な質問を考慮させる手法です。

FPSゲームのレベル設計で重要な要素は何ですか?
[回答を受け取った後]
その要素を考慮したFPSゲームのレベルの設計案を作成してください。

7. 思考連鎖 (Chain of Thought, CoT)

中間推論ステップを生成して最終回答の精度を向上させる手法です。

3歳の時、パートナーは私の3倍の年齢でした。現在私は20歳です。
パートナーの年齢は?
ステップバイステップで考えましょう。

8. 自己一貫性 (Self-consistency)

複数の推論経路を生成し、最も一貫した回答を選択する手法です。

このメールは重要ですか?内容を分析して結論を導き出してください。
[同じプロンプトを複数回実行し、最も多く出現する回答を採用]

9. 思考木 (Tree of Thoughts, ToT)

複数の推論パスを探索できるよう、思考連鎖を拡張した手法です。

[問題解決において複数のアプローチを同時に検討させる手法]

10. ReAct(理由付けと行動) (ReAct: Reason & Act)

外部ツールと組み合わせて推論と行動を交互に行う手法です。

メタリカのバンドメンバーには合計何人の子供がいますか?
[検索ツールを使って各メンバーについて調査し、結果を合計]

11. 自動プロンプトエンジニアリング (Automatic Prompt Engineering)

LLM を使って他の LLM 用のプロンプトを生成・評価・改善する手法です。LLM でなく Midjourney 向けのプロンプトを Claude に生成させるなど私はよく使います。

Tシャツを注文する10種類の表現を生成してください。

12. コードプロンプティング (Code Prompting)

コード関連のタスクに特化したプロンプト技法については、次の 4 つのサブカテゴリに分けることができます。

a. コードを書くためのプロンプト (Prompts for writing code)

特定のタスクのコードを生成するプロンプトです。実行環境、入出力形式、エラー処理などの要件を明示するとより効果的です。

特定のフォルダ内のすべてのファイル名の先頭に"draft"という文字列を追加する
Bashスクリプトを書いてください。

b. コードを説明するためのプロンプト (Prompts for explaining code)

コードの機能、構造、ロジックを人間が理解しやすく解説させるプロンプトです。

以下のBashコードを説明してください:
#!/bin/bash
echo "フォルダ名を入力してください:"
read folder_name
...

c. コードを翻訳するためのプロンプト (Prompts for translating code)

ある言語で書かれたコードを別の言語に変換するプロンプトです。元のコードの機能を担保するよう強調すると良い結果になるようです。

以下のBashスクリプトをPythonコードに変換してください:
#!/bin/bash
echo "フォルダ名を入力してください:"
...

d. コードをデバッグ・レビューするためのプロンプト (Prompts for debugging and reviewing code)

バグの特定、修正、およびコード品質の向上提案を求めるプロンプトです。エラーメッセージやスタックトレースを含めると効果的です。

以下のPythonコードにはエラーがあります:
エラーを修正し、コード全体を改善してください。
import os
import shutil
folder_name = input("フォルダ名を入力:")
prefix = input("ファイル名の先頭に追加する文字列:")
text = toUpperCase(prefix)
...

ベストプラクティス

次に個別のテクニックというよりプロンプト全般でのベストプラクティスです。

  1. 例を提供する:期待する出力の例を示すことで精度を向上
  2. シンプルでわかりやすいプロンプトを設計:明確な言語を使用
  3. 出力形式を明確に指定:「3 段落のブログ記事を生成」など具体的に
  4. 制約よりも指示を優先:否定形より肯定形の表現が効果的
  5. JSONなどの構造化出力を使用:データ抽出・分類タスクに有効
  6. トークン長を制御:設定またはプロンプト内で指定
  7. プロンプトに変数を使用:再利用可能で動的なプロンプト作成
  8. 入力形式やスタイルを実験:質問、声明、指示など
  9. 分類タスクでは異なるクラスの例をミックス:バイアス防止のため
  10. モデルの更新に適応:新バージョンでプロンプトを再テスト
  11. プロンプトの試行を詳細に記録:モデル、設定、プロンプト、出力を文書化

一旦 JSON 経由にするなど経験としては効果的なので、私はよく使います。

まとめ

この論文ではプロンプトエンジニアリングの様々な技法を紹介しています。ゼロショットから高度な推論技法(思考連鎖、自己一貫性、思考木)、そしてコード生成・操作のためのプロンプティングまで、幅広い手法が解説されています。

プロンプトエンジニアリングは反復的なプロセスであり、モデルのパフォーマンスに基づいてプロンプトを継続的に改良することが重要です。また、表形式でプロンプト試行を記録し、異なるモデルバージョンや設定での結果を比較することが推奨されています。

コードプロンプティングの分野では、生成、説明、翻訳、デバッグという開発サイクル全体をカバーする技法が提示されており、開発効率の向上に貢献します。特にデバッグとレビューの機能は、単なるバグ修正だけでなく、コード品質の全体的な向上につながる可能性を持っています。