임베딩 모델이 RAG 품질을 결정한다
RAG(Retrieval-Augmented Generation) 시스템에서 임베딩 모델 선택은 LLM 선택만큼 중요합니다. 아무리 좋은 GPT-4o를 쓰더라도 관련 문서를 제대로 검색하지 못하면 답변 품질이 떨어집니다.
임베딩 모델은 텍스트를 숫자 벡터로 변환하며, 이 벡터의 유사도로 관련 문서를 검색합니다. 2025년 기준 주요 선택지를 비교합니다.
한눈에 보는 비교표
| 모델 | 차원 | 최대 입력 | 가격($/1M) | 한국어 | MTEB 점수 |
|---|---|---|---|---|---|
| text-embedding-3-large (OpenAI) | 3072 | 8191 토큰 | $0.13 | ★★★★☆ | 64.6 |
| text-embedding-3-small (OpenAI) | 1536 | 8191 토큰 | $0.02 | ★★★☆☆ | 62.3 |
| embed-v3.0 (Cohere) | 1024 | 512 토큰 | $0.10 | ★★★★☆ | 64.5 |
| BGE-M3 (BAAI) | 1024 | 8192 토큰 | 무료 (오픈소스) | ★★★★★ | 66.0 |
| E5-mistral-7b (MS) | 4096 | 32768 토큰 | 무료 (오픈소스) | ★★★☆☆ | 66.6 |
| KoSimCSE (한국어) | 768 | 512 토큰 | 무료 | ★★★★★ | - |
MTEB(Massive Text Embedding Benchmark) 점수 기준, 높을수록 좋음
OpenAI text-embedding-3: 가장 쉬운 선택
OpenAI의 임베딩 API는 사용이 가장 간단합니다.
from openai import OpenAI
client = OpenAI()
def embed(text: str, model="text-embedding-3-small") -> list[float]:
response = client.embeddings.create(input=text, model=model)
return response.data[0].embedding
# 단일 텍스트
vec = embed("한국 AI 스타트업 투자 트렌드")
print(f"차원: {len(vec)}") # 1536
# 배치 처리
texts = ["텍스트1", "텍스트2", "텍스트3"]
response = client.embeddings.create(input=texts, model="text-embedding-3-small")
vecs = [d.embedding for d in response.data]
언제 사용할까?
- 이미 OpenAI API를 쓰고 있어 추가 설정이 번거로울 때
- 빠른 프로토타입 제작
- 영어 위주 문서
비용 계산
1M 토큰 = 0.13 (large) 문서 10만 개, 평균 500토큰 = 5천만 토큰 = small 기준 $1
초기 인덱싱 비용은 매우 저렴합니다. 검색 시 재임베딩은 쿼리 길이가 짧아 무시할 수 있는 수준입니다.
BGE-M3: 한국어 포함 다국어 최강
BAAI(베이징 AI 연구소)의 BGE-M3는 2024년 공개 이후 다국어 임베딩의 표준으로 자리잡았습니다.
특징
1. 하이브리드 검색 지원 단일 모델로 세 가지 검색 방식을 동시 지원합니다:
- Dense retrieval (일반 벡터 유사도)
- Sparse retrieval (BM25 유사, 키워드 매칭)
- Multi-vector retrieval (ColBERT 방식, 토큰 레벨 매칭)
2. 8192 토큰 지원 긴 문서를 청크 없이 통째로 임베딩 가능합니다.
3. 100개 이상 언어 한국어, 일본어, 중국어, 아랍어 등 저자원 언어에서 OpenAI보다 좋은 성능.
from FlagEmbedding import BGEM3FlagModel
model = BGEM3FlagModel("BAAI/bge-m3", use_fp16=True)
# Dense + Sparse 하이브리드
output = model.encode(
["한국어 문서 검색 테스트"],
batch_size=12,
return_dense=True,
return_sparse=True,
)
dense_vec = output["dense_vecs"] # 일반 벡터
sparse_vec = output["lexical_weights"] # 키워드 가중치
언제 사용할까?
- 한국어가 포함된 문서 검색
- 무료로 로컬 또는 자체 서버에서 실행하고 싶을 때
- 하이브리드 검색으로 정확도를 높이고 싶을 때
- 긴 문서(논문, 보고서) 처리
Cohere embed
-v3.0: 검색 특화
Cohere의 임베딩 모델은 검색 정확도에 특화되어 있습니다.
특징
input_type 파라미터 문서 임베딩과 쿼리 임베딩을 구분해서 최적화합니다:
import cohere
co = cohere.Client("...")
# 문서 색인 시
doc_embeddings = co.embed(
texts=documents,
model="embed-multilingual-v3.0",
input_type="search_document" # 문서용
).embeddings
# 검색 쿼리 시
query_embedding = co.embed(
texts=[query],
model="embed-multilingual-v3.0",
input_type="search_query" # 쿼리용
).embeddings
이 방식이 문서/쿼리 구분 없이 동일 임베딩을 쓰는 것보다 검색 정확도를 높입니다.
Reranker와의 조합 Cohere는 임베딩 + Reranker(교차 인코더) 조합을 잘 지원합니다:
# 1단계: 임베딩으로 후보 100개 추출
# 2단계: Reranker로 상위 5개 재정렬
results = co.rerank(
query=query,
documents=candidates,
model="rerank-multilingual-v3.0",
top_n=5
)
한국어 특화: KoSimCSE, KoBERT 계열
순수 한국어 서비스라면 한국어 특화 모델을 고려할 수 있습니다.
KoSimCSE-roberta (snunlp)
from sentence_transformers import SentenceTransformer
model = SentenceTransformer("snunlp/KR-ELECTRA-discriminator")
embeddings = model.encode(["한국어 문장을 임베딩합니다"])
단점: 영어 혼용 문서에 취약하고, BGE-M3 대비 다국어 성능 부족. 순수 한국어 도메인에서만 의미 있습니다.
실전 선택 가이드
한국어가 포함된 RAG 시스템
→ BGE-M3 (무료, 다국어 최강, 하이브리드 검색)
빠른 프로토타입, 비용 무관
→ text-embedding-3-small (가장 간단)
최고 정확도의 영어 검색
→ text-embedding-3-large 또는 Cohere embed-v3.0
긴 문서 (논문, 보고서, 계약서)
→ BGE-M3 (8192 토큰) 또는 E5-mistral-7b (32768 토큰)
엔터프라이즈, 데이터 외부 전송 불가
→ BGE-M3 (자체 서버 실행)
결론
2025년 기준 BGE-M3는 한국어 포함 다국어 RAG의 사실상 표준입니다. 무료이고, 한국어가 강하고, 하이브리드 검색까지 지원합니다. 빠른 시작에는 OpenAI text-embedding-3-small로 프로토타입을 만들고, 프로덕션에서 BGE-M3로 전환하는 전략을 추천합니다.
임베딩 모델 선택만큼 중요한 것이 청크 크기, 오버랩, 리랭킹 전략입니다. ai.zip의 RAG 완전 가이드에서 전체 파이프라인 설계를 확인하세요.





