숫자가 근거를 대신할 수 없습니다
이번 주 개발자 커뮤니티에서 눈에 띄는 글 세 편이 올라왔습니다. 벡터 임베딩 차원 선택 가이드, 합성 데이터로 학습한 지뢰 탐지 CNN, 그리고 Tesla V100 위에서 BAGEL-7B-MoT를 NF4 양자화로 돌린 경험기입니다. 셋 모두 '이렇게 하면 된다'는 톤으로 끝나지만, 데이터 분석가의 시선으로 보면 정확히 같은 패턴이 반복됩니다 — 핵심 지표의 정량적 근거가 빠져 있다는 것입니다.
1. 256d vs 3072d — 'More is better'의 함정
Dev.to에 게시된 임베딩 차원 선택 가이드(출처: dev.to/sreeni5018)는 256d부터 3072d까지의 스펙트럼을 '학교 교육과정' 비유로 풀어냅니다. 직관적이지만 한 가지 치명적인 결여가 있습니다: 실제 검색 품질 지표(Recall@k, MRR, nDCG)에 대한 비교 실험이 전혀 없습니다.
차원 수를 높이면 코사인 유사도의 분별력이 올라가는 건 사실입니다. 하지만 실무에서 진짜 물어봐야 할 질문은 다릅니다. '768d에서 3072d로 올렸을 때 Recall@10이 몇 포인트 오르고, 인덱싱 latency와 벡터 스토리지 비용은 얼마나 증가하는가?' 이 trade-off 없이 '3072d = Maximum depth'라고 선언하는 것은 하이퍼파라미터 튜닝 없이 가장 큰 모델을 돌리는 것과 본질적으로 같습니다.
MTEB(Massive Text Embedding Benchmark) 리더보드를 보면, OpenAI의 text-embedding-3-large(3072d)와 오픈소스 BGE-large(1024d) 사이의 평균 점수 차이는 태스크에 따라 1~3포인트 수준인 경우가 많습니다. 반면 벡터당 메모리 비용은 3배 차이가 납니다. '내 데이터셋'에서의 ablation study 없이 차원을 고르는 건, 베이스라인 없이 모델을 배포하는 것과 같습니다.
2. 합성 데이터 70% — 이걸 '성공'이라 부를 수 있나요?
레바논 출신 16세 개발자가 Blender로 생성한 합성 이미지만으로 fast.ai CNN을 학습시켜 실제 지뢰 사진을 70% 이상의 confidence로 분류했다는 글(출처: dev.to/lucirie)은 감동적입니다. 하지만 데이터 분석가로서 던져야 할 질문이 산적합니다.
첫째, 테스트 세트 크기가 사실상 1장입니다. 어머니가 찍은 실제 지뢰 사진 한 장에서 70% confidence를 얻었다는 건 n=1 평가입니다. 통계적 유의성은커녕 Precision, Recall, F1-score를 논할 수 있는 샘플 사이즈가 아닙니다. 둘째, 학습-검증 분할이 RandomSplitter(valid_pct=0.1)로 설정되어 있는데, 합성 데이터 자체가 동일한 3D 모델에서 카메라 앵글만 바꿔 생성되었으므로 validation set과 training set 사이의 분포 누수(data leakage) 가능성이 높습니다.
셋째, 가장 근본적인 문제는 domain gap입니다. Blender 렌더링과 실제 전장 토양 위 지뢰 사이의 텍스처, 조도, 잔해물 분포 차이를 모델이 학습한 게 아니라 우연히 넘어간 것일 수 있습니다. 합성 데이터 기반 연구에서 표준적으로 사용되는 domain randomization이나 sim-to-real transfer 기법, 그리고 최소한 수십 장의 실제 이미지에 대한 정량적 평가가 없다면, 이건 proof-of-concept의 proof조차 되기 어렵습니다.
동일 글에서 언급된 PyTorch 기반 tabular 모델이 '80% 정확도'를 달성했다는 부분도 마찬가지입니다. 학습 데이터와 평가 데이터가 분리되지 않고 t_indep 전체에 대해 accuracy를 계산하고 있습니다. 이건 training accuracy이지 test accuracy가 아닙니다. 5-fold cross-validation이든 holdout set이든, 일반화 성능을 측정하는 최소한의 절차가 빠져 있습니다.
3. NF4 양자화 후 '거의 동일' — 50장으로 충분한가요?
ByteDance의 BAGEL-7B-MoT를 Tesla V100에서 NF4 양자화로 구동한 경험기(출처: dev.to/scottcjn)는 기술적으로 가장 내실 있는 글입니다. bfloat16 미지원, Flash Attention 미지원, torch.compile 비호환이라는 세 가지 제약을 하나씩 풀어가는 과정은 실무적 가치가 높습니다.
하지만 핵심 주장인 'float16과 NF4의 출력이 거의 동일하다(nearly identical)'는 평가가 50장 이미지 비교에 근거합니다. 여기서 물어봐야 합니다 — 50장의 샘플 사이즈로 '거의 동일'이라는 결론을 내릴 수 있나요? 이미지 캡셔닝 품질 비교에 표준적으로 쓰이는 CIDEr, BLEU, CLIPScore 같은 정량 지표가 하나도 언급되지 않습니다. 'fine-grained spatial reasoning에서 약간의 열화'가 있다고 했는데, 그 '약간'이 정확히 어느 정도인지 숫자로 제시되지 않습니다.
또한 LLaVA 대비 '환각이 줄었다'는 주장도 정성적 관찰에 머물러 있습니다. 환각률(hallucination rate) 측정에는 CHAIR(Caption Hallucination Assessment with Image Relevance) 같은 프로토콜이 있습니다. 8~15초에서 '200ms 추가' 수준으로 개선되었다는 latency 비교는 좋지만, throughput(초당 처리 이미지 수), 첫 토큰 생성까지의 시간(TTFT), 메모리 피크 사용량의 시계열 모니터링 같은 운영 지표가 있어야 프로덕션 환경에서의 안정성을 논할 수 있습니다.
세 글이 공유하는 한 가지 패턴
세 소스의 공통점은 명확합니다. 기술적 접근 자체는 타당하지만, 주장의 크기에 비해 근거의 양이 부족합니다. 차원 선택은 벤치마크 없이 비유로, 합성 데이터 모델은 n=1 평가로, 양자화 품질은 50장의 정성적 비교로 결론을 내립니다. 이건 이 세 저자만의 문제가 아니라 개발자 커뮤니티 전반에 만연한 패턴입니다.
실무에서 모델을 돌릴 때 제가 항상 적용하는 체크리스트가 있습니다:
- 베이스라인이 있는가? — 비교 대상 없는 '좋다'는 의미가 없습니다
- 테스트 셋이 학습 분포와 분리되어 있는가? — training accuracy ≠ generalization
- 샘플 사이즈가 통계적 결론을 지지하는가? — n=50이면 효과 크기(effect size)에 따라 검정력(power)이 부족할 수 있습니다
- 재현 가능한가? — 코드와 데이터가 공개되어 있어야 검증이 가능합니다
전망: 숫자의 이면을 읽는 리터러시가 경쟁력입니다
임베딩 차원을 고를 때는 MTEB에서 내 도메인과 가장 유사한 태스크의 벤치마크를 먼저 확인하세요. 합성 데이터를 쓸 때는 sim-to-real gap을 정량적으로 측정하는 실험 설계를 먼저 잡으세요. 양자화를 적용할 때는 최소한 수백 장 규모의 비교 평가와 자동 지표를 돌리세요.
세 글 모두 '접근성이 좋아졌다'는 메시지를 전합니다. 맞습니다. fast.ai 17줄, bitsandbytes 한 줄이면 모델이 돌아갑니다. 그러나 모델을 돌리는 것과 모델을 신뢰할 수 있는 것 사이에는 실험 설계라는 다리가 있습니다. 그 다리 없이 프로덕션에 올리면, correlation을 causation으로 착각하는 시스템이 사용자 앞에 서게 됩니다. 근거는 있나요? — 이 질문을 코드 리뷰만큼 자주 던지는 팀이 결국 살아남습니다.