요약
| 구분 |
변경 전 (Vision-only) |
변경 후 (OCR + AI) |
성과 |
| 정확도 |
약 0.70 (불안정) |
0.91 이상 |
대폭 개선 (Stable) |
| 재시도 횟수 |
평균 2.5 ~ 3회 |
0회 수렴 |
중복 호출 제거 |
| Gemini 토큰 |
건당 과다 소모 |
358 tokens/건 |
호출량 67% 감소 |
| 외부 비용 |
비용 누적 리스크 |
약 25% 절감 |
비용 효율화 |
1. 배경: 사진 한 장으로 문제 등록하기
수학 문제 사진을 올리면 AI가 단원과 유형을 자동으로 분석해 주는 기능을 개발했다. 사용자가 일일이 입력하는 번거로움을 없애고, 최소한의 수정만으로 등록을 마치는 것이 목표였다.
- 요구사항: 단순 텍스트뿐만 아니라 수식, 그래프, 도형이 포함된 문제도 정확하게 분류해야 함.
2. 문제: Vision-only의 한계와 비용 리스크
초기에는 이미지만 AI(Vision model)에 던지는 방식을 썼는데, 두 가지 심각한 문제가 터졌다.
1) 정확도와 포맷 불안정 (Vision-only)
- 현상: 이미지만으로는 수식이나 보기(ㄱ,ㄴ,ㄷ) 같은 디테일한 텍스트 정보가 뭉개졌다.
- 결과: 분류 정확도가 0.70 수준에 머물렀고, AI가 뱉는 JSON 포맷이 깨지는 경우가 빈번했다.
2) 동기 처리의 비용 누적
- 비용 폭주: AI가 틀리면 재시도(Retry)를 하게 했는데, 성공률이 낮다 보니 불필요한 재호출만 반복되어 API 비용이 급증했다.
- UX 저하: 외부 API(OCR/AI)의 응답 지연이나 429(Rate Limit) 에러가 사용자에게 그대로 노출되어 타임아웃이 발생했다.
3. 아키텍처 개선: 비동기 처리와 락(Lock)
사용자 대기 시간을 없애고 시스템 안정성을 높이기 위해 비동기 워커 패턴을 도입했다.
1) Fire & Forget (빠른 응답)
- 변경: 업로드 API는
Scan(작업카드) 생성과 원본 이미지 저장만 하고 즉시 응답(200 OK)을 준다.
- 효과: 무거운 OCR/AI 작업은 백그라운드 워커가 전담하여 사용자 경험(UX)을 쾌적하게 만들었다.