한국어
Week 4: 프로덕션
04. 고급 (DSPy)

04. 고급: DSPy 프롬프트 최적화

개요

DSPy는 "Declarative Self-improving Language Programs"의 약자입니다. 수동으로 프롬프트 문자열을 조정하는 대신 다음을 정의합니다:

  1. Signature: 입력/출력 타입
  2. Module: 로직 흐름
  3. Optimizer: 최대화할 메트릭 (예: faithfulness)

그러면 DSPy가 프로그램을 "컴파일"하여 메트릭을 최대화하는 최적의 few-shot 예제와 지시사항을 자동으로 찾습니다. 이것이 프롬프트 엔지니어링의 미래입니다.

핵심 개념

개념설명
Signature작업의 입력/출력 타입 정의
ModuleLLM 호출과 로직 캡슐화
Optimizer프롬프트 자동 개선
TeleprompterDSPy의 최적화 알고리즘

DSPy Signatures

import dspy
 
# 단순 signature
class BasicQA(dspy.Signature):
    """짧고 사실적인 답변으로 질문에 답변."""
    question = dspy.InputField()
    answer = dspy.OutputField(desc="보통 1-5 단어 사이")
 
# Chain-of-thought가 있는 복잡한 signature
class ReasonedQA(dspy.Signature):
    """추론과 함께 질문에 답변."""
    question = dspy.InputField()
    reasoning = dspy.OutputField(desc="단계별 추론")
    answer = dspy.OutputField()

DSPy Modules

class RAGModule(dspy.Module):
    def __init__(self, num_passages=3):
        super().__init__()
        self.retrieve = dspy.Retrieve(k=num_passages)
        self.generate = dspy.ChainOfThought(ReasonedQA)
 
    def forward(self, question):
        # 관련 문서 검색
        passages = self.retrieve(question).passages
 
        # 검색된 컨텍스트로 답변 생성
        context = "\n".join(passages)
        return self.generate(question=question, context=context)

Teleprompter로 최적화

from dspy.teleprompt import BootstrapFewShot
 
# 메트릭 정의
def accuracy_metric(example, pred, trace=None):
    return example.answer.lower() == pred.answer.lower()
 
# optimizer 생성
teleprompter = BootstrapFewShot(
    metric=accuracy_metric,
    max_bootstrapped_demos=4,
    max_labeled_demos=16
)
 
# 모듈 컴파일 (최적화)
optimized_rag = teleprompter.compile(
    RAGModule(),
    trainset=train_examples
)

DSPy를 사용하는 이유

자동 최적화: DSPy가 수동 튜닝 없이 최적의 프롬프트와 예제를 찾음

수동 프롬프팅DSPy
시행착오체계적 최적화
직관 기반메트릭 기반
재현 어려움재현 가능
변화에 취약자가 적응

DSPy vs 전통적 프롬프팅

# 전통적 접근법
prompt = """당신은 유용한 어시스턴트입니다. 질문에 정확하게 답변하세요.
질문: {question}
답변:"""
 
# DSPy 접근법
class QA(dspy.Signature):
    question = dspy.InputField()
    answer = dspy.OutputField()
 
qa_module = dspy.Predict(QA)
# DSPy가 실제 프롬프트를 자동으로 최적화!

실습

Signatures 정의

입력/출력 사양 생성

Modules 구축

검색과 생성 결합

메트릭 설정

"좋음"이 무엇인지 정의

최적화 실행

DSPy가 최적의 프롬프트를 찾도록 함

참고 자료

학술 논문