Testing Microsoft Agent Framework Applications
개요
Microsoft Agent Framework 애플리케이션은 LLM의 불확정성을 고려하여 테스트 시 각 경계를 독립적으로 테스트하고, 모델 의존적인 행동은 별도의 평가 방식으로 접근하는 계층적 테스트 전략을 적용해야 합니다.
주요 내용
* 라이브 모델 테스트 지양: 라이브 모델 테스트는 비용이 많이 들고 느리며 진단이 어려우므로, 일반적인 단위 및 통합 테스트를 대체하기보다는 제한적으로 사용해야 합니다.
* 테스트 피라미드: 에이전트 애플리케이션 테스트는 가장 많은 부분을 차지하는 결정론적 컴포넌트 테스트(가상 모델 클라이언트, 도구, 스키마, 라우팅)부터 시작하여, 에이전트 + 도구 + 저장소 + 워크플로우 경계 테스트, 그리고 모델과 사용자 입력에 실제로 의존하는 행동을 검증하는 평가 스타일의 통합 테스트로 이어집니다.
* 가상 모델 클라이언트 활용: IChatClient 인터페이스를 통해 모델 클라이언트를 주입 가능하게 만들어, 테스트 시 실제 모델 호출 없이 시나리오에 필요한 응답을 반환하고 애플리케이션이 보낸 내용을 기록하는 가상 클라이언트를 사용합니다.
* 에이전트 경계 테스트: 주입 가능한 모델 클라이언트를 사용하면 실제 애플리케이션과 동일하게 에이전트를 구성하고, 네트워크 호출 없이 입력이 모델 경계에 도달하고 응답이 애플리케이션 API를 통해 반환되는지 검증할 수 있습니다.
* 도구 테스트: 도구는 C# 계약(함수 실행)과 AI 계약(모델에 대한 함수 설명)으로 나뉘며, 두 가지 모두 테스트해야 합니다.
* 함수 자체 테스트: 일반적인 단위 테스트로 비즈니스 로직 오류, 권한 문제, 매핑 오류 등을 잡습니다.
* AI 계약 테스트: 생성된 AIFunction의 이름, 설명, JSON 스키마 등을 검사하여 모델 동작에 영향을 미치는 속성을 확인합니다.
* 구조화된 출력 테스트:
* 역직렬화 테스트: 모델 응답을 기대하는 타입으로 성공적으로 역직렬화되는지, 그리고 잘못된 형식의 출력에 대한 처리 정책이 적용되는지 테스트합니다.
* 비즈니스 유효성 검사 테스트: 역직렬화된 객체의 비즈니스 로직 유효성을 검사하여 안전하지 않은 의도가 라우팅되지 않도록 합니다.
* 라우팅 테스트: 모델이 생성한 유효한 라우팅 결과를 기반으로 하는 C# 코드는 결정론적이므로, 일반적으로 알려진 결정으로 테스트 테이블을 구성하여 검증합니다. 모델 기반 분류기는 스크립트된 응답을 사용하여 테스트합니다.
* 워크플로우 테스트: 워크플로우의 최종 결과물뿐만 아니라 발행된 이벤트, 실행된 엑스큐터, 분기, 에러, 인간 개입 일시 중지 등을 인프로세스 실행으로 검사합니다.
* 평가 스타일 회귀 검사: 문자열 일치만으로는 검증하기 어려운 행동(예: 관련성, 일관성, 근거 기반, 작업 준수)은 소규모 평가 세트를 구성하여 지역적 평가기 또는 모델 기반 평가기를 사용하여 검증합니다.
* 실패 경로 테스트: 모델 오류, 잘못된 구조화된 출력, 잘못된 도구 요청, 도구 실패, 에이전트 루프, 사용자 취소, 컨텍스트 크기 초과 등의 실패 시나리오를 의도적으로 테스트하여 제어된 오류 처리를 보장합니다.
* 테스트 데이터 관리: 민감한 정보가 포함된 테스트 데이터를 익명화하고, 프로덕션 환경과의 경계를 명확히 하여 데이터 유출을 방지합니다.
* 실용적인 테스트 계획: 새로운 에이전트 기능 추가 시, C# 서비스/도구 직접 테스트, AIFunction 계약 테스트, 가상 클라이언트를 사용한 에이전트 테스트, 구조화된 출력 및 유효성 검사 테스트, 라우팅 테스트, 워크플로우 테스트, 작고 안정적인 평가 세트, 대규모 라이브 평가 순서로 진행하여 피드백 속도를 높이고 실패 원인을 국지화합니다.
시사점
이러한 계층적 테스트 접근 방식은 Microsoft Agent Framework를 사용하여 개발된 에이전트 애플리케이션의 신뢰성과 예측 가능성을 크게 향상시키며, 모델의 불확정성을 효과적으로 관리하고 애플리케이션의 결정론적 경계를 명확히 하여 디버깅을 용이하게 합니다.
댓글
GitHub Discussions