임베딩 깊게 — 모델·차원·벤치마크·캐시
임베딩 깊게 — 모델·차원·벤치마크·캐시
임베딩은 텍스트 (또는 이미지·코드) 를 고정 차원의 실수 벡터로 매핑한 결과입니다. 의미가 가까운 것이 벡터 공간에서 가깝게 배치된다는 가정 위에 검색·클러스터링·분류·추천이 얹힙니다.
1. 임베딩의 직관
문장 두 개를 같은 모델로 임베딩해 코사인 유사도를 재면, 의미가 비슷한 문장이 더 가까운 값을 보이는 경향이 있습니다.
"오늘 날씨 어때?" ↔ "현재 기온 알려줘" → 유사도 0.85
"오늘 날씨 어때?" ↔ "감자튀김 만드는 법" → 유사도 0.20
같은 문장이라도 모델에 따라 절댓값이 다르므로, 임계값은 모델 단위로 조율합니다.
2. 차원 수의 의미
임베딩의 차원이 클수록 표현력이 커지지만 저장·검색 비용이 비례 이상으로 늘어납니다.
| 차원 | 예시 모델 |
|---|---|
| 384 / 512 | 작은 Sentence-Transformers · BGE-small |
| 768 | nomic-embed-text · BGE-base |
| 1024 | BGE-large · Cohere embed v3 |
| 1536 | OpenAI text-embedding-3-small |
| 3072 | OpenAI text-embedding-3-large |
3. Matryoshka 표현 학습
Kusupati et al. (2022) 가 정리한 학습 방식. 임베딩 앞쪽 차원만 잘라 써도 정보가 비교적 잘 보존되도록 학습합니다. OpenAI text-embedding-3 시리즈가 응답에서 차원을 줄여 받는 옵션을 제공하는 배경이 이 아이디어로 알려져 있습니다.
응답 차원: 3072 (full) → 1536 → 768 → 256
↑
하나의 모델에서 잘라 쓰는 모양
저장 비용·검색 속도와 정확도의 균형을 사후에 맞출 수 있습니다.
4. 정규화와 거리 함수
대부분의 텍스트 임베딩은 L2 정규화된 벡터로 제공되거나 권장됩니다. 정규화된 벡터끼리는 코사인 유사도와 내적이 사실상 같습니다. 모델 카드의 권장 거리 함수를 따릅니다.
5. 폐쇄형 API 모델
| 모델 | 제공 | 차원 | 메모 |
|---|---|---|---|
OpenAI text-embedding-3-small |
OpenAI API | 1536 (축소 가능) | 저렴 · 다국어. |
OpenAI text-embedding-3-large |
OpenAI API | 3072 (축소 가능) | 고품질. |
Cohere embed-multilingual-v3.0 |
Cohere API | 1024 | 다국어 강세. |
Voyage voyage-3 |
Voyage AI | 다양 | 도메인 특화. |
Google text-embedding-004 |
Vertex / AI Studio | 768 | Gemini 와 같은 진입점. |
6. 오픈 가중치 모델
| 모델 | 출자 | 메모 |
|---|---|---|
BGE (BAAI/bge-*) |
BAAI | 영어 · 중국어 · 다국어 변형. small / base / large. |
| nomic-embed-text | Nomic AI | 768 차원. 라이선스 비교적 관대. |
| Jina embeddings | Jina AI | 다국어 변형 (jina-embeddings-v3) · 긴 입력 지원. |
| multilingual-e5 | Microsoft 연구 | 100 여 개 언어 학습. |
| Sentence-Transformers | UKP Lab | 다양한 작은 모델 모음. |
| ColBERT 계열 | Stanford | late-interaction 검색용. |
7. 작업 유형 별 안내
대부분 모델이 두 모드를 구분하라고 안내합니다:
- passage / document — 색인 대상에 임베딩.
- query — 검색 쿼리에 임베딩.
같은 모델이라도 prefix ("query: ..." · "passage: ...") 가 다르면 결과가 달라집니다 (e5 계열).
8. MTEB 벤치마크
Massive Text Embedding Benchmark — Hugging Face 가 공개한 종합 벤치마크로 분류·클러스터링·검색·재정렬·STS 등 다양한 과제로 모델을 줄 세웁니다.
주의 사항:
- 영어 중심 평가가 많습니다. 한국어 점수는 별도 카테고리·다국어 변형으로.
- 벤치마크 점수와 자기 도메인 성능은 다를 수 있습니다. 자체 평가셋이 더 신뢰.
- 새 모델이 자주 추가됩니다.
9. 한국어와 다국어
- multilingual-e5 · bge-m3 · Cohere embed v3 multilingual 등이 한국어 포함 다국어 지원.
- 영어 전용 모델에 한국어를 넣으면 품질이 떨어지는 사례가 흔합니다.
- 한국어 데이터로 측정한 평가 자료 (
Ko-MTEB같은 시도) 가 있고 새 모델이 자주 등록됩니다.
10. 캐시 · 재계산 정책
운영 측면의 흔한 모양:
- content hash 기준 캐시 — 청크 텍스트의 해시를 키로 임베딩 결과를 저장. 같은 텍스트 재계산 회피.
- 버전 핀 고정 — 임베딩 모델 이름·버전을 메타데이터에 함께 적습니다.
- 모델 변경 = 재임베딩 — 다른 모델의 벡터 공간은 호환되지 않습니다.
- 배치 작업 — 일정 양씩 묶어 호출, 실패는 재시도, 비용 한도 알림.
CREATE TABLE chunks (
id BIGINT PRIMARY KEY,
content TEXT,
content_hash TEXT,
embedding vector(1536),
embed_model TEXT, -- 'text-embedding-3-small'
embed_version TEXT, -- '2024-01-25'
embed_at TIMESTAMPTZ
);
11. 차원 축소 · 비용
API 임베딩은 토큰 단위 과금. 대용량 코퍼스를 처음 인덱싱할 때 비용이 한 번에 크게 발생할 수 있습니다. 자체 호스팅 (BGE · nomic · e5 + GPU 또는 CPU) 으로 옮기면 운영 부담이 늘어나는 대신 단가가 사라집니다.
차원 축소 — Matryoshka 모델의 차원을 잘라 쓰거나, PCA 같은 후처리 축소. 검색 정확도에 미치는 영향이 모델·도메인마다 다르므로 측정이 전제.
12. 자주 걸리는 자리
모델 변경 후 재임베딩 의무 — 옛 벡터와 새 쿼리는 서로 다른 공간. 호환되지 않음.
차원 불일치 — vector(1536) 컬럼에 1024 차원을 못 넣음. 모델별 분리 컬럼·테이블.
prefix 누락 — e5 · BGE 같은 모델은 query/passage prefix 가 결과를 바꿈.
정규화 가정 — 정규화 안 된 벡터에 코사인 거리만 가정하면 어긋날 수 있습니다. 모델 출력 자체의 정규화 여부 확인.
언어 혼용 — 같은 텍스트의 한국어·영어가 섞이면 모델에 따라 두 언어가 가깝게 또는 멀게 배치. 자기 도메인에서 측정.
너무 짧은 텍스트 — 10 토큰 미만의 입력은 의미가 흩어져 검색 품질이 떨어집니다. 청크 최소 길이 정책.
너무 긴 텍스트 — 모델 입력 한도 (512 · 8192 토큰) 를 넘으면 잘리거나 에러. 청킹 + 가중 평균 같은 우회는 손실이 있음.
벤치마크 맹신 — MTEB 1 위가 자기 도메인 1 위가 아닐 수 있음.
임베딩 캐시 무한 증가 — TTL · 사용량 통계 없이 두면 저장 비용 누적.
하고픈 말
임베딩의 90% 자리는 적절한 다국어 모델 + 콘텐츠 해시 캐시 + 모델 버전 메타데이터 셋이면 충분합니다. 모델 교체는 재임베딩 비용이 따라오므로 처음 핀 고정이 중요하고, MTEB 점수보다 자기 도메인 평가셋이 신뢰도가 높습니다.
Next
- agents-overview
- llm-landscape
OpenAI Embeddings · Cohere Embed · BAAI BGE · nomic-embed-text · Sentence-Transformers · MTEB Leaderboard · Matryoshka 학습 (2022) · BEIR · pgvector 를 참고합니다.