피드백 수집과 주석 활용하기
피드백 수집과 주석 활용하기 (Feedback)
LLM 애플리케이션을 제대로 평가하려면 피드백을 수집하고 분석할 도구가 필요해요. Weave에는 UI에서 직접, 또는 SDK로 프로그램적으로 Call에 피드백을 남기는 통합 피드백 시스템이 있어요. 이모지 반응, 텍스트 코멘트, 구조화된 데이터 등 여러 피드백 유형을 지원해서, 평가 데이터셋을 만들고 LLM 콘텐츠 문제를 찾아내며 파인튜닝 같은 고급 작업에 쓸 예시를 모으는 데 도움을 줍니다. 이 페이지에서는 UI와 SDK에서 피드백을 다루는 방법, 그리고 상세 평가를 위한 사람 주석(human annotation) 사용법을 살펴볼게요.
UI에서 피드백 제공하기
Call 세부 정보 패널 사용하기
- Weave 프로젝트 사이드바에서 Traces로 이동해요.
- 피드백을 추가할 Call이 있는 행을 찾아요.
- 연결된 Trace 이름을 클릭해 트레이스 트리와 Call 세부 정보 패널을 열어요.
- Call 세부 정보 탭 바에서 Feedback을 선택해요.
- 피드백을 추가·보기·삭제해요. 추가·보기는 Call 세부 정보 피드백 화면 오른쪽 위의 아이콘으로, 보기·삭제는 Call 세부 정보 피드백 테이블에서 해요. 삭제는 해당 피드백 행의 가장 오른쪽 열에 있는 휴지통 아이콘을 클릭하면 됩니다.
피드백 아이콘 사용하기
Traces 테이블과 개별 Call 세부 정보 패널 양쪽에 있는 아이콘으로 반응을 추가·제거하거나 메모를 남길 수 있어요. Traces 테이블에서는 Feedback 컬럼에, Call 세부 정보 패널에서는 오른쪽 위에 아이콘이 위치해요.
반응을 추가하려면 이모지 아이콘을 클릭하고, 좋아요·싫어요를 고르거나 + 아이콘으로 더 많은 이모지를 선택해요. 반응을 제거하려면 제거할 이모지 반응 위에 마우스를 올리고 반응을 클릭하면 돼요.
코멘트를 추가하려면 코멘트 버블 아이콘을 클릭하고, 텍스트 상자에 메모를 적어요. 피드백 메모의 최대 글자 수는 1024자예요. Enter 키를 누르면 저장되고, 메모를 계속 추가할 수 있습니다.
피드백 메모의 최대 글자 수는 1024자입니다. 이 한도를 넘으면 Weave는 메모를 만들지 않아요.
SDK로 피드백 제공하기
피드백 수집을 자동화하거나 평가 파이프라인에 통합하고 싶다면, UI에서 손으로 입력하는 대신 SDK를 써요. Weave Python SDK를 쓰면 Call에 피드백을 프로그램적으로 추가, 제거, 조회할 수 있어요. TypeScript SDK는 피드백 기능을 지원하지 않습니다.
프로젝트의 피드백 조회하기
SDK로 Weave 프로젝트의 피드백을 조회할 수 있어요. 지원되는 조회 연산은 다음과 같아요.
client.get_feedback(): 프로젝트의 모든 피드백을 반환해요.client.get_feedback("[FEEDBACK-UUID]"):[FEEDBACK-UUID]로 지정된 특정 피드백 객체를 컬렉션으로 반환해요.client.get_feedback(reaction="[REACTION-TYPE]"): 특정 반응 타입의 모든 피드백 객체를 반환해요.
client.get_feedback()의 각 피드백 객체에서도 더 많은 정보를 얻을 수 있어요.
id: 피드백 객체 IDcreated_at: 피드백 객체의 생성 시간 정보feedback_type: 피드백 유형 (reaction, note, custom)payload: 피드백 페이로드
import weave
client = weave.init('intro-example')
# Get all feedback in a project
all_feedback = client.get_feedback()
# Fetch a specific feedback object by id.
# The API returns a collection, which is expected to contain at most one item.
one_feedback = client.get_feedback("[FEEDBACK-UUID]")[0]
# Find all feedback objects with a specific reaction. You can specify offset and limit.
thumbs_up = client.get_feedback(reaction="👍", limit=10)
# After retrieval, view the details of individual feedback objects.
for f in client.get_feedback():
print(f.id)
print(f.created_at)
print(f.feedback_type)
print(f.payload)
Call에 피드백 추가하기
Call의 UUID를 사용해 피드백을 추가할 수 있어요. 지원되는 연산은 아래와 같아요.
call.feedback.add_reaction("[REACTION-TYPE]"): 지원되는[REACTION-TYPE]값(이모지) 중 하나를 추가해요. 예: 👍call.feedback.add_note("[NOTE]"): 메모를 추가해요.call.feedback.add("[LABEL]", [OBJECT]):[LABEL]로 지정된 커스텀 피드백[OBJECT]를 추가해요.
피드백 메모의 최대 글자 수는 1024자입니다. 이 한도를 넘으면 Weave는 메모를 만들지 않아요.
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 })
Call UUID 가져오기
Call 직후에 피드백을 반드시 추가해야 하는 상황이라면, Call 실행 중이나 실행 후에 Call UUID를 프로그램적으로 가져올 수 있어요.
Call 실행 중에: 현재 Call을 가져와 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 실행 후에: call() 메서드로 연산을 실행하고 ID를 가져올 수도 있어요.
import weave
weave.init("uuid")
@weave.op()
def simple_operation(input_value):
return f"Processed {input_value}"
# Execute the operation and retrieve the result and call ID
result, call = simple_operation.call("example input")
call_id = call.id
Call에서 피드백 삭제하기
UUID를 지정해 특정 Call에서 피드백을 삭제할 수 있어요.
call.feedback.purge("[FEEDBACK-UUID]")
사람 주석 추가하기 (Human annotations)
사람 주석은 Call에 대한 구조화된, 사람이 검토한 판단을 담게 해 줘요. 리뷰어가 자신의 기준으로 모델 출력을 채점할 수 있게 말이죠. 사람 주석은 Weave UI에서 지원되며, 커스텀 필드를 만들어 Traces에 사람이 입력한 데이터를 피드백으로 추가할 수 있습니다. 사람 주석을 하려면 먼저 UI나 API로 Human Annotation 스코어러를 만들어야 해요. 그다음 UI에서 그 스코어러로 주석을 달고, API로 주석 스코어러를 수정할 수 있습니다.
UI에서 Human Annotation 스코어러 만들기
- 프로젝트 사이드바에서 Assets로 이동해요.
- Assets 탐색 패널에서 Scorers를 클릭해요.
- Scorers 패널 헤더에서 New scorer를 클릭해요.
- Create Scorer 모달 대화상자에서 설정해요:
Scorer type은Human annotation, 그리고Name,Description, 수집할 피드백 유형을 결정하는Type(예:boolean·integer)을 지정해요. - Create scorer를 클릭하면, 이제 스코어러로 주석을 달 수 있어요.
예를 들어 사람이 LLM이 로드한 문서 유형을 고르는 경우를 볼게요. 점수 설정의 Type은 가능한 문서 유형을 담은 enum이에요.
UI에서 Human Annotation 스코어러 사용하기
Human Annotation 스코어러를 만들면 Traces 페이지에서 사용할 수 있어요.
- 프로젝트 사이드바에서 Traces로 이동해요.
- 사람 주석을 달 Call이 있는 행을 찾아요.
- 연결된 Trace 이름을 클릭해 트레이스 트리와 Call 세부 정보 패널을 열어요.
- Call 세부 정보 탭 바의 오른쪽 위에서 Show feedback 버튼을 클릭해요. 사용 가능한 스코어러가 Annotate 패널에 표시됩니다.
- 주석을 만들고 Save를 클릭해요.
- Call 세부 정보 패널 탭 바에서 Feedback 탭을 클릭해 Feedback 테이블을 봐요. 새 주석이 테이블에 표시되고, 메인 Traces 테이블의 Annotations 컬럼에서도 볼 수 있어요.
최신 정보를 보려면 Traces 테이블을 새로고침하세요.
API로 Human Annotation 스코어러 만들기
API를 통해서도 Human Annotation 스코어러를 만들 수 있어요. 각 스코어러는 독립적으로 생성·업데이트되는 객체예요. 프로그램적으로 만들려면 1) weave.flow.annotation_spec에서 AnnotationSpec 클래스를 임포트하고, 2) weave의 publish 메서드로 스코어러를 만들어요.
다음 예시는 두 스코어러를 만들어요. 첫 번째 Temperature는 LLM 호출의 주관적 온도를 평가하고, 두 번째 Tone은 LLM 응답의 어조를 평가해요. 각 스코어러는 연관 객체 ID(temperature-scorer, tone-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로 Human Annotation 스코어러 수정하기
위 예시를 확장해서, publish에 원래 객체 ID(temperature-scorer)를 사용해 Temperature 스코어러의 업데이트 버전을 만들 수 있어요. 결과는 버전 이력이 쌓인 업데이트된 객체가 돼요.
Human Annotation 스코어러 객체 이력은 Scorers 탭의 Human annotations 아래에서 볼 수 있어요.
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로 Human Annotation 스코어러 사용하기
피드백 API로 Human Annotation 스코어러를 쓰려면 특별히 구성된 이름과 annotation_ref 필드를 지정해요. annotation_spec_ref는 UI에서 적절한 탭을 선택하거나 AnnotationSpec 생성 중에 얻을 수 있어요.
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(),
)