오케스트레이션 테스팅 — 비결정론적 AI를 어떻게 테스트하는가

…

한줄 요약

AI 테스트는 정답 비교가 아니라 기준 충족 여부 확인이다 — 그리고 여러 번 실행해서 통계로 판단한다.

본문

소프트웨어 테스트와 무엇이 다른가

일반 소프트웨어 테스트:

입력: add(2, 3)
기대값: 5
실제값: 5
결과: 통과

항상 같은 답이 나온다. 정확히 일치하는지 비교한다.

AI 워크플로우 테스트:

입력: diagnose("흉통, 호흡곤란, 발열, 기침")
기대값: ???
실제값: "폐렴 또는 흉막염 의심. 추가 검사: 흉부 X-ray, CRP, 혈액배양"
결과: 좋은 답인가?

정답이 없고, 매번 조금씩 다른 답이 나온다. “이 답이 의학적으로 적절한가”를 판단해야 한다.


4단계 테스트 계층

1단계 — 컴포넌트 테스트

각 에이전트를 독립적으로 테스트한다. 이 에이전트가 맡은 역할을 제대로 하는가.

약사 에이전트 테스트 예시:

입력: {
  환자: {eGFR: 25},
  제안 약물: 메트포르민 1000mg
}

확인할 것:
✓ 금기 플래그를 세웠는가?
✓ 메트포르민이 금기 목록에 있는가?
✓ 대안 약물을 제시했는가?

정확한 단어는 중요하지 않다. 의미가 맞는지가 중요하다.

2단계 — 통합 테스트

여러 에이전트가 협력하는 서브 워크플로우를 테스트한다.

“데이터 수집 → 약물 검토 흐름”이 제대로 작동하는가:

  • 수집 에이전트의 결과가 약사 에이전트에게 제대로 전달되는가?
  • 약사 에이전트의 금기 판단이 다음 단계에 반영되는가?

3단계 — E2E 테스트

실제 의료 시나리오 전체를 처음부터 끝까지 테스트한다.

핵심 시나리오 예시:

시나리오확인할 것
단순 2형 당뇨 신규 진단진단 있음, 치료 계획 있음, 금기 없음
CKD Stage 4 + 당뇨메트포르민 금기, 대안 제시, 신장내과 협진 권고
응급 고혈당즉시 에스컬레이션, 5초 이내 응답
활력징후 이상 알림의사에게 알림 전송, 심각도 분류 정확

4단계 — LLM-as-Judge (AI 판별)

정확한 정답을 알 수 없는 경우, 다른 AI가 출력 품질을 평가한다.

평가 프롬프트:
"다음 치료 계획을 내과 전문의 관점에서 평가하세요.

환자 정보: [환자 데이터]
AI가 작성한 치료 계획: [치료 계획]

평가 기준:
1. 의학적 정확성 (1~5점)
2. 안전성 — 금기 및 위험 요인 확인 여부 (1~5점)
3. 완결성 — 필요한 요소가 모두 있는가 (1~5점)
4. 근거 — 권고 근거를 제시했는가 (1~5점)

문제점이 있으면 구체적으로 명시하세요."

4점 이상이면 통과, 3점 이하면 실패로 처리한다.


비결정론적 테스트 대응

같은 테스트를 여러 번 실행해서 통계를 낸다.

“CKD 환자 메트포르민 케이스를 10번 실행하면 몇 번이나 금기를 올바르게 탐지하는가?”

10번 중 9번 이상: 통과 10번 중 7~8번: 경고 (검토 필요) 10번 중 6번 이하: 실패 (프롬프트 수정 필요)


회귀 테스트 관리

새로운 버그를 발견하면 그 케이스를 테스트 셋에 추가한다.

버그 발견: CKD Stage 4 + 심부전 복합 케이스에서
           스피로노락톤 + ACE 억제제 고칼륨혈증 위험을 못 잡음
    ↓
수정
    ↓
이 케이스를 회귀 테스트 셋에 영구 추가
    ↓
이후 모든 배포 전 자동 실행
    ↓
동일 버그 재발 즉시 감지

버그를 수정할 때마다 테스트를 추가하면, 시스템이 성숙할수록 테스트 커버리지도 자동으로 올라간다.


테스트를 언제 실행하는가

배포 전 필수: 모든 코드 변경, 프롬프트 수정, 모델 변경 시. AI는 프롬프트 한 줄이 바뀌어도 예상치 못한 동작 변화가 생길 수 있다.

주기적 실행: 외부 모델이 업데이트될 때 (OpenAI, Anthropic이 모델을 바꾸면 성능이 달라질 수 있다), 가이드라인 DB가 업데이트됐을 때.

배포 후 모니터링: 프로덕션 환경에서 샘플링한 실제 케이스를 정기적으로 LLM-as-Judge로 평가. 시스템이 현실 데이터에서도 잘 작동하는지 확인.


더 알고 싶다면

🔗 관련 글

← 오케스트레이션 시리즈 전체 보기