> ## 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.

# 피드백 수집 및 어노테이션 사용

> UI와 SDK를 통해 LLM 애플리케이션에 대한 피드백을 수집하고 분석합니다

LLM 애플리케이션을 평가하려면 피드백을 수집하고 분석할 도구가 필요합니다. W\&B Weave는 통합 피드백 시스템을 제공하므로 UI에서 직접, 또는 SDK를 통해 프로그래밍 방식으로 Call에 피드백을 남길 수 있습니다. Weave는 이모지 반응, 텍스트 댓글, 구조화된 데이터 등 다양한 피드백 유형을 지원하므로 팀에서 다음과 같은 작업을 할 수 있습니다.

* 성능 모니터링용 평가 데이터셋을 구축합니다.
* LLM 콘텐츠 문제를 파악하고 해결합니다.
* 파인튜닝 같은 고급 작업에 사용할 예시를 수집합니다.

이 가이드는 Weave에서 LLM 애플리케이션을 개발하거나 검토하는 사용자를 위한 것입니다. UI와 SDK에서 Weave의 피드백 기능을 사용하는 방법, 피드백을 쿼리하고 관리하는 방법, 휴먼 어노테이션으로 상세한 평가를 수행하는 방법을 다룹니다.

* [UI에서 피드백 제공](#provide-feedback-in-the-ui)
* [SDK를 통해 피드백 제공](#provide-feedback-through-the-sdk)
* [휴먼 어노테이션 추가](#add-human-annotations)

<h2 id="provide-feedback-in-the-ui">
  UI에서 피드백 제공하기
</h2>

다음 섹션에서는 Weights & Biases UI의 Call details 패널에서 또는 피드백 아이콘을 사용하여 피드백을 제공하는 방법을 설명합니다.

<h3 id="use-the-call-details-panel">
  Call details 패널 사용하기
</h3>

1. Weave 프로젝트 사이드바에서 **Traces**로 이동하세요.
2. 피드백을 추가할 Call의 행을 찾으세요.
3. 연결된 Trace 이름을 클릭하여 트레이스 트리와 Call details 패널을 여세요.
4. Call details 탭 표시줄에서 **Feedback**을 선택하세요.
5. 피드백을 추가, 확인 또는 삭제하세요.
   * Call details 피드백 뷰의 오른쪽 상단에 있는 *아이콘을 사용하여 피드백을 추가하고 확인하세요*.
   * *Call details 피드백 table에서 피드백을 확인하고 삭제하세요.* 피드백을 삭제하려면 해당 피드백 행의 맨 오른쪽 열에 있는 휴지통 아이콘을 클릭하세요.

<Frame>
  <img src="https://mintcdn.com/coreweave-dbfa0e8d/3Dv_sw2eg8feUJlx/products/wandb/weave/_media/feedback_tab.png?fit=max&auto=format&n=3Dv_sw2eg8feUJlx&q=85&s=50b49b6e6e2614b182b1a33775754175" alt="Call details의 Feedback 탭" width="1266" height="548" data-path="products/wandb/weave/_media/feedback_tab.png" />
</Frame>

<h3 id="use-the-feedback-icons">
  피드백 아이콘 사용하기
</h3>

Traces table과 개별 Call details 패널에 있는 아이콘으로 반응을 추가하거나 제거하고, 노트를 추가할 수 있습니다.

* *Traces table*: **Traces** table에서 해당 행의 **Feedback** 열에 있습니다.
* *Call details 패널*: 각 Call details 패널의 오른쪽 상단에 있습니다.

반응을 추가하려면 다음을 수행하세요.

1. 이모지 아이콘을 클릭하세요.
2. 좋아요나 싫어요를 추가하거나, **+** 아이콘을 클릭하여 다른 이모지를 선택하세요.

반응을 제거하려면 다음을 수행하세요.

1. 제거할 이모지 반응에 마우스를 올리세요.
2. 반응을 클릭하면 제거됩니다.

> [Call details 패널의 **Feedback** 열](#use-the-call-details-panel)에서도 피드백을 삭제할 수 있습니다.

댓글을 추가하려면 다음을 수행하세요.

1. 말풍선 아이콘을 클릭하세요.
2. 텍스트 상자에 노트를 입력하세요. 피드백 노트는 최대 1024자까지 입력할 수 있습니다.
3. **Enter** 키를 눌러 노트를 저장하세요. 노트는 여러 개 추가할 수 있습니다.

<Warning>
  피드백 노트는 최대 1024자까지 입력할 수 있습니다. 이 제한을 초과하는 노트는 Weave에서 생성되지 않습니다.
</Warning>

<Frame>
  <img src="https://mintcdn.com/coreweave-dbfa0e8d/3Dv_sw2eg8feUJlx/products/wandb/weave/_media/feedback_calls.png?fit=max&auto=format&n=3Dv_sw2eg8feUJlx&q=85&s=ab4006b5d636f9e87db1edc7a80fd1ab" alt="피드백 열이 있는 Call 그리드" width="3056" height="1589" data-path="products/wandb/weave/_media/feedback_calls.png" />
</Frame>

<h2 id="provide-feedback-through-the-sdk">
  SDK로 피드백 제공하기
</h2>

UI에서 피드백을 직접 입력하는 대신 피드백 수집을 자동화하거나 평가 파이프라인에 통합하려면 SDK를 사용하세요.

피드백 관련 SDK 사용 예시는 UI의 Call details 패널에 있는 **Use** 탭에서 확인할 수 있습니다.

Weave Python SDK를 사용하면 Call에 대한 피드백을 프로그래밍 방식으로 [추가](/ko/products/wandb/weave/reference/python-sdk/trace/feedback#method-add), [제거](/ko/products/wandb/weave/reference/python-sdk/trace/feedback#method-purge), [쿼리](/ko/products/wandb/weave/reference/python-sdk/trace/weave_client#method-get_feedback)할 수 있습니다. TypeScript SDK는 피드백 기능을 지원하지 않습니다.

<h3 id="query-a-projects-feedback">
  프로젝트의 피드백 쿼리하기
</h3>

SDK를 사용하면 Weave 프로젝트의 피드백을 쿼리할 수 있습니다. SDK는 다음 피드백 쿼리 오퍼레이션을 지원합니다.

* `client.get_feedback()`: 프로젝트의 모든 피드백을 반환합니다.
* `client.get_feedback("[FEEDBACK-UUID]")`: `[FEEDBACK-UUID]`로 지정한 특정 피드백 객체를 컬렉션 형태로 반환합니다.
* `client.get_feedback(reaction="[REACTION-TYPE]")`: 특정 반응 유형에 해당하는 모든 피드백 객체를 반환합니다.

`client.get_feedback()`에서 각 피드백 객체의 추가 정보도 조회할 수 있습니다.

* `id`: 피드백 객체 ID입니다.
* `created_at`: 피드백 객체의 생성 시간 정보입니다.
* `feedback_type`: 피드백 유형(reaction, note, custom)입니다.
* `payload`: 피드백 페이로드입니다.

<Tabs>
  <Tab title="Python">
    ```python lines theme={"system"}
    import weave
    client = weave.init('intro-example')

    # 프로젝트의 모든 피드백 조회
    all_feedback = client.get_feedback()

    # id로 특정 피드백 객체 가져오기
    # API는 컬렉션을 반환하며, 이 컬렉션에는 항목이 최대 하나만 포함됩니다.
    one_feedback = client.get_feedback("[FEEDBACK-UUID]")[0]

    # 특정 반응이 달린 모든 피드백 객체 찾기. offset과 limit을 지정할 수 있습니다.
    thumbs_up = client.get_feedback(reaction="👍", limit=10)

    # 조회한 후 개별 피드백 객체의 세부 정보 확인
    for f in client.get_feedback():
        print(f.id)
        print(f.created_at)
        print(f.feedback_type)
        print(f.payload)
    ```
  </Tab>

  <Tab title="TypeScript">
    ```plaintext theme={"system"}
    이 기능은 아직 TypeScript에서 지원되지 않습니다.
    ```
  </Tab>
</Tabs>

<h3 id="add-feedback-to-a-call">
  Call에 피드백 추가하기
</h3>

Call의 UUID를 사용하여 Call에 피드백을 추가할 수 있습니다. UUID로 특정 Call을 조회하려면 먼저 [Call 실행 중 또는 실행 후에 UUID를 가져오세요](#retrieve-the-call-uuid). SDK는 Call에 피드백을 추가하는 다음 오퍼레이션을 지원합니다.

* `call.feedback.add_reaction("[REACTION-TYPE]")`: 👍와 같이 지원되는 `[REACTION-TYPE]` 값(이모지) 중 하나를 추가합니다.
* `call.feedback.add_note("[NOTE]")`: 노트를 추가합니다.
* `call.feedback.add("[LABEL]", [OBJECT])`: `[LABEL]`로 지정한 맞춤형 피드백 `[OBJECT]`를 추가합니다.

<Warning>
  피드백 노트는 최대 1024자까지 입력할 수 있습니다. 노트가 이 제한을 초과하면 Weave는 해당 노트를 생성하지 않습니다.
</Warning>

<Tabs>
  <Tab title="Python">
    ```python lines theme={"system"}
    import weave
    client = weave.init('intro-example')

    call = client.get_call("[CALL-UUID]")

    # 이모지 반응 추가
    call.feedback.add_reaction("👍")

    # 노트 추가
    call.feedback.add_note("this is a note")

    # 맞춤형 키/값 쌍 추가
    # 첫 번째 인수는 사용자가 정의한 "type" 문자열입니다.
    # 피드백은 JSON으로 직렬화할 수 있어야 하며, 직렬화된 크기가 1KB 미만이어야 합니다.
    call.feedback.add("correctness", { "value": 5 })
    ```
  </Tab>

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

<h4 id="retrieve-the-call-uuid">
  Call UUID 가져오기
</h4>

Call 직후 바로 피드백을 추가해야 하는 경우에는 Call 실행 도중이나 실행 후에 프로그래밍 방식으로 Call UUID를 가져올 수 있습니다.

<h5 id="during-call-execution">
  Call 실행 중
</h5>

Call 실행 중에 UUID를 조회하려면 현재 Call을 가져온 다음 해당 ID를 반환하세요.

<Tabs>
  <Tab title="Python">
    ```python lines theme={"system"}

    import weave
    weave.init("uuid")

    @weave.op()
    def simple_operation(input_value):
        # 단순한 오퍼레이션 수행
        output = f"Processed {input_value}"
        # 현재 call ID 조회
        current_call = weave.require_current_call()
        call_id = current_call.id
        return output, call_id
    ```
  </Tab>

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

<h5 id="after-call-execution">
  Call 실행 후
</h5>

또는 `call()` 메서드로 오퍼레이션을 실행한 후 Call ID를 가져올 수도 있습니다.

<Tabs>
  <Tab title="Python">
    ```python lines theme={"system"}
    import weave
    weave.init("uuid")

    @weave.op()
    def simple_operation(input_value):
        return f"Processed {input_value}"

    # 오퍼레이션을 실행하고 결과와 call ID를 가져옵니다
    result, call = simple_operation.call("example input")
    call_id = call.id
    ```
  </Tab>

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

<h3 id="delete-feedback-from-a-call">
  Call에서 피드백 삭제하기
</h3>

UUID를 지정하면 특정 call에서 피드백을 삭제할 수 있습니다.

<Tabs>
  <Tab title="Python">
    ```python lines theme={"system"}
    call.feedback.purge("[FEEDBACK-UUID]")
    ```
  </Tab>

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

<h2 id="add-human-annotations">
  휴먼 어노테이션 추가
</h2>

휴먼 어노테이션을 사용하면 Call에 대해 사람이 검토한 판단을 구조화된 형태로 캡처할 수 있으므로, 검토자가 자체 기준에 따라 모델 출력을 평가할 수 있습니다.

휴먼 어노테이션은 Weights & Biases UI에서 지원됩니다. 이 기능을 사용하면 맞춤형 필드를 만들고, 사람이 입력한 데이터를 피드백으로 트레이스에 추가할 수 있습니다. 휴먼 어노테이션을 작성하려면 먼저 [UI](#create-a-human-annotation-scorer-in-the-ui) 또는 [API](#create-a-human-annotation-scorer-using-the-api)로 휴먼 어노테이션 Scorer를 생성해야 합니다. 그런 다음 [UI에서 Scorer를 사용해 어노테이션을 작성](#use-the-human-annotation-scorer-in-the-ui)하거나 [API로 어노테이션 Scorer를 수정](#modify-a-human-annotation-scorer-using-the-api)할 수 있습니다.

<h3 id="create-a-human-annotation-scorer-in-the-ui">
  UI에서 휴먼 어노테이션 Scorer 만들기
</h3>

UI에서 휴먼 어노테이션 Scorer를 만들려면 다음 단계를 따르세요.

1. 프로젝트 사이드바에서 **Assets**로 이동하세요.
2. Assets 내비게이션 패널에서 **Scorers**를 클릭하세요.
3. **Scorers** 패널 헤더에서 **New scorer**를 클릭하세요.
4. **Create Scorer** 모달 대화 상자에서 다음 항목을 설정하세요.
   * `Scorer type`: `Human annotation`
   * `Name`
   * `Description`
   * `Type`: 수집할 피드백의 유형을 결정합니다(예: `boolean` 또는 `integer`).
5. **Create scorer**를 클릭하세요. 이제 이 Scorer로 어노테이션을 작성할 수 있습니다.

다음 예시에서는 휴먼 어노테이터가 LLM이 로드한 문서의 유형을 선택합니다. 점수 설정의 `Type`은 선택 가능한 문서 유형들로 구성된 `enum`입니다.

<Frame>
  <img src="https://mintcdn.com/coreweave-dbfa0e8d/3Dv_sw2eg8feUJlx/products/wandb/weave/_media/human-annotation-scorer-form.png?fit=max&auto=format&n=3Dv_sw2eg8feUJlx&q=85&s=7d38f47385bd21b407caf5a959b1a7e9" alt="Create Scorer 모달 대화 상자" width="3342" height="1862" data-path="products/wandb/weave/_media/human-annotation-scorer-form.png" />
</Frame>

<h3 id="use-the-human-annotation-scorer-in-the-ui">
  UI에서 휴먼 어노테이션 Scorer 사용하기
</h3>

휴먼 어노테이션 Scorer를 생성하면 Traces 페이지에서 사용할 수 있습니다.

Scorer를 사용하려면 다음 단계를 따르세요.

1. 프로젝트 사이드바에서 **Traces**로 이동하세요.

2. 휴먼 어노테이션을 추가할 Call의 행을 찾으세요.

3. 연결된 Trace 이름을 클릭하여 트레이스 트리와 Call details 패널을 여세요.

4. Call details 탭 표시줄 오른쪽 상단에 있는 **Show feedback** 버튼을 클릭하세요.

   <img src="https://mintcdn.com/coreweave-dbfa0e8d/3Dv_sw2eg8feUJlx/products/wandb/weave/_media/marker-icon.png?fit=max&auto=format&n=3Dv_sw2eg8feUJlx&q=85&s=aafc9db6195967a8ec0acfe214fd5044" alt="Call 헤더의 마커 아이콘" width="306" height="84" data-path="products/wandb/weave/_media/marker-icon.png" />

   사용 가능한 휴먼 어노테이션 Scorer가 **Annotate** 패널에 표시됩니다.

   <img src="https://mintcdn.com/coreweave-dbfa0e8d/3Dv_sw2eg8feUJlx/products/wandb/weave/_media/full-feedback-sidebar.png?fit=max&auto=format&n=3Dv_sw2eg8feUJlx&q=85&s=ba9ef22e7d49bd57e0a087b7dcbd05f0" alt="휴먼 어노테이션 Scorer 피드백 패널" width="3342" height="1862" data-path="products/wandb/weave/_media/full-feedback-sidebar.png" />

5. 어노테이션을 작성하세요.

6. **Save**를 클릭하세요.

7. Call details 패널의 탭 표시줄에서 **Feedback** 탭을 클릭하면 Feedback table을 확인할 수 있습니다. 새 어노테이션이 table에 표시됩니다. 기본 Traces table의 **Annotations** 열에서도 어노테이션을 확인할 수 있습니다.

   > 최신 정보를 확인하려면 Traces table을 새로 고치세요.

<Frame>
  <img src="https://mintcdn.com/coreweave-dbfa0e8d/3Dv_sw2eg8feUJlx/products/wandb/weave/_media/feedback-in-the-table.png?fit=max&auto=format&n=3Dv_sw2eg8feUJlx&q=85&s=6118c46e60c28bc3117179d9d44b49fa" alt="Traces table의 휴먼 어노테이션 Scorer 피드백" width="3342" height="1569" data-path="products/wandb/weave/_media/feedback-in-the-table.png" />
</Frame>

<h3 id="create-a-human-annotation-scorer-using-the-api">
  API를 사용하여 휴먼 어노테이션 Scorer 만들기
</h3>

API로도 휴먼 어노테이션 Scorer를 만들 수 있습니다. 각 Scorer는 별도의 객체이므로 개별적으로 생성하고 업데이트합니다. 휴먼 어노테이션 Scorer를 프로그래밍 방식으로 만들려면 다음 단계를 따르세요.

1. `weave.flow.annotation_spec`에서 `AnnotationSpec` 클래스를 임포트합니다.
2. `weave`의 `publish` 메서드를 사용하여 Scorer를 만듭니다.

다음 예시에서는 Scorer 두 개를 만듭니다. 첫 번째 Scorer인 `Temperature`는 LLM Call의 체감 온도를 채점하고, 두 번째 Scorer인 `Tone`은 LLM 응답의 어조를 채점합니다. 각 Scorer는 연결된 객체 ID(`temperature-scorer`, `tone-scorer`)를 지정하여 `save`를 사용합니다.

<Tabs>
  <Tab title="Python">
    ```python lines theme={"system"}
    import weave
    from weave.flow.annotation_spec import AnnotationSpec

    client = weave.init("feedback-example")

    spec1 = AnnotationSpec(
      name="Temperature",
      description="The perceived temperature of the llm call",
      field_schema={
        "type": "number",
        "minimum": -1,
        "maximum": 1,
      }
    )
    spec2 = AnnotationSpec(
      name="Tone",
      description="The tone of the llm response",
      field_schema={
        "type": "string",
        "enum": ["Aggressive", "Neutral", "Polite", "N/A"],
      },
    )
    weave.publish(spec1, "temperature-scorer")
    weave.publish(spec2, "tone-scorer")
    ```
  </Tab>

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

<h3 id="modify-a-human-annotation-scorer-using-the-api">
  API를 사용하여 휴먼 어노테이션 Scorer 수정하기
</h3>

[API를 사용하여 휴먼 어노테이션 Scorer 생성하기](#create-a-human-annotation-scorer-using-the-api)에 이어, 다음 예시에서는 `publish` 시 원래 객체 ID(`temperature-scorer`)를 사용하여 `Temperature` Scorer의 새 버전을 생성합니다. 그 결과 객체가 업데이트되며, 모든 버전의 이력이 함께 유지됩니다.

> 휴먼 어노테이션 Scorer 객체 이력은 **Human annotations** 아래의 **Scorers** 탭에서 확인할 수 있습니다.

<Tabs>
  <Tab title="Python">
    ```python lines theme={"system"}
    import weave
    from weave.flow.annotation_spec import AnnotationSpec

    client = weave.init("feedback-example")

    # Scorer의 새 버전 생성
    spec1 = AnnotationSpec(
      name="Temperature",
      description="The perceived temperature of the llm call",
      field_schema={
        "type": "integer",  # <<- 유형을 integer로 변경
        "minimum": -1,
        "maximum": 1,
      }
    )
    weave.publish(spec1, "temperature-scorer")
    ```
  </Tab>

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

<Frame>
  <img src="https://mintcdn.com/coreweave-dbfa0e8d/3Dv_sw2eg8feUJlx/products/wandb/weave/_media/human-annotation-scorer-history.png?fit=max&auto=format&n=3Dv_sw2eg8feUJlx&q=85&s=98b79764fd87597de1bde43f086def64" alt="휴먼 어노테이션 Scorer 이력" width="2574" height="1434" data-path="products/wandb/weave/_media/human-annotation-scorer-history.png" />
</Frame>

<h3 id="use-a-human-annotation-scorer-using-the-api">
  API로 휴먼 어노테이션 Scorer 사용하기
</h3>

feedback API에서 특수한 형식의 이름과 `annotation_ref` 필드를 지정하면 휴먼 어노테이션 Scorer를 사용할 수 있습니다. `annotation_spec_ref`는 UI에서 해당 탭을 선택하거나 `AnnotationSpec`을 생성할 때 획득할 수 있습니다.

<Tabs>
  <Tab title="Python">
    ```python lines theme={"system"}
    import weave

    client = weave.init("feedback-example")

    call = client.get_call("[CALL-ID]")
    annotation_spec = weave.ref("[ANNOTATION-SPEC-REF-URI]")

    call.feedback.add(
      feedback_type="wandb.annotation." + annotation_spec.name,
      payload={"value": 1},
      annotation_ref=annotation_spec.uri(),
    )
    ```
  </Tab>
</Tabs>
