AI Prompt Engineering · レッスン

プロンプトのコンパイルと最適化

BootstrapFewShot、MIPROなど、実践的なDSPyオプティマイザーを学びます。

レッスン 3/413 ステップ

「プロンプトのコンパイルと最適化」はCoddyKit上の無料AI Prompt Engineeringレッスンです。 これはレッスン3/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはAI Prompt Engineering学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 AI Prompt Engineeringコースには全4レッスンが含まれています。

DSPyにおける最適化の意味

DSPyの最適化(コンパイルとも呼ばれます)は、トレーニングセットと評価指標をもとに、プログラムに最適なプロンプト設定を見つけます。オプティマイザーは、利用可能なfew-shot例、指示、推論のデモンストレーションを探索します。

コンパイルは一度だけ実行し、結果を保存して最適化されたプログラムをデプロイします。推論時には高速なLLM呼び出しを行うだけで、最適化のオーバーヘッドは発生しません。

評価指標関数の定義

DSPyのすべてのオプティマイザーには、期待される出力をもとに予測を評価する評価指標関数が必要です。数値(またはブール値)を返し、値が大きいほど良い結果を示します。

評価指標は、プロンプト設定が適切かどうかを判断するためにオプティマイザーが使う信号です。

# Metric: exact match on answer field
def exact_match_metric(example, prediction, trace=None):
    """
    example: a training example with .answer
    prediction: the module's output with .answer
    Returns 1.0 if correct, 0.0 otherwise
    """
    expected = example.answer.strip().lower()
    predicted = prediction.answer.strip().lower()
    return float(expected == predicted)

# Metric: F1 score for token overlap (common in QA)
def token_f1_metric(example, prediction, trace=None):
    gold_tokens = set(example.answer.lower().split())
    pred_tokens = set(prediction.answer.lower().split())
    if not pred_tokens:
        return 0.0
    precision = len(gold_tokens & pred_tokens) / len(pred_tokens)
    recall = len(gold_tokens & pred_tokens) / len(gold_tokens)
    if precision + recall == 0:
        return 0.0
    return 2 * precision * recall / (precision + recall)

トレーニングセットの準備

DSPyでは、dspy.Exampleオブジェクトのトレーニングセットが必要です。各例には入力と期待される出力を指定します。BootstrapFewShotでは、20〜50例でも十分なことがよくあります。

import dspy

# Build training examples
trainset = [
    dspy.Example(
        question='What is the capital of Germany?',
        answer='Berlin'
    ).with_inputs('question'),

    dspy.Example(
        question='Who wrote Romeo and Juliet?',
        answer='William Shakespeare'
    ).with_inputs('question'),

    dspy.Example(
        question='What year did World War II end?',
        answer='1945'
    ).with_inputs('question'),
    # ... add more examples
]

print(f'Training set size: {len(trainset)} examples')
print(trainset[0].question, '->', trainset[0].answer)

BootstrapFewShotオプティマイザー

BootstrapFewShotは、DSPyで最もよく使われるオプティマイザーです。トレーニングセットに対してプログラムを実行し、成功したトレース(評価指標を通過した入出力の組)を収集して、コンパイル済みプロンプトのfew-shotデモンストレーションとして使用します。

import dspy
from dspy.teleprompt import BootstrapFewShot

# Define your program
class QA(dspy.Signature):
    """Answer factual questions."""
    question: str = dspy.InputField()
    answer: str = dspy.OutputField()

program = dspy.ChainOfThought(QA)

# Set up the optimizer
optimizer = BootstrapFewShot(
    metric=exact_match_metric,
    max_bootstrapped_demos=4,   # Up to 4 few-shot examples per predictor
    max_labeled_demos=4,        # Use labeled examples directly if available
)

# Compile!
compiled_program = optimizer.compile(program, trainset=trainset)
print('Compilation complete')

MIPROオプティマイザー

MIPRO(Multi-prompt Instruction Proposal and Optimization)は、より強力なオプティマイザーです。few-shot例を選択するだけでなく、プロンプトに含めるより適切な指示テキストも探索します。

MIPROはコンパイル中により多くのLLM呼び出しを必要としますが、多くの場合、正解率を大幅に向上させます。

import dspy
from dspy.teleprompt import MIPROv2

class QA(dspy.Signature):
    """Answer factual questions."""
    question: str = dspy.InputField()
    answer: str = dspy.OutputField()

program = dspy.ChainOfThought(QA)

# MIPRO: optimizes both instructions AND few-shot examples
optimizer = MIPROv2(
    metric=exact_match_metric,
    auto='medium',      # 'light' / 'medium' / 'heavy' for optimization budget
    num_threads=4,      # Parallel evaluation threads
)

compiled_program = optimizer.compile(
    program,
    trainset=trainset,
    num_trials=20,       # Number of candidate prompts to evaluate
)
print('MIPRO compilation complete')

コンパイル済みプロンプトの構成

コンパイル後、DSPyは最適化されたfew-shotデモンストレーションをプロンプトに埋め込みます。コンパイル済みプログラムの予測器を調べることで、その内容を確認できます。

import dspy

# After compiling, inspect the optimized state
compiled_program = dspy.ChainOfThought('question -> answer')
# (Assume this was returned by optimizer.compile(...))

# Inspect the demos that were found
for demo in compiled_program.demos:
    print('Input:', demo.question)
    print('Reasoning:', demo.get('reasoning', 'N/A'))
    print('Answer:', demo.answer)
    print('---')

# Save the compiled state
compiled_program.save('compiled_qa_program.json')
print('Saved compiled program')

teleprompter.compile()インターフェース

DSPyのすべてのオプティマイザーは、同じcompile()インターフェースを共有します。この一貫性により、プログラムコードを変更せずにオプティマイザーを交換できます。

from dspy.teleprompt import BootstrapFewShot, MIPROv2, COPRO

# All optimizers use the same interface:
# compiled = optimizer.compile(program, trainset=trainset)

# BootstrapFewShot: fast, uses successful traces as demos
opt1 = BootstrapFewShot(metric=exact_match_metric)

# MIPRO: slower, optimizes instructions too
opt2 = MIPROv2(metric=exact_match_metric, auto='light')

# COPRO: coordinate descent over instruction proposals
opt3 = COPRO(metric=exact_match_metric, depth=3)

# Swap between them with one line change:
compiled = opt1.compile(program, trainset=trainset)
# or: compiled = opt2.compile(program, trainset=trainset)

BootstrapFewShotWithRandomSearch

BootstrapFewShotWithRandomSearchは、複数の候補デモンストレーションセットを生成し、検証セットで最も高い性能を示したものを選択することでBootstrapFewShotを拡張します。

BootstrapFewShotのシンプルさとMIPROの強力さの中間に位置する、バランスのよい選択肢です。

from dspy.teleprompt import BootstrapFewShotWithRandomSearch

# Split data into train and validation
trainset = examples[:40]
devset = examples[40:60]

optimizer = BootstrapFewShotWithRandomSearch(
    metric=exact_match_metric,
    max_bootstrapped_demos=4,
    num_candidate_programs=8,  # Try 8 different demo sets
    num_threads=4,
)

compiled_program = optimizer.compile(
    program,
    trainset=trainset,
    valset=devset,  # Picks the best program based on validation
)
print('Best program selected from 8 candidates')

コンパイルコストに関する考慮事項

コンパイルでは、候補プロンプトの生成と評価のために追加のLLM呼び出しが発生します。次の目安で予算を確保してください。

  • BootstrapFewShot:トレーニングセットのサイズの約1〜2倍のLLM呼び出し
  • RandomSearch(候補8個):約8〜10倍
  • MIPRO medium:約30〜50倍

コンパイルはオフラインで実行し、結果を保存して、保存済みのプログラムをデプロイしてください。本番環境での推論コストは変わりません。

コンパイル済みプログラムの検証

コンパイル後は、最適化されたプログラムが本当に汎用化できることを確認するため、必ず分離しておいたテストセットで評価してください。トレーニングセットの性能だけを確認してはいけません。

import dspy

# Evaluate on test set
evaluate = dspy.Evaluate(
    devset=testset,
    metric=exact_match_metric,
    num_threads=4,
    display_progress=True,
)

# Compare uncompiled vs compiled
uncompiled_score = evaluate(uncompiled_program)
compiled_score = evaluate(compiled_program)

print(f'Uncompiled accuracy: {uncompiled_score:.1%}')
print(f'Compiled accuracy:   {compiled_score:.1%}')
print(f'Improvement: +{compiled_score - uncompiled_score:.1%}')

すべてを組み合わせる

DSPyの完全な最適化ワークフローは、シグネチャの定義 → モジュールの構築 → トレーニングデータの準備 → オプティマイザーの選択 → コンパイル → 評価 → 保存です。これは、アイデアから本番で利用できる最適化済みプロンプトパイプラインに至るまでの一連の流れです。

import dspy
from dspy.teleprompt import BootstrapFewShot

# 1. Configure LM
dspy.configure(lm=dspy.LM('openai/gpt-4o-mini', api_key='sk-...'))

# 2. Define signature and module
class QA(dspy.Signature):
    """Answer questions accurately."""
    question: str = dspy.InputField()
    answer: str = dspy.OutputField()

program = dspy.ChainOfThought(QA)

# 3. Compile
optimizer = BootstrapFewShot(metric=exact_match_metric)
compiled = optimizer.compile(program, trainset=trainset)

# 4. Save
compiled.save('production_qa.json')
print('Production program ready')

理解度チェック:BootstrapFewShot

BootstrapFewShotは、コンパイル済みプロンプトを改善するために、トレーニングセットの何を使用しますか。

まとめ:コンパイルと最適化

DSPyの最適化では、評価指標関数とトレーニングセットを使って、最適なプロンプト設定を探索します。BootstrapFewShotは、成功したトレースから適切なfew-shotデモンストレーションを見つけます。MIPROv2はさらに、より適切な指示テキストも探索します。すべてのオプティマイザーはcompile(program, trainset=...)インターフェースを共有します。コンパイルは一度だけ発生するオフラインコストです。program.save()で結果を保存し、推論時には最適化済みプログラムをコストなしでデプロイできます。

無料で開始

AI チューターと学ぶ AI Prompt Engineering — 無料

ブラウザでリアルコードを書いて実行し、24/7 の AI チューターから瞬時にサポートを受け、ウェブまたはアプリで続きから学習できます。

コース
53
レッスン
199

よくある質問

「プロンプトのコンパイルと最適化」レッスンは無料ですか?

はい。「プロンプトのコンパイルと最適化」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、AI Prompt Engineeringコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 AI Prompt Engineeringコースには全4レッスンが含まれています。

「プロンプトのコンパイルと最適化」で何を学びますか?

BootstrapFewShot、MIPROなど、実践的なDSPyオプティマイザーを学びます。 ブラウザで直接実行するハンズオンコードでAI Prompt Engineeringを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

AI Prompt Engineeringを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのAI Prompt Engineeringは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン3/4です。

「プロンプトのコンパイルと最適化」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このAI Prompt Engineeringレッスンでコードを書いて実行できますか?

はい。すべてのAI Prompt Engineeringレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. DSPy Framework入門
  2. シグネチャとモジュールの定義
  3. プロンプトのコンパイルと最適化
  4. DSPyパイプラインの評価
← AI Prompt Engineeringに戻る