평가 주도 개발로 LLM 챗봇 구축하기: Phoenix를 활용한 실전 가이드

요약

평가 주도 개발(Evaluation Driven Development)을 활용하여 LLM 챗봇을 구축하고 개선하는 실전 워크숍입니다. Arize의 Phoenix 도구를 사용하여 여행 에이전트 챗봇을 MVP에서 프로덕션 레벨로 발전시키는 전 과정을 실습합니다.

평가 주도 개발의 개념

평가 주도 개발은 테스트 주도 개발(TDD)의 LLM 애플리케이션 특화 버전입니다. 핵심 사이클은 다음과 같습니다:

  • 개발 단계: 추적(Trace) → 실험(Experimentation) → 테스트 케이스 검증
  • 프로덕션 단계: 배포 → 모니터링 → 프로덕션 인사이트를 개발에 재투입
  • 지속적 개선: 프로덕션에서 발견된 새로운 입력과 질문을 테스트에 통합하여 순환적으로 개선
  • 확장 가능한 방식: 테스트 기반 개발로 애플리케이션 성능을 체계적으로 향상

실습 예제: 여행 에이전트 챗봇 아키텍처

워크숍에서는 다음과 같은 구조의 여행 에이전트 챗봇을 사용합니다:

  • 기본 구조: Router → Tool Selection → Response
  • 4가지 핵심 도구:
    • Itinerary Tool: 여행 일정 생성
    • Flight Search Tool: 실시간 항공편 정보 조회 API 연동
    • Travel Info Tool: 특정 위치에 대한 정보 제공
    • Packing List Tool: 짐 싸기 목록 생성
  • 모델: GPT-4o / GPT-4o-mini 사용
  • 입력 처리: 사용자 입력 + 채팅 기록 + 메모리

개발 단계: 테스트 케이스 구축 및 실험

Ground Truth 데이터셋 생성

  • CSV 파일 업로드: 질문과 예상 함수 호출을 매핑
  • 생성 방법: Claude 3.7을 사용한 합성 데이터 생성 후 수동 검수
  • 중요 원칙: 생성된 데이터는 반드시 사람이 검토하고 수정해야 함
  • 데이터셋 크기: 많은 예제가 필요하지 않으므로 고품질 검증이 중요

Prompt Playground 활용

  • Trace에서 프롬프트 추출: 특정 시점의 LLM 호출을 Playground로 가져오기
  • What-if 분석: 그 시점의 모든 변수와 프롬프트를 재현하여 테스트
  • 버전 관리: 프롬프트 변경사항을 자동으로 버전화하여 추적
  • 태깅 시스템: Production, Staging 등의 태그로 프롬프트 상태 관리
  • 프로그래밍 방식 활용: Phoenix에서 프롬프트를 직접 가져와 코드에 통합

다양한 실험 수행

  • 모델 비교: GPT-4o vs Anthropic Claude 성능 비교
  • 파라미터 조정: Tool Choice를 ‘auto’로 설정, 필수/선택 파라미터 조정
  • 프롬프트 개선: 시스템 프롬프트에 “현재 연도는 2025년” 등 컨텍스트 추가
  • 병렬 실험: 여러 버전의 프롬프트를 동시에 테스트하여 효율성 향상

평가(Evaluation) 기법

자동 평가

  • Router 평가: Ground truth와 실제 함수 호출 비교 (Success Rate 계산)
  • 평가자 파일: Python 코드로 실험 결과에 평가 로직 적용
  • LLM as Judge: 출력이 사용자 질문에 답변하는지 자동 판단하여 고수준 평가

수동 검토

  • 실패 케이스 집중: ‘incorrect’ 레이블로 필터링하여 문제점 파악
  • 근본 원인 분석: Router 문제인지 Tool 실행 문제인지 구분
  • 데이터셋 업데이트: 발견된 문제를 새로운 테스트 케이스로 추가

프로덕션 모니터링 및 피드백 루프

프로덕션 추적

  • 지속적인 Tracing: 프로덕션 환경에서도 모든 호출 추적
  • 에러 탐지: “과거 날짜로 항공편 검색 불가” 등의 프로덕션 에러 발견
  • 하드 케이스 시뮬레이션: 어려운 질문들로 애플리케이션 스트레스 테스트

프로덕션 인사이트를 개발로 환류

  • LLM Judge로 대규모 필터링: 수많은 프로덕션 로그에서 문제 케이스만 추출
  • 문제점 발견 예시:
    • 모델이 현재 연도를 2024년으로 오인 → 시스템 프롬프트에 “2025년” 명시
    • 친환경 투어 요청을 완전히 답변하지 못함 → Travel Info 프롬프트 개선
  • 새로운 데이터셋 생성: 실패한 프로덕션 케이스로 새 테스트셋 구축
  • 재실험: 개선된 프롬프트로 프로덕션 케이스 재테스트

Phoenix 도구 활용 기법

Tracing 설정

  • Auto-instrumentation: OpenTelemetry 기반 자동 계측으로 OpenAI, Anthropic 등 패키지 자동 추적
  • 수동 Decorator: @tracer 데코레이터로 커스텀 스팬 추가

데이터셋 관리

  • CSV 업로드: Input/Output 컬럼으로 간단하게 생성
  • UI에서 직접 편집: 개별 예제 추가/수정 가능
  • API 연동: Python에서 프로그래밍 방식으로 데이터셋 관리
  • Export 기능: 데이터셋, 스팬, 트레이스 모두 추출 가능

Playground 기능

  • 모델 전환: 동일 프롬프트로 여러 모델 간 성능 비교
  • 실시간 테스트: 데이터셋을 프롬프트에 바로 적용하여 배치 테스트
  • 결과 비교: 여러 실험 결과를 나란히 비교

핵심 인사이트

  • 순환적 개발: 개발-배포-모니터링-개선의 사이클을 빠르게 반복하는 것이 핵심
  • 테스트 기반 사고: 랜덤 입력 테스트보다 구조화된 테스트 케이스가 훨씬 효과적
  • 프로덕션이 교과서: 실제 사용자 입력이 최고의 테스트 케이스 소스
  • 도구의 역할: Phoenix 같은 도구는 이 프로세스를 편리하게 하지만, 개념 자체가 더 중요
  • 비개발자 친화적: QA 엔지니어, PM도 프롬프트 개선과 테스트에 참여 가능
  • OpenTelemetry 표준: 표준 추적 프로토콜 사용으로 벤더 독립적
  • 점진적 완성도: MVP부터 시작해 평가를 통해 점진적으로 안정성 향상
  • Human-in-the-loop: 완전 자동화보다 사람의 판단이 결합된 접근이 더 신뢰성 높음

Leave a Comment