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

UI에서 피드백 남기기

Weave UI에서 호출 세부 정보 페이지 또는 아이콘을 사용하여 피드백을 추가하고 확인할 수 있습니다.

통화 상세 페이지에서

  1. 사이드바에서 Traces로 이동합니다.
  2. 피드백을 추가하려는 통화의 행을 찾습니다.
  3. 통화 상세 페이지를 엽니다.
  4. 해당 통화의 Feedback 열을 선택합니다.
  5. 피드백을 추가, 조회 또는 삭제합니다.
    • 통화 상세 피드백 보기의 오른쪽 상단에 위치한 _아이콘을 사용해 피드백 추가 및 조회_를 사용합니다.
    • 통화 상세 피드백 테이블에서 피드백을 조회하고 삭제합니다. 해당 피드백 행의 가장 오른쪽 열에 있는 휴지통 아이콘을 클릭해 피드백을 삭제합니다.
통화 상세의 Feedback 탭 스크린샷

아이콘 사용하기

콜 테이블과 개별 콜 세부 정보 페이지에 있는 아이콘을 사용하여 반응을 추가하거나 제거하고, 메모를 추가할 수 있습니다.
  • 콜 테이블: 콜 테이블의 해당 행에 있는 Feedback 열에 위치합니다.
  • 콜 세부 정보 페이지: 각 콜 세부 정보 페이지의 오른쪽 상단에 위치합니다.
반응을 추가하려면:
  1. 이모지 아이콘을 클릭합니다.
  2. 엄지손가락 위/아래(좋아요/싫어요) 이모지를 추가하거나, 더 많은 이모지를 보려면 + 아이콘을 클릭합니다.
반응을 제거하려면:
  1. 제거하려는 이모지 반응 위에 마우스를 올립니다.
  2. 해당 반응을 클릭하여 제거합니다.
콜 세부 정보 페이지의 Feedback 열에서 피드백을 삭제할 수도 있습니다.
댓글을 추가하려면:
  1. 말풍선 아이콘을 클릭합니다.
  2. 텍스트 상자에 메모를 입력합니다.
  3. 메모를 저장하려면 Enter 키를 누릅니다. 메모는 여러 개 추가할 수 있습니다.
피드백 메모의 최대 글자 수는 1024자입니다. 이 한도를 초과하면 메모가 생성되지 않습니다.
피드백 열이 있는 콜 그리드 스크린샷

SDK를 통해 피드백 제공하기

호출 상세 페이지의 Use 탭에서 피드백에 대한 SDK 사용 예제를 확인할 수 있습니다.
Weave 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]

# 특정 reaction을 가진 모든 피드백 객체를 찾습니다. 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를 사용하려면, 호출 실행 중 또는 실행 후에 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>")

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

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

# 사용자 정의 키/값 쌍 추가
# 첫 번째 인자는 사용자가 정의하는 "type" 문자열입니다.
# 피드백은 JSON 직렬화 가능해야 하며, 직렬화 시 크기가 1 KB 미만이어야 합니다.
call.feedback.add("correctness", { "value": 5 })

호출 UUID 가져오기

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

import weave
weave.init("uuid")

@weave.op()
def simple_operation(input_value):
    # Perform some simple operation
    output = f"Processed {input_value}"
    # Get the current call 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에서 지원됩니다. 휴먼 어노테이션을 추가하려면 먼저 UI 또는 API를 사용해 휴먼 어노테이션 스코어러를 생성해야 합니다. 그런 다음 UI에서 스코어러를 사용해 어노테이션을 추가하고, API를 사용해 어노테이션 스코어러를 수정할 수 있습니다.

UI에서 Human annotation 스코어러 만들기

UI에서 Human annotation 스코어러를 만들려면 다음을 수행합니다:
  1. 사이드바에서 Scorers로 이동합니다.
  2. 오른쪽 상단에서 + Create scorer를 클릭합니다.
  3. 설정 페이지에서 다음을 설정합니다:
    • Scorer typeHuman annotation으로 설정
    • Name
    • Description
    • 수집할 피드백 유형을 결정하는 Type (예: boolean 또는 integer)
  4. Create scorer를 클릭합니다. 이제 스코어러를 사용해 주석을 추가할 수 있습니다.
다음 예에서는 사람 평가자에게 LLM이 어떤 유형의 문서를 입력으로 사용했는지 선택하도록 요청합니다. 따라서 스코어 설정에서 선택한 Type은 가능한 문서 유형을 포함하는 enum입니다.
Human Annotation 스코어러 폼

UI에서 human annotation scorer 사용하기

human annotation scorer를 생성하면, 설정한 옵션과 함께 호출 상세 페이지의 Feedback 사이드바에 자동으로 표시됩니다. scorer를 사용하려면 다음을 수행하세요:
  1. 사이드바에서 Traces로 이동합니다.
  2. human annotation을 추가할 호출의 행을 찾습니다.
  3. 호출 상세 페이지를 엽니다.
  4. 오른쪽 상단에서 Show feedback 버튼을 클릭합니다. 콜 헤더의 마커 아이콘 사용 가능한 human annotation scorer가 사이드바에 표시됩니다. Human Annotation scorer 피드백 사이드바
  5. annotation을 작성합니다.
  6. Save를 클릭합니다.
  7. 호출 상세 페이지에서 Feedback을 클릭해 호출 테이블을 확인합니다. 새 annotation이 테이블에 표시됩니다. 또한 Traces의 호출 테이블에서 Annotations 열에 있는 annotation도 확인할 수 있습니다.
    최신 정보를 보려면 호출 테이블을 새로 고침하세요.
콜 테이블의 Human Annotation scorer 피드백

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

휴먼 어노테이션 스코어러는 API를 통해서도 생성할 수 있습니다. 각 스코어러는 독립적으로 생성 및 업데이트되는 개별 객체입니다. 프로그래밍 방식으로 휴먼 어노테이션 스코어러를 생성하려면 다음을 수행하십시오:
  1. weave.flow.annotation_spec에서 AnnotationSpec 클래스를 import합니다.
  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")

# create a new version of the scorer
spec1 = AnnotationSpec(
  name="Temperature",
  description="The perceived temperature of the llm call",
  field_schema={
    "type": "integer",  # <<- change type to integer
    "minimum": -1,
    "maximum": 1,
  }
)
weave.publish(spec1, "temperature-scorer")
휴먼 어노테이션 스코어러 이력

API로 사람 기반 어노테이션 스코어러 사용하기

피드백 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(),
)