메인 콘텐츠로 건너뛰기
LLM 애플리케이션을 효율적으로 평가하려면 피드백을 수집하고 분석할 수 있는 강력한 도구가 필요합니다. W&B Weave는 통합 피드백 시스템을 제공하여 사용자가 UI에서 직접 콜에 대한 피드백을 남기거나 SDK를 통해 프로그램 방식으로 제출할 수 있도록 합니다. 이모지 반응, 텍스트 댓글, 구조화된 데이터 등 다양한 피드백 유형을 지원하여 Teams가 다음을 수행할 수 있습니다:
  • 성능 모니터링을 위한 평가 데이터셋을 구축합니다.
  • LLM 콘텐츠 문제를 효과적으로 식별하고 해결합니다.
  • 파인튜닝과 같은 고급 작업을 위한 예제를 수집합니다.
이 가이드는 UI와 SDK에서 Weave의 피드백 기능을 사용하는 방법, 피드백을 쿼리하고 관리하는 방법, 그리고 자세한 평가를 위해 휴먼 어노테이션을 활용하는 방법을 다룹니다.

UI에서 피드백 제공하기

Weave UI의 Call details 패널이나 아이콘에서 피드백을 추가하고 확인할 수 있습니다.

통화 세부정보 패널에서

  1. Weave 프로젝트 사이드바에서 Traces로 이동합니다.
  2. 피드백을 추가하려는 통화의 행을 찾습니다.
  3. 연결된 Trace 이름을 클릭하여 Trace 트리와 통화 세부정보 패널을 엽니다.
  4. 통화 세부정보 탭 바에서 Feedback을 선택합니다.
  5. 피드백을 추가, 확인 또는 삭제합니다.
    • 통화 세부정보 피드백 보기의 오른쪽 상단에 있는 아이콘을 사용해 피드백을 추가하고 확인 합니다.
    • 통화 세부정보 피드백 테이블에서 피드백을 확인하고 삭제합니다. 해당 피드백 행의 맨 오른쪽 열에 있는 휴지통 아이콘을 클릭하여 피드백을 삭제합니다.
통화 세부정보의 Feedback 탭 스크린샷

피드백 아이콘 사용하기

Traces 테이블과 개별 콜 상세 패널에 있는 아이콘을 사용하여 리액션을 추가·제거하고, 노트를 추가할 수 있습니다.
  • Traces 테이블: Traces 테이블에서 해당 행의 Feedback 열에 위치합니다.
  • 콜 상세 패널: 각 콜 상세 패널의 오른쪽 상단에 위치합니다.
리액션을 추가하려면:
  1. 이모지 아이콘을 클릭합니다.
  2. 엄지손가락 위(👍), 엄지손가락 아래(👎) 리액션을 추가하거나, 더 많은 이모지를 보려면 + 아이콘을 클릭합니다.
리액션을 제거하려면:
  1. 제거하려는 이모지 리액션 위에 마우스를 올립니다.
  2. 해당 리액션을 클릭하여 제거합니다.
콜 상세 패널의 Feedback 열에서 피드백을 삭제할 수도 있습니다.
코멘트를 추가하려면:
  1. 말풍선 아이콘을 클릭합니다.
  2. 텍스트 박스에 노트를 입력합니다. 피드백 노트의 최대 글자 수는 1024자입니다.
  3. 노트를 저장하려면 Enter 키를 누릅니다. 추가 노트도 계속해서 남길 수 있습니다.
피드백 노트의 최대 글자 수는 1024자입니다. 이 한도를 초과하는 노트는 생성되지 않습니다.
Screenshot of calls grid with feedback column

SDK를 통해 피드백 제공

UI의 Call details 패널에 있는 Use 탭에서 피드백 관련 SDK 사용 예제를 확인할 수 있습니다. Weave Python SDK를 사용하여 호출에 대한 피드백을 코드로 추가, 삭제조회할 수 있습니다. TypeScript SDK는 현재 피드백 기능을 지원하지 않습니다.

프로젝트의 피드백 쿼리하기

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: 피드백 페이로드입니다.
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)

호출에 피드백 추가하기

호출 UUID를 사용해 호출에 피드백을 추가할 수 있습니다. 특정 호출을 가져오려면 호출 실행 중 또는 실행 후에 UUID를 조회하세요. SDK는 호출에 피드백을 추가하기 위해 다음 작업을 지원합니다:
  • call.feedback.add_reaction("<reaction_type>"): 👍 같은 지원되는 <reaction_types>(이모지) 중 하나를 추가합니다.
  • call.feedback.add_note("<note>"): 메모를 추가합니다.
  • call.feedback.add("<label>", <object>): <label>로 지정한 커스텀 피드백 <object>를 추가합니다.
피드백 메모에 사용할 수 있는 최대 길이는 1024자입니다. 메모가 이 제한을 초과하면 생성되지 않습니다.
import weave
client = weave.init('intro-example')

call = client.get_call("<call_uuid>")

# Adding an emoji reaction
call.feedback.add_reaction("👍")

# Adding a note
call.feedback.add_note("this is a note")

# Adding custom key/value pairs.
# The first argument is a user-defined "type" string.
# Feedback must be JSON serializable and less than 1 KB when serialized.
call.feedback.add("correctness", { "value": 5 })

호출 UUID 가져오기

호출 직후에 피드백을 추가해야 하는 경우, 호출 실행 중이거나 실행 직후에 프로그램 코드로 호출 UUID를 가져올 수 있습니다.
호출 실행 중
호출이 실행되는 동안 UUID를 가져오려면, 현재 호출을 가져와 해당 ID를 반환합니다.

import weave
weave.init("uuid")

@weave.op()
def simple_operation(input_value):
    # 간단한 연산 수행
    output = f"Processed {input_value}"
    # 현재 호출 ID 가져오기
    current_call = weave.require_current_call()
    call_id = current_call.id
    return output, call_id
호출 실행 후
또는 call() 메서드를 사용해 연산을 실행한 다음 ID를 가져올 수도 있습니다:
import weave
weave.init("uuid")

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

# 연산을 실행하고 결과와 호출 ID를 가져옵니다
result, call = simple_operation.call("example input")
call_id = call.id

호출에서 피드백 삭제하기

UUID를 지정하여 특정 호출에서 피드백을 삭제할 수 있습니다.
call.feedback.purge("<feedback_uuid>")

휴먼 애노테이션 추가

휴먼 애노테이션은 Weave UI에서 지원됩니다. 이 기능을 사용하면 사용자 정의 필드를 만들어 피드백으로 사용할 사람이 입력한 추가 데이터를 Trace에 추가할 수 있습니다. 휴먼 애노테이션을 사용하려면 먼저 UI 또는 API를 사용해 Human Annotation 스코어러를 생성해야 합니다. 그런 다음 UI에서 이 스코어러를 사용해 애노테이션을 추가하고, API를 사용해 애노테이션 스코어러를 수정할 수 있습니다.

UI에서 휴먼 애노테이션 스코어러 생성하기

UI에서 휴먼 애노테이션 스코어러를 생성하려면 다음을 수행하세요:
  1. 프로젝트 사이드바에서 Assets로 이동합니다.
  2. Assets 탐색 패널에서 Scorers를 클릭합니다.
  3. Scorers 패널 헤더에서 New scorer를 클릭합니다.
  4. Create Scorer 모달 대화 상자에서 다음을 설정합니다:
    • Scorer typeHuman annotation으로 설정
    • Name
    • Description
    • Type: 수집할 피드백 유형(예: boolean 또는 integer)을 결정합니다.
  5. Create scorer를 클릭합니다. 이제 스코어러를 사용해 주석을 추가할 수 있습니다.
다음 예시에서는 휴먼 애노테이터에게 LLM이 어떤 유형의 문서를 입력으로 사용했는지 선택하도록 요청합니다. 따라서 스코어러 설정에서 선택된 Type은 가능한 문서 유형을 포함하는 enum입니다.
Create Scorer 모달 대화 상자

UI에서 human annotation scorer 사용하기

human annotation scorer를 생성하면 Traces 페이지에서 사용할 수 있습니다. scorer를 사용하려면 다음을 수행합니다:
  1. 프로젝트 사이드바에서 Traces로 이동합니다.
  2. human annotation을 추가하려는 Call의 행을 찾습니다.
  3. 링크된 Trace 이름을 클릭해 Trace 트리와 Call 세부 정보 패널을 엽니다.
  4. Call 세부 정보 탭 바의 오른쪽 상단에서 Show feedback 버튼을 클릭합니다. Marker icon in Call header 사용 가능한 human annotation scorer가 추가된 Annotate 패널에 표시됩니다. Human Annotation scorer feedback panel
  5. annotation을 추가합니다.
  6. Save를 클릭합니다.
  7. Call 세부 정보 패널 탭 바에서 Feedback 탭을 클릭해 Feedback 테이블을 확인합니다. 새 annotation이 테이블에 표시됩니다. 메인 Traces 테이블의 Annotations 열에서도 annotation을 볼 수 있습니다.
    최신 정보를 보려면 Traces 테이블을 새로 고침하세요.
Human Annotation scorer feedback in Traces table

API를 사용하여 인간 어노테이션 스코어러 생성하기

인간 어노테이션 스코어러는 API를 통해서도 생성할 수 있습니다. 각 스코어러는 독립적으로 생성 및 업데이트되는 개별 객체입니다. 프로그래밍 방식으로 인간 어노테이션 스코어러를 생성하려면 다음을 수행합니다:
  1. weave.flow.annotation_spec에서 AnnotationSpec 클래스를 임포트합니다.
  2. weavepublish 메서드를 사용해 스코어러를 생성합니다.
다음 예시에서는 두 개의 스코어러를 생성합니다. 첫 번째 스코어러 Temperature는 LLM 호출의 체감 온도를 스코어링하는 데 사용됩니다. 두 번째 스코어러 Tone은 LLM 응답의 톤을 스코어링하는 데 사용됩니다. 각 스코어러는 연결된 객체 ID(temperature-scorertone-scorer)와 함께 save를 사용하여 생성됩니다.
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")

API를 사용하여 사람 주석 스코어러 수정하기

API를 사용하여 사람 주석 스코어러를 생성하는 예시를 확장하여, 다음 예시는 publish할 때 원래 객체 ID(temperature-scorer)를 사용해 Temperature 스코어러의 업데이트된 버전을 생성합니다. 결과로 모든 버전 이력이 포함된 업데이트된 객체가 생성됩니다.
Human annotations 아래 Scorers 탭에서 사람 주석 스코어러 객체의 이력을 볼 수 있습니다.
import weave
from weave.flow.annotation_spec import AnnotationSpec

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

# 스코어러의 새 버전 생성
spec1 = AnnotationSpec(
  name="Temperature",
  description="llm 호출의 체감 온도",
  field_schema={
    "type": "integer",  # <<- 타입을 integer로 변경
    "minimum": -1,
    "maximum": 1,
  }
)
weave.publish(spec1, "temperature-scorer")
사람 주석 스코어러 이력

API를 사용해 사람 어노테이션 스코어러 사용하기

feedback API를 사용하면 특정 형식의 이름과 annotation_ref 필드를 지정해 사람 어노테이션 스코어러를 사용할 수 있습니다. UI에서 해당 탭을 선택하거나 AnnotationSpec을 생성하는 과정에서 annotation_spec_ref를 얻을 수 있습니다.
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(),
)