Langfuse 평가 핵심 개념 (Scores·Methods·Experiments)
Langfuse 평가 핵심 개념 (Scores·Methods·Experiments)
LLM 애플리케이션은 끊임없이 "테스트하고 모니터링하는 루프"를 돌아요. 그 중심에 평가 개념들이 있는데, Langfuse에서는 점수(score), 평가 방법(evaluation method), 데이터셋(dataset), 실험(experiment)이 서로 맞물려 동작해요. 오프라인 평가는 배포 전에 고정 데이터셋 위에서 새 프롬프트·모델을 돌려보는 것이고, 온라인 평가는 라이브 트레이스에 점수를 매겨 실무 트래픽의 문제를 잡는 거예요. 이 페이지에서는 그 개념들이 어떻게 쌓이는지 정리할게요.
평가 루프 (The Evaluation Loop)
LLM 앱은 보통 아래와 같은 루프를 반복해요. 대표적인 워크플로우를 고객 지원 챗봇으로 보면요.
- 응답이 덜 딱딱해지도록 프롬프트를 수정해요.
- 배포 전에 실험을 돌려요—고객 질문 데이터셋에 새 프롬프트를 테스트하는 오프라인 평가죠.
- 점수와 출력을 검토해요. 톤은 좋아졌는데 응답이 길어지고 중요한 링크를 빼먹는 경우가 생겼어요.
- 프롬프트를 다듬고 실험을 다시 돌려요.
- 결과가 좋아졌네요. 새 프롬프트를 프로덕션에 배포해요.
- 온라인 평가로 새 엣지 케이스를 잡으며 모니터링해요.
- 고객이 프랑스어로 질문했는데 봇이 영어로 답하는 걸 발견했어요.
- 이 프랑스어 질문을 데이터셋에 추가해서 다음 실험에서 잡히게 해요.
- 프랑스어 응답을 지원하도록 프롬프트를 수정하고 또 다른 실험을 돌려요.
시간이 지나면 데이터셋은 몇 개의 예시에서 다양하고 대표적인 실무 테스트 케이스 집합으로 자라나요.
점수 (Scores)
점수(Scores) 는 평가 결과를 저장하는 Langfuse의 보편적 데이터 객체예요. LLM 출력에 품질 판단을 내릴 때마다—사람 주석이든, LLM 심판이든, 프로그램적 검사든, 최종 사용자 피드백이든—결과는 점수로 저장돼요. 점수는 트레이스·관찰·세션·데이터셋 실행에 붙일 수 있고, 각 점수는 이름(name), 값(value), 데이터 타입(NUMERIC·CATEGORICAL·BOOLEAN·TEXT)을 가져요.
평가 방법 (Evaluation Methods)
평가 방법은 트레이스·관찰·세션·데이터셋 실행에 점수를 매기는 함수예요. 여러 평가 방법을 조합해 점수를 추가할 수 있어요.
| 방법 | 내용 | 언제 쓰나요 |
|---|---|---|
| LLM-as-a-Judge | 커스텀 기준으로 LLM이 출력을 평가 | 규모 있는 주관 평가 (톤·정확성·유용성) |
| Code evaluators | 커스텀 Python·TypeScript 로직으로 점수화 | 결정적 검사, 구조화 출력 검증, 커스텀 비즈니스 규칙 |
| Scores via UI | Langfuse UI에서 트레이스에 직접 점수 추가 | 빠른 품질 스팟 체크, 개별 트레이스 검토 |
| Annotation Queues | 커스텀 가능한 큐로 구조화된 사람 검토 워크플로우 | ground truth 구축, 체계적 라벨링, 팀 협업 |
| Scores via API/SDK | Langfuse API·SDK로 프로그래밍 방식 점수 추가 | 커스텀 평가 파이프라인, 결정적 검사, 자동화 워크플로우 |
새 평가 방법을 설정할 때는 Score Analytics로 만든 점수를 분석·검토할 수 있어요.
온라인 평가 (Online Evaluation)
온라인 평가에서는 유입되는 프로덕션 관찰을 매칭할 규칙(rule) 을 만들어요. 규칙이 그에 붙은 평가자를 트리거해 관찰에 점수를 매기죠. 이렇게 실무 트래픽의 문제를 잡아요.
- 평가자(Evaluator) 는 Langfuse가 데이터를 어떻게 점수화할지 정의해요. 배치 평가로 과거 관찰을 점수화하거나, 규칙에 붙여 유입되는 운영 관찰을 점수화하거나, 프롬프트 실험 실행을 점수화하는 데 써요.
- 규칙(Rule) 은 어떤 유입 관찰을 Langfuse가 점수화할지 정의해요. 필터와 샘플링 비율로 관찰을 선별한 뒤, 하나 이상의 평가자를 트리거하는 용도예요.
평가자는 여러 규칙에 걸쳐 재사용할 수 있어요. LLM-as-a-Judge의 경우 Langfuse는 규칙과 매칭되는 관찰을 상대로 평가자의 기본 변수 매핑을 검증해요. 데이터 모양이 다르면 특정 평가자-규칙 할당에 대해 매핑을 덮어쓸 수 있어요.
과거 관찰에 평가자 실행
평가자를 저장할 때 Also run on past observations를 켜면 규칙에 매칭되는 기존 관찰까지 점수화해요. 최대 6개월 범위의 프리셋이나 커스텀 범위를 고르고 최대 25,000개 관찰을 평가할 수 있어요. 시작 전에 예상 LLM 비용을 확인하세요.
평가자 결과 모니터링
커스텀 대시보드로 시간에 따른 점수·성능을 추적해요. 평가자의 점수나 비용이 임계값을 넘으면 알림을 받으려면 평가자를 열고 Add alert를 클릭하면 돼요. Score threshold와 Cost threshold(개별 LLM-as-a-Judge 평가자용) 프리필 알림을 만들 수 있어요.
배치 평가 (Batch Evaluation)
수집된 후의 과거 관찰 집합을 점수화하는 데 배치 평가를 써요. 새 평가자나 업데이트된 평가자를 기존 프로덕션 데이터에 테스트하고 싶을 때 유용하죠. 절차는 간단해요—Traces 테이블을 열고, 평가하려는 기간·트레이스 기준으로 필터링하고, 매칭되는 행을 선택한 뒤 Actions → Evaluate로 평가자를 선택해 실행해요. 결과 점수는 각 선택 트레이스의 매칭 관찰에 붙어요.
실험 (Experiments)
실험(Experiment) 은 데이터셋 위에서 애플리케이션을 실행하고 출력을 평가하는 작업이에요. 프로덕션 배포 전에 변경 사항을 테스트하는 방식이죠. 먼저 구성 요소를 이해해요.
| 객체 | 정의 |
|---|---|
| Dataset | 테스트 케이스(데이터셋 항목)의 모음. 데이터셋에 실험을 실행 가능 |
| Dataset item | 데이터셋의 한 항목. 테스트할 시나리오(입력)와 선택적 기대 출력을 담음 |
| Task | 실험에서 테스트할 애플리케이션 코드. 각 데이터셋 항목에 수행되며 출력을 점수화 |
| Evaluation Method | 실험 결과를 점수화하는 함수. 코드 평가자, SDK로 수집한 점수, LLM-as-a-Judge 등 |
| Score | 평가의 출력 |
| Experiment Run | 모든 데이터셋 항목에 task를 한 번 실행해 출력(과 점수)을 생성 |
개념적으로 이렇게 맞물려요. 주어진 데이터셋에 실험을 실행하면 각 데이터셋 항목이 정의한 task 함수로 전달돼요. task 함수는 보통 테스트하려는 LLM 호출이고, 각 항목에 대해 출력을 만들어요. 이 과정이 experiment run이고, 항목에 연결된 출력 모음이 실험 결과예요. 그 결과는 다양한 평가 방법으로 점수화하고, 점수를 바탕으로 모든 테스트 케이스에 걸친 애플리케이션 성능의 완전한 그림을 얻을 수 있어요.
실험 실행 방식
- SDK로 프로그래밍 방식 실행: task·평가 로직을 완전히 제어할 수 있어요. Experiments via SDK
- Langfuse 인터페이스에서 직접: 데이터셋과 프롬프트 버전을 선택해 코드 없이 프롬프트를 빠르게 반복할 수 있어요. Experiments via UI
- OpenTelemetry로: 이미 OTel로 트레이스를 내보내고 Python·JS/TS SDK를 안 쓴다면, 그 스팬에 실험 속성을 붙여 실험 실행으로 그룹화할 수 있어요. Experiments via OpenTelemetry
선택 사항이지만, Datasets를 Langfuse에서 관리하는 것을 권장해요. 같은 데이터에 대한 서로 다른 실험의 UI 비교 테이블을 쓰고, 프로덕션·스테이징 트레이스를 바탕으로 데이터셋을 반복적으로 개선할 수 있기 때문이에요.