1. 왜 Trace 분석과 평가가 필요한가
LLM (Large Language Model) 기반 애플리케이션과 에이전트 (Agent) 는 블랙박스 특성을 갖습니다. 동일한 입력에도 확률적으로 다른 출력이 나오며, 내부 추론 과정이 불투명합니다. 이런 특성은 다음 세 가지 문제를 만들어냅니다.1-1. 블랙박스 문제
전통적인 소프트웨어는 단위 테스트 (Unit Test) 로 품질을 보장할 수 있습니다. 하지만 LLM 응답은 결정론적이지 않기 때문에, 실제 실행 흔적 (Trace) 을 기록하고 분석 해야만 문제의 원인을 추적할 수 있습니다.| 일반 소프트웨어 | LLM 애플리케이션 |
|---|---|
| 입력 → 결정론적 출력 | 입력 → 확률적 출력 |
| 단위 테스트로 검증 가능 | Trace 기반 분석 필요 |
| 코드 디버깅으로 원인 파악 | Span 단위 분석으로 원인 파악 |
| 배포 후 변경 없음 | 프롬프트/모델/데이터 드리프트 발생 |
1-2. 프로덕션 품질 보장
개발 환경에서 잘 동작하던 앱이 프로덕션에서 품질이 저하되는 이유는 다양합니다.- 데이터 드리프트 (Data Drift): 사용자가 예상치 못한 질문 패턴 사용
- 모델 드리프트 (Model Drift): LLM 공급자가 모델을 조용히 업데이트
- 컨텍스트 오염 (Context Pollution): 검색된 문서의 품질 저하
- 프롬프트 엣지 케이스 (Prompt Edge Case): 특정 입력에서만 실패하는 케이스
1-3. 비용 최적화
LLM API 호출 비용은 입력/출력 토큰 수에 비례합니다. Trace 데이터를 분석하면 다음을 최적화할 수 있습니다.- 불필요하게 긴 시스템 프롬프트 식별
- 중복 LLM 호출 (캐싱으로 대체 가능한 구간) 발견
- 응답 생성에 불필요한 토큰이 포함된 패턴 탐지
- 고비용 모델 호출을 저비용 모델로 대체 가능한 케이스 분류
2. Trace 검색과 필터링
2-1. mlflow.search_traces() API
mlflow.search_traces() 는 기록된 Trace 를 Python 코드로 검색하는 핵심 API 입니다. 반환값은 pandas.DataFrame 입니다.
2-2. 태그 기반 필터링
2-3. 상태 및 시간 기반 필터링
2-4. UI에서의 Trace 탐색
MLflow UI 에서 Trace 를 탐색할 때는 다음 경로를 사용합니다.- Experiment 페이지 →
Traces탭 클릭 - 좌측 필터 패널에서 Status, 날짜 범위, 태그 필터 적용
- 특정 Trace 클릭 → Span 트리 (Span Tree) 뷰에서 단계별 실행 확인
- Span 클릭 시 입출력 (Input/Output), 속성 (Attributes), 이벤트 (Events) 상세 확인
Databricks 환경에서는 MLflow UI 가 Workspace UI 에 통합되어 있습니다. Experiment 페이지 접근 경로: Experiments → (실험명) → Traces 탭
3. Trace 분석 패턴
3-1. Latency 병목 Span 찾기
3-2. Token 사용량 분석
3-3. 에러 패턴 분석
4. MLflow Evaluation — mlflow.genai.evaluate()
4-1. 기본 개념
mlflow.genai.evaluate() 는 LLM 애플리케이션의 출력을 Scorer (평가자) 를 사용하여 자동으로 채점합니다. 평가 결과는 MLflow Experiment 에 기록되어 버전 간 비교가 가능합니다.
4-2. 기본 Scorer 종류
| Scorer | 설명 | 주요 판정 기준 |
|---|---|---|
| Guidelines | 사용자 정의 지침 준수 여부 | 프롬프트 기반 LLM-as-a-judge |
| Correctness | 예상 정답과의 일치도 | 의미적 동등성 (Semantic Equivalence) |
| Safety | 유해 콘텐츠 포함 여부 | 폭력, 혐오, 개인정보 등 |
| RetrievalGroundedness | 검색 결과에 근거한 답변인지 | 환각 (Hallucination) 감지 |
4-3. mlflow.genai.evaluate() 사용 예시
참고:mlflow.genai.evaluate()는 MLflow 2.14 이상에서 지원합니다. 기존mlflow.evaluate()와 API 구조가 다릅니다.
5. 커스텀 Scorer 작성
기본 Scorer 로 커버되지 않는 도메인 특화 평가 기준은@scorer 데코레이터를 사용하여 직접 정의합니다.
5-1. @scorer 데코레이터 기본 구조
5-2. LLM-as-a-Judge 패턴 커스텀 Scorer
5-3. 커스텀 Scorer 등록 및 실행
6. 평가 데이터셋 구축
좋은 평가는 좋은 데이터셋에서 시작합니다. 평가 데이터셋은 크게 세 가지 방법으로 구축합니다.6-1. Trace에서 데이터셋 추출
프로덕션 Trace 에서 고품질 사례를 자동으로 수집합니다.6-2. 수동 레이블링 워크플로우
자동 수집만으로는 엣지 케이스를 충분히 커버하기 어렵습니다. 도메인 전문가가 직접 레이블링하는 과정이 필요합니다.6-3. Gold Set 관리
Gold Set 은 정확성이 검증된 핵심 평가 데이터셋입니다. Spark DataFrame 또는 Delta Table 로 관리하면 버전 관리와 공유가 용이합니다.7. 프로덕션 모니터링
7-1. Trace 기반 품질 대시보드
Unity Catalog 시스템 테이블 (system.mlflow.traces) 을 Databricks SQL 로 쿼리하여 품질 대시보드를 구축합니다.
7-2. 드리프트 감지
이동 평균 (Moving Average) 비교로 품질 드리프트를 조기에 감지합니다.7-3. 알림 설정 (Databricks Workflow 활용)
Databricks Workflow (Jobs) 를 사용하여 주기적으로 품질 지표를 체크하고 임계값 초과 시 알림을 전송합니다.8. 베스트 프랙티스
8-1. 평가 주기 가이드
| 상황 | 권장 평가 주기 | 비고 |
|---|---|---|
| 모델 버전 업데이트 | 배포 전 반드시 실행 | Gold Set 전체 평가 |
| 프롬프트 변경 | 변경 전후 비교 평가 | A/B 테스트와 병행 |
| 프로덕션 정기 평가 | 주 1회 | 샘플링된 Trace 활용 |
| 드리프트 의심 시 | 즉시 | 최근 Trace 기반 |
8-2. Scorer 선택 가이드
8-3. 비용 vs 품질 트레이드오프
LLM-as-a-Judge 방식의 Scorer 는 판단 품질이 높지만 호출 비용이 발생합니다.8-4. Flywheel (플라이휠) 효과 구축
프로덕션 데이터를 평가에 활용하는 선순환 구조를 만드는 것이 최종 목표입니다.정리
| 핵심 개념 | 설명 |
|---|---|
| Trace 분석 | 블랙박스 LLM 앱의 실행 흔적을 기록하고 Latency, 토큰, 에러 패턴을 분석합니다 |
| search_traces() | 태그, 상태, 시간 조건으로 Trace 를 Python DataFrame 으로 조회합니다 |
| genai.evaluate() | 평가 데이터셋과 Scorer 를 조합하여 LLM 앱을 자동 채점합니다 |
| 기본 Scorer | Guidelines, Correctness, Safety, RetrievalGroundedness 등을 제공합니다 |
| 커스텀 Scorer | @scorer 데코레이터로 도메인 특화 평가 기준을 직접 정의합니다 |
| Gold Set | 검증된 평가 데이터를 Delta Table 로 버전 관리하고 CI/CD 에 통합합니다 |
| 프로덕션 모니터링 | 시스템 테이블 + Workflow Job 으로 드리프트를 자동 감지하고 알림을 전송합니다 |
| Flywheel 효과 | 프로덕션 트레이스 → 평가 데이터 → 모델 개선의 선순환을 구축합니다 |