RAG 임베딩 모델, OpenAI와 BGE-M3와 E5 중 무엇을 쓸까
리더보드 점수로 고르면 대체로 후회합니다. 한국어, 차원 수, 그리고 실제로 재야 하는 지표를 기준으로 정리했습니다.
후보들의 실제 스펙
| OpenAI 3-small | OpenAI 3-large | BGE-M3 | |
|---|---|---|---|
| 차원 | 1536 | 3072 | 1024 |
| 최대 입력 | 8191 토큰 | 8191 토큰 | 8192 토큰 |
| 가격 (100만 토큰당) | 27원 | 174원 | 자체 호스팅 |
| 다국어 | 지원 | 지원 | 100개 이상 언어 |
| 검색 모드 | dense | dense | dense + sparse + multi-vector |
가격은 달러 표시 단가($0.02 / $0.13)를 환율 1달러 = 1,340원(2026년 9월 10일)으로 환산한 세전 값입니다. 원화 정가는 없고, 매달 환율만큼 청구액이 달라집니다.
E5 계열(multilingual-e5)은 오픈 웨이트 다국어 모델로 같은 부류에 들어갑니다.
리더보드로 고르면 안 되는 이유
MTEB 같은 벤치마크는 유용하지만, 당신의 데이터로 매긴 점수가 아닙니다.
- 벤치마크 코퍼스는 대개 위키·뉴스·웹 문서입니다. 사내 문서, 법률 문서, 코드, 고객 문의는 분포가 완전히 다릅니다.
- 상위권 모델들의 점수 차이는 대개 1~3점입니다. 당신 데이터에서 그 순서가 유지된다는 보장이 없습니다.
- 한국어 성능은 다국어 평균 점수에 묻힙니다.
실제로 갈리는 지점 세 가지
1. 한국어
한국어는 교착어라 형태소가 붙습니다. "결제하다 / 결제했습니다 / 결제가 / 결제를"이 전부 다른 토큰열입니다. 영어 위주로 학습된 모델은 이 변화를 같은 개념으로 묶는 데 상대적으로 약합니다.
BGE-M3가 이 지점에서 흥미로운 이유는 dense 하나만 주는 게 아니라는 데 있습니다. sparse(어휘 매칭, BM25에 가까운 토큰 가중치)와 multi-vector(ColBERT식 토큰 단위 상호작용)를 같이 냅니다.
이게 왜 중요하냐면 — 고유명사와 코드에서 dense 검색이 자주 실패하기 때문입니다. "PG-4021 오류"를 물었을 때 dense 벡터는 "결제 관련 오류"라는 의미로 뭉개서 엉뚱한 문서를 가져옵니다. sparse는 PG-4021이라는 토큰을 정확히 잡습니다. 사내 문서에는 이런 식별자가 아주 많습니다.
같은 효과를 OpenAI 임베딩 + 별도 BM25 인덱스로 만들 수도 있습니다. 다만 그건 인덱스를 두 개 운영한다는 뜻입니다.
2. 차원 수 = 저장·검색 비용
차원은 그냥 숫자가 아니라 인프라 비용입니다.
문서 100만 청크를 float32로 저장할 때:
1024차원 → 1M × 1024 × 4B ≈ 4.1 GB
1536차원 → 1M × 1536 × 4B ≈ 6.1 GB
3072차원 → 1M × 3072 × 4B ≈ 12.3 GB
벡터 DB는 이걸 메모리에 올리려 합니다. 3배 차이는 인스턴스 등급 차이로 직결되고, 검색 지연에도 영향을 줍니다.
3-large의 3072차원이 성능 대비 값을 하는 경우는 생각보다 드뭅니다. OpenAI 임베딩은 차원 축소를 지원하니, large를 쓰더라도 1024로 줄여서 비교해 볼 가치가 있습니다.
3. 운영 부담
| API | 자체 호스팅 | |
|---|---|---|
| 초기 | 키 하나 | GPU, 서빙, 배치 튜닝 |
| 최초 색인 100만 청크 | 약 54,000원 (small 기준, 청크당 2천 토큰 가정) | 인스턴스 시간 |
| 재색인 | 다시 54,000원 | 다시 인스턴스 시간 |
| 모델 교체 | 파라미터 하나 | 재배포 |
| 데이터 반출 | 있음 | 없음 |
마지막 줄이 자체 호스팅의 진짜 이유인 경우가 많습니다. 비용이 아니라 문서를 외부로 보낼 수 없어서입니다.
그래서 어떻게 고르나
30분짜리 평가를 만드세요. 이게 리더보드 읽는 것보다 훨씬 빠르게 답을 줍니다.
1단계. 실제 사용자 질문 50개를 모읍니다. 없으면 팀원에게 물어보세요. 지어내지 마세요 — 지어낸 질문은 너무 잘 검색됩니다.
2단계. 각 질문에 대해 "이 문서가 나와야 한다"를 사람이 표시합니다. 질문당 1~3개면 됩니다.
3단계. 후보 모델별로 색인하고 recall@k를 잽니다.
recall@5 = (상위 5개 안에 정답 문서가 들어온 질문 수) / 전체 질문 수
4단계. 여기서 대부분 결론이 납니다. 그리고 자주 이런 결과가 나옵니다 — 모델 간 차이보다 청킹 전략의 차이가 더 큽니다. 800토큰으로 자르느냐 2,000토큰으로 자르느냐, 문단 경계를 지키느냐가 임베딩 모델 선택보다 recall을 크게 흔듭니다.
실무 권장 순서
- OpenAI 3-small로 시작하세요. 100만 토큰에 27원이면 실험을 막지 않는 가격이고, 인프라가 0입니다.
- recall을 재세요. 만족스러우면 끝입니다. 대부분 여기서 끝납니다.
- 한국어 고유명사·코드 검색이 약하면 sparse를 더하세요. BM25 하이브리드든 BGE-M3든.
- 데이터가 외부로 나갈 수 없으면 처음부터 자체 호스팅입니다. 이건 성능 문제가 아닙니다.
- 차원을 줄여보세요. 성능이 유지되면 인프라 비용이 그대로 절감됩니다.
정리
- 리더보드 순위는 당신 데이터의 순위가 아닙니다.
- 한국어에서는 dense 단독보다 sparse를 섞는 것이 고유명사·식별자 검색을 살립니다.
- 차원 수는 성능 지표가 아니라 저장·메모리 비용입니다.
- 모델을 바꾸기 전에 청킹부터 보세요. 대개 그쪽 영향이 더 큽니다.
- 자체 호스팅의 진짜 이유는 비용이 아니라 데이터 반출 금지입니다.
여러분은 어떤 모델을 쓰고 계시고, 한국어 검색에서 어떤 케이스가 잘 안 되던가요?
출처
- OpenAI API 가격 — 임베딩 단가.
- BAAI/bge-m3 모델 카드 — BGE-M3의 다국어·하이브리드 검색 스펙.
- OpenAI, Embeddings 가이드 — 차원 축소(dimensions) 옵션과 입력 한도.
- MTEB 리더보드 — 본문에서 "그대로 믿지 말라"고 한 그 리더보드. 무엇을 재는지 확인하는 용도로는 유용합니다.