Weave Scorers — 출력 품질 점수 매기기

Weave Scorers — 출력 품질 점수 매기기

AI가 낸 출력이 '얼마나 좋은지'는 숫자로 매겨야 비교가 가능해요. Weave에서 이 역할을 하는 게 **Scorer(스코어러)**예요. AI의 출력을 받아 분석하고, 결과를 {키: 값} 사전으로 돌려주면서 평가 지표를 만들어요. 필요하면 입력 데이터를 기준(reference)으로 삼을 수도 있고, 판정 이유 같은 부가 정보도 함께 돌려줄 수 있어요.

Scorer 종류

Weave는 두 가지 Scorer 방식을 지원해요.

  • 함수 기반(Function-based): @weave.op로 장식된 Python 함수
  • 클래스 기반(Class-based): 복잡한 평가에 쓰는 weave.Scorer 상속 클래스

Scorer는 반드시 사전을 돌려야 하고, 여러 지표나 중첩 지표, LLM 판정기의 판단 텍스트처럼 숫자가 아닌 값도 담을 수 있어요.

import weave

@weave.op
def evaluate_uppercase(text: str) -> dict:
    return {"text_is_uppercase": text.isupper()}

my_eval = weave.Evaluation(
    dataset=[{"text": "HELLO WORLD"}],
    scorers=[evaluate_uppercase]
)

클래스 기반 예시

LLM 판정기처럼 프롬프트를 바꾸거나 여러 함수 호출이 필요하면 Scorer를 상속받아요. score 메서드를 @weave.op로 장식하고 사전을 돌려주면 돼요.

class SummarizationScorer(Scorer):
    model_id: str = "gpt-4o"
    system_prompt: str = "Evaluate whether the summary is good."

    @weave.op
    def call_llm(self, summary: str, processed_text: str) -> dict:
        res = llm_client.chat.completions.create(
            messages=[{"role": "system", "content": self.system_prompt},
                      {"role": "user", "content": summary}])
        return {"summary_quality": res}

    @weave.op
    def score(self, output: str, text: str) -> dict:
        eval_result = self.call_llm(summary=output, processed_text=processed_text)
        return {"summary_quality": eval_result}

컬럼 매핑과 점수 요약

스코어 함수의 인자 이름이 데이터셋 컬럼과 안 맞으면 column_map으로 연결해요.

scorer = SummarizationScorer(column_map={"text": "news_article"})

평가 실행 시 각 행의 점수를 계산한 뒤, 마지막 요약 점수는 auto_summarize가 만들고 summarize 메서드로 재정의할 수도 있어요. 개별 호출에 점수를 붙이고 싶으면 .call()call.apply_scorer()를 쓰면 돼요. 모든 점수 결과는 Weave DB에 저장되고 UI나 API로 조회할 수 있어요.

더 알아보기