LLM을 활용한 문서 추출 시스템의 테스트에서, 느리고 비싼 외부 호출을 모킹 대신 캐싱으로 처리하는 접근과 그 장점을 설명한다.
이전에 나는 표면 테스트(surface testing)에 대해 설명한 바 있고, 지금도 시스템을 테스트할 때 그렇게 하고 있다.
최근에 나는 LLM의 도움을 일부 빌려 문서를 추출하는 시스템을 공동 개발했는데, 여기에서 흥미로운 변주가 생겼다. 문서를 추출하고 그에 대해 여러 가지를 단언(assert)하는 테스트 케이스가 수십 개 있다. 하지만 전체를 한 번 돌리는 데에만 20–30분이 걸리고, LLM 호출 때문에 비용도 1–2달러 든다.
나는 여기에 대한 목(mock)을 작성하고 싶은 유혹을 억눌렀다. 또한, 더 큰 유혹이었던 “추출을 아예 테스트 스위트의 일부로 돌리지 말자”는 생각도 참았다. 대신, 우리는 단순히 이전 추출 결과를 캐싱해서, 테스트를 돌릴 때 시간과 비용을 아끼도록 했다. 이 접근은 모킹에 비해 다음과 같은 장점이 있다.
캐시는 로컬 개발 환경에서만 동작하는 조건부 코드 조각으로 접근된다. 파일에 저장되는 데이터는 외부 호출에서 실제로 받게 되는 것과 완전히 동일하다. 나는 느리고 값비싼 호출이 포함된 대부분의 표면 테스트에 이 방식을 사용할 수 있다고 믿는다.
캐시를 갱신하는 트리거는 바로 그 논리(로직) 자체를 다시 테스트해야 할 때이다. 시스템의 다른 부분을 테스트할 때는, 성능 비용을 치르지 않고도 여전히 이 추출 스위트에 의존할 수 있다.