EvaluationLogger를 사용해 기존 Python 또는 TypeScript 코드에서 예측과 점수를 기록하는 방법을 보여줍니다. 이를 통해 전체 데이터셋과 Scorer 모음을 먼저 정의하지 않고도 Weave에서 모델 성능을 평가할 수 있습니다. 데이터셋이나 scorer가 처음부터 정의되어 있지 않거나 워크플로가 실행되는 동안 평가 데이터를 점진적으로 기록해야 하는 경우 이 접근 방식을 사용하세요.
미리 정의된 Dataset과 Scorer 객체 목록이 필요한 표준 Evaluation 객체와 달리, EvaluationLogger를 사용하면 개별 예측과 그에 해당하는 점수를 사용할 수 있게 되는 대로 점진적으로 기록할 수 있습니다.
더 체계적인 평가를 선호하시나요?미리 정의된 데이터셋과 scorer를 갖춘, 더 구조화된 평가 프레임워크를 원한다면 표준 Evaluation 프레임워크를 참조하세요.
EvaluationLogger는 유연성을 제공하고, 표준 프레임워크는 구조와 가이드를 제공합니다.기본 워크플로
- 로거 초기화:
EvaluationLogger인스턴스를 생성하고, 필요에 따라model및dataset에 대한 메타데이터를 전달합니다. 생략하면 기본값이 사용됩니다.LLM 호출(예: OpenAI)의 토큰 사용량과 비용을 수집하려면 LLM을 호출하기 **전에EvaluationLogger를 초기화하세요. 먼저 LLM을 호출하고 나중에 예측을 로깅하면 토큰 및 비용 데이터는 수집되지 않습니다. - 예측 로깅: 시스템의 각 입력/출력 쌍에 대해
log_prediction()을 호출합니다. - 점수 로깅: 반환된
ScoreLogger를 사용해 해당 예측에 대한log_score()를 호출합니다. 예측마다 여러 점수를 기록할 수 있습니다. - 예측 완료: 예측을 최종 확정하려면 점수를 로깅한 뒤 항상
finish()를 호출합니다. - 요약 로깅: 모든 예측 처리가 끝나면
log_summary()를 호출해 점수를 집계하고 선택 커스텀 메트릭을 추가합니다.
log_example()을 사용해 2~4단계를 단일 Call로 결합할 수 있습니다.
기본 예제
EvaluationLogger를 사용해 기존 코드에 인라인으로 예측과 점수를 로깅하는 방법을 보여줍니다. [YOUR-TEAM]/[YOUR-PROJECT]를 W&B entity와 프로젝트로 바꾸세요.
- Python
- TypeScript
user_model 함수는 입력 목록에 대해 정의되며 적용됩니다. 각 예제마다:- 입력과 출력은
log_prediction을 사용해 로깅됩니다. - 정확성 점수(
correctness_score)는log_score를 통해 로깅됩니다. finish()는 해당 예측에 대한 로깅을 마무리합니다.
log_summary는 집계 메트릭을 기록하고 Weave에서 점수 자동 요약을 트리거합니다.log_example()를 사용한 간소화된 로깅
log_example()을 사용하면 입력, 출력, 그리고 점수를 단일 Call로 로깅할 수 있습니다. 이 편의 방법은 log_prediction(), log_score(), finish()를 한 단계로 결합하며, 배치 또는 오프라인 평가 중처럼 로깅할 입력, 모델 출력, 점수가 이미 준비되어 있을 때 유용합니다.
log_example() 호출은 다음과 동일합니다:
Weave TypeScript SDK에서는
log_example()을 사용할 수 없습니다. TypeScript 사용자는 기본 예제에 나와 있는 logPrediction() 및 logScore() 패턴을 사용하세요.고급 활용
EvaluationLogger는 더 복잡한 평가 시나리오를 지원할 수 있도록 기본 워크플로를 넘어서는 유연한 사용 패턴을 제공합니다. 다음 섹션에서는 자동 리소스 관리를 위한 컨텍스트 매니저 사용, 에이전트 트레이스를 평가 행에 연결, 모델 실행과 로깅의 분리, 리치 미디어 데이터 처리, 그리고 여러 모델 평가를 나란히 비교하는 등 고급 기법을 설명합니다.
컨텍스트 관리자 사용
EvaluationLogger는 예측과 점수 모두에 대해 컨텍스트 관리자(with 문)를 지원합니다. 이를 사용하면 코드를 더 깔끔하게 작성할 수 있고, 리소스를 자동으로 정리할 수 있으며, LLM judge Call과 같은 중첩된 오퍼레이션도 더 효과적으로 추적할 수 있습니다.
이 문맥에서 with 문을 사용하면 다음과 같은 이점이 있습니다.
- 컨텍스트를 벗어날 때
finish()가 자동으로 호출됨. - 중첩된 LLM Call에 대한 토큰 및 비용 추적 개선.
- 예측 컨텍스트 내에서 모델 실행 후 출력 설정 가능.
- Python
- TypeScript
에이전트 트레이스를 평가에 연결하기
log_prediction() 컨텍스트 내에서 실행하세요. EvaluationLogger는 해당 컨텍스트에서 생성된 span에 평가 run, 예시 및 trial 메타데이터를 설정하고, Weave는 이 메타데이터를 사용해 트레이스를 평가 결과에 연결합니다.
평가와 에이전트 span 간의 자동 연결은 Python에서만 사용할 수 있습니다. TypeScript
EvaluationLogger와 Evaluation.evaluate()는 에이전트 span을 연결하는 활성 평가 범위를 생성하지 않습니다. TypeScript에서는 이 섹션에서 설명하는 OTel 속성을 직접 설정해야만 span을 연결할 수 있으며, 두 Call ID를 모두 이미 알고 있는 경우에만 가능합니다.[YOUR-TEAM]/[YOUR-PROJECT]를 W&B entity 및 프로젝트로 바꾸세요.
- Python
- TypeScript
log_prediction() 컨텍스트 내에서 실행되고 Weave 인테그레이션이 이를 트레이싱하면 Weave는 트레이스를 평가 결과에 자동으로 연결합니다. 그렇지 않은 경우에는 에이전트 span에 두 연결 ID를 직접 설정해야 합니다. 설정 방법은 span이 생성되는 위치에 따라 다릅니다.
- 동일한 프로세스, 자체 계측: 각 span에 속성을 직접 설정합니다.
- 별도의 서비스: 해당 서비스에 두 ID를 전달한 후, 서비스가 생성하는 span에 설정합니다.
직접 계측한 span 연결
log_prediction() 컨텍스트 내에서 span이 생성되면 EvaluationLogger가 모든 속성을 자동으로 설정합니다. 하지만 자체 OpenTelemetry(OTel) 계측을 통해 span을 전송하는 경우, 연결하려는 각 span에 속성을 직접 설정해야 합니다. 평가에는 다음 속성을 설정할 수 있습니다.
/agents/otel/v1/traces 엔드포인트를 통해 평가와 동일한 Weave 프로젝트로 span을 전송하세요. OTel span 속성은 부모 span에서 자식 span으로 전파되지 않으므로 연결하려는 모든 span에 속성을 설정하세요.
엔드포인트에 대한 자세한 내용은 다음을 참조하세요.
- 기존 OTel 파이프라인에서 span을 전송하려면 OpenTelemetry span을 Agents 뷰로 전송을 참조하세요.
- 엔드포인트 사양은 GenAI 트레이스 내보내기를 참조하세요.
weave.eval.run_id와 weave.eval.predict_and_score_call_id만 평가 및 결과 연결을 설정합니다. 행 digest, 예시 ID, trial index, kind, 평가 이름은 컨텍스트를 추가하고 필터링을 지원하지만 자체적으로 연결을 만들지는 않습니다. 두 연결 속성에는 OTel 트레이스 또는 span ID가 아닌 Weave Call ID를 사용하세요.
평가 결과 쿼리 API에서 두 ID를 모두 획득할 수 있습니다. 응답의 각 평가에는 evaluation_call_id가 있고, 각 trial에는 predict_and_score_call_id가 있습니다.
다음 예시에서는 span이 에이전트 오퍼레이션의 OTel span이라고 가정합니다. 각 대괄호 값을 해당 span이 속한 평가 run 및 결과의 메타데이터로 바꾸세요.
TypeScript 예시는 예측 범위에 의존하지 않고 OTel 속성을 직접 설정하므로 작동합니다. 두 Call ID를 이미 사용할 수 있는 경우에만 사용하세요.
- Python
- TypeScript
별도의 서비스에서 실행되는 에이전트 연결
EvaluationLogger 패턴은 Python에서만 사용할 수 있습니다.
- Python
- TypeScript
log_prediction() 컨텍스트에 진입하면 컨텍스트 본문이 실행되기 전에 Evaluation.predict_and_score Call이 생성됩니다. 이 컨텍스트는 두 Call ID를 모두 제공하는 ScoreLogger를 반환합니다(다음 예시에서는 prediction에 바인딩됨). 서비스가 응답할 때까지 컨텍스트를 열어 두어 동일한 평가 결과에 출력과 점수를 기록할 수 있도록 하세요.평가 프로세스에서 [AGENT-SERVICE-URL]을 에이전트를 실행하는 엔드포인트로 바꾸고, [YOUR-TEAM]/[YOUR-PROJECT]도 변경하세요.[YOUR-TEAM]/[YOUR-PROJECT]로 span을 내보내도록 구성하세요.eval_context를 복사하세요. OTel은 래퍼 span의 속성을 상속하지 않습니다.evaluation에서 연결된 에이전트 span 보기
- wandb.ai로 이동합니다.
- Weave 사이드바 메뉴에서 Evals를 클릭합니다.
- 평가 run을 선택합니다.
- 열리는 evaluation 세부정보 패널에서 Evaluation 탭의 View spans를 클릭합니다. 해당 evaluation으로 필터링된 Spans 탭이 표시된 Agents 페이지가 열립니다.
기존 데이터셋에 연결하기
log_prediction에 inputs로 전달하면, Weave는 평가 run이 실행될 때마다 데이터를 다시 임포트합니다. 그 결과 중복 데이터가 저장되며, 데이터셋이 크거나 많은 평가에서 이를 재사용하는 경우 저장 공간이 낭비될 수 있습니다.
이 중복을 방지하려면 평가를 실행하기 전에 먼저 데이터셋을 Weave에 게시한 다음, 게시된 데이터셋의 행을 inputs로 전달하세요. 그러면 Weave는 데이터를 다시 임포트하는 대신 내부 참조를 사용해 게시된 행 참조를 해석합니다. 이 방식을 사용하면 표준 Evaluation 프레임워크와 동일하게 연결된 환경을 사용할 수 있으며, 각 예측은 Weave UI의 특정 데이터셋 행에 다시 연결됩니다.
다음 예제에서는 데이터셋을 게시하고 이를 EvaluationLogger에 연결한 뒤, 다른 데이터셋과 마찬가지로 조회하고 순회합니다.
- Python
- TypeScript
로깅 전에 출력 먼저 계산하기
- Python
- TypeScript
리치 미디어 로깅
log_prediction 또는 log_score 메서드에 dict 또는 미디어 객체를 전달하면 됩니다.
- Python
- TypeScript
여러 평가 기록 및 비교
EvaluationLogger를 사용하면 Weave UI에서 여러 평가를 나란히 기록하고 비교할 수 있습니다. 이는 동일한 데이터셋에서 서로 다른 모델의 성능을 평가하는 데 유용합니다.
- 다음 코드 샘플을 실행합니다.
- Weave UI에서 Evals 탭을 엽니다.
- 비교하려는 평가를 선택합니다.
- Compare를 클릭합니다. Compare 뷰에서 다음 작업을 할 수 있습니다.
- 추가하거나 제거할 평가 선택.
- 표시하거나 숨길 메트릭 선택.
- 특정 예제를 페이지별로 살펴보며, 주어진 데이터셋에서 동일한 입력에 대해 서로 다른 모델이 어떻게 수행되었는지 확인.
- Python
- TypeScript


사용 팁
EvaluationLogger를 최대한 효과적으로 사용할 수 있습니다.
- Python
- TypeScript
- 각 예측 후에는 즉시
finish()를 호출하세요. - 개별 예측에 연결되지 않은 메트릭(예를 들어, 전체 지연 시간)을 캡처하려면
log_summary를 사용하세요. - 리치 미디어 로깅은 정성적 분석에 매우 유용합니다.