dspy.BootstrapFewShot
dspy.BootstrapFewShot
dspy.BootstrapFewShot는 DSPy의 데모 튜닝(demo-tuning) 옵티마이저 중에서도 가장 기본이 되는 부트스트래퍼예요. 부트스트래핑이란 걸 정확히 짚어보면, "프로그램(또는 여러분이 제공한 teacher)을 훈련 예시에 실행하고, 각 완성 결과를 메트릭으로 채점한 뒤, 메트릭을 통과한 trace만 demo로 남기는" 과정이에요.
이 옵티마이저의 핵심 전제는 간단해요. 평가를 신뢰할 만한 메트릭이 있다면, 그 메트릭을 통과한 완성 결과(성공 trace)가 곧 좋은 few-shot 예시라는 것이죠. 그래서 거의 항상 zero-shot보다 성능이 좋고, 옵티마이저를 처음 써볼 때 가장 안전한 선택으로 꼽혀요.
생성자 시그니처
dspy.BootstrapFewShot은 다음과 같은 파라미터를 받아요.
dspy.BootstrapFewShot(
metric=None,
metric_threshold=None,
teacher_settings=None,
max_bootstrapped_demos=4,
max_labeled_demos=16,
max_rounds=1,
max_errors=None,
)
metric: 각 완성 결과를 채점하는 함수예요. 참/거짓(또는 숫자)을 반환하면 됩니다.metric_threshold: 숫자를 반환하는 메트릭의 하한(임계값)이에요. 없으면 메트릭의 반환값을 bool로 강제해요.metric_threshold=0.5는 "점수가 0.5 이상이면 통과"라는 뜻이에요.max_bootstrapped_demos: 부트스트랩된(검증된) demo가 차지할 슬롯 수예요.max_labeled_demos: 조합된 demo의 총 개수 상한이에요.max_rounds: 한 예시의 성공 trace를 얻기 위해 teacher를 재실행하는 횟수예요.
compile은 teacher와 trainset을 받아요. teacher를 전달하지 않으면 student.deepcopy()를 만들어 그 사본이 teacher가 돼요. 그래서 원본 student는 컴파일 과정에서 손대지 않아요.
부트스트래핑이 동작하는 방식
.compile이 돌아갈 때 일어나는 일을 순서로 보면 이래요.
- teacher 초기화. teacher가 없으면
student.deepcopy(). teacher가 아직 컴파일 안 됐고max_labeled_demos > 0이면LabeledFewShot(k=max_labeled_demos)를 적용해 teacher가 부트스트랩할 예시를 확보해요. - trainset 순회. 각 예시마다 최대
max_rounds번 시도해요. 매 라운드는 현재 예시를 모든 predictor의 demo에서 제거하고,rollout_id=round, temperature=1.0으로 LM을 복사해 teacher를 호출해요. - 메트릭으로 채점.
metric(example, prediction, trace)를 호출해요. 참 반환(또는metric_threshold가 있으면 숫자>= metric_threshold)이면 그 trace를 통과로 표시해요. teacher나 메트릭에서 예외가 나면 오류 카운터가 증가하고,max_errors를 넘기면 예외를 올려요. - 통과 trace에서 demo 추출. 각 trace의 predictor 호출마다
dspy.Example(augmented=True, **inputs, **outputs)를 만들어 해당 predictor 이름 아래 저장해요. - demo 할당. 각 predictor에 대해 앞
max_bootstrapped_demos슬롯은 부트스트랩 demo, 나머지(max_labeled_demos까지)는 trainset의 부트스트랩되지 않은 부분에서 샘플링한 원시 라벨 예시로 채워요.
핵심 포인트
- teacher는 student의 딥카피가 기본값이에요. teacher에는
LabeledFewShotdemo가 적용되므로, 그걸 student의 컴파일된 상태로 새지 않게 하려는 설계예요. 더 강한 모델을teacher=로 넘기는 게, 단일 LM 부트스트래핑이 정체됐을 때의 표준 업그레이드 경로예요. - 부트스트랩 중인 예시는 teacher의 demo에서 먼저 제거돼요. 그렇게 안 하면 teacher가 자기 demo에서 예시의 답을 꺼내 "성공"할 수 있거든요.
- 결과는 새 컴파일된 모듈이고 원본 student는 바뀌지 않아요. 반환된 모듈에는
_compiled = True가 설정돼요.
언제 쓰나요?
예시가 아주 적을 때(약 10개) 첫 시작으로 좋아요. 메트릭이 신뢰할 만하면 zero-shot보다 거의 항상 나아지므로, 더 무거운 옵티마이저로 넘어가기 전에 먼저 깔아보는 베이스라인으로도 적절해요. 메트릭이 지나치게 관대하면 낮은 품질의 demo가 많이 남고, 엄격하면 적지만 고품질의 demo가 남는다는 점을 기억하세요.