LLM 학습 에이전트 백엔드: Spring MVC, Virtual Thread, 비용 최적화 전략
LLM 기반 학습 에이전트의 대규모 채팅 트래픽 처리 및 복잡한 AI 파이프라인 구성 요구사항 충족을 위해 백엔드 시스템 설계
Spring MVC와 Virtual Thread 조합을 통해 동기적 코드 스타일 유지하며 높은 동시성 확보, 쓰레드 고갈 문제 해결 시도
컨텍스트(Context)와 Tool 설계에 집중하여 답변 품질 향상, 이미지 분석 서브에이전트 분리로 환각 감소 및 비용 절감
LLM-as-a-Judge 방식의 답변 품질 개선 워크플로우 구축 및 과적합(Overfitting) 문제 해결 노력
에이전트 분리, 암시적/명시적 캐싱 전략으로 LLM API 호출 비용 최적화
Spring MVC + Virtual Thread vs. Spring Webflux
학습 에이전트 백엔드는 대규모 채팅 트래픽 처리라는 핵심 요구사항을 만족시키기 위해 기술 스택 선정에 고심했다. Spring MVC와 Virtual Thread 조합은 기존 개발팀의 익숙함을 활용하면서도, 블로킹 I/O 발생 시 캐리어 스레드(Carrier Thread)를 효율적으로 전환하여 높은 동시성(Concurrency)을 확보하는 방안으로 제시되었다. 특히 Java 25부터 개선된 pinning 이슈 해결은 안정성 측면에서 긍정적이다. 반면, Spring Webflux는 이벤트 루프(Event Loop) 기반으로 SSE 스트리밍 처리에 최적화되었으나, 가파른 학습 곡선과 리액티브 전염(Reactive Contamination)의 위험성을 내포하고 있어 도입이 망설여졌다. 결국 팀의 기술 부채와 학습 비용을 고려하여 Virtual Thread를 선택한 것으로 보인다.
AI 파이프라인 구축을 위한 Nest.js의 역할
Nest.js는 Node.js의 이벤트 루프(Event Loop)와 비동기 I/O 처리 능력을 기반으로 복잡한 AI 파이프라인 구성에 적합한 환경을 제공한다. TypeScript 기반의 모듈, 컨트롤러, 서비스 구조는 Spring과 유사한 아키텍처 패턴을 적용하여 코드의 관리 용이성을 높인다. 특히, 풍부한 JavaScript/TypeScript AI 라이브러리 생태계는 LLM 연동 및 다양한 AI 모델 통합에 유리하다. 다만, CPU 바운드 작업 시 이벤트 루프 블로킹 가능성은 주의해야 할 부분이며, 이를 해결하기 위해 별도의 워커 스레드(Worker Thread) 활용이나 비동기 작업 위임 전략이 필요할 수 있다.
컨텍스트(Context)와 Tool 설계의 중요성
학습 에이전트의 답변 품질은 LLM 모델 자체의 성능뿐만 아니라, 제공되는 컨텍스트와 Tool의 설계에 크게 좌우된다. 본문에서는 강의 커리큘럼, 수강생 진도, 사용자 언어, 영상 프레임 등 다양한 컨텍스트 정보를 동적으로 로드하는 방식을 채택했다. 이는 'Lost in the Middle' 현상 방지와 토큰 비용 최적화를 위한 전략이다. 특히, 이미지 분석을 위한 별도의 서브에이전트 분리는 환각(Hallucination) 감소와 비용 절감이라는 두 마리 토끼를 잡는 효과적인 접근 방식이다.
LLM 답변 품질 개선을 위한 워크플로우
LLM의 답변 품질을 체계적으로 개선하기 위해 LLM-as-a-Judge 방법론에서 착안한 자체 워크플로우를 구축했다. Golden Dataset을 정답지로 활용하여 학습 에이전트의 답변을 평가하고, 평가관(Evaluator), 조교(Tutor) 에이전트를 통해 프롬프트 개선 과정을 자동화했다. 이 과정에서 발생한 과적합(Overfitting) 문제는 반복적인 피드백 수정 대신, 일관된 문제 패턴이 반복될 때만 프롬프트를 수정하는 방식으로 해결했다. 이는 사람의 검수와 결합하여 LLM 기반 개선의 효율성을 높이는 방안이다.
LLM API 비용 최적화를 위한 캐싱 전략
외부 LLM API 의존성이 높은 학습 에이전트의 운영 비용 절감을 위해 다양한 캐싱 전략을 적용했다. 에이전트 분리를 통해 역할별로 필요한 시스템 프롬프트만 로드하여 요청당 토큰 수를 절감했다. 또한, 암시적 캐싱(Implicit Caching)의 불확실성과 제어의 어려움을 극복하기 위해, 명시적 캐싱(Explicit Caching)을 도입하여 캐시 생성, TTL 관리, 비용 절감 효과를 직접 제어할 수 있게 했다. 특히 Gemini의 명시적 캐싱은 입력 토큰 비용의 90% 할인 효과를 제공하지만, 캐시 저장 비용과의 손익분기점 분석이 선행되어야 한다.