0Pricing
AI Prompt Engineering · 강의

프롬프트 컴파일 및 최적화

BootstrapFewShot, MIPRO 및 기타 DSPy 최적화 도구를 실제로 사용해 봅니다.

프롬프트 컴파일 및 최적화은(는) CoddyKit의 무료 AI Prompt Engineering 강의입니다. 이것은 4개 중 3번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 AI Prompt Engineering 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. AI Prompt Engineering 강의에는 총 4개의 강의가 포함되어 있습니다.

DSPy에서 최적화의 의미

DSPy의 최적화(컴파일이라고도 함)는 학습 데이터 세트와 평가 지표가 주어졌을 때 프로그램에 가장 적합한 프롬프트 구성을 찾습니다. 최적화기는 가능한 퓨샷 예시, 지침 및 추론 시연 예시를 탐색합니다.

컴파일을 한 번 실행하고 결과를 저장한 뒤 최적화된 프로그램을 배포합니다. 추론 시점에는 빠른 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 최적화기입니다. 학습 데이터 세트에서 프로그램을 실행하고, 성공적인 추적(평가 지표를 통과한 입력-출력 쌍)을 수집한 다음, 이러한 추적을 컴파일된 프롬프트의 퓨샷 시연 예시로 사용합니다.

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(다중 프롬프트 지침 제안 및 최적화)는 더 강력한 최적화기입니다. 퓨샷 예시를 선택할 뿐 아니라 프롬프트에 포함할 더 나은 지침 텍스트도 탐색합니다.

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는 최적화된 퓨샷 시연 예시를 프롬프트에 삽입합니다. 컴파일된 프로그램의 예측기를 확인하면 이를 살펴볼 수 있습니다.

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 중간 설정: 약 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 최적화 작업 흐름은 다음과 같습니다. signature 정의 → 모듈 구축 → 학습 데이터 준비 → 최적화기 선택 → 컴파일 → 평가 → save. 아이디어에서 운영 환경에 배포할 수 있는 최적화된 프롬프트 파이프라인까지 이어지는 전체 주기입니다.

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은 성공적인 추적에서 좋은 퓨샷 시연 예시를 찾습니다. MIPROv2는 더 나은 지침 텍스트도 추가로 탐색합니다. 모든 최적화기는 compile(program, trainset=...) 인터페이스를 공유합니다. 컴파일은 오프라인에서 한 번만 발생하는 비용이므로 program.save()으로 결과를 저장하고, 추론 시점에는 추가 비용 없이 최적화된 프로그램을 배포하십시오.

자주 묻는 질문

“프롬프트 컴파일 및 최적화” 강의는 무료인가요?

네 — “프롬프트 컴파일 및 최적화” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 AI Prompt Engineering 강의 전체를 잠금 해제할 수 있습니다. AI Prompt Engineering 강의에는 총 4개의 강의가 포함되어 있습니다.

“프롬프트 컴파일 및 최적화”에서 뭘 배우나요?

BootstrapFewShot, MIPRO 및 기타 DSPy 최적화 도구를 실제로 사용해 봅니다. 브라우저에서 직접 실행하는 실습 코드로 AI Prompt Engineering을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.

AI Prompt Engineering을(를) 시작하는 데 경험이 필요한가요?

사전 경험은 필요하지 않습니다. CoddyKit의 AI Prompt Engineering은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 3번째 강의입니다.

“프롬프트 컴파일 및 최적화” 강의는 얼마나 걸리나요?

대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.

이 AI Prompt Engineering 강의에서 코드를 작성하고 실행할 수 있나요?

네. 모든 AI Prompt Engineering 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.

이 강의의 모든 강의

  1. DSPy 프레임워크 소개
  2. 시그니처와 모듈 정의
  3. 프롬프트 컴파일 및 최적화
  4. DSPy 파이프라인 평가
← AI Prompt Engineering(으)로 돌아가기