APE(自動プロンプトエンジニアリング)(エーピーイー ジドウ プロンプト エンジニアリング)
Zhou et al.(2022)が提案した自動プロンプト設計手法。LLM に入出力例から指示文を逆生成させ、候補を評価・選別することで人手設計を不要にする。
APE(自動プロンプトエンジニアリング)
概要
APE(Automatic Prompt Engineer)は、Zhu Zhou、Xuezhi Wang らが 2022 年に発表した自動プロンプト設計フレームワークだ(論文: "Large Language Models Are Human-Level Prompt Engineers")。人間が試行錯誤でプロンプトを設計する作業を自動化し、LLM 自身に最適な指示文を生成・選別させる。プロンプトエンジニアリングを一種の「ブラックボックス最適化」として定式化した先駆的手法として広く引用されている。
3 ステップの仕組み
Step 1: 候補指示文の生成
入出力ペア(Few-shot 例)を LLM に与え、「これらの例を説明する指示文を複数生成してください」とプロンプト。LLM は多様な候補を出力する。
入力例: "The cat sat on the mat."
出力例: "Le chat s'est assis sur le tapis."
→ LLM が生成する指示文候補:
- "Translate the following English sentence to French."
- "Render the text in French."
- "Convert to French language:"
Step 2: 候補の評価
各候補を小規模開発セット(dev set)に適用して精度などのスコアを算出。
Step 3: リランキングと選択
スコア上位の候補を採用。必要に応じてモンテカルロサーチや反復的改善も適用。
主な実験結果
論文での実験は 24 のタスク(BIG-Bench Instruction Induction)で実施された。
| 手法 | BIG-Bench 平均精度 |
|---|---|
| Zero-shot(プロンプトなし) | 54.2% |
| Few-shot(手動プロンプト) | 69.4% |
| Zero-shot-CoT("Let's think step by step") | 61.9% |
| APE(自動生成) | 72.5% |
APE は手動プロンプトを超え、「Let's think step by step」すら上回る指示文を自動発見した。発見されたプロンプトの一例として「Let's work this out in a step by step way to be sure we have the right answer.」が報告されている。
設計上の工夫
前向き・逆向き生成
- 前向き(forward): 入力→出力の方向でプロンプトを生成(標準)
- 逆向き(insert): 出力→入力の逆方向から指示文を推定
逆向き生成は予期しない視点の指示文を生み出す場合があり、多様性向上に貢献する。
モンテカルロサーチ
上位候補をシード(種)として、軽微な書き換えを LLM に依頼して周辺候補を探索する。局所的な改善に有効。
OPRO・TextGrad との比較
| 特性 | APE | OPRO | TextGrad |
|---|---|---|---|
| 反復回数 | 1〜2 回(シンプル) | 多反復 | 多反復 |
| 軌跡活用 | しない | する | するに近い |
| 失敗例分析 | しない | しない | 重視 |
| 計算コスト | 低 | 中 | 高 |
| 適用範囲 | 汎用 | 汎用 | 複合パイプライン |
APE はシンプルさが強みで、数十の候補を一括生成→評価→選別するため、実装コストが最も低い。反復的な軌跡追跡は行わないため、OPRO より収束保証は弱い。
実装例
import openai
def generate_prompts(few_shot_examples, n=20):
demo = "\n".join(f"Input: {e['input']}\nOutput: {e['output']}" for e in few_shot_examples)
response = openai.chat.completions.create(
model="gpt-4o",
messages=[{"role": "user", "content": f"Examples:\n{demo}\nGenerate {n} instruction prompts."}]
)
return response.choices[0].message.content.split("\n")
def score_prompt(prompt, dev_set):
correct = sum(1 for ex in dev_set if llm_complete(prompt + "\n" + ex["input"]).strip() == ex["output"])
return correct / len(dev_set)
candidates = generate_prompts(few_shot_examples)
best = max(candidates, key=lambda p: score_prompt(p, dev_set))
まとめ
APE は「人間並みのプロンプトエンジニアが LLM にできる」ことを示した先駆的研究だ。2025 年現在、OPRO・TextGrad・ProTeGi など後続手法の出発点として位置付けられており、シンプルな 1〜2 反復パイプラインとして実プロダクトに組み込みやすい点が依然として評価されている。