04. 고급: DSPy 프롬프트 최적화
개요
DSPy는 "Declarative Self-improving Language Programs"의 약자입니다. 수동으로 프롬프트 문자열을 조정하는 대신 다음을 정의합니다:
- Signature: 입력/출력 타입
- Module: 로직 흐름
- Optimizer: 최대화할 메트릭 (예: faithfulness)
그러면 DSPy가 프로그램을 "컴파일"하여 메트릭을 최대화하는 최적의 few-shot 예제와 지시사항을 자동으로 찾습니다. 이것이 프롬프트 엔지니어링의 미래입니다.
핵심 개념
| 개념 | 설명 |
|---|---|
| Signature | 작업의 입력/출력 타입 정의 |
| Module | LLM 호출과 로직 캡슐화 |
| Optimizer | 프롬프트 자동 개선 |
| Teleprompter | DSPy의 최적화 알고리즘 |
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가 실제 프롬프트를 자동으로 최적화!실습
참고 자료
학술 논문
- "DSPy: Compiling Declarative Language Model Calls into Self-Improving Pipelines" - Khattab et al., 2023
- arXiv:2310.03714 (opens in a new tab)
- DSPy 기초 논문