임베딩 모델 심화 — 2026년판 (Embedding Models — The 2026 Deep Dive)
Word2Vec는 단어마다 벡터(vector) 하나를 내어 주었습니다. 현대 임베딩 모델(modern embedding model)은 단락(passage)마다 벡터를 만들어 주고, 교차 언어(cross-lingual)에 대응하며, 희소(sparse), 밀집(dense), 다중 벡터(multi-vector) 관점을 함께 제공하고, 인덱스(index)에 맞춰 크기를 조절할 수 있게 해줍니다. 잘못 고르면 RAG가 엉뚱한 단락을 검색(retrieve)해 옵니다.
유형: Learn
언어: Python
선수 강의: Phase 5 · 03 (Word2Vec), Phase 5 · 14 (Information Retrieval)
예상 시간: 약 60분
학습 목표
밀집(dense), 희소(sparse), 다중 벡터(multi-vector) 임베딩의 차이를 설명합니다.
마트료시카 표현 학습(Matryoshka Representation Learning)과 차원 절단(dimension truncation)의 의미를 이해합니다.
MTEB 리더보드(leaderboard)를 자신의 도메인 평가(domain evaluation)와 함께 해석합니다.
임베딩 모델을 고를 때 언어 범위, 컨텍스트 길이, 저장 비용, 지연 시간을 함께 고려합니다.
문제
여러분의 RAG 시스템(system)은 40% 확률로 잘못된 단락을 검색해 옵니다. 범인은 대부분 벡터 데이터베이스(vector database)나 프롬프트(prompt)가 아닙니다. 임베딩 모델(embedding model)입니다.
2026년에 임베딩을 고른다는 것은 다음 다섯 축을 가로질러 선택한다는 뜻입니다.
밀집(dense) vs 희소(sparse) vs 다중 벡터(multi-vector). 단락당 벡터 하나, 토큰(token)당 벡터 하나, 또는 가중치가 부여된 희소 단어 가방(sparse weighted bag of words) 중에서 고릅니다.
언어 범위(language coverage). 영어만 다루는 작업에서는 영어 전용(monolingual English) 모델이 여전히 우세합니다. 코퍼스(corpus)가 여러 언어로 섞여 있다면 다국어(multilingual) 모델이 이깁니다.
컨텍스트 길이(context length). 512 토큰, 8,192 토큰, 32,768 토큰 등이 있습니다. 실제 유효 용량(effective capacity)은 공식적으로 광고되는 최대값의 60~70% 수준인 경우가 많습니다.
차원 예산(dimension budget). 3,072개의 부동소수점(float)을 풀 정밀도(full precision)로 두면 벡터당 12 KB가 됩니다. 1억 개 벡터라면 저장 비용이 월 $1,300에 달합니다. 마트료시카 절단(Matryoshka truncation)은 이를 4배로 줄여 줍니다.
공개(open) vs 호스팅(hosted). 오픈 웨이트(open-weight)는 스택과 데이터를 직접 통제할 수 있습니다. 호스팅 방식은 통제권을 내주는 대신 항상 최신 모델(always-latest)을 받을 수 있습니다.
이 강의는 지난 분기에 인기 있었다는 이유로 모델을 고르지 않고, 근거(evidence)에 따라 선택할 수 있도록 트레이드오프(tradeoff)에 이름을 붙입니다.
사전 테스트
2문제 · 이 강의를 시작하기 전에 얼마나 알고 있는지 확인해보세요
1.밀집(dense), 희소(sparse), 다중 벡터(multi-vector) 임베딩의 핵심 차이는 무엇인가요?
2.마트료시카 표현 학습(Matryoshka Representation Learning)이 임베딩 벡터로 할 수 있게 해주는 것은 무엇인가요?
0/2 답변 완료
개념
밀집 임베딩(Dense embeddings). 단락마다 벡터 하나입니다. 보통 384~3,072 차원입니다. 코사인 유사도(cosine similarity)가 의미적 근접성(semantic proximity)을 기준으로 단락을 순위 매깁니다. OpenAI text-embedding-3-large, BGE-M3 dense mode, Voyage-3 등이 대표 예시입니다. 기본 선택지입니다.
희소 임베딩(Sparse embeddings). SPLADE 계열입니다. 트랜스포머(transformer)가 어휘(vocab)의 모든 토큰에 대해 가중치를 예측한 뒤 대부분을 0으로 만듭니다. 그 결과는 크기가 어휘 크기(|vocab|)인 희소 벡터입니다. BM25처럼 어휘 매칭(lexical matching)을 포착하면서도 학습된 항 가중치(learned term weight)를 사용합니다. 키워드 위주의 질의(keyword-heavy query)에 강합니다.
다중 벡터(Multi-vector, late interaction). ColBERTv2, Jina-ColBERT가 여기에 속합니다. 토큰마다 벡터 하나를 둡니다. 점수 계산은 MaxSim으로 합니다. 즉, 질의 토큰마다 가장 유사한 문서 토큰을 찾아 점수를 합산합니다. 저장 비용과 점수 계산 비용이 더 크지만, 긴 질의(long query)와 도메인 특화 코퍼스(domain-specific corpora)에서 더 좋은 성능을 냅니다.
BGE-M3: 세 가지를 한 번에. 하나의 모델이 밀집, 희소, 다중 벡터 표현을 동시에 출력합니다. 각 표현은 독립적으로 질의할 수 있고, 점수는 가중합(weighted sum)으로 결합(fuse)합니다. 하나의 체크포인트(checkpoint)에서 유연성이 필요할 때 선택하는 2026년의 기본값입니다.
마트료시카 표현 학습(Matryoshka Representation Learning). 벡터의 첫 N개 차원이 그 자체로 유용한 임베딩이 되도록 학습합니다. 1,536차원 벡터를 256차원으로 절단(truncate)하면 약 1% 정확도를 내주고 6배의 저장 절감(storage savings)을 얻습니다. OpenAI text-3, Cohere v4, Voyage-4, Jina v5, Gemini Embedding 2, Nomic v1.5 이상이 이를 지원합니다.
MTEB 리더보드는 부분만 말해줍니다
대규모 텍스트 임베딩 벤치마크(Massive Text Embedding Benchmark; MTEB)는 출시 시점인 2022년에 8개 작업 유형에 걸친 56개 과제로 시작했고, MTEB v2에서는 100개 이상의 과제로 확장되었습니다. 2026년 초 기준으로 Gemini Embedding 2가 검색(retrieval) 부문에서 1위(67.71 MTEB-R)입니다. Cohere embed-v4는 일반(general) 부문(65.2 MTEB)에서 앞서고, BGE-M3는 오픈 웨이트 다국어 부문(63.0)에서 선두입니다. 리더보드는 필요조건이지만 충분조건은 아닙니다. 항상 자신의 도메인에서 벤치마크해야 합니다.
3단계 패턴(three-tier pattern)
사용 사례
패턴
빠른 1차 검색(fast first-pass)
밀집 바이 인코더(dense bi-encoder, BGE-M3, text-3-small)
재현율 보강(recall boost)
희소(SPLADE, BGE-M3 sparse) + RRF 융합(fuse)
상위 50개의 정확도(precision on top-50)
다중 벡터(ColBERTv2) 또는 교차 인코더 재정렬(cross-encoder reranker)
대부분의 프로덕션 스택(production stack)은 세 방식을 모두 사용합니다.
직접 만들기
Step 1: 기준선 — Sentence-BERT 기반 밀집 임베딩
from sentence_transformers import SentenceTransformer
import numpy as np
encoder = SentenceTransformer("BAAI/bge-small-en-v1.5")
corpus = [
"The first iPhone launched in 2007.",
"Apple released the iPod in 2001.",
"Android is an operating system from Google.",
]
emb = encoder.encode(corpus, normalize_embeddings=True)
query = "When was the iPhone released?"
q_emb = encoder.encode([query], normalize_embeddings=True)[0]
scores = emb @ q_emb
print(sorted(enumerate(scores), key=lambda x: -x[1]))
normalize_embeddings=True를 켜면 내적(dot product)이 코사인 유사도와 같아집니다. 항상 설정하는 것을 권장합니다.
Step 2: 마트료시카 절단(Matryoshka truncation)
deftruncate(vectors, dim):
out = vectors[:, :dim]
return out / np.linalg.norm(out, axis=1, keepdims=True)
emb_256 = truncate(emb, 256)
emb_128 = truncate(emb, 128)
절단 뒤에는 다시 정규화(normalize)합니다. Nomic v1.5, OpenAI text-3, Voyage-4는 첫 몇 단계에서 무손실(lossless)에 가깝게 동작하도록 학습되어 있습니다. 마트료시카 학습이 적용되지 않은 모델(예: 원본 Sentence-BERT)은 절단하면 성능이 급격히 떨어집니다(degrade).
Step 3: BGE-M3 다기능(multi-functionality) 사용
from FlagEmbedding import BGEM3FlagModel
model = BGEM3FlagModel("BAAI/bge-m3", use_fp16=True)
output = model.encode(
corpus,
return_dense=True,
return_sparse=True,
return_colbert_vecs=True,
)
# output["dense_vecs"]: (n_docs, 1024)# output["lexical_weights"]: list of dict {token_id: weight}# output["colbert_vecs"]: list of (n_tokens, 1024) arrays
세 가지 인덱스를 한 번의 추론(inference) 호출로 얻습니다. 점수 융합(score fusion)은 다음과 같이 합니다.
후보 모델을 대표적인(representative) 부분 집합에서 실행합니다. 리더보드 순위만 믿지 마세요. 자신의 도메인이 중요합니다.
Step 5: 코사인을 처음부터 직접 만들기(hand-rolled cosine from scratch)
code/main.py를 참고합니다. 표준 라이브러리(stdlib)만 사용한 평균화된 해싱 트릭(averaged Hashing Trick) 임베딩 구현입니다. 트랜스포머 임베딩과 경쟁하려는 것이 아니라, 토큰화(tokenize) → 벡터 → 정규화 → 내적이라는 전체 구조의 형태(shape)를 보여 주려는 것입니다.
함정(Pitfalls)
질의와 문서에 같은 모델을 쓰는지 확인. 일부 모델(Voyage, Jina-ColBERT)은 비대칭 인코딩(asymmetric encoding)을 사용합니다. 질의(query)와 문서(document)가 서로 다른 경로를 지나갑니다. 항상 모델 카드(model card)를 확인합니다.
누락된 프리픽스(missing prefix).bge-* 모델은 질의 앞에 "Represent this sentence for searching relevant passages: "를 붙여야 합니다. 잊으면 재현율(recall)이 3~5포인트 떨어질 수 있습니다.
과도한 마트료시카 절단(over-trimming Matryoshka). 1,536 → 256은 보통 안전합니다. 1,536 → 64는 안전하지 않습니다. 평가 세트(eval set)에서 검증(validate)하세요.
컨텍스트 절단(context truncation). 대부분의 모델은 최대 길이를 넘는 입력을 조용히 잘라 냅니다. 긴 문서에는 청킹(chunking)이 필요합니다(lesson 23 참고).
꼬리 지연 시간(latency tail) 무시. MTEB 점수는 p99 지연 시간을 가려 줍니다. 600M 모델이 335M 모델보다 2포인트 높아도, 질의당 비용은 3배일 수 있습니다.
2026년의 패턴은 BGE-M3 또는 text-3-large에서 시작해서 MTEB로 자신의 도메인에서 평가한 뒤, 도메인 특화 모델이 3포인트 이상 앞서면 교체하는 것입니다.
산출물 만들기
outputs/skill-embedding-picker.md로 저장합니다.
---
name: embedding-picker
description: Pick embedding model, dimension, and retrieval mode for a given corpus and deployment.
version: 1.0.0
phase: 5
lesson: 22
tags: [nlp, embeddings, retrieval]
---
Given a corpus (size, languages, domain, avg length), deployment target (cloud / edge / on-prem), latency budget, and storage budget, output:
Guide the student in Korean.
1. Model. Named checkpoint or API. One-sentence reason.
2. Dimension. Full / Matryoshka-truncated / int8-quantized. Reason tied to storage budget.
3. Mode. Dense / sparse / multi-vector / hybrid. Reason.
4. Query prefix / template if required by the model card.
5. Evaluation plan. MTEB tasks relevant to domain + held-out domain eval with nDCG@10.
Refuse recommendations that truncate Matryoshka to <64 dims without domain validation. Refuse ColBERTv2 for corpora under 10k passages (overhead not justified). Flag long-document corpora (>8k tokens) routed to models with 512-token windows.
이 스킬(skill)은 코퍼스 정보(크기, 언어, 도메인, 평균 길이), 배포 대상(클라우드 / 엣지 / 온프레미스), 지연 예산(latency budget), 저장 예산(storage budget)을 입력으로 받아 모델, 차원, 모드, 질의 프리픽스, 평가 계획을 추천하게 합니다. 도메인 검증 없이 마트료시카를 64차원 미만으로 자르는 추천은 거부하고, 1만 단락 미만의 코퍼스에 ColBERTv2를 권하지 않으며, 8k 토큰을 넘는 긴 문서 코퍼스가 512토큰 윈도우 모델로 라우팅되면 플래그(flag)합니다.
연습문제
쉬움.bge-small-en-v1.5로 100개의 문장을 풀 차원(384)에서 인코딩하고, 마트료시카 128차원에서도 인코딩합니다. 질의 10개에 대해 MRR(Mean Reciprocal Rank) 감소 폭을 측정합니다.
중간. 자신의 도메인 단락 500개에 대해 BGE-M3의 dense, sparse, colbert 모드를 비교합니다. recall@10에서 무엇이 이기는지 확인하고, RRF 융합이 단일 최고 모드보다 나은지도 확인합니다.
어려움. 자신의 상위 2개 도메인 과제에서 후보 모델 3개에 대해 MTEB를 실행합니다. MTEB 점수, 100개 질의 배치에서의 p99 지연 시간, 1M 질의당 비용($/1M queries)을 보고합니다. 파레토 최적(Pareto-optimal)한 것을 고릅니다.
핵심 용어
용어
흔한 설명
실제 의미
밀집 임베딩(Dense embedding)
"그 벡터"
텍스트마다 고정 크기 벡터 하나. 코사인 유사도로 순위를 매깁니다.
희소 임베딩(Sparse embedding)
학습된 BM25
어휘 토큰마다 가중치 하나. 대부분이 0이며 종단 간(end-to-end)으로 학습됩니다.
다중 벡터(Multi-vector)
ColBERT 방식
토큰마다 벡터 하나. MaxSim으로 점수를 냅니다. 인덱스가 더 크지만 재현율이 좋습니다.
마트료시카(Matryoshka)
러시아 인형 트릭
첫 N개 차원만으로도 유효한 더 작은 임베딩이 됩니다.
MTEB
그 벤치마크
대규모 텍스트 임베딩 벤치마크. 출시 시 56개 과제, v2에서는 100개 이상입니다.
BEIR
검색 벤치마크
18개 제로샷(zero-shot) 검색 과제. 도메인 간(cross-domain) 견고성에 자주 인용됩니다.
Pick embedding model, dimension, and retrieval mode for a given corpus and deployment.
Skill
확인 문제
3문제 · 모두 맞추면 완료 표시가 가능합니다
1.RAG 시스템이 bge-small 모델을 사용하는데 배포 후 recall@10이 4포인트 떨어졌습니다. 질의 앞에 'Represent this sentence for searching relevant passages: ' 프리픽스(prefix)를 빼먹은 것을 발견했습니다. 이 프리픽스가 왜 중요한가요?
2.한 팀이 마트료시카(Matryoshka) 학습된 1,536차원 임베딩을 64차원으로 절단(truncate)해 저장 공간을 절약했습니다. 검색 정확도가 급격히 떨어졌습니다. 무엇이 잘못되었나요?
3.키워드 위주 질의(keyword-heavy query)가 많은 다국어 코퍼스용 운영 검색 시스템을 구축해야 합니다. 재현율(recall)과 정밀도(precision)를 가장 잘 균형 잡는 검색 전략은 무엇인가요?