셀카 검증 LLM 중복 호출 제거로 응답 속도 233배 개선
목차
셀카 처리 요청이 33~68초에서 0.14초로 떨어졌다. 대략 233배 빨라진 거다. 이건 단순히 "응 좋아" 정도로 넘어가기엔 너무 극적인 개선이라 기록해 둘 가치가 있다.
느린 처리의 대가
처음에 셀카 검증 흐름을 보니 정말 느렸다. 33~68초는 사용자 입장에서는 거의 타임아웃 직전 수준이고, API 서버 입장에서도 요청당 리소스를 오래 점유한다는 뜻이다. 테스트할 때마다 1분 대기, 실제 운영 환경에선 사용자 이탈 위험, 그리고 LLM 호출 비용도 발생하고 있었다. 이 정도면 단순한 "느린 엔드포인트"가 아니라 운영상 문제다. 팀에서 우선순위를 높이고 시간을 낼 수밖에 없었다.
원인: 불필요한 LLM 중복 호출
코드를 추적해 보니 두 가지 구조적 문제가 있었다. 첫째, 씬 LLM(경량 또는 중간 처리용 LLM)을 거쳤다가 다시 최종 검증 LLM을 부르는 이중 호출 구조였다. 씬 LLM은 실제로는 필요 없는 중간 처리였는데, 초기 설계 단계에서 추가했던 계층이 그대로 남아 있던 것 같다. 이걸 걷어내자 한 번에 속도가 확 올랐다.
둘째, 캐시 사전 준비(pre-warming)가 없었다. 같은 셀카 검증 로직은 패턴이 반복되는데도 매 요청마다 LLM 프롬프트를 새로 구성하고 컨텍스트를 로드했다. 이건 마치 DB 커넥션을 매번 새로 여는 것처럼 비효율적이었다.
수정한 부분들
변경 파일을 보면 다층적인 조율이 필요했다:
route.ts파일들 (admin/selfies, selfie): 불필요한 LLM 단계를 제거하고, 직접 최종 검증 로직으로 진입하도록 수정chat.ts: 캐시된 프롬프트와 컨텍스트를 재사용하는 로직 추가claude-cli.ts: CLI 인터페이스 단에서 캐시 pre-warm 기능 구현 (요청 전에 필요한 리소스를 미리 로드)scenes.ts: 셀카 검증 씬(시나리오)의 캐시 키를 정의해서 같은 요청은 즉시 응답 가능하도록
결과적으로 API 엔드포인트→캐시 확인→필요시만 LLM 호출→응답 이런 식의 직선 경로가 되었다.
성능 최적화에서 배운 것
이 작업에서 느낀 핵심은 두 가지다.
첫째, 측정 없이는 최적화도 없다. 처음부터 "응답 시간이 오래 걸린다"는 정성적 불평이 있었지만, 실제로 33~68초라는 범위를 재고 병목이 LLM 호출인지 I/O인지 캐시인지 프로파일링으로 확인하지 않았다면 이 수준의 개선은 불가능했다.
둘째, 아키텍처 부채는 생각보다 빠르게 누적된다. 초기에 "안전하게 두 단계로 검증하자"는 의도는 좋았을 수도 있다. 하지만 운영 과정에서 그 단계가 정말 필요한지 재평가하는 과정이 없으면, 의도는 죽고 레거시만 남는다. 정기적으로 "이 로직이 정말 필요한가?"를 묻는 습관이 중요하다.
다음부턴 비슷한 규모 작업할 때 처음부터 성능 목표를 정의하고, 단계적으로 캐싱 전략을 세우는 식으로 접근할 생각이다.
🛒 이 글과 어울리는 추천 상품
*위 링크는 쿠팡파트너스 활동의 일환이며, 일정액의 수수료를 제공받을 수 있습니다.
댓글 0
첫 댓글 달아줘.