LLM 애플리케이션을 평가하려면 피드백을 수집하고 분석할 도구가 필요합니다. W&B Weave는 통합 피드백 시스템을 제공하므로 UI에서 직접, 또는 SDK를 통해 프로그래밍 방식으로 Call에 피드백을 남길 수 있습니다. Weave는 이모지 반응, 텍스트 댓글, 구조화된 데이터 등 다양한 피드백 유형을 지원하므로 팀에서 다음과 같은 작업을 할 수 있습니다.
성능 모니터링용 평가 데이터셋을 구축합니다.
LLM 콘텐츠 문제를 파악하고 해결합니다.
파인튜닝 같은 고급 작업에 사용할 예시를 수집합니다.
이 가이드는 Weave에서 LLM 애플리케이션을 개발하거나 검토하는 사용자를 위한 것입니다. UI와 SDK에서 Weave의 피드백 기능을 사용하는 방법, 피드백을 쿼리하고 관리하는 방법, 휴먼 어노테이션으로 상세한 평가를 수행하는 방법을 다룹니다.
UI에서 피드백을 직접 입력하는 대신 피드백 수집을 자동화하거나 평가 파이프라인에 통합하려면 SDK를 사용하세요.피드백 관련 SDK 사용 예시는 UI의 Call details 패널에 있는 Use 탭에서 확인할 수 있습니다.Weave Python SDK를 사용하면 Call에 대한 피드백을 프로그래밍 방식으로 추가, 제거, 쿼리할 수 있습니다. 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: 피드백 페이로드입니다.
Python
TypeScript
import weaveclient = 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)
Call의 UUID를 사용하여 Call에 피드백을 추가할 수 있습니다. UUID로 특정 Call을 조회하려면 먼저 Call 실행 중 또는 실행 후에 UUID를 가져오세요. SDK는 Call에 피드백을 추가하는 다음 오퍼레이션을 지원합니다.
call.feedback.add_reaction("[REACTION-TYPE]"): 👍와 같이 지원되는 [REACTION-TYPE] 값(이모지) 중 하나를 추가합니다.
call.feedback.add_note("[NOTE]"): 노트를 추가합니다.
call.feedback.add("[LABEL]", [OBJECT]): [LABEL]로 지정한 맞춤형 피드백 [OBJECT]를 추가합니다.
피드백 노트는 최대 1024자까지 입력할 수 있습니다. 노트가 이 제한을 초과하면 Weave는 해당 노트를 생성하지 않습니다.
Python
TypeScript
import weaveclient = 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 })
휴먼 어노테이션을 사용하면 Call에 대해 사람이 검토한 판단을 구조화된 형태로 캡처할 수 있으므로, 검토자가 자체 기준에 따라 모델 출력을 평가할 수 있습니다.휴먼 어노테이션은 Weights & Biases UI에서 지원됩니다. 이 기능을 사용하면 맞춤형 필드를 만들고, 사람이 입력한 데이터를 피드백으로 트레이스에 추가할 수 있습니다. 휴먼 어노테이션을 작성하려면 먼저 UI 또는 API로 휴먼 어노테이션 Scorer를 생성해야 합니다. 그런 다음 UI에서 Scorer를 사용해 어노테이션을 작성하거나 API로 어노테이션 Scorer를 수정할 수 있습니다.
다음 예시에서는 Scorer 두 개를 만듭니다. 첫 번째 Scorer인 Temperature는 LLM Call의 체감 온도를 채점하고, 두 번째 Scorer인 Tone은 LLM 응답의 어조를 채점합니다. 각 Scorer는 연결된 객체 ID(temperature-scorer, tone-scorer)를 지정하여 save를 사용합니다.
Python
TypeScript
import weavefrom weave.flow.annotation_spec import AnnotationSpecclient = 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를 사용하여 휴먼 어노테이션 Scorer 생성하기에 이어, 다음 예시에서는 publish 시 원래 객체 ID(temperature-scorer)를 사용하여 Temperature Scorer의 새 버전을 생성합니다. 그 결과 객체가 업데이트되며, 모든 버전의 이력이 함께 유지됩니다.
휴먼 어노테이션 Scorer 객체 이력은 Human annotations 아래의 Scorers 탭에서 확인할 수 있습니다.
Python
TypeScript
import weavefrom weave.flow.annotation_spec import AnnotationSpecclient = 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")
feedback API에서 특수한 형식의 이름과 annotation_ref 필드를 지정하면 휴먼 어노테이션 Scorer를 사용할 수 있습니다. annotation_spec_ref는 UI에서 해당 탭을 선택하거나 AnnotationSpec을 생성할 때 획득할 수 있습니다.