Accepted as revised direction

ADR-0003: Text Encoder and Natural Language Search

작성일: 2026-05-14 · 범위: 텍스트 인코더 포함, 자연어 검색, VLM 대비 설계 논리

Decision

프로젝트를 단순 이미지 분류기가 아니라 온디바이스 랜드마크 인식 + 자연어 검색 어시스턴트로 확장한다. 단, Gemma/Qwen류 생성형 VLM을 핵심 모델로 쓰지 않고, dual-engine retrieval architecture를 채택한다.

  1. 사진 입력은 fine-tuned vision model이 담당한다. 현재 후보는 MobileCLIP2-B/S4, MobileNetV4 Hybrid를 우선 유지한다.
  2. 텍스트 입력은 별도 text encoder가 담당한다. Sprint 1 데모는 경량 multilingual text embedding 모델 또는 MobileCLIP2 text encoder를 노트북/서버 runtime에서 먼저 검증한다.
  3. 최종 결과는 image score, text score, metadata keyword score를 landmark_id 단위로 fusion해 Top-3와 reject 판단을 반환한다.
  4. 저장된 text embedding은 기본 index로 포함하되, text encoder를 함께 제공해 metadata 변경 또는 자유 질의 입력 시 재계산 가능하게 한다.

Why Change

이미지 랜드마크 인식만으로도 Sprint 1 핵심 동작은 충족하지만, 프로젝트가 단순 closed-set classifier로 보일 위험이 있다. 사용자가 "성의 외곽같은 돌담이 있는 공원"처럼 랜드마크 이름을 모르는 자연어 설명을 입력했을 때 낙산공원을 찾아내려면, 이미지 classifier와 별개로 자연어 의미 검색 계층이 필요하다.

이 변경의 목적은 모델을 무겁게 만드는 것이 아니라, 고정된 landmark recognition 문제에 맞는 통제 가능한 멀티모달 검색을 추가하는 것이다.

Architecture

User image ──> Image Recognizer ──> image_score[landmark_id]
                         │
User text  ──> Text Encoder   ──> text_score[landmark_id]
                         │
Metadata   ──> Keyword/BM25   ──> keyword_score[landmark_id]
                         │
                         ▼
                Fusion + Reject Gate
                         │
                         ▼
       Top-3 landmarks, confidence percent, debug log
모듈 역할 Sprint 1 권장 Sprint 2 권장
Image Recognizer 사진에서 landmark Top-3와 low-confidence reject 판단. MobileCLIP2-B 또는 MobileNetV4 Hybrid 중 검증 승자. strict split, blind test, quantization 이후 최종 모델 확정.
Text Encoder 자연어 질의를 embedding으로 변환. 노트북 local demo에서 multilingual-e5-small 또는 MobileCLIP2-S2 text encoder 검증. MobileCLIP2-S3 multi-task export 기준으로 text encoder ONNX와 tokenizer metadata를 앱 asset에 포함한다.
Text Index landmark 설명, 별칭, 키워드, text embedding 저장. landmark_info.json + precomputed embeddings. metadata 업데이트 시 on-device 또는 build-time 재색인.
Fusion image/text/keyword 점수를 결합해 Top-3 산출. 규칙 기반 weighted sum. validation 기반 weight calibration.

Text Encoder Choice

후보 장점 위험 결정
MobileCLIP2 text encoder image-text shared embedding 구조. 사진과 텍스트를 같은 계열로 설명하기 좋다. 한국어 자유 질의 품질은 검증 필요. text tower도 수십~100M급이라 공짜가 아니다. image-text alignment 실험과 영어/짧은 prompt baseline에 사용.
multilingual-e5-small 또는 유사 sentence embedding 한국어/영어 자연어 설명 검색에 더 직접적이다. landmark metadata 검색에 적합하다. 이미지 embedding과 같은 공간이 아니므로 fusion은 landmark_id 점수 단위로 해야 한다. 자연어 검색의 1순위 후보.
Keyword/BM25 가볍고 즉시 구현 가능. "성곽", "돌담", "공원" 같은 명시 특징에 강하다. 동의어/우회 표현에 약하다. Sprint 1 fallback baseline으로 반드시 포함.
Gemma/Qwen류 VLM 범용 설명, 추론, 질의응답에 강하다. GB급 모델 크기, 생성형 hallucination, latency, battery, confidence 제어 문제가 크다. 핵심 인식/검색 모델이 아니라 Sprint 2+ 설명 생성 또는 query rewrite 후보.

Why Not Just Gemma or Qwen

Gemma/Qwen류 VLM은 범용 멀티모달 추론에는 강하지만, 본 프로젝트의 핵심 출력은 생성문이 아니라 landmark_id, Top-k, confidence, reject다. 이 문제는 생성형 답변보다 embedding retrieval과 threshold calibration이 더 잘 맞는다.

Stored Embeddings Are Not a Problem

후보 landmark가 고정되어 있으므로 text embedding index가 고정되는 것은 정상이다. 오히려 offline mode, 빠른 검색, 재현 가능한 평가에 유리하다. 다만 text encoder를 함께 제공하면 landmark 설명이나 키워드가 바뀔 때 embedding을 다시 생성할 수 있다.

landmark_text_index.json
{
  "encoder": "multilingual-e5-small",
  "version": "sprint1-v1",
  "items": [
    {
      "landmark_id": "naksan_park",
      "texts": [
        "낙산공원은 한양도성 성곽길과 돌담이 이어지는 공원이다.",
        "a park with Seoul city wall, stone walls, and walking paths"
      ],
      "embedding": [ ... ]
    }
  ]
}

Self-Questions

질문
텍스트 인코더가 이미지 정확도를 대체해야 하는가? 아니다. 사진 인식과 자연어 검색은 서로 다른 task다. image recognizer를 유지하고 text search를 추가한다.
텍스트 임베딩을 저장하면 비교 대상이 고정되어 문제가 되는가? 현재 범위에서는 문제가 아니다. 고정 landmark 후보가 제품 정의이며, text encoder를 포함하면 재색인도 가능하다.
MobileCLIP2 text encoder 하나로 한국어 자연어 검색까지 충분한가? 검증 전에는 모른다. 그래서 multilingual sentence encoder와 BM25를 함께 비교한다.
이 변경이 Sprint 1을 위험하게 만드는가? 사진 인식 주경로를 건드리지 않으면 위험은 관리 가능하다. 자연어 검색은 side demo와 metadata 검색부터 시작한다.

References