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

# 튜토리얼: 앱 버전 관리

> Weave Model을 사용하여 애플리케이션과 매개변수를 추적하고 버전을 관리하는 방법을 알아보세요

시스템의 성능을 파악하려면 [입력, 출력, 메타데이터](/ko/products/wandb/weave/quickstart)와 함께 [앱을 거쳐 가는 데이터](/ko/products/wandb/weave/tutorial-tracing_2)를 추적하는 것이 필수적입니다. 앱의 버전을 지속적으로 관리하는 것도 그에 못지않게 중요합니다. 코드나 매개변수를 변경했을 때 출력이 어떻게 달라지는지 확인할 수 있기 때문입니다. Weave의 `Model` 클래스를 사용하면 이러한 변경 사항이 자동으로 추적됩니다.

이 튜토리얼은 LLM 애플리케이션의 여러 버전 간에 결과를 비교하고 재현하려는 개발자를 대상으로 합니다. 튜토리얼을 마치면 애플리케이션의 매개변수와 코드를 캡처하고 버전이 관리되는 Weave `Model`을 만들 수 있습니다. 또한 이전 버전을 조회하여 재사용하는 방법도 익힐 수 있습니다.

이 튜토리얼에서 배울 내용은 다음과 같습니다.

* Weave `Model`을 사용하여 애플리케이션과 매개변수를 추적하고 버전을 관리하는 방법
* 이미 로깅된 Weave `Model`을 내보내고, 수정하고, 재사용하는 방법

<h2 id="use-weavemodel">
  `weave.Model` 사용하기
</h2>

<Warning>
  `weave.Model` 클래스는 Python에서만 지원됩니다.
</Warning>

Weave `Model`을 사용하면 모델 공급업체 ID, 프롬프트, temperature 등의 매개변수가 변경될 때마다 Weave가 이를 저장하고 버전을 관리합니다.

Weave에서 `Model`을 만들려면 다음이 필요합니다.

* `weave.Model`을 상속하는 클래스
* 모든 클래스 필드에 대한 유형 정의
* `@weave.op()` 데코레이터가 적용되고 유형이 지정된 `invoke` 함수

클래스 필드나 모델을 정의하는 코드를 변경하면 Weave가 변경 사항을 로깅하고 버전을 업데이트합니다. 따라서 앱의 여러 버전 간에 생성 결과를 비교할 수 있습니다.

다음 예시에서 Weave는 모델 이름, temperature, system 프롬프트를 추적하고 버전을 관리합니다.

<Tabs>
  <Tab title="Python">
    ```python lines {26,33-34} theme={"system"}
    import json
    from openai import OpenAI

    import weave

    @weave.op()
    def extract_dinos(wmodel: weave.Model, sentence: str) -> dict:
        response = wmodel.client.chat.completions.create(
            model=wmodel.model_name,
            temperature=wmodel.temperature,
            messages=[
                {
                    "role": "system",
                    "content": wmodel.system_prompt
                },
                {
                    "role": "user",
                    "content": sentence
                }
                ],
                response_format={ "type": "json_object" }
            )
        return response.choices[0].message.content

    # weave.Model을 상속하는 서브클래스
    class ExtractDinos(weave.Model):
        client: OpenAI = None
        model_name: str
        temperature: float
        system_prompt: str

        # 함수 이름은 반드시 `invoke` 또는 `predict`로 지정하세요
        @weave.op()
        def invoke(self, sentence: str) -> dict:
            dino_data  = extract_dinos(self, sentence)
            return json.loads(dino_data)
    ```
  </Tab>

  <Tab title="TypeScript">
    ```plaintext theme={"system"}
    This feature is not available in TypeScript yet.
    ```
  </Tab>
</Tabs>

이제 모델을 인스턴스화하고 `invoke`로 호출할 수 있습니다.

<Tabs>
  <Tab title="Python">
    ```python lines {7,18} theme={"system"}
    weave.init('jurassic-park')
    client = OpenAI()

    system_prompt = """Extract any dinosaur `name`, their `common_name`, \
    names and whether its `diet` is a herbivore or carnivore, in JSON format."""

    dinos = ExtractDinos(
        client=client,
        model_name='gpt-4o',
        temperature=0.4,
        system_prompt=system_prompt
    )

    sentence = """I watched as a Tyrannosaurus rex (T. rex) chased after a Triceratops (Trike), \
    both carnivore and herbivore locked in an ancient dance. Meanwhile, a gentle giant \
    Brachiosaurus (Brachi) calmly munched on treetops, blissfully unaware of the chaos below."""

    result = dinos.invoke(sentence)
    print(result)
    ```
  </Tab>

  <Tab title="TypeScript">
    ```plaintext theme={"system"}
    This feature is not available in TypeScript yet.
    ```
  </Tab>
</Tabs>

`.invoke()`를 호출하면 Weave의 트레이스에 모델 매개변수와 `weave.op()`으로 데코레이트된 모델 함수의 코드가 함께 추적됩니다. 모델의 버전도 관리됩니다(이 예시에서는 `v21`). 모델을 클릭하면 해당 버전을 사용한 모든 Call을 확인할 수 있습니다.

<img src="https://mintcdn.com/coreweave-dbfa0e8d/3Dv_sw2eg8feUJlx/products/wandb/weave/_media/tutorial-model_invoke3.png?fit=max&auto=format&n=3Dv_sw2eg8feUJlx&q=85&s=9fdbffd1e5837823322919a24c541e08" alt="Weave 모델 재사용" width="1664" height="1292" data-path="products/wandb/weave/_media/tutorial-model_invoke3.png" />

`weave.Model` 사용 시 참고 사항:

* 원하는 경우 Weave `Model`의 함수 이름으로 `invoke` 대신 `predict`를 사용할 수 있습니다.
* 다른 클래스 메서드를 Weave로 추적하려면 `weave.op()`으로 래핑하세요.
* Weave는 밑줄로 시작하는 매개변수를 무시하며 로깅하지 않습니다.

<h2 id="export-and-reuse-a-logged-weavemodel">
  로깅된 `weave.Model` 내보내기 및 재사용
</h2>

이제 Weave에서 모델의 버전이 관리되므로, 코드에서 모델을 다시 정의하지 않고도 이전 버전을 가져와 다시 실행할 수 있습니다. 이 기능은 과거 결과를 재현하거나 특정 모델 버전을 다른 사람과 공유할 때 유용합니다.

Weave는 호출된 Model을 저장하고 버전을 관리하므로, 이를 내보내고 재사용할 수 있습니다.

<h3 id="get-the-model-ref">
  Model ref 조회
</h3>

Weights & Biases UI에서 특정 버전의 Model ref를 조회할 수 있습니다.

<h3 id="use-the-model">
  Model 사용하기
</h3>

Model 객체의 URI를 확인했다면 이를 내보내 재사용할 수 있습니다. 내보낸 모델은 이미 초기화되어 있으므로 바로 사용할 수 있습니다.

<Tabs>
  <Tab title="Python">
    ```python lines {2} theme={"system"}
    # 내보낸 Weave 모델은 이미 초기화되어 있으므로 바로 호출할 수 있습니다.
    new_dinos = weave.ref("weave://morgan/jurassic-park/object/ExtractDinos:ey4udBU2MU23heQFJenkVxLBX4bmDsFk7vsGcOWPjY4").get()

    # 클라이언트를 다시 OpenAI 클라이언트로 설정합니다.
    new_dinos.client = client

    new_sentence = """I also saw an Ankylosaurus grazing on giant ferns"""
    new_result = new_dinos.invoke(new_sentence)
    print(new_result)
    ```
  </Tab>

  <Tab title="TypeScript">
    ```plaintext theme={"system"}
    이 기능은 아직 TypeScript에서 사용할 수 없습니다.
    ```
  </Tab>
</Tabs>

이제 새 입력에도 동일한 Model 버전(v21)이 사용된 것을 확인할 수 있습니다.

<img src="https://mintcdn.com/coreweave-dbfa0e8d/3Dv_sw2eg8feUJlx/products/wandb/weave/_media/tutorial-model_re-use.png?fit=max&auto=format&n=3Dv_sw2eg8feUJlx&q=85&s=f962108efde0d0dde004de5ab442183f" alt="Weave 모델 재사용" width="1260" height="1120" data-path="products/wandb/weave/_media/tutorial-model_re-use.png" />

이제 버전 관리되는 Weave `Model`을 갖추었으므로, 애플리케이션의 여러 버전에서 이 모델을 반복 개선하고 조회하고 재사용할 수 있습니다.

<h2 id="whats-next">
  다음 단계
</h2>

* [Evaluation 파이프라인 구축 튜토리얼](/ko/products/wandb/weave/tutorial-eval)을 따라 애플리케이션을 반복적으로 개선해 나가세요.
