Skip to main content
W&B를 DSPy와 함께 사용해 언어 모델 프로그램을 추적하고 최적화하세요. W&B는 Weave DSPy 인테그레이션을 보완하며 다음을 제공합니다:
  • 시간에 따른 평가 메트릭 추적
  • 프로그램 시그니처 변화 확인을 위한 W&B Tables
  • MIPROv2와 같은 DSPy 옵티마이저와의 인테그레이션
DSPy 모듈을 최적화할 때 보다 포괄적인 관측 가능성을 확보하려면 W&B와 Weave 모두에서 인테그레이션을 활성화하세요.
참고wandb==0.21.2weave==0.52.5부터는 W&B와 함께 사용할 때 Weave가 자동으로 초기화됩니다:
  • weave를 임포트한 다음 wandb.init()를 호출하는 경우(스크립트 환경)
  • wandb.init()를 호출한 뒤 나중에 weave를 임포트하는 경우(노트북/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를 임포트하는 것으로 충분하며, 명시적인 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 Run URL과 Weave URL을 모두 받게 됩니다. W&B는 시간에 따른 평가 메트릭과 함께 프로그램 시그니처의 변화를 보여주는 Tables를 표시합니다. run의 Overview 탭에는 자세히 확인할 수 있는 Weave 트레이스 링크가 포함되어 있습니다. run 객체가 WandbDSPyCallback에 전달되지 않으면 전역 run 객체가 사용됩니다.
W&B의 DSPy 최적화 run
DSPy와 함께 사용하는 Weave 트레이싱, 평가, 최적화에 대한 자세한 내용은 Weave DSPy 인테그레이션 가이드를 참조하세요.

예측을 W&B Tables에 기록하기

최적화 중 개별 예시를 살펴볼 수 있도록 상세한 예측 로깅을 활성화하세요. 이 콜백은 각 evaluation step마다 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. run의 Overview 페이지로 이동합니다.
  2. predictions_0, predictions_1 등과 같은 패턴으로 이름이 지정된 Table 패널을 찾습니다.
  3. 실패 사례를 분석하려면 is_correct로 필터링합니다.
  4. 프로젝트 Workspace에서 여러 run의 테이블을 비교합니다.
각 table에는 다음 column이 포함됩니다.
  • example: 입력 데이터
  • prediction: 모델 출력
  • is_correct: Evaluation 결과
자세한 내용은 W&B Tables 가이드를 참조하세요.

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

가장 성능이 좋은 DSPy 프로그램을 재현하고 버전 관리하려면 W&B Artifacts에 저장하세요. 전체 프로그램을 저장할지, 상태만 저장할지 선택할 수 있습니다.
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")

# 버전 관리를 위한 맞춤형 alias 추가
callback.log_best_model(
    optimized_program,
    save_program=True,
    aliases=["best", "production", "v2.0"]
)