메인 콘텐츠로 건너뛰기
W&B를 DSPy와 함께 사용하여 언어 모델 프로그램을 추적하고 최적화하세요. W&B는 Weave DSPy 통합을 보완하여 다음과 같은 기능을 제공합니다:
  • 시간 경과에 따른 평가 지표 추적
  • 프로그램 시그니처 변화를 위한 W&B Tables
  • MIPROv2와 같은 DSPy 옵티마이저와의 연동
DSPy 모듈을 최적화할 때 포괄적인 관측 가능성을 확보하려면 W&B와 Weave 양쪽에서 모두 통합을 활성화하세요.
Notewandb==0.21.2weave==0.52.5부터는 Weave가 W&B와 함께 사용될 때 자동으로 초기화됩니다:
  • weave를 import한 뒤 wandb.init()을 호출하는 경우(스크립트 환경)
  • 먼저 wandb.init()을 호출한 뒤 나중에 weave를 import하는 경우(노트북/Jupyter 환경)
명시적으로 weave.init(...)를 호출할 필요가 없습니다.

설치 및 인증

필요한 라이브러리를 설치하고 W&B에 로그인합니다:
  1. 필요한 라이브러리를 설치합니다:
    pip install wandb weave dspy
    
  2. WANDB_API_KEY 환경 변수를 설정하고 로그인합니다:
    export WANDB_API_KEY=<your_api_key>
    wandb login
    
W&B가 처음이라면 빠른 시작 가이드를 참고하세요.

프로그램 최적화 추적 (실험적)

dspy.Evaluate를 사용하는 DSPy 옵티마이저(예: MIPROv2)의 경우 WandbDSPyCallback을 사용하여 시간 경과에 따른 평가 지표를 로그로 기록하고, 프로그램 시그니처의 변화를 W&B Tables에서 추적합니다.
import dspy
from dspy.datasets import MATH

import weave
import wandb
from wandb.integration.dspy import WandbDSPyCallback

# W&B 초기화 (weave import만으로 충분하며, 명시적인 weave.init 호출 불필요)
project_name = "dspy-optimization"
with wandb.init(project=project_name) as run:
    # DSPy에 W&B 콜백 추가
    dspy.settings.callbacks.append(
        WandbDSPyCallback(run=run)
    )

    # 언어 모델 설정
    teacher_lm = dspy.LM('openai/gpt-4o', max_tokens=2000, cache=True)
    student_lm = dspy.LM('openai/gpt-4o-mini', max_tokens=2000)
    dspy.configure(lm=student_lm)

    # 데이터셋 로드 및 프로그램 정의
    dataset = MATH(subset='algebra')
    program = dspy.ChainOfThought("question -> answer")

    # 옵티마이저 설정 및 실행
    optimizer = dspy.MIPROv2(
        metric=dataset.metric,
        auto="light",
        num_threads=24,
        teacher_settings=dict(lm=teacher_lm),
        prompt_model=student_lm
    )

    optimized_program = optimizer.compile(
        program,
        trainset=dataset.train,
        max_bootstrapped_demos=2,
        max_labeled_demos=2
    )
이 코드를 실행하면 W&B 실행 URL과 Weave URL을 모두 받게 됩니다. W&B는 시간에 따른 평가 지표와 함께 프로그램 시그니처의 변화를 보여주는 Tables를 제공합니다. 실행의 Overview 탭에는 상세 분석을 위한 Weave trace 링크가 포함되어 있습니다. run 객체가 WandbDSPyCallback에 전달되지 않으면 전역 run 객체가 사용됩니다.
W&B에서의 DSPy 최적화 실행
Weave에서 DSPy를 사용한 트레이싱, 평가, 최적화에 대한 자세한 내용은 Weave DSPy 통합 가이드를 참조하세요.

예측을 W&B Tables에 로깅하기

예측 상세 로깅을 활성화하여 최적화 과정 중 개별 샘플을 검사할 수 있습니다. 이 콜백은 각 평가 단계마다 W&B Tables를 생성하며, 이를 통해 특정 성공 및 실패 사례를 분석하는 데 도움이 됩니다.
from wandb.integration.dspy import WandbDSPyCallback

# 예측 로깅 활성화 (기본적으로 활성화됨)
callback = WandbDSPyCallback(log_results=True)
dspy.settings.callbacks.append(callback)

# 최적화 실행
optimized_program = optimizer.compile(program, trainset=train_data)

# 필요한 경우 예측 로깅 비활성화
# callback = WandbDSPyCallback(log_results=False)

예측 데이터 확인

최적화 후 W&B에서 예측 데이터를 확인합니다:
  1. 실행의 Overview 페이지로 이동합니다.
  2. predictions_0, predictions_1 등과 같은 패턴의 이름을 가진 Table 패널을 찾습니다.
  3. 실패 사례를 분석하려면 is_correct로 필터링합니다.
  4. 프로젝트 워크스페이스에서 실행 간 테이블을 비교합니다.
각 테이블에는 다음과 같은 열이 포함됩니다:
  • example: 입력 데이터
  • prediction: 모델 출력
  • is_correct: 평가 결과
자세한 내용은 W&B Tables 가이드Tables 튜토리얼을 참고하세요.

DSPy 프로그램 저장 및 버전 관리

최상의 DSPy 프로그램을 재현하고 버전 관리하려면 W&B 아티팩트로 저장하세요. 프로그램 전체를 저장할지, 상태만 저장할지 선택할 수 있습니다.
from wandb.integration.dspy import WandbDSPyCallback

# 콜백 인스턴스 생성
callback = WandbDSPyCallback()
dspy.settings.callbacks.append(callback)

# 최적화 실행
optimized_program = optimizer.compile(program, trainset=train_data)

# 저장 옵션:

# 1. 전체 프로그램 (권장) - 아키텍처 및 상태 포함
callback.log_best_model(optimized_program, save_program=True)

# 2. JSON으로 상태만 저장 - 더 가볍고 사람이 읽기 쉬운 형식
callback.log_best_model(optimized_program, save_program=False, filetype="json")

# 3. pickle로 상태만 저장 - Python 객체 보존
callback.log_best_model(optimized_program, save_program=False, filetype="pkl")

# 버전 관리를 위한 커스텀 별칭 추가
callback.log_best_model(
    optimized_program,
    save_program=True,
    aliases=["best", "production", "v2.0"]
)