> ## Documentation Index
> Fetch the complete documentation index at: https://docs.wandb.ai/llms.txt
> Use this file to discover all available pages before exploring further.

> W&B와 함께 DSPy 프로그램을 추적하고 최적화해 프롬프트, 평가, 컴파일된 모듈 성능을 기록합니다.

# DSPy

W\&B를 DSPy와 함께 사용해 언어 모델 프로그램을 추적하고 최적화하세요. W\&B는 [Weave DSPy 인테그레이션](/ko/weave/guides/integrations/dspy)을 보완하며 다음을 제공합니다:

* 시간에 따른 평가 메트릭 추적
* 프로그램 시그니처 변화 확인을 위한 W\&B Tables
* MIPROv2와 같은 DSPy 옵티마이저와의 인테그레이션

DSPy 모듈을 최적화할 때 보다 포괄적인 관측 가능성을 확보하려면 W\&B와 Weave 모두에서 인테그레이션을 활성화하세요.

<Info>
  **참고**

  `wandb==0.21.2` 및 `weave==0.52.5`부터는 W\&B와 함께 사용할 때 Weave가 자동으로 초기화됩니다:

  * `weave`를 임포트한 다음 `wandb.init()`를 호출하는 경우(스크립트 환경)
  * `wandb.init()`를 호출한 뒤 나중에 `weave`를 임포트하는 경우(노트북/Jupyter 환경)

  명시적으로 `weave.init(...)`를 호출할 필요는 없습니다.
</Info>

<div id="install-and-authenticate">
  ## 설치 및 인증
</div>

필요한 라이브러리를 설치한 다음 W\&B에 로그인합니다:

<Tabs>
  <Tab title="명령줄">
    1. 필요한 라이브러리를 설치합니다:

       ```shell theme={null}
       pip install wandb weave dspy
       ```

    2. `WANDB_API_KEY` [환경 변수](/ko/models/track/environment-variables/)를 설정하고 로그인합니다:

       ```bash theme={null}
       export WANDB_API_KEY=<your_api_key>
       wandb login
       ```
  </Tab>

  <Tab title="Python">
    1. 필요한 라이브러리를 설치합니다:

       ```bash theme={null}
       pip install wandb weave dspy
       ```
    2. 코드에서 W\&B에 로그인합니다:

       ```python theme={null}
       import wandb
       wandb.login()
       ```
  </Tab>

  <Tab title="Notebook">
    필요한 라이브러리를 설치하고 임포트한 다음 W\&B에 로그인합니다:

    ```notebook theme={null}
    !pip install wandb weave dspy

    import wandb
    wandb.login()
    ```
  </Tab>
</Tabs>

W\&B가 처음이신가요? [퀵스타트 가이드](/ko/models/quickstart/)를 참조하세요.

<div id="track-program-optimization-experimental">
  ## 프로그램 최적화 추적 (실험적)
</div>

`dspy.Evaluate`를 사용하는 DSPy 옵티마이저(MIPROv2 등)의 경우 `WandbDSPyCallback`을 사용해 시간에 따른 평가 메트릭을 기록하고, W\&B Tables에서 프로그램 시그니처가 어떻게 변화하는지 추적하세요.

```python theme={null}
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` 객체가 사용됩니다.

<Frame>
  <img src="https://mintcdn.com/wb-21fd5541/mVjDwbx0mC8gYx-b/images/integrations/dspy_run_page.png?fit=max&auto=format&n=mVjDwbx0mC8gYx-b&q=85&s=f0bd7a2568e48fdf8ea232bf09528af3" alt="W&B의 DSPy 최적화 run" width="3456" height="1865" data-path="images/integrations/dspy_run_page.png" />
</Frame>

DSPy와 함께 사용하는 Weave 트레이싱, 평가, 최적화에 대한 자세한 내용은 [Weave DSPy 인테그레이션 가이드](/ko/weave/guides/integrations/dspy)를 참조하세요.

<div id="log-predictions-to-wb-tables">
  ## 예측을 W\&B Tables에 기록하기
</div>

최적화 중 개별 예시를 살펴볼 수 있도록 상세한 예측 로깅을 활성화하세요. 이 콜백은 각 evaluation step마다 W\&B Tables를 생성하므로, 특정 성공 사례와 실패 사례를 분석하는 데 도움이 됩니다.

```python theme={null}
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)
```

<div id="access-prediction-data">
  ### 예측 데이터 액세스
</div>

최적화 후 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 가이드](/ko/models/tables/visualize-tables/)를 참조하세요.

<div id="save-and-version-dspy-programs">
  ## DSPy 프로그램 저장 및 버전 관리
</div>

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

```python theme={null}
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"]
)
```
