LLM을 활용한 이미지 검수 시스템 개발

LLM을 활용한 이미지 검수 시스템 개발

Tech

들어가며: 이미지 검수 시스템의 필요성

누적 가입자 1,400만명 그리고 MAU 350만 명이 활동하고 있는 숨고는 약 160만 고수들이 고객의 요청을 해결해 드리기 위해 활동하는 생태계입니다. 그리고 고객이 고수를 고용할 때 중요하게 보는 요소 중 하나는 고수의 프로필입니다.

프로필은 고객에게 신뢰를 줄 수 있는 첫인상이며, 상세히 적힌 프로필과 고용률은 정비례의 상관관계를 보여줍니다. 그리고 프로필을 구성하는 다양한 요소 중 고수의 첫인상을 결정하는 가장 중요한 요소는 각종 이미지와 고수들이 작업한 작업물 사진입니다. 그렇기에 숨고에는 매일 3,000 ~ 6,000건의 이미지가 업로드되고 있습니다.

하지만 종종 프로필에 적합하지 않은 이미지 등 어뷰징 사례가 빈번히 발생하고 있었고, 이를 수작업으로 처리해 왔지만 물리적인 한계가 있었습니다. 이 문제를 해결하기 위해, LLM 기반 자동 이미지 검수 시스템 구축의 필요성이 대두되었습니다.

본론: LLM 연동을 통한 이미지 자동 검수 시스템 구축

대체 이미지

당시 저희가 필요로 하는 비용과 성능, 안정성에 가장 부합하는 모델은 OpenAI의 o4-mini 모델이었습니다. 이 중 o4-mini 모델은 Prompt Caching 기능과 Batch API 기능 두 가지 핵심 기능을 제공해 주었기 때문에 이를 활용하면 비용을 50% 이상 절감하는 이점이 있었기에 o4-mini 모델을 선택하게 됐습니다.

Step 1 : 프롬프트 구성

처음에는 파인튜닝(Fine Tuning)을 고려했지만, 추가 비용이 발생하는 단점이 있었고 저희가 목표로 하는 이미지 검수는 특별한 도메인 지식이 필요한 영역이 아니었기에 제외했습니다. 대신 프롬프트 고도화에 집중하여, Anthropic Console의 Prompt Generator 기능을 활용한 LLM이 잘 인식할 수 있는 프롬프트 형태로 변환하였습니다. 샘플 데이터를 기반으로 프롬프트 정확도 테스트를 진행한 결과 85% 이상의 정확도를 확보할 수 있었습니다.

대체 이미지
출처 : Claude.ai

Step 2 : Batch API 적용

일반적으로 LLM 모델을 연동하게 되면 필요한 시점에 실시간으로 REST API를 호출하여 응답을 받도록 구성합니다. 다만, 이미지 검수는 실시간성이 필요하지 않았기에 Batch API 를 활용한 하루 단위 배치 검수 전략을 선택했습니다. OpenAI의 Batch API를 사용하면 여러 요청을 모아 한 번에 처리할 수 있고, 비용 또한 50% 이상 절감할 수 있는 이점이 있기 때문이었습니다. 이를 정리해 보면 아래와 같습니다.

  • 업로드된 이미지를 하루 단위로 모음
  • Batch API 요청으로 일괄 검수
  • 24시간 내 응답 확인

이 방식은 즉각 응답이 필요한 챗봇이나 실시간 서비스에는 적합하지 않지만, 이미지 검수에는 최적의 방식이었습니다. Batch API 를 통한 Batch Job 처리는 아래와 같은 흐름으로 진행되게 되었습니다.

대체 이미지

Step 3 : 이미지 전송 방식 정하기

이제 Batch API로 이미지를 전송해야 했습니다. 이미지를 API로 전송할 때는 img_url 방식과 tokenize(base64) 방식 중 선택이 필요했습니다.

  • img_url : 접근/보안/인프라 접근 비용 문제 존재
  • tokenize : base64 인코딩으로 약 33% 용량 증가하지만, img_url 노출되지 않아 악의적인 공격 회피 등 인프라 리소스 절약에 유리

저희는 33%의 용량 증가가 있더라도 url, 인프라 보안을 위해 tokenize 방식을 선택했습니다.

대체 이미지

Step 4: JSONL 포맷팅

Batch API로 요청을 보내기 위해선 요청을 JSONL 형태 포맷의 File로 만들어서 업로드해야 합니다. 하지만 서버에서 Disk에 파일을 저장하고 다시 사용하는 것은 보안 문제I/O 성능 및 안정성 문제가 있어 메모리 상에서 ByteStreamFile 데이터를 작성하고 해당 Stream을 File Upload API에 담아서 보내도록 했습니다.

대체 이미지

Step 5: 배치 생성

File을 업로드하고 나면 FileId가 주어지는데 이 FileId가 있어야 Create Batch API를 호출하여 Batch 작업을 생성할 수 있습니다.

대체 이미지
출처 : OpenAI

REST API 호출은 여러 방식으로 할 수 있습니다.

  • requests : 직접 URL 호출
  • OpenAI 공식 패키지 : OpenAI의 기능들을 사용하기에 편하게 구성되어 있음
  • LangChain : LLM 연동에 필요한 다양한 기능을 제공함

저희는 의존성을 최소화하기 위해 우선 requests 로 직접 URL을 호출하는 방식을 사용했습니다.

Step 6 : 배치 완료 처리

Batch API로 요청이 들어가게 되면 24H 안에 결과를 확인할 수 있지만 문제는 결과를 확인할 수 있는 정확한 시점은 측정할 수 없었기 때문에 주기적으로 아래와 같이 처리하도록 했습니다.

  1. 1시간마다 스케줄러가 결과 완료 여부 확인
  2. 결과가 완료되었다면, 결과다운로드 후 이미지 검수 결과 반영
  3. 결과가 아직 완료되지 않았다면 1시간 뒤 1번 부터 반복
대체 이미지

적용 결과

LLM을 적용한 결과 업무 생산성 측면에서 획기적인 변화를 이뤄낼 수 있었습니다. 이전에는 담당자들이 일 6,000여건의 이미지와 작업물을 수작업으로 작업했어야 했고 물리적으로 불가능한 작업량이었습니다. 그러나 현재는 자동화 시스템을 통해 모든 작업물을 자동화하여 전수 검사가 가능한 상황이 되었습니다.

이런 변화를 통해 담당자들은 단순 반복 업무에서 벗어나 더욱 임팩트 있는 업무인 유저 경험 (Candidate eXperience) 개선에 집중할 수 있는 환경을 마련할 수 있는 상황이 되었습니다.

향후 방향성

숨고에서 처음으로 시도하는 LLM 연동 작업이었기에 실험적인 부분들이 많았습니다. 그래서 의존성을 최대한 줄이기 위해 OpenAI 패키지LangChain을 적용하지 않았습니다. 그렇기 때문에 추후 다음과 같이 여러 방면으로 고도화를 시킬 수 있을 것으로 기대하고 있습니다.

  • LangChain 도입: 프레임워크화 및 유지보수 편의성 강화
  • Agent & MCP 기능 적용: 자율성과 유연성 향상
  • 최신 고성능 모델 적용 : GPT-5, Google Genie3, Nano-Banana 등 최신 모델 활용 검토

LLM이 워낙 빠른 속도로 발전 되면서 이미 작년 12월 이후 현재 2025년 9월에는 LLM 업계에 과거와 비교할 수 없을 정도의 변화가 이뤄졌습니다. 이제는 AI Agent를 활용한 바이브코딩이 보편화 되어 있고 Google의 Genie3는 3D 월드를 실시간 생성하고 Nano-Banana 모델이 이미지 분야에서 또 한번의 지각변동을 일으켰습니다. OpenAI에서는 GPT5를 발표하여 기존 모델에서 한단계 지능을 끌어 올렸습니다.

AI 기술이 급속도로 발전하고 있는 현 상황에서 숨고 팀은 다양한 영역에서 AI를 활용한 기능들을 도입하고 있습니다. 대 AI시대에 숨고를 통해 고객들과 고수들이 더 나은 삶을 영위할 수 있도록 함께 나아가도록 하겠습니다.

  • #ai
  • #batch api
  • #llm
  • #o4-mini
  • #openai
Aiden Choi
Aiden ChoiBackend Engineer

모두의 더 나은 삶을 위해
함께 변화를 만들어갈 동료를 기다립니다

채용중인 공고 보기