Accepted as revised direction
ADR-0003: Text Encoder and Natural Language Search
작성일: 2026-05-14 · 범위: 텍스트 인코더 포함, 자연어 검색, VLM 대비 설계 논리
Decision
프로젝트를 단순 이미지 분류기가 아니라 온디바이스 랜드마크 인식 + 자연어 검색 어시스턴트로 확장한다. 단, Gemma/Qwen류 생성형 VLM을 핵심 모델로 쓰지 않고, dual-engine retrieval architecture를 채택한다.
- 사진 입력은 fine-tuned vision model이 담당한다. 현재 후보는 MobileCLIP2-B/S4, MobileNetV4 Hybrid를 우선 유지한다.
- 텍스트 입력은 별도 text encoder가 담당한다. Sprint 1 데모는 경량 multilingual text embedding 모델 또는 MobileCLIP2 text encoder를 노트북/서버 runtime에서 먼저 검증한다.
- 최종 결과는 image score, text score, metadata keyword score를 landmark_id 단위로 fusion해 Top-3와 reject 판단을 반환한다.
- 저장된 text embedding은 기본 index로 포함하되, text encoder를 함께 제공해 metadata 변경 또는 자유 질의 입력 시 재계산 가능하게 한다.
Why Change
이미지 랜드마크 인식만으로도 Sprint 1 핵심 동작은 충족하지만, 프로젝트가 단순 closed-set classifier로 보일 위험이 있다. 사용자가 "성의 외곽같은 돌담이 있는 공원"처럼 랜드마크 이름을 모르는 자연어 설명을 입력했을 때 낙산공원을 찾아내려면, 이미지 classifier와 별개로 자연어 의미 검색 계층이 필요하다.
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이 더 잘 맞는다.
- 고정된 10~15개 후보 집합에서는 거대 VLM보다 task-specific recognizer가 더 통제 가능하다.
- reject threshold, Top-1/Top-3, confusion matrix, calibration 같은 평가가 명확하다.
- GB급 VLM은 다음주 Sprint 1 데모의 휴대폰/노트북 온디바이스 리스크가 크다.
- VLM은 향후 설명 생성, query rewrite, 여행 가이드 QA 모듈로 확장하는 편이 자연스럽다.
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 검색부터 시작한다. |