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를 재실행하는 횟수예요.

compileteachertrainset을 받아요. teacher를 전달하지 않으면 student.deepcopy()를 만들어 그 사본이 teacher가 돼요. 그래서 원본 student는 컴파일 과정에서 손대지 않아요.

부트스트래핑이 동작하는 방식

.compile이 돌아갈 때 일어나는 일을 순서로 보면 이래요.

  1. teacher 초기화. teacher가 없으면 student.deepcopy(). teacher가 아직 컴파일 안 됐고 max_labeled_demos > 0이면 LabeledFewShot(k=max_labeled_demos)를 적용해 teacher가 부트스트랩할 예시를 확보해요.
  2. trainset 순회. 각 예시마다 최대 max_rounds번 시도해요. 매 라운드는 현재 예시를 모든 predictor의 demo에서 제거하고, rollout_id=round, temperature=1.0으로 LM을 복사해 teacher를 호출해요.
  3. 메트릭으로 채점. metric(example, prediction, trace)를 호출해요. 참 반환(또는 metric_threshold가 있으면 숫자 >= metric_threshold)이면 그 trace를 통과로 표시해요. teacher나 메트릭에서 예외가 나면 오류 카운터가 증가하고, max_errors를 넘기면 예외를 올려요.
  4. 통과 trace에서 demo 추출. 각 trace의 predictor 호출마다 dspy.Example(augmented=True, **inputs, **outputs)를 만들어 해당 predictor 이름 아래 저장해요.
  5. demo 할당. 각 predictor에 대해 앞 max_bootstrapped_demos 슬롯은 부트스트랩 demo, 나머지(max_labeled_demos까지)는 trainset의 부트스트랩되지 않은 부분에서 샘플링한 원시 라벨 예시로 채워요.

핵심 포인트

  • teacher는 student의 딥카피가 기본값이에요. teacher에는 LabeledFewShot demo가 적용되므로, 그걸 student의 컴파일된 상태로 새지 않게 하려는 설계예요. 더 강한 모델을 teacher=로 넘기는 게, 단일 LM 부트스트래핑이 정체됐을 때의 표준 업그레이드 경로예요.
  • 부트스트랩 중인 예시는 teacher의 demo에서 먼저 제거돼요. 그렇게 안 하면 teacher가 자기 demo에서 예시의 답을 꺼내 "성공"할 수 있거든요.
  • 결과는 새 컴파일된 모듈이고 원본 student는 바뀌지 않아요. 반환된 모듈에는 _compiled = True가 설정돼요.

언제 쓰나요?

예시가 아주 적을 때(약 10개) 첫 시작으로 좋아요. 메트릭이 신뢰할 만하면 zero-shot보다 거의 항상 나아지므로, 더 무거운 옵티마이저로 넘어가기 전에 먼저 깔아보는 베이스라인으로도 적절해요. 메트릭이 지나치게 관대하면 낮은 품질의 demo가 많이 남고, 엄격하면 적지만 고품질의 demo가 남는다는 점을 기억하세요.