TL;DR
네트워크 호출 없이 모바일 기기 내부에서 작동하는 이미지 이해 기능을 개발했습니다. 그 과정에서 거대 모델(teacher)의 정교한 표현력을 작은 모델(student)에게 전수하여 성능은 유지하면서 크기와 연산량을 획기적으로 줄이는 '지식 증류(knowledge distillation)' 기법을 핵심 전략으로 활용했습니다.
구체적으로는 이미지-텍스트 임베딩 모델을 활용해 영어 전용 텍스트 인코더를 지식 증류를 활용해 다국어(영어/일본어/중국어(번체)/태국어/한국어)로 확장했고, 의미 기반 이미지 검색을 테스트해 보았습니다.
- 핵심 성과: 다국어를 지원하는 이미지 검색 기능 구현(지식 증류 기법을 활용해 5개 언어 Recall@5 평균 78% 달성)
들어가며: 왜 ‘메신저용’이고 왜 ‘온디바이스’인가
메신저 시나리오에서 이미지 이해가 필요한 이유
메신저에는 텍스트만큼이나 사진과 이미지가 많이 오갑니다. 텍스트 메시지는 검색이나 요약, 알림 미리보기 기능을 구현하기가 비교적 쉽지만, 이미지 메시지는 ‘사진’이라는 한 가지 타입으로만 취급되는 경우가 많기 때문에 그렇지 않습니다. 이 간극이 사용자 경험(UX) 저하로 이어졌습니다. 예를 들어 알림 화면에서 "사진 1개를 보냈습니다" 대신 "강아지 사진을 보냈습니다"처럼 내용을 한 번 더 해석해 주는 문장이 나온다면 사용자는 앱을 열기 전에도 맥락을 더 잘 파악할 수 있을 것입니다.
검색도 비슷합니다. 키워드 기반 검색은 텍스트에는 강하지만 이미지에는 적용하기 어렵습니다. 반면 이미지와 텍스트를 같은 임베딩 공간(embedding space)에 놓으면 '강아지 / 멍멍이 / 개'처럼 표현이 달라도 같은 의미를 찾아낼 수 있고 '박스 안의 고양이'처럼 복잡한 의미도 표현할 수 있으며, 언어가 달라도 같은 결과로 이어질 수 있습니다.
결과적으로 이미지 이해는 알림·검색·추천 같은 메신저의 여러 접점에서 기본 기능을 한 단계 끌어올리는 기반이 될 수 있습니다. 이에 여러 메신저 기능 개선에 도움이 되었으면 하는 바람으로 메신저용 온디바이스 이미지 모델을 만들었습니다.
예제 사용자 시나리오
- 알림 개선: "사진 1개를 보냈습니다" → "강아지 사진을 보냈습니다"
- 검색 확대: "강아지", "멍멍이", "개" 혹은 "박스 안에 고양이"와 같은 자연어로 의미 기반 검색 제공
- 추천 개선: 이미지 자동 분류 및 추천
서버가 아닌 온디바이스에서 풀어야 했던 이유
이미지 이해는 서버에서 처리하는 것이 가장 흔한 형태지만, 메신저 환경에서는 '온디바이스'가 사실상 전제 조건에 가까웠습니다. 그 이유는 다음과 같습니다.
- 지연(latency): 모바일 환경은 체감 지연에 매우 민감합니다. 네트워크 왕복 시간(round trip time, RTT)에 따라 결과가 흔들리면 사용자 경험이 쉽게 나빠집니다. 특히 알림과 검색 같은 예제 시나리오에서 매우 중요한 요소입니다.
- 프라이버시: 개인 사진 또는 그로부터 생성된 임베딩이나 캡션이 서버로 전송되는 순간 프라이버시와 관련 해 기능의 민감도가 크게 올라갑니다.
- 오프라인 혹은 불안정한 네트워크 환경: 지하철이나 비행기 안 또는 로밍한 상황 등에서도 잘 작동해야 했습니다.
- 모델 크기 및 호환성: Android/iOS 모두에서 제한된 메모리와 연산 자원으로 안정적으로 작동해야 했고, 다운로드 부담도 고려해야 했습니다.
‘메신저용 온디바이스 이미지 모델 학습기’ 시리즈에서 다룰 내용
두 편으로 구성한 이 시리즈에서는 약 6개월간 진행한 온디바이스 PoC(proof of concept) 프로젝트 중 두 가지 핵심 기술을 중점적으로 다룰 예정입니다.
- 이미지 벡터 검색: 텍스트 이미지 간 임베딩 기반 의미 검색 및 로컬 벡터 DB 인덱싱 도입(비디오 벡터 검색은 이미지 벡터 검색의 확장 사례로 간략히 언급)
- 이미지 캡션 생성(captioning): 짧은 캡션을 초저지연으로 생성하는 비자기회귀(non-autoregressive, non-AR) 전략 도입
한 편에 모두 담기에는 분량이 다소 많아 두 편으로 나눴습니다.
1편에서는 메신저 환경에서 온디바이스로 이미지 이해를 구현해야 했던 배경과 제약을 정리한 뒤, 지식 증류로 텍스트 인코더를 다국어로 확장해 온디바이스 이미지 검색을 가능하게 만든 과정을 다룹니다.
2편에서는 이미지 캡션 생성 시 가장 큰 병목이었던 자기회귀(AR) 디코딩 지연을 비자기회귀 전략으로 바꿔 200~400ms급 초저지연을 달성한 다단계 지식 증류 학습 방법을 소개하겠습니다.
문제 정의 및 목표 지표 설정
목표 1: 텍스트와 이미지 간 의미 유사도에 기반한 다국어 지원 이미지 검색 기능 구현
검색은 '이 미지와 텍스트를 같은 임베딩 공간으로 사상한 뒤 코사인 유사도(cosine similarity)로 가까운 것을 찾는다'라는 아이디어로 정리됩니다. 이때 영어뿐 아니라 '강아지 / 犬 / ลูกสุนัข'처럼 다국어 쿼리가 같은 이미지를 가리키게 만드는 것이 핵심입니다.
목표 1의 요구 사항을 정리하면 다음과 같습니다.
- 의미 기반 검색: 키워드 매칭이 아닌 의미적 유사성(semantic similarity)
- 다국어(영어, 일본어, 중국어(번체), 태국어, 한국어) 지원
목표 2: 빠른 속도로, 짧게 잘 정리된 자연스러운 캡션 생성
LINE 앱과 같은 메신저 환경에서 중요한 건 장문의 상세한 설명이 아니라, 짧고 일반적인 표현으로 '무슨 사진인지'를 전달하는 것입니다. 이를 위해 길이는 대략 8 단어 정도로 제한했습니다. 이때 문장은 문법 오류가 없으면서 불필요하게 반복되는 단어나 오타도 없어야 했습니다. 예를 들어 "a desk with a computer on a desk"처럼 ‘a’가 불필요하게 반복되는 문장은 사용자가 즉시 이상하다고 느낄 수 있습니다. 따라서 "a desk with a computer"처럼 짧게 정리된 문장을 빠르게 생성하는 것이 목표였습니다.
목표 2의 요구 사항을 정리하면 다음과 같습니다.
- 모바일 UX를 만족할 빠른 속도
- 짧고(8 단어 이하), 문법 오류/불필요한 반복/오타 등이 없는 자연스러운 문장 생성
목표 2를 어떻게 달성했는지는 2편에서 말씀드릴 예정입니다.
공통 목표: 온디바이스 배포
두 기능 모두 실서비스에 배포 가능한 수준이 목표였기 때문에 모델 크기·속도·호환성을 동시에 만족해야 했습니다. 모델 크기는 앱 다운로드 부담을 고려해 200 MB 이하를 목표로 설정했고, 콜드 스타트(cold start)를 포함해 수백 ms 이내의 응답을 지향했습니다. 런타임은 Android/iOS 모두를 지원하는 LiteRT를 기준으로 설계했습니다.
공통 목표 요구 사항
- 모델 크기를 줄여 앱 다운로드 부담 최소화(목표 <200MB)
- 콜드 스타트 포함 수백 ms 이내의 속도
- 호환성: Android/iOS 지원
평가 지표
검색은 전통적으로 쓰이는 Recall@K를 사용했습니다. 이미지에서 텍스트(Image-to-Text) 방향과 텍스트에서 이미지(Text-to-Image) 방향 모두를 측정했고, 주로 Recall@5를 사용했습니다.
캡션 품질은 CIDEr, CLIPScore 같은 지표를 참고하되, 모바일 UX에서 더 중요한 '실제 서비스 사용 가능 여부'를 포착하기 위해 LLM 기반 수락 비율(accept ratio)을 지표로 추가했습니다. 반복·오타·문법 오류 등으로 '실제 서비스서 사용하기 어렵다'라고 판단되는 케이스를 직접 잡기 위한 선택이었습니다.
- 검색 지표
- Image-to-Text Recall@5
- Text-to-Image Recall@5
- 캡션 지표
- CIDEr(전통적 캡션 평가 지표)
- CLIPScore(의미적 유사도)
- 수락 비율(실사용 품질, GPT-4o mini 기반)
다국어를 지원하기 위한 지식 증류: 온디바이스 이미지 검색
