한글 임베딩에 대한 고찰: KURE-v1·v2부터 Qwen3까지, 한국어 임베딩 모델은 어떻게 동작할까
관련 글 · RAG 평가 데이터셋과 품질 평가 · 벡터 DB 스키마와 컬렉션 설계
한국어 RAG(검색 증강 생성, 검색한 문서를 LLM 답변의 근거로 쓰는 방식)나 검색 시스템의 품질은 임베딩 모델 하나에서 크게 갈립니다. 같은 문서와 같은 LLM을 쓰더라도 어떤 임베딩으로 색인을 만들었는지에 따라 정답 문서를 찾아오는 비율이 크게 달라집니다.
2024년 말 KoE5와 KURE-v1이 공개되면서 한국어 전용 임베딩이 실용 단계에 들어섰습니다. 2026년 8월에는 파라미터 1억 5,400만 개짜리 KURE-v2가 76억 파라미터 모델을 한국어 검색 벤치마크에서 앞질렀습니다. 이 글은 KURE-v1과 v2의 동작 방식 차이를 중심에 둡니다. 한국어 임베딩 모델 20여 종이 각각 어떤 백본 위에서, 어떤 표현 방식으로, 어떤 학습 목표로 만들어졌는지도 살펴봅니다.
이 글에서 알 수 있는 것
- 범용 다국어 임베딩만으로는 한국어 검색이 부족한 네 가지 이유
- 임베딩 모델을 나눠 읽는 다섯 가지 설계 축(백본·표현·풀링·학습 목표·입력 형식)
- 대조학습·하드 네거티브·위음성 필터링·후기 상호작용 같은 핵심 학습 기법
- KURE-v1(단일 벡터)과 KURE-v2(후기 상호작용)가 무엇을 바꿨고 그 대가가 무엇인지
- 다른 한국어 임베딩 모델들의 계열과 MTEB(kor, v2) 태스크별 강약점
- 상황별 모델 선택 기준과 모델마다 다른 입력 형식
이 글의 수치는 2026년 10월 기준으로 공개된 모델 카드, 원 논문, MTEB(kor, v2) 리더보드를 근거로 합니다.
1. 먼저 알아 둘 용어는 무엇일까요
한마디로: 이 글을 읽는 데 필요한 말을 미리 풀어 둔 작은 사전입니다. 낯선 용어가 나오면 이 표로 돌아와 확인하면 됩니다.
이 글에 자주 나오는 용어를 먼저 정리합니다. 자세한 원리는 4절에서 다시 다룹니다.
| 용어 | 쉬운 설명 |
|---|---|
| 임베딩(embedding) | 텍스트를 숫자 배열(벡터)로 바꾼 값입니다. 의미가 가까운 텍스트는 가까운 벡터가 되도록 만듭니다. |
| 토큰·토크나이저 | 토큰은 모델이 텍스트를 읽는 단위로, 단어나 단어 조각입니다. 토크나이저는 문장을 토큰으로 자르는 도구이고 모델마다 정해진 어휘집을 씁니다. |
| 벡터·차원 | 벡터는 숫자를 정해진 개수만큼 늘어놓은 배열이고 차원은 그 숫자의 개수입니다. 차원이 클수록 더 많은 정보를 담을 수 있지만 저장 공간도 더 듭니다. |
| 코사인 유사도 | 두 벡터가 가리키는 방향이 얼마나 비슷한지 재는 값입니다. 방향이 같으면 1, 직각이면 0, 정반대면 −1이며 클수록 의미가 가깝다고 봅니다. |
| 백본(backbone) | 임베딩 모델이 출발점으로 삼는 사전학습 언어 모델입니다. BERT, XLM-RoBERTa, Qwen3 등이 있습니다. |
| 사전학습·파인튜닝 | 사전학습은 대량의 텍스트로 언어 전반을 먼저 익히는 단계입니다. 파인튜닝은 사전학습된 모델을 특정 작업(이 글에서는 주로 검색)의 데이터로 추가 학습하는 단계입니다. 임베딩 분야에서는 대량의 약한 쌍으로 대조학습하는 단계(약지도 사전학습)도 사전학습이라 부릅니다. |
| 파라미터 | 모델 안에서 학습으로 정해지는 숫자(가중치)입니다. 개수로 모델 크기를 나타내며 M은 백만, B는 십억 단위입니다. |
| 인코더·디코더 | 인코더는 문장 전체를 양방향으로 한 번에 봅니다. 디코더는 앞쪽 토큰만 보며 다음 토큰을 예측하도록 학습된 모델입니다. |
| 어텐션(attention) | 각 토큰이 문장 안의 다른 토큰을 얼마나 참고할지 정하는 계산입니다. 이 계산을 거치며 토큰 벡터에 문맥이 반영됩니다. |
| 풀링(pooling) | 토큰마다 나온 벡터 여러 개를 문장 벡터 하나로 모으는 방법입니다. |
| 단일 벡터(dense) 모델 | 문서 하나를 벡터 하나로 압축해 표현하는 모델입니다. |
| 후기 상호작용(late interaction) | 토큰마다 작은 벡터를 남겨 두고, 검색 시점에 질의 토큰과 문서 토큰을 맞춰 보는 방식입니다. ColBERT가 대표 모델입니다. |
| MaxSim | 질의 토큰마다 문서에서 가장 비슷한 토큰의 유사도를 골라 모두 더한 점수입니다. 후기 상호작용 모델이 씁니다. |
| 손실 함수(loss function) | 모델의 출력이 목표에서 얼마나 벗어났는지를 숫자 하나로 계산하는 함수입니다. 학습은 이 값을 줄이는 방향으로 파라미터를 조금씩 고치는 과정입니다. |
| 배치(batch) | 학습 한 단계에서 함께 처리하는 샘플 묶음입니다. 배치 크기는 그 묶음에 든 샘플 수입니다. |
| 대조학습(contrastive learning) | 정답 쌍의 유사도는 높이고 오답 쌍의 유사도는 낮추도록 학습하는 방법입니다. |
| InfoNCE | 대조학습에 쓰는 대표적인 손실 함수입니다. |
| 배치 내 네거티브(in-batch negatives) | 같은 배치에 들어온 다른 질의의 정답 문서를 오답으로 쓰는 방법입니다. |
| 하드 네거티브(hard negative) | 질의와 비슷해 보이지만 정답은 아닌 문서입니다. 쉬운 오답보다 학습 신호가 강합니다. |
| 위음성(false negative) | 오답으로 취급했지만 실제로는 정답인 문서입니다. 모델이 맞는 답을 밀어내도록 잘못 학습시킵니다. |
| 지식 증류(knowledge distillation) | 교사 모델이 매긴 점수 분포를 학생 모델이 따라가도록 학습하는 방법입니다. |
| 크로스 인코더(cross-encoder) | 질의와 문서를 한 입력으로 넣어 관련도를 매기는 모델입니다. 정확하지만 느려서 주로 리랭커(재정렬 모델)로 씁니다. |
| 양자화(quantization) | 벡터의 숫자를 더 적은 비트로 줄여 저장하는 방법입니다. 저장 공간과 계산량이 줄어드는 대신 정밀도가 조금 떨어질 수 있습니다. |
| 인덱스(HNSW·PLAID) | 많은 벡터 가운데 비슷한 것을 빨리 찾도록 미리 만들어 두는 자료 구조입니다. HNSW는 일반 벡터 DB가 많이 쓰는 그래프 기반 근사 최근접 이웃 인덱스로, 이 글에서는 단일 벡터 모델의 인덱스로 나옵니다. PLAID는 후기 상호작용 모델의 토큰 벡터용 인덱스입니다. |
| QPS·p95 지연 | QPS는 초당 처리하는 질의 수로 클수록 좋습니다. p95 지연은 전체 요청의 95%가 이 시간 안에 끝나는 응답 시간으로, 평균에 가려지는 느린 요청까지 드러냅니다. |
| nDCG@10 | 검색 결과 상위 10개의 순위 품질을 나타내는 지표입니다. 관련 문서가 위쪽에 있을수록 높고 최댓값은 1입니다. 1에 가까울수록 좋고 같은 정답 문서라도 순위가 아래로 내려갈수록 점수에 덜 반영됩니다. |
| MTEB(kor, v2) | 임베딩 벤치마크 MTEB의 한국어 검색 구성입니다. 이 글에서는 9개 태스크의 nDCG@10을 씁니다. |
| 접두어·지시문 | 모델에 넣기 전에 질의나 문서 앞에 붙이는 문자열입니다. query:, Instruct: … Query: … 같은 형태입니다. |
점수는 0~1 사이 값으로 적습니다. 두 점수의 차이를 말할 때는 100을 곱한 “점”으로 씁니다. 예를 들어 0.8160과 0.7927의 차이는 2.33점입니다.
2. 한국어 임베딩은 왜 따로 필요할까요
한마디로: 형태 변화, 토크나이저의 언어 배분, 한국어 학습 데이터 부족, 도메인 편향 때문에 범용 다국어 모델이 한국어에서 곧바로 최고 성능을 내지는 않습니다. 그래서 한국어 검색에 맞춰 다시 조정하거나 새로 만든 모델이 따로 나옵니다.
임베딩 모델은 “의미가 가까우면 벡터도 가깝다”는 성질이 성립하도록 텍스트를 고차원 벡터로 바꿉니다. 영어권에서는 BGE, E5, OpenAI text-embedding-3 같은 범용 모델이 표준으로 자리 잡았습니다. 하지만 이 범용 모델이 한국어에서 곧바로 최고 성능을 내지는 않습니다. 이유는 이렇습니다.
- 교착어의 형태 변화: 한국어는 어간에 조사와 어미가 붙어 표면형이 조합 수만큼 늘어납니다. “계약을 해지하려면 / 계약 해지 시 / 해지된 계약은”처럼 같은 개념이 여러 형태로 흩어지므로 표현을 한 점으로 모으는 일이 영어보다 어렵습니다.
- 토크나이저의 언어 배분: 다국어 모델은 100개 이상의 언어가 하나의 어휘집을 나눠 씁니다. 한국어에 배정된 서브워드(subword, 단어보다 작은 토큰 단위)가 적으면 한 문장이 더 잘게 쪼개져 같은 최대 길이 안에 담기는 내용이 줄어듭니다. 이 때문에 한국어로 사전학습된 인코더(KLUE-RoBERTa, KR-BERT, A.X Encoder 등)를 백본으로 쓰는 시도가 계속됩니다.
- 학습 데이터의 부족: KoE5 연구는 한국어 임베딩 성능 저하의 주된 원인으로 임베딩 학습용 한국어 데이터의 부족을 지목했습니다.1 이 분야의 기여는 모델만큼이나 데이터셋(ko-triplet, AI Hub 기계독해 데이터 재가공 등)에서 나왔습니다.
- 도메인 편향: 공개 벤치마크는 위키와 뉴스 중심이지만 실무 코퍼스에는 계약서, 사내 위키, 고객 상담 기록, PDF 표가 뒤섞여 있습니다. 범용 모델이 잘 맞는 영역과 그렇지 않은 영역이 갈립니다.
이 문제의 해법은 세 갈래로 수렴합니다.
- 강한 다국어 백본을 가져와 한국어 검색 데이터로 다시 조정합니다. KoE5, KURE-v1, BGE-m3-ko, snowflake-ko, PIXIE가 여기에 속합니다.
- 한국어로 사전학습된 백본 위에 검색 모델을 새로 만듭니다. KR-SBERT, KoSimCSE, colbert-ko, KURE-v2가 이 갈래입니다.
- 거대한 디코더 LLM을 임베딩 모델로 바꿉니다. Qwen3-Embedding과 comsat-ko-8b가 이렇게 만들어졌습니다.
이 세 갈래와 별개인 축으로 표현 방식이 있습니다. 문서를 벡터 하나로 나타내는지, 토큰별로 벡터 여러 개를 남기는지의 차이입니다.
3. 임베딩 모델은 어떤 축으로 나눠 읽을까요
한마디로: 모델 이름은 제각각이어도 백본, 표현 방식, 풀링, 학습 목표, 입력 형식 다섯 가지를 보면 서로의 차이가 정리됩니다.
모델 이름만 나열하면 차이가 잘 보이지 않습니다. 다음 다섯 축(①~⑤)으로 나눠 읽으면 동작 방식의 차이가 선명해집니다. 이후 모든 모델 소개는 이 다섯 축을 기준으로 합니다.
① 백본 아키텍처: 인코더인가 디코더인가요
인코더 전용 모델(BERT, RoBERTa, XLM-RoBERTa, DeBERTa, ModernBERT)은 양방향 어텐션(attention, 각 토큰이 다른 토큰을 얼마나 참고할지 정하는 계산)으로 문장 전체를 한 번에 보므로 문장 표현을 만드는 데 자연스럽게 맞습니다. 글을 끝까지 다 읽은 뒤 앞뒤를 오가며 이해하는 방식에 가깝습니다.
디코더 전용 모델(Qwen3, Gemma 계열 등)은 다음 토큰 예측으로 사전학습됐습니다. 각 토큰이 앞쪽 토큰만 보는 인과적(causal) 어텐션을 쓰므로 문장 끝 토큰에 앞 문맥 전체의 정보가 모입니다. 앞에서부터 차례로 읽어 나가며 마지막에 이르러서야 전체 내용을 알게 되는 방식에 가깝습니다.
② 표현 방식: 벡터를 몇 개 남기나요
- Dense: 문서 전체를 벡터 하나로 압축합니다.
- Sparse: 어휘별 가중치를 남겨 BM25처럼 동작합니다. BM25는 단어 일치를 기준으로 점수를 매기는 전통적인 키워드 검색 방식입니다.
- Multi-vector(후기 상호작용): 토큰마다 작은 벡터를 남기고 검색 시점에 MaxSim으로 맞춥니다.
③ 풀링: 토큰 벡터를 어떻게 모으나요
토큰 벡터들을 하나로 모으는 방법입니다.
- [CLS] 토큰: 문장 앞에 붙는 특수 토큰의 벡터를 씁니다(BGE-M3 계열).
- 평균 풀링: 모든 토큰 벡터의 평균을 씁니다(E5, SBERT).
- 마지막 토큰/EOS: 문장 끝 토큰의 벡터를 씁니다(디코더 계열).
- 풀링 없음: 후기 상호작용 모델은 아예 풀링하지 않습니다.
④ 학습 목표: 무엇을 당기고 무엇을 밀어내나요
이 글에 나오는 학습 목표는 이렇습니다.
- 비지도 SimCSE
- 배치 내 네거티브 대조학습(MNRL/InfoNCE)
- 가이드 모델로 오답을 거르는 GIST
- 교사 리랭커의 점수 분포를 따라가는 KL 증류
각 기법은 4절에서 다룹니다. “파인튜닝”이라는 같은 단어 아래에서도 무엇을 당기고 무엇을 밀어내는지는 모델마다 전부 다릅니다.
⑤ 입력 형식: 접두어나 지시문을 붙이나요
| 모델 계열 | 질의 | 문서 |
|---|---|---|
| E5 계열 | query: |
passage: |
| Snowflake·PIXIE | query: 접두어 |
없음 |
| Qwen3·comsat 계열 | 작업 지시문(Instruct: … Query: …) |
없음 |
| KURE-v1·v2, BGE-M3 | 없음 | 없음 |
학습 때와 추론 때의 입력 형식이 다르면 성능이 떨어집니다.
4. 임베딩 모델은 어떤 기법으로 학습할까요
한마디로: 요즘 검색 임베딩은 거의 전부 “맞는 짝은 가깝게, 틀린 짝은 멀게” 배우는 대조학습으로 만듭니다. 나머지 기법은 주로 정답·오답 쌍을 더 많이, 더 깨끗하게 확보하는 방법과 표현 방식·학습 신호를 보강하는 방법입니다.
한국어 임베딩 모델의 모델 카드는 대부분 “X를 Y 데이터로 Z 손실을 써서 파인튜닝했다” 한 줄로 끝납니다. 그 한 줄을 읽으려면 Z에 해당하는 기법을 알아야 합니다. 이 절에서는 이 글에 나오는 모델들이 공유하는 기법을 한 번에 정리합니다.
대조학습과 InfoNCE는 어떻게 동작할까요
현대 검색 임베딩은 거의 전부 대조학습으로 학습됩니다. 질의 q와 정답 문서 d⁺의 유사도는 높이고 오답 문서 d⁻들과의 유사도는 낮추도록 학습합니다.
짝 맞추기 연습과 비슷합니다. 질문 카드와 여러 장의 답 카드를 놓고 맞는 짝은 끌어당기고 틀린 짝은 밀어냅니다. 이 연습을 반복하면 의미가 맞는 질의와 문서가 벡터 공간에서 가까이 모입니다.
L = − log exp(s(q, d⁺)/τ) / [ exp(s(q, d⁺)/τ) + Σ_j exp(s(q, d_j⁻)/τ) ]
InfoNCE 손실입니다. s는 코사인 유사도, τ는 온도(점수 차이를 얼마나 날카롭게 볼지 정하는 값)이며 분모의 오답 개수가 많을수록 구분 신호가 강해집니다.
쉽게 말하면 질의와 모든 후보 문서의 유사도를 점수로 바꾼 뒤 그중 정답 문서가 차지하는 몫을 봅니다. 정답의 몫이 클수록 손실이 작아지므로 학습은 정답 점수를 올리고 오답 점수를 내리는 쪽으로 움직입니다.
오답을 어디서 구하느냐가 핵심입니다. 가장 싼 방법은 배치 내 네거티브로, 같은 배치에 들어온 다른 질의들의 정답 문서를 오답으로 씁니다. 이미 계산한 문서 벡터를 재활용하므로 오답을 따로 마련할 필요가 없습니다. sentence-transformers의 MultipleNegativesRankingLoss(MNRL)가 바로 이 방식입니다.
배치가 클수록 오답이 많아지므로 강한 임베딩 모델은 모두 큰 배치를 씁니다. E5 사전학습은 32,768, KURE-v2 1단계는 16,384, KURE-v1은 4,096입니다.
객관식 시험의 보기 수에 견주면 이해하기 쉽습니다. 보기가 많을수록 어림짐작으로 맞히기 어려우므로 정답을 제대로 구별해야 점수가 나옵니다. 배치가 크면 질의 하나가 상대할 오답 보기가 그만큼 늘어납니다.
하지만 배치 크기는 GPU 메모리에 묶입니다. 이 제약을 푸는 기법인 Gradient Cache는 다음 순서로 동작합니다.
- 배치를 작은 조각으로 나눠 임베딩만 먼저 계산합니다.
- 전체 배치의 손실 기울기를 임베딩 단위로 캐시합니다.
- 조각별로 역전파(손실을 줄이도록 각 파라미터를 고칠 방향을 거꾸로 계산해 전달하는 과정)합니다.
무거운 계산은 조각 단위로 메모리에 올리고 손실은 전체 배치 기준으로 계산합니다. 그래서 같은 GPU 메모리로도 큰 배치만큼의 오답을 쓸 수 있습니다.
이름에 Cached가 붙은 손실(CachedMultipleNegativesRankingLoss, CachedGISTEmbedLoss)이 이 기법을 씁니다. KoE5와 KURE-v1이 모두 Cached 손실을 쓴 것도 이 때문입니다.
또 하나의 요소는 하드 네거티브입니다. 배치 내 무작위 오답은 대부분 너무 쉽습니다. “김치 담그는 법” 질의에 “한라산 높이” 문서가 오답으로 들어오는 식입니다. 그래서 기존 검색기로 질의와 비슷하지만 정답은 아닌 문서를 미리 찾아(mining) 함께 넣습니다.
하드 네거티브는 시험 문제의 “헷갈리는 오답 보기”와 같습니다. 정답과 비슷해 보이는 보기를 가려내는 연습을 해야 실력이 늘듯이 모델도 비슷하지만 틀린 문서를 구별하면서 더 세밀한 기준을 익힙니다.
KURE-v1은 질의당 하드 네거티브 5개, KURE-v2와 E5 파인튜닝은 7개를 씁니다.
SimCSE는 드롭아웃으로 어떻게 정답을 만들까요
SimCSE(2021)는 한국어 1세대 문장 임베딩(KoSimCSE)의 직접적인 기반입니다.2
비지도 SimCSE는 같은 문장을 인코더에 두 번 통과시킵니다. 드롭아웃(dropout, 학습 중 일부 뉴런을 무작위로 끄는 기법)이 매번 다르게 적용되므로 두 출력은 미세하게 다릅니다. 이 둘을 정답 쌍으로 당기고 배치 안의 다른 문장들은 밀어냅니다.
같은 사진에 조금씩 다른 필터를 씌워 두 장을 만든 것과 비슷합니다. 겉모습은 살짝 달라도 담긴 내용은 같으므로 라벨 없이도 정답 짝으로 쓸 수 있습니다.
논문은 드롭아웃이 “최소한의 데이터 증강”으로 작동하며 드롭아웃을 끄면 표현이 붕괴함을 보였습니다.
지도 SimCSE는 자연어 추론(NLI) 데이터에서 함의(entailment) 쌍을 정답으로, 모순(contradiction) 쌍을 하드 네거티브로 둡니다. BERT-base 기준 STS(의미적 텍스트 유사도) 스피어만 상관(모델이 매긴 유사도 순위가 사람이 매긴 순위와 얼마나 일치하는지 나타내는 값)은 비지도 76.3, 지도 81.6이었습니다.
논문은 대조학습이 사전학습 임베딩의 이방성(anisotropy, 벡터들이 좁은 원뿔에 몰리는 현상)을 펴서 공간을 균일하게 만든다는 분석도 함께 제시했습니다. 한국어에서는 카카오브레인의 KorNLI·KorSTS가 이 데이터 역할을 했습니다.
E5식 약지도 사전학습과 접두어는 무엇일까요
E5(2022)는 “사람이 만든 라벨 없이도 BM25를 이기는 임베딩”을 처음 보인 모델입니다.3
E5는 레딧 질문-답변, 위키 제목-본문, 논문 제목-초록처럼 웹에 원래 있고 서로 약하게 관련된 쌍을 약 13억 개 모아 일관성 필터로 정제했습니다. 필터는 먼저 노이즈 섞인 데이터로 모델을 학습시킵니다. 그다음 이 모델로 각 쌍을 무작위 문서 100만 개와 경쟁시켜 정답이 상위 2위 안에 드는 쌍만 남깁니다.
그렇게 남은 약 2억 7천만 쌍(CCPairs)으로 배치 32,768로 대조 사전학습했습니다. 이후 NLI·MS MARCO·NQ로 파인튜닝하면서 하드 네거티브 7개와 크로스 인코더 교사 증류를 결합했습니다.
E5의 query: / passage: 접두어는 질의와 문서를 같은 인코더로 처리하면서도 둘의 역할을 구분하는 비대칭 장치입니다. 접두어는 이름표 역할을 합니다. 같은 인코더가 “이건 묻는 글”, “이건 답이 담긴 글”이라는 이름표를 보고 각 역할에 맞는 벡터를 만듭니다. 논문에 따르면 이 비대칭 설계는 코퍼스 안에 질의를 바꿔 말한 문장(paraphrase)이 있는 검색 태스크에서 특히 중요합니다. E5의 풀링은 평균 풀링입니다.
주의: E5를 백본으로 쓴 KoE5와 multilingual-e5-small-ko-v2는 접두어를 반드시 붙여야 합니다.
이 “약지도 사전학습 → 하드 네거티브 파인튜닝” 2단계 레시피는 이후 사실상 표준이 됐습니다. BGE-M3, Qwen3-Embedding, mLateOn, 그리고 KURE-v2가 모두 이 구조를 따릅니다. KURE-v1과 KoE5는 이미 사전학습된 모델을 가져와 2단계만 한국어로 다시 한 경우입니다.
BGE-M3는 한 모델에서 어떻게 세 가지 점수를 낼까요
KURE-v1, BGE-m3-ko, PIXIE-Rune, snowflake-ko 등 한국어 상위 단일 벡터 모델은 상당수가 BGE-M3 또는 같은 XLM-RoBERTa 계열 백본 위에 있습니다. BGE-M3의 이름에 든 세 M은 다국어(Multi-Linguality), 다기능(Multi-Functionality), 다중 입도(Multi-Granularity)입니다. 이름처럼 하나의 인코더 출력에서 세 가지 점수를 동시에 뽑습니다.4
Dense e = norm(H[0]) s_dense = ⟨e_q, e_p⟩
Sparse(어휘) w_t = ReLU(W_lex^T H[i]) s_lex = Σ_{t ∈ q∩p} w_{q,t} · w_{p,t}
Multi-vector E = norm(W_mul^T H) s_mul = (1/N) Σ_i max_j E_q[i] · E_p[j]
통합 점수 s_inter = 1·s_dense + 0.3·s_lex + 1·s_mul
쉽게 말하면 한 번 인코딩한 결과에서 점수 세 개를 뽑습니다. 문장 벡터끼리의 내적(s_dense), 질의와 문서에 함께 나온 토큰의 가중치를 곱해 더한 값(s_lex), 토큰 단위 MaxSim의 평균(s_mul)입니다. 통합 점수 s_inter는 s_dense와 s_mul에 1, s_lex에 0.3을 곱해 더한 값입니다.
- Dense: [CLS] 토큰의 마지막 은닉 상태(hidden state, 모델이 토큰마다 내놓는 내부 벡터)를 정규화해 벡터 하나로 씁니다.
- Sparse: 각 토큰의 은닉 상태를 스칼라 가중치로 투영하고 질의와 문서에 함께 나온 토큰의 가중치만 곱해 더합니다.
- Multi-vector: 모든 토큰을 투영한 뒤 정규화합니다. MaxSim을 질의 토큰 수 N으로 나눠 평균합니다.
BGE-M3 학습의 중심에는 자기 지식 증류(self-knowledge distillation)가 있습니다. 세 점수를 가중합한 s_inter를 “교사” 신호로 삼고 각 개별 점수가 이 통합 점수의 분포를 따라가도록 학습합니다. 최종 손실은 일반 InfoNCE와 증류 손실의 평균입니다. 세 검색 방식이 서로를 가르치는 구조라 별도의 교사 모델이 필요 없습니다. 세 학생이 함께 낸 답을 모범 답안으로 삼고 각자 그 답안에 맞춰 공부하는 모습과 비슷합니다.
BGE-M3는 XLM-RoBERTa의 위치 임베딩을 8,192까지 늘리고 RetroMAE 방식으로 추가 사전학습해 백본을 준비했습니다. 이어서 194개 언어 12억 쌍의 비지도 데이터로 대조 사전학습했습니다. 파인튜닝 데이터는 영어 110만, 중국어 38.7만, 다국어 8.9만, 장문 합성 4.1만 건입니다. 장문 대응으로는 256토큰마다 [CLS]를 끼워 넣고 그 은닉 상태들을 평균하는 MCLS 기법도 제안했습니다.
한국어 입장에서 보면 파인튜닝 데이터 중 다국어 몫이 작아서 한국어로 추가 학습할 여지가 있습니다. BGE-m3-ko 모델 카드가 “중국어·영어 외 언어 학습이 부족해 추가 학습이 필요하다”고 적은 것도 같은 맥락입니다.5
GIST와 위음성 필터링은 왜 반복해서 나올까요
배치 내 네거티브에는 치명적인 약점이 있습니다. 배치 안의 “다른 질의의 정답”이 사실 이 질의에도 정답일 수 있습니다. 예를 들어 같은 배치에 “근로계약 해지 사유”와 “근로계약 종료 요건”이 함께 들어오면 서로의 정답을 오답으로 밀어내는 잘못된 학습이 일어납니다. 이것이 위음성 문제입니다.
하드 네거티브가 시험의 “헷갈리는 오답”이라면 위음성은 “채점표가 틀린 정답”입니다. 학생이 맞는 답을 골랐는데 채점표가 오답으로 처리하면 학생은 맞는 답을 피하도록 배웁니다. 모델도 같은 방식으로 잘못 학습됩니다.
GISTEmbed(2024)는 별도의 가이드 모델 G로 이를 걸러냅니다.6 규칙은 단순합니다. 가이드 모델이 계산한 유사도에서 어떤 후보가 질의-정답 쌍의 유사도보다 높으면 그 후보는 오답이 아니라고 봅니다. 가이드 모델은 채점표를 한 번 더 검토하는 조교 역할을 하는 셈입니다.
이런 후보는 손실 계산에서 −∞로 마스킹해 제외합니다. 다른 질의, 다른 정답, 할당된 네거티브 모두에 같은 규칙을 적용합니다. KURE-v1이 쓴 CachedGISTEmbedLoss가 바로 이 손실에 Gradient Cache를 결합한 것입니다.
이 아이디어는 형태만 바꿔 거의 모든 최신 모델에서 반복됩니다.
- E5: 일관성 필터로 학습 데이터 자체를 정제합니다.
- NV-Retriever의 positive-aware mining: 하드 네거티브를 캘 때 정답 점수 대비 일정 비율 이상으로 높은 후보는 버립니다. mLateOn은 “정답 관련도의 95%를 넘는 후보는 폐기”하는 규칙을 썼습니다. KURE-v2도 이 계열의 percpos 방식으로 네거티브를 캤습니다.
- KURE-v2의 교사 필터: 교사 리랭커가 어떤 네거티브를 정답보다 높게 매기면 그 학습 샘플 전체를 버립니다.
- Qwen3-Embedding: InfoNCE에 마스크 계수를 넣어 상대적 임계값을 넘는 쌍의 유사도를 0으로 처리합니다.
한국어 임베딩의 성능 경쟁은 겉으로는 백본과 파라미터 경쟁처럼 보이지만 모델 카드를 겹쳐 읽으면 “얼마나 깨끗한 정답과 오답을 만들었는가”의 경쟁입니다. KURE-v2는 KURE-v1의 학습 데이터에서 출발했지만 Qwen3-32B로 정답 쌍을 재판정해 가짜 정답을 걸러냈다고 밝혔습니다.7 모델 세대는 데이터 정제에서 갈립니다.
ColBERT와 MaxSim은 무엇이 다를까요
단일 벡터 모델은 문서 전체를 벡터 하나로 요약합니다. 짧은 문장이든 수천 토큰짜리 문서든 같은 크기의 표현 예산을 쓰기 때문에 정보가 많은 장문일수록 세밀한 신호가 압축 과정에서 뭉개집니다.
ColBERT(2020)는 질의와 문서를 각각 인코딩합니다.8 다만 마지막에 하나로 모으지 않고 토큰마다 작은 벡터를 남깁니다.8 둘의 상호작용은 검색 시점에 처음 일어나므로 “후기 상호작용”이라고 부릅니다. 점수 함수는 MaxSim입니다.
s(q, d) = Σ_{i ∈ q} max_{j ∈ d} ( q_i · d_j )
각 질의 토큰이 문서 안에서 가장 잘 맞는 토큰을 찾고 그 최댓값들을 합산합니다.
쉽게 말하면 q_i는 질의의 i번째 토큰 벡터, d_j는 문서의 j번째 토큰 벡터이고 점(·)은 두 벡터의 내적, 곧 유사도입니다. max는 문서 토큰 가운데 가장 큰 값 하나를 고르고 Σ는 그 값을 질의 토큰 전체에 걸쳐 더합니다. 책으로 비유하면 단일 벡터는 책 전체를 한 줄 요약으로 줄여 질문 요약과 비교하고 MaxSim은 질문의 단어마다 책에서 가장 잘 맞는 단어를 찾아 그 점수를 합산합니다.
“근로계약 해지 요건”이라는 질의라면 각 질의 토큰이 긴 법령 안에서 자신과 가장 잘 대응하는 표현을 따로따로 찾아냅니다. 문서를 한 벡터로 요약하는 대신 검색에 중요한 표현을 토큰 단위로 직접 확인하는 셈입니다.
구현에서 눈여겨볼 부분은 이렇습니다.
- 질의 [MASK] 확장: 짧은 질의를 [MASK] 토큰으로 고정 길이까지 채웁니다. KURE-v2와 colbert-ko-en-v2는 64토큰, colbert-ko-0.1b는 32토큰입니다. 모델은 이 [MASK] 위치에 질의를 보강하는 “가상의 검색어” 벡터를 만들어 냅니다. 일종의 학습된 질의 확장입니다.
- 저차원 투영: 768차원 은닉 상태를 128차원으로 투영(행렬 곱으로 벡터를 다른 차원의 벡터로 바꾸는 계산, 여기서는 768→128로 줄임)해 저장 비용을 줄입니다.
- PLAID 엔진: 문서 토큰 벡터를 군집화해 각 토큰을 “중심점 ID + 저비트 잔차”로 저장합니다. 잔차는 원래 벡터와 중심점의 차이입니다. 검색할 때는 질의-중심점 유사도로 후보 문서를 먼저 좁힌 뒤 선택된 문서만 잔차를 복원해 정확한 MaxSim을 계산합니다. 도서관에 비유하면 책의 각 쪽을 비슷한 것끼리 같은 칸으로 분류해 칸 번호와 작은 차이만 적어 두는 방식입니다. 질의와 가까운 칸에 쪽이 많이 걸린 책부터 살펴보므로 모든 책을 펼쳐 볼 필요가 없습니다.
단일 벡터·후기 상호작용·크로스 인코더를 나란히 놓고 비교해 봅니다.
| 구분 | 단일 벡터(Bi-encoder) | 후기 상호작용 | 크로스 인코더(리랭커) |
|---|---|---|---|
| 상호작용 시점 | 없음(벡터 1회 비교) | 인코딩 이후(MaxSim) | 인코딩 이전(질의+문서를 한 입력으로) |
| 문서 사전 인코딩 | 가능 | 가능 | 불가능(질의마다 재계산) |
| 인덱스 크기 | 가장 작음 | 큼(압축 기법으로 상쇄) | 해당 없음 |
| 정밀도 | 압축 손실 있음 | 높음 | 가장 높음 |
| 역할 | 1차 검색 | 1차 검색 또는 재정렬 | 후보 재정렬 |
BGE-M3의 multi-vector 기능도 같은 원리입니다. 다만 전용 ColBERT 모델과 달리 위 BGE-M3 항목의 수식처럼 MaxSim을 질의 토큰 수 N으로 나눠 평균을 냅니다. 또 dense·sparse와 모델 하나를 공유하는 “부가 기능”입니다.
증류, 모델 병합, Matryoshka는 무엇을 더할까요
- 교사 리랭커 증류(KL divergence): 크로스 인코더는 정확하지만 느립니다. 그 점수 분포를 학생 임베딩 모델이 KL 발산(두 확률 분포가 얼마나 다른지 재는 값)으로 따라가게 학습하면 정답/오답의 이진 라벨로는 전달할 수 없는 정보, 즉 “하드 네거티브들 사이의 미세한 순서”가 전해집니다. 채점자가 맞고 틀림만 알려 주는 데서 그치지 않고 보기마다 얼마나 정답에 가까운지 점수를 매겨 주는 셈입니다. E5(크로스 인코더), mLateOn(mxbai-rerank-large-v2), KURE-v2(Qwen3-Reranker-4B)가 이 방법을 씁니다.
- 모델 병합: 서로 다른 체크포인트의 가중치를 섞습니다. multilingual-e5-small-ko-v2는 Model Soup(LM-Cocktail 구현)으로 한국어 특화 모델 60%와 원본 다국어 모델 40%를 가중 평균해 만들었습니다. 한국어 성능을 얻으면서 원본의 일반화 능력을 지킵니다. 이름처럼 두 재료를 한 냄비에 섞어 양쪽 맛을 함께 살리려는 방법입니다. Qwen3-Embedding은 파인튜닝 후 여러 체크포인트를 구면 선형 보간(slerp)으로 병합합니다.
- Matryoshka 표현 학습(MRL): 벡터의 앞쪽 일부 차원만 잘라 써도 성능이 유지되도록 학습합니다. 큰 인형 안에 작은 인형이 겹겹이 든 러시아 인형 마트료시카처럼 긴 벡터의 앞부분이 그 자체로 쓸 만한 작은 벡터가 됩니다. 저장 공간을 줄여야 할 때 앞부분만 잘라 쓰면 됩니다. Qwen3-Embedding과 F2LLM-v2가 지원합니다. 한국어 ColBERT인 colbert-ko-0.1b는 토큰 벡터를 32/64/96/128차원으로 잘라 쓸 수 있게 학습했습니다.
5. KURE는 어떻게 발전했을까요: KoE5 → KURE-v1 → KURE-v2
한마디로: KoE5는 한국어 학습 데이터를 공개했고 KURE-v1은 긴 문서를 받는 백본과 위음성 필터(GIST)를 더했습니다. KURE-v2는 작은 한국어 백본 위에 토큰마다 벡터를 남기는 방식으로 설계를 바꿨습니다.
KURE(Korea University Retrieval Embedding)는 고려대학교 NLP&AI 연구실과 HIAI 연구소가 만든 한국어-영어 검색 임베딩 시리즈입니다.9 계보를 따라가면 한국어 임베딩이 어떤 순서로 진화했는지 압축적으로 드러납니다.
| 모델 | 공개 | 표현 | 파라미터 |
|---|---|---|---|
| KoE5 | 2024.10 | Dense | 560M |
| KURE-v1 | 2024.12 | Dense | 568M |
| KURE-v2 | 2026.08 | Multi-vector | 154M |
| 모델 | 백본 | 학습 데이터 | 손실 |
|---|---|---|---|
| KoE5 | multilingual-e5-large | ko-triplet-v1.0, 약 70만+ 쌍 | CachedMNRL |
| KURE-v1 | BAAI/bge-m3 | 한국어 질의-문서-하드네거티브(5) 약 200만 | CachedGISTEmbed |
| KURE-v2 | skt/A.X-Encoder-base | PFT 약 2,070만 쌍 → SFT 약 303만 삼중항 | InfoNCE → 대조 + KL 증류 |
PFT는 약지도 사전 파인튜닝(pre-fine-tuning), SFT는 지도 파인튜닝(supervised fine-tuning)입니다. 삼중항은 질의·정답·오답을 한 묶음으로 둔 학습 샘플입니다.
KoE5는 왜 데이터부터 만들었을까요
KoE5는 intfloat/multilingual-e5-large를 파인튜닝한 모델입니다. 이 백본은 XLM-RoBERTa-large 기반으로 24층, 1024차원, 최대 512토큰입니다. 학습 데이터인 ko-triplet-v1.0은 오픈 데이터로 구성한 한국어 질의-문서-하드네거티브로, 약 70만 건 이상입니다. 학습에는 CachedMultipleNegativesRankingLoss를 배치 512, 학습률(파라미터를 한 번에 얼마나 크게 고칠지 정하는 값) 1e-5, 1에폭(학습 데이터 전체를 한 바퀴 도는 단위)으로 적용했습니다.1
모델 자체만큼이나 데이터셋 공개가 중요한 기여였습니다. E5를 이어받았기 때문에 query: / passage: 접두어가 필수입니다. 512토큰 제한 때문에 긴 문서에는 불리합니다. 이 한계가 직접적인 계기가 되어 다음 세대는 bge-m3로 백본을 바꿨습니다.
KURE-v1은 무엇을 바꿨을까요
KURE-v1은 백본을 BAAI/bge-m3(568M, 1024차원, 최대 8192토큰)로 바꾸고 한국어 질의-문서-하드네거티브(5개) 약 200만 건으로 파인튜닝했습니다. 학습 설정은 CachedGISTEmbedLoss, 배치 4,096, 학습률 2e-5, 1에폭입니다.10 핵심이 된 선택은 이렇습니다.
- 8192토큰 백본으로 KoE5의 길이 제한을 없앴습니다.
- GIST 손실로 배치 내 위음성을 걸러 “실제 정답을 오답으로 미는” 오류를 줄였습니다. 이 오류는 배치 4,096이라는 큰 배치에서 생기기 쉽습니다.
KURE-v1은 bge-m3의 dense 경로([CLS] 풀링)만 사용하는 단일 벡터 모델로 배포됩니다. 차원·토크나이저·입력 형식이 bge-m3와 같아서 기존 bge-m3 인덱스는 모델 경로만 바꿔 재임베딩하면 그대로 옮겨 갈 수 있습니다.
다만 bge-m3의 sparse·multi-vector 헤드까지 한국어로 재학습했다는 서술은 공식 자료에서 확인되지 않습니다. 커뮤니티에서 KURE-v1의 sparse 출력이 비어 나온다는 질문이 올라온 것도 이와 관련이 있어 보입니다. 하이브리드 검색이 필요하다면 원본 bge-m3의 sparse 출력을 쓰거나 별도 BM25를 두는 편이 안전합니다.
KURE-v2는 어떤 구조일까요
KURE-v2는 다섯 축 가운데 백본, 표현, 풀링, 학습 목표 네 개를 한꺼번에 바꿨습니다.7
- 백본:
skt/A.X-Encoder-base입니다. SKT가 자체 개발한 ModernBERT 구조의 한국어 인코더로, flash attention과 최대 16,384토큰 문맥을 지원합니다. 22층, 은닉 크기 768입니다. 한국어 NLU 벤치마크에서 KoBEST 평균 85.50(klue/roberta-base 76.44, kf-deberta-base 83.25), KLUE 평균 86.10을 기록했습니다.11 - 다층 투영 헤드: 보통의 ColBERT는 768 → 128 선형층 하나를 쓰지만 KURE-v2는 768 → 1536 → 768 → 128 3층 구조를 씁니다. 앞의 두 층에는 잔차 연결(층의 입력을 출력에 그대로 더해 주는 지름길)이 있고 모든 층에 편향(bias)과 비선형 함수가 없습니다. 즉 수학적으로는 여전히 하나의 선형 변환입니다. 선형 변환은 여러 번 이어 붙여도 하나로 합쳐지기 때문입니다. 저자들은 깊게 분해된 매개변수화가 최적화 경로를 바꿔 암묵적 정규화처럼 작동한다고 해석합니다. 이 헤드가 약 480만 파라미터를 더해 총 154M이 됩니다.
- 입출력: 토큰당 128차원이며 정규화 후 MaxSim으로 점수를 냅니다. 질의는 [MASK]로 64토큰까지 확장하고 문서는 추론 시 최대 8,192토큰입니다. 접두어는 없습니다.
KURE-v2는 두 단계로 어떻게 학습했을까요
1단계는 약지도 사전 파인튜닝(PFT)입니다. 제목-본문, 제목-초록, 지시-응답처럼 관련은 있지만 정밀한 검색 라벨은 없는 쌍을 씁니다. 한국어는 AI Hub와 모두의 말뭉치의 제목-본문, KULLM의 지시-응답, 한국어 위키·mC4 추출 쌍, Magpie 방식 합성 쌍을 모아 중복을 제거하니 약 1,035만 쌍이었습니다.
영어는 MS MARCO, NQ, S2ORC 등 실제 질의 중심 12개 코퍼스에서 한국어와 비슷한 규모로 샘플링했습니다. 학습은 전역 배치 16,384, InfoNCE, 1에폭으로 진행했습니다.
이 단계의 배치는 단일 언어로 구성해 배치 하나에 한국어나 영어 한쪽만 넣습니다. 만 개가 넘는 배치 내 오답 중에 다른 언어 문서가 섞여 있으면 모델은 의미 관련성 대신 손쉬운 지름길로 오답을 맞혀 버립니다. “이 문서는 질의와 언어가 다르다”는 지름길입니다. 단일 언어 배치는 이 지름길을 차단합니다.
이 단계까지만 학습한 KURE-v2-unsupervised는 사람의 관련성 라벨 없이 평균 nDCG@10 0.7283을 기록했습니다. KoE5(0.7337)와 거의 같은 수준입니다.
2단계는 지도 파인튜닝(SFT)입니다. 질의당 정답 1개와 하드 네거티브 7개로 구성합니다. 한국어 약 146만 건은 KURE-v1의 학습 데이터에서 출발했습니다. 저자들이 직접 들여다보니 정답으로 묶여 있지만 실제로는 정답이 아닌 쌍(위양성)이 있었습니다. 이런 쌍은 Qwen3-32B로 관련성을 재판정해 걸러냈습니다. 영어 약 150만 건은 하드 네거티브가 포함된 공개 검색 데이터 9종입니다.
하드 네거티브는 NV-Retriever의 percpos 방식으로 캤습니다. 모든 질의-문서 쌍에는 Qwen3-Reranker-4B 점수를 매겨 두 가지로 썼습니다.
- 증류: 학생(KURE-v2)의 MaxSim 점수 분포가 교사의 점수 분포(정답 1 + 오답 7)를 따라가도록 KL 발산으로 학습합니다.
- 위음성 필터: 교사가 어떤 네거티브를 정답보다 높게 매기면 그 네거티브는 실제로 관련 문서일 가능성이 높습니다. 그래서 그 학습 샘플 전체를 제거합니다.
최종 손실은 배치 256의 대조 손실과 KL 증류 손실의 결합입니다. 대조 손실은 배치 안의 모든 문서를 오답 후보로 씁니다. 두 단계 모두 PyLate 라이브러리로 학습했습니다.
6. KURE-v1과 v2는 무엇이 다를까요
한마디로: KURE-v1은 문서를 벡터 하나로, KURE-v2는 토큰마다 벡터를 남겨 비교합니다. v2가 더 작고 점수도 높지만 다중 벡터 인덱스를 따로 갖춰야 합니다.
단일 벡터 모델인 KURE-v1은 문서 전체를 벡터 하나로 압축합니다. 빠르고 인덱스가 작지만 장문에서는 정보 병목이 생깁니다. 후기 상호작용 모델인 KURE-v2는 토큰마다 벡터를 남겨 검색 시점에 맞춥니다. 정밀하지만 벡터가 많습니다. 이 부담은 풀링과 양자화로 상쇄합니다.
| 설계 축 | KURE-v1 | KURE-v2 | 의미 |
|---|---|---|---|
| 백본 | XLM-RoBERTa(bge-m3), 다국어 | ModernBERT(A.X Encoder), 한국어 특화 | 한국어 사전학습 백본 + flash attention |
| 파라미터 | 568M | 154M | 약 3.7배 작음 |
| 표현 | 문서당 1024차원 벡터 1개 | 토큰당 128차원 벡터 | 압축 손실 제거 |
| 풀링 | [CLS] | 없음(MaxSim) | 토큰 단위 매칭 |
| 학습 단계 | 1단계(이미 사전학습된 bge-m3 위 SFT) | 2단계(PFT 2,070만 → SFT 303만) | 검색 표현을 처음부터 구축 |
| 오답 처리 | GIST 가이드 모델 마스킹 | percpos 마이닝 + 교사 필터 + LLM 재판정 | 데이터 정제 강화 |
| 교사 신호 | 없음(가이드는 필터 용도) | Qwen3-Reranker-4B KL 증류 | 오답 간 순서까지 학습 |
| 언어 | 한국어 중심 | 한국어·영어 균형 | 이중언어 검색 |
| 인프라 | 일반 벡터 DB(HNSW) | PLAID, BinaryIVF 등 다중 벡터 인덱스 | 서빙 스택 변경 필요 |
| MTEB(kor, v2) 평균 nDCG@10 | 0.7616 | 0.8160 | +5.4점 |
HNSW는 일반 벡터 DB가 근사 최근접 이웃 검색에 많이 쓰는 그래프 기반 인덱스입니다.
어블레이션으로 보면 무엇이 성능을 만들었을까요
어블레이션(ablation)은 구성 요소를 하나씩 바꾸거나 빼서 각 요소의 기여를 재는 실험입니다. KURE-v2 공개 노트의 어블레이션은 “무엇이 성능을 만들었는가”를 가늠할 직접적인 단서입니다.7 아래 수치는 평균 nDCG@10에 100을 곱한 값입니다.
| 비교 | 결과 | 해석 |
|---|---|---|
| PFT 직후 헤드 | 단일 헤드 73.46 · 다층 헤드 72.83 | 약지도 단계에서는 단일 헤드가 근소하게 앞섭니다. |
| SFT 후 헤드 | 단일 헤드 80.81 · 다층 헤드 81.62 | SFT를 거치면 순위가 뒤집힙니다. 다층 헤드의 이점은 리랭커 증류와 결합될 때 드러납니다. |
| SFT 손실 | 대조 손실만 78.63 · KL 증류만 80.66 · 둘 다 81.62 | 두 손실은 중복이 아닙니다. 대조 손실은 넓은 후보 공간의 전역적 구분을, 증류는 어려운 후보들 사이의 정밀한 순서를 담당합니다. |
여기서 끌어낼 결론은 이렇습니다.
- 후기 상호작용에서는 파라미터가 결정적 요인이 아닙니다. 154M의 KURE-v2가 점수가 가장 높은 단일 벡터 모델(7.6B)을 2.33점, 27B 모델을 4.93점 앞섭니다.
- 이득은 장문에 집중됩니다. MLDR(장문 검색)에서 KURE-v2는 71.59, 최고 단일 벡터 모델은 51.57로 20점 차이입니다.
- 약지도 단계만으로 최종 점수의 상당 부분에 도달합니다. PFT만으로 72.83이고 SFT가 8.77점을 더합니다.
작은 모델이 서빙에서 왜 빠를까요
후기 상호작용은 저장할 벡터가 많다는 약점이 있습니다. KURE-v2 공개 자료는 서빙 실험으로 이 약점을 정량적으로 상쇄해 보였습니다. 측정 조건은 A100 80GB 1대, 배치 1이며 질의 인코딩을 포함한 종단 측정을 9개 한국어 코퍼스에 대해 합산했습니다.7 QPS는 초당 처리 질의 수입니다. 클수록 같은 장비로 더 많은 요청을 받을 수 있습니다.
| 구성 | 전체 인덱스 | nDCG@10 | QPS |
|---|---|---|---|
| PLAID(4비트 잔차) | 24.2 GB | 81.36 | 44 |
| PLAID + 토큰 풀링 ×2 | 12.5 GB | 81.45 | 49 |
| PLAID + 토큰 풀링 ×3 | 8.4 GB | 81.24 | 50 |
| 비대칭 이진 양자화 | 5.0 GB | 약 80.3 | — |
| 풀링 ×3 + 비대칭 이진 | 1.7 GB | 79.57 | — |
| 참고: 단일 벡터 HNSW 5종(fp16) | 7.0–25.4 GB | 최고 79.10 | 4B–8B 모델 약 25 |
표에 나온 압축·검색 기법은 이렇게 작동합니다.
- 계층적 토큰 풀링: 한 문서 안의 비슷한 토큰 벡터들을 Ward 연결 군집화(묶었을 때 흩어짐이 가장 적게 늘어나는 쌍부터 차례로 합치는 방법)로 묶어 평균 벡터로 대체합니다. 문서 토큰만 줄이고 MaxSim 계산식은 그대로입니다. 같은 말을 되풀이하는 메모 여러 줄을 한 줄로 합쳐 적는 것과 비슷합니다. 저장할 토큰 벡터 수가 줄어 인덱스가 작아집니다.
- 비대칭 이진 양자화: 문서 토큰 벡터의 각 차원을 부호에 따라 ±1, 즉 1비트로 저장합니다. 숫자마다 크기는 버리고 부호(+ 또는 −)만 남기는 셈입니다. 질의 벡터는 bf16으로 유지합니다. 질의까지 양자화할 때 생기는 손실을 피하면서 저장량을 줄입니다.
- BinaryIVF: 1비트 토큰 벡터를 역색인 리스트로 나누고 해밍 거리(XOR + popcount, 두 비트열에서 값이 다른 자리의 수)로 후보 문서를 뽑습니다. 그다음 상위 1,000개만 정확한 비대칭 MaxSim으로 재정렬합니다. 150만 문서 MIRACL에서 1비트 전수 스캔의 p95 지연(요청의 95%가 이 시간 안에 끝나는 응답 시간)은 156ms였습니다. BinaryIVF를 쓰면 2.2GB 인덱스로 38ms까지 내려가 4B–8B 단일 벡터 모델의 p95(42ms)보다 짧아집니다.
병목은 정작 질의 인코딩에서 생겼습니다. 4B–8B 단일 벡터 모델은 질의 인코딩에만 38–40ms를 쓰기 때문에 HNSW 검색이 1–2ms여도 처리량이 약 25 QPS에 묶입니다. 검색 자체는 빠른데 질문을 벡터로 바꾸는 입구에서 줄이 길어지는 셈입니다. KURE-v2는 질의를 13.8ms에 인코딩해 MUVERA를 제외한 모든 구성에서 44–57 QPS를 냅니다. MUVERA는 토큰 벡터들을 고정 길이 벡터 하나로 바꿔 단일 벡터 인덱스로 검색하는 방식입니다.
KURE-v2는 모델 크기를 키우는 대신 문서를 토큰 단위로 덜 압축해 표현하고 토큰 풀링과 양자화로 저장량을 줄였습니다. 한국어 백본, 토큰 단위 표현, 정제된 데이터와 교사 증류, 압축·후보 생성 인덱스의 조합이 7.6B–27B 단일 벡터 모델을 품질과 처리량 양쪽에서 앞섭니다. 그 대가로 서빙 스택을 바꿔야 합니다. 일반 벡터 DB에 벡터 하나를 넣는 KURE-v1과 달리, KURE-v2는 PLAID 같은 다중 벡터 인덱스가 필요합니다.
7. 다른 한국어 임베딩 모델은 무엇이 있을까요
한마디로: KURE 말고도 문장 유사도용 1세대 모델, 한국어로 파인튜닝한 다국어 인코더, 한국어 ColBERT, 다국어 후기 상호작용 모델, 디코더 대형 모델, 상용 API가 있습니다. 계열마다 강한 작업이 다릅니다.
KURE가 전부는 아닙니다. 한국어 임베딩 생태계를 여섯 갈래로 나누고 각 모델을 3절의 다섯 축(백본·표현·풀링·학습 목표·입력 형식)으로 읽어 보겠습니다.
1세대 SBERT·SimCSE 계열은 무엇에 강할까요
한국어로 사전학습된 BERT 계열(110M 규모) 위에, 문장 쌍 데이터(NLI·STS)로 문장 임베딩을 학습한 모델들입니다. RAG 시대 이전의 주 용도는 의미적 텍스트 유사도(STS), 곧 두 문장이 얼마나 비슷한지 점수를 매기는 일이었습니다.
snunlp/KR-SBERT-V40K-klueNLI-augSTS
Dense · 서울대 계산언어학 연구실 · KR-BERT-V40K(BERT) · 768차원 · 최대 128토큰 · 평균 풀링 · 접두어 없음12
- 백본: 서울대가 만든 한국어 BERT인 KR-BERT의 4만 어휘(V40K) 변형입니다. WordPiece로 토큰화합니다.
- 학습: 두 문장 벡터를 분류기에 넣는 샴(siamese) 구조로 KLUE-NLI를 학습한 뒤 증강된 KorSTS로 다시 파인튜닝했습니다. KorSTS 증강에는 Thakur 등(2021)의 in-domain 전략(AugSBERT)을 썼습니다. 크로스 인코더로 새 문장 쌍에 유사도 라벨을 붙여 데이터를 불리는 방식입니다.
- 특징: 최대 길이 128토큰으로, 문장 단위 작업에 맞춰진 모델입니다. 문서 분류 튜토리얼에서 정확도 0.8628을 보고했습니다.
BM-K/KoSimCSE-roberta (및 -bert, -multitask)
Dense · KLUE-RoBERTa-base / KLUE-BERT-base · 768차원 · [CLS] 벡터 사용 · 접두어 없음13
- 학습: 4절에서 본 SimCSE를 한국어로 옮겼습니다. 지도 설정은 한국어로 번역된 SNLI·MNLI(KorNLI)로, 비지도 설정은 위키 말뭉치로 학습합니다. 검증과 평가는 KorSTS로 합니다.
- 성능(KorSTS): 평균 기준 KoSBERT 80.39 → KoSimCSE-RoBERTa 83.65 → KoSimCSE-RoBERTa-multitask 85.77입니다. 같은 저장소의 KoSentenceT5(77.83), KoSentenceBART(77.14)보다 높았습니다.
- 특징: 같은 저장소는 Sentence-BERT, SimCSE, Sentence-T5, DiffCSE 등 여러 한국어 문장 임베딩 구조를 비교 가능한 환경으로 제공해 한국어 문장 임베딩 연구의 기준점 역할을 했습니다.
jhgan/ko-sroberta-multitask · upskyy/kf-deberta-multitask
Dense · RoBERTa / DeBERTa-v2 · 768차원 · 평균 풀링 · 접두어 없음
- ko-sroberta-multitask:
klue/roberta-base를 KorNLI·KorSTS로 멀티태스크 학습한 SBERT입니다. 오랫동안 “한국어 임베딩의 기본값”처럼 쓰였습니다. - kf-deberta-multitask: 백본은 카카오뱅크와 에프앤가이드가 만든 KF-DeBERTa입니다. DeBERTa-v2 구조로 범용 말뭉치와 금융 도메인 말뭉치를 함께 학습했고 KLUE 평균 82.83으로 KLUE-RoBERTa-large(82.43)보다 높았습니다. 여기에 KorSTS·KorNLI를 멀티태스크로 학습하면서 NLI에는
MultipleNegativesRankingLoss(scale 20), STS에는CosineSimilarityLoss를 썼습니다. KorSTS 코사인 스피어만은 86.25입니다.14
1세대의 한계는 검색에서 드러납니다. STS는 비슷한 길이의 두 문장을 비교하지만 검색은 짧은 질의와 긴 문서라는 비대칭 쌍을 다룹니다. KURE-v1 모델 카드의 한국어 검색 벤치마크(8개 데이터셋 평균)에서 ko-sroberta-multitask의 Top-10 NDCG는 0.4869로 KURE-v1(0.6947)과 20점 넘게 차이 났습니다.10
2024년 AutoRAG 한국어 벤치마크(Top-1 기준)에서도 KoSimCSE-roberta 0.4298, ko-sroberta-multitask 0.4211로, 같은 표의 BGE-m3-ko(0.7456)와 큰 차이를 보였습니다.
그래도 문장 유사도, FAQ 매칭, 중복 질문 탐지처럼 짧은 대칭 쌍을 다루는 작업에서는 여전히 가볍고 빠른 선택지입니다.
다국어 인코더를 한국어로 파인튜닝한 모델은 무엇이 다를까요
현재 한국어 RAG 현장에서 가장 많이 쓰이는 갈래입니다. 대부분 XLM-RoBERTa 구조의 568M급 다국어 인코더를 가져와 한국어 검색 데이터로 추가 학습합니다. 구조가 같아서 겉으로는 거의 구분되지 않습니다. 차이는 전부 어떤 데이터와 손실, 입력 형식으로 학습했는지에서 생깁니다.
dragonkue/BGE-m3-ko
Dense · bge-m3(XLM-RoBERTa) · 568M · 1024차원 · 8192토큰 · [CLS] · 접두어 없음5
- 동기: 모델 카드는 bge-m3가 중국어·영어 외 언어 학습이 부족해 한국어 최적화를 위한 추가 학습이 필요했다고 설명합니다. 4절에서 본 대로 bge-m3의 파인튜닝 데이터에서 다국어 몫은 8.9만 건으로 작습니다.
- 성능: 2024년 AutoRAG 한국어 벤치마크 Top-1에서 0.7456으로 같은 표의 KoE5(0.7018), bge-m3(0.6578), Upstage Embedding(0.6579), OpenAI text-embedding-3-large(0.6053)를 앞섰습니다. MTEB(kor, v2) 평균은 0.7547입니다.
- KURE-v1과의 차이: 백본과 출력 형식은 같고 학습 데이터와 손실 함수(KURE-v1은 GIST)가 다릅니다. 태스크별로 보면 BGE-m3-ko는 MrTidy(0.6099)와 MIRACL(0.6833)에서, KURE-v1은 장문 MLDR(0.4637 대 0.3899)에서 앞섭니다.
dragonkue/snowflake-arctic-embed-l-v2.0-ko
Dense · Snowflake arctic-embed-l-v2.0(XLM-RoBERTa 구조) · 568M · 1024차원 · 8192토큰 · [CLS] · 질의에만 query: 접두어15
- 데이터: AI Hub의 기계독해 데이터를 검색용으로 재구성했습니다. 행정 문서, 일반 기계독해, 뉴스 기사, 도서 자료, 숫자 연산, 금융·법률 문서가 들어갑니다. 모델 카드는 학습 데이터를 “clustered datasets”로 표기합니다.
- 입력 형식: 질의에만
query:접두어를 붙이고 문서에는 붙이지 않는 비대칭 형식입니다. sentence-transformers에서는prompt_name="query"로 처리합니다. 반정밀도 추론 시에는 bf16 사용을 권장합니다. - 성능: MTEB(kor, v2) 평균 0.7653으로 568M급 단일 벡터 모델 중 최상위입니다. 특히 AutoRAG(PDF 파싱 문서 검색)에서 0.9093으로 단일 벡터 모델 중 가장 높습니다. 행정·금융·법률 문서 데이터로 학습한 효과로 읽힙니다.
telepix/PIXIE-Rune-v1.5
Dense · 텔레픽스 · XLM-RoBERTa · 약 0.5B · 1024차원 · 6144토큰 · [CLS] · 질의에만 query: 접두어16
- 정체성: 위성 데이터 기업 텔레픽스가 만든 한국어·영어 검색 임베딩입니다. PIXIE는 TelePIX Intelligent Embedding의 약자로, 항공우주 도메인 검색에 특화됐습니다.
- 도메인 평가: STELLA는 NASA 기술 보고서 서버(NTRS) 문서로 만든 항공우주 검색 벤치마크입니다. 여기서 0.6559로 bge-m3(0.5056)와 snowflake-arctic-embed-l-v2.0(0.5448)을 크게 앞섭니다. STELLA는 정확한 기술 용어로 묻는 질의와 용어 없이 개념으로 묻는 질의를 함께 담아서 어휘 매칭과 의미 매칭을 따로 잽니다.
- 범용 성능: MTEB(kor, v2) 평균 0.7618로 KURE-v1(0.7616)과 사실상 같습니다. 도메인 특화와 범용 한국어 성능을 함께 챙긴 사례입니다. 같은 계열에 0.6B 규모의 PIXIE-Spell도 있습니다.
dragonkue/multilingual-e5-small-ko-v2
Dense · multilingual-e5-small(BERT 구조) · 384차원 · 512토큰 · 평균 풀링 · query: / passage: 필수17
- 모델 병합: 한국어 특화 버전(
multilingual-e5-small-ko)과 원본multilingual-e5-small을 6:4로 가중 평균한 Model Soup입니다. 비율은 실험으로 정했습니다. 한국어로 파인튜닝하면서 잃기 쉬운 원본의 일반화 능력을 병합으로 되찾는 전략입니다. - 위치: 파라미터가 두 배 이상인 multilingual-e5-base보다 한국어 벤치마크에서 높다고 보고합니다. 데모나 경량 애플리케이션용입니다. 모델 카드는 리랭커(bge-reranker-v2-m3-ko 등)와 결합할 것을 권합니다.
“한국어로 파인튜닝하면 무조건 좋아진다”는 생각은 맞지 않습니다. KURE-v1 모델 카드의 벤치마크에서 upskyy/bge-m3-korean은 원본 bge-m3보다 낮았습니다(Top-10 NDCG 0.6026 대 0.6872).10 또 KURE-v1과 BGE-m3-ko는 원본 bge-m3보다 평균은 높지만 위키 기반 MrTidy에서는 원본(0.6471)보다 낮습니다(0.5909, 0.6099). 파인튜닝은 학습 데이터 분포 쪽으로 모델을 당기고 그 대가로 다른 영역을 잃을 수 있습니다. e5-small-ko-v2의 Model Soup은 이 문제에 대한 하나의 처방입니다.
한국어 ColBERT 계열은 KURE-v2와 무엇이 같을까요
한국어 후기 상호작용 모델들은 모두 같은 백본, 즉 skt/A.X-Encoder-base(ModernBERT) 위에 있고 같은 학습 라이브러리(PyLate)도 씁니다. 그래서 이들끼리의 점수 차이는 주로 데이터, 학습 레시피, 투영 헤드 설계의 차이로 읽을 수 있습니다.
| 모델 | 파라미터 | 투영 헤드 | 문서/질의 길이 |
|---|---|---|---|
| yjoonjang/colbert-ko-v1 | 149M | — | — |
| dragonkue/colbert-ko-0.1b | 149M | — | 2,048 / 32 |
| yjoonjang/colbert-ko-en-v2 | 149M | 단일 선형 768→128 | 8,192 / 64 |
| nlpai-lab/KURE-v2 | 154M | 3층 768→1536→768→128 | 8,192 / 64 |
| 모델 | 특징 | MTEB(kor) 평균 | MLDR |
|---|---|---|---|
| yjoonjang/colbert-ko-v1 | 초기 한국어 ColBERT | 0.6282 | 0.2214 |
| dragonkue/colbert-ko-0.1b | Matryoshka 32·64·96·128차원 | 0.6776 | 0.2872 |
| yjoonjang/colbert-ko-en-v2 | 한국어·영어 이중언어 | 0.8063 | 0.6992 |
| nlpai-lab/KURE-v2 | 교사 증류 + LLM 정제 데이터 | 0.8160 | 0.7159 |
colbert-ko-0.1b는 문서 2,048토큰, 질의 32토큰으로 학습됐습니다. 토큰 벡터를 32·64·96·128차원 중 골라 쓸 수 있는 Matryoshka 학습을 적용했습니다. 저장 공간을 더 줄여야 하는 환경에 맞는 설계입니다. AutoRAG에서 0.9700으로 전 모델 중 최고지만 법률(LawIR 0.4475)과 장문(MLDR 0.2872)에서는 약합니다.18
colbert-ko-en-v2는 KURE-v2와 같은 백본, 같은 길이 설정(8,192/64)에 단일 선형 헤드를 씁니다. KURE 저자 중 한 명(장영준)이 공개한 모델로, KURE-v2와 거의 같은 수준(0.8063)입니다.19 6절의 어블레이션(단일 헤드 80.81 대 다층 헤드 81.62)과 함께 보면 두 모델의 차이 상당 부분이 투영 헤드 설계에서 설명됩니다.
v1 → v2의 도약은 같은 백본·같은 크기에서 0.63 → 0.81로, 18점입니다. 두 모델의 크기가 같으므로 이 차이는 대규모 약지도 사전학습, 하드 네거티브, 교사 증류, 긴 학습 문맥에서 나왔습니다. 특히 MLDR이 0.22 → 0.70으로 뛴 것은 학습 시 문서 길이(2,048 → 8,192)의 영향으로 보입니다.
한국어를 배우지 않은 다국어 후기 상호작용 모델은 어떨까요
lightonai/mLateOn
Multi-vector · LightOn · mmBERT-base(ModernBERT) · 307M · 토큰당 128차원 · 8192토큰 · MaxSim20
- 학습 언어: 학습 언어에 한국어가 없습니다. 영어·프랑스어·독일어·이탈리아어·스페인어·포르투갈어·스웨덴어·노르웨이어·아랍어 9개 언어로만 검색 학습을 했습니다. 검증된 영어 데이터를 8개 언어로 기계번역하는 translate-train 방식과, 교차 언어 쌍 2.2억 개를 더한 정렬 학습을 썼습니다.
- 데이터 규모: 사전학습 28억 쌍(다국어 21.6억 + 영어 6.65억), 파인튜닝 1,630만 샘플입니다. 하드 네거티브는 NV-Retriever 방식으로 정답 관련도의 95%를 넘는 후보를 버리고 샘플당 상위 10개를 남겼습니다. 증류 점수는 mxbai-rerank-large-v2 크로스 인코더로 붙였습니다.
- 투영 헤드: 768 → 1536 → 768 → 128이며 앞 두 층에 잔차 연결이 있고 편향·활성화 함수가 없습니다. KURE-v2가 쓴 다층 헤드와 같은 형태입니다.
- 한국어 성능: 그럼에도 MTEB(kor, v2) 평균 0.7906으로 한국어로 학습한 568M 단일 벡터 모델들(0.75–0.77)과 7.6B Qwen3-Embedding-8B(0.7826)를 앞섭니다. MLDR은 0.7005로 단일 벡터 최고(0.5157)를 크게 넘습니다.
LightOn은 같은 레시피를 단일 벡터 모델(mDenseOn)에 적용했을 때는 학습 언어 밖으로 일반화가 제한적이었고 후기 상호작용 구조에서는 그 제한이 풀렸다고 보고했습니다.21 실제로 전체 MIRACL 점수가 학습 언어만 뽑은 점수보다 오히려 높습니다(67.04 대 65.61). 한국어 결과는 이 주장을 독립적으로 뒷받침하는 사례입니다.
perplexity-ai/pplx-embed-v1-late-0.6b
Multi-vector · Perplexity · 596M · 토큰당 128차원 · MaxSim22
- 학습: 단일 벡터 모델 pplx-embed-v1-0.6b를 출발점으로, 토큰 단위 MaxSim을 최적화하는 대조 손실로 이어서 학습했습니다. 128차원은 MaxSim 전용 커널의 빠른 경로에 맞춘 선택입니다.
- 한국어 성능: MTEB(kor, v2) 평균 0.7381입니다. 법률(LawIR 0.7285)과 Ko-StrategyQA(0.7973)는 좋지만 MLDR이 0.2816으로 낮습니다. 후기 상호작용이라는 구조만으로 장문 성능이 보장되지는 않는다는 반례입니다. 학습 시 문서 길이와 장문 데이터가 함께 받쳐 줘야 합니다.
디코더 기반 대형 임베딩은 어떻게 동작할까요
최근의 큰 흐름은 수십억 파라미터 LLM을 임베딩 모델로 바꾸는 것입니다. 동작 방식이 인코더와 근본적으로 다른데 어텐션과 질의 형식, 학습 데이터에서 차이가 납니다.
- 인과적 어텐션: 각 토큰은 자기보다 앞의 토큰만 보므로 문장 끝에 [EOS] 토큰을 붙이고 그 위치의 마지막 층 은닉 상태를 문장 벡터로 씁니다(마지막 토큰 풀링). 앞 문맥 전체가 이 위치로 모이기 때문입니다.
- 지시문 기반 질의: 질의 앞에 “웹 검색 질의가 주어졌을 때 답이 되는 문단을 찾아라” 같은 작업 지시문을 붙이고 문서에는 붙이지 않습니다. 같은 모델이 지시문만 바꿔 검색, 분류, 군집화 등 다른 작업에 맞는 벡터를 만듭니다.
- LLM이 만든 학습 데이터: 백본 LLM 자신이 합성 학습 데이터를 대량으로 생성합니다.
Qwen/Qwen3-Embedding (0.6B / 4B / 8B)
Decoder · Alibaba Qwen · 차원 1024 / 2560 / 4096 · 32,768토큰 · EOS 풀링 · 지시문 · MRL 지원23
- 1단계: Qwen3-32B로 생성한 다중 작업 약지도 합성 쌍 약 1억 5천만 개로 대조 학습합니다.
- 2단계: 실제 지도 데이터와, 코사인 유사도 0.7 초과로 걸러낸 고품질 합성 데이터를 합친 약 1,200만 쌍으로 파인튜닝합니다. 손실은 위음성을 막는 마스크 계수가 들어간 개선된 InfoNCE입니다.
- 3단계: 여러 체크포인트를 slerp로 병합해 견고성과 일반화를 높입니다.
한국어에서는 MTEB(kor, v2) 평균이 8B 0.7826, 4B 0.7737입니다. 법률(LawIR 0.8171)과 Ko-StrategyQA(0.8363)처럼 추론이 필요한 질의에서 강합니다.
sionic-ai/comsat-embed-ko-8b-preview
Decoder · 사이오닉 AI · 7.6B · 4096차원 · 8192토큰 · 마지막 토큰 풀링 + L2 정규화 · 질의에만 지시문24
- 학습: 100만 건 이상의 한국어 검색 지향 데이터로 학습한 한국어 특화 디코더 임베딩입니다. 모델 카드는 베이스 모델을 명시하지 않습니다. 다만 7.6B 파라미터·4096차원·마지막 토큰 풀링·
Instruct: … Query: …형식은 Qwen3-Embedding-8B와 같은 사양입니다. - 성능: MTEB(kor, v2) 평균 0.7927로 단일 벡터 모델 중 1위입니다. PublicHealthQA 0.8871, Belebele 0.9853, Ko-StrategyQA 0.8394, MrTidy 0.6253 등 고르게 높습니다. Qwen3-Embedding-8B 대비 약 1점 향상이 한국어 특화 학습의 몫입니다.
microsoft/harrier-oss-v1-27b · codefuse-ai/F2LLM-v2-8B
Decoder · 다국어 범용 · 한국어를 지원 언어로 포함
- Harrier-OSS-v1-27b(마이크로소프트): 27B 디코더로, 마지막 토큰 풀링 + L2 정규화를 씁니다. 임베딩은 5,376차원, 문맥은 32,768토큰입니다. 대규모 다국어 데이터 혼합으로 대조 학습했습니다. 한국어 평균은 0.7667이지만 법률 검색 LawIR에서 0.8737로 전 모델 1위입니다.25
- F2LLM-v2-8B(CodeFuse): 공개 고품질 데이터 6천만 건으로 학습했습니다. 200개 이상 언어를 지원하며 중·저자원 언어를 강조합니다. Matryoshka 학습, EOS 위치 풀링, 4096차원입니다. 한국어 평균은 0.7638이고 공중보건 PublicHealthQA에서 0.9380으로 전 모델 1위입니다.26
상용 API 임베딩은 어떻게 쓸까요
Upstage Solar Embedding-1-large
API · 업스테이지 · 질의용·문서용 두 모델이 하나의 벡터 공간 공유27
- 비대칭 이중 인코더:
solar-embedding-1-large-query와solar-embedding-1-large-passage두 모델을 따로 제공합니다. 같은 인코더에 접두어를 붙여 역할을 나누는 E5와 달리, 아예 질의용과 문서용 모델을 분리했습니다. 문서는 passage 모델로 색인하고 질의는 query 모델로 인코딩해야 합니다. - 성능: 2024년 출시 당시 영어·한국어·일본어 모두에서 OpenAI text-embedding-3-large보다 높다고 발표했습니다. 이전 모델 대비 Ko-MIRACL 7.84점 향상도 밝혔습니다. comsat 모델 카드의 MTEB 한국어 검색 표에서는 평균 0.7674, AutoRAG 0.8833, SQuADKor 0.9521을 기록했습니다(다른 모델들과 측정 출처가 다를 수 있습니다).24
참고로 OpenAI text-embedding-3-large는 KURE-v1 모델 카드의 한국어 검색 평가에서 Top-10 NDCG 0.6167이었습니다.10 KURE-v1(0.6947), bge-m3(0.6872)는 물론 multilingual-e5-large(0.6637)보다도 낮습니다. “유명한 API가 한국어에서도 최선”이라는 가정은 성립하지 않습니다.
모델들을 한눈에 비교하면 어떨까요
아래 두 표는 같은 모델을 구조와 학습 방식으로 나눠 정리한 것입니다. 유형의 D는 단일 벡터(Dense), MV는 다중 벡터(Multi-vector), Dec는 디코더 기반입니다. “~”가 붙은 파라미터는 백본 규모에서 추정한 근사치입니다. “—”는 공식 자료에서 확인되지 않는 항목이고 “비공개”는 제공사가 밝히지 않은 항목입니다. 핵심 학습 열의 MNRL은 MultipleNegativesRankingLoss, CosSim은 CosineSimilarityLoss의 줄임말입니다. Cached가 붙은 손실은 4절의 Gradient Cache를 적용한 손실입니다.
| 모델 | 유형 · 파라미터 | 백본 | 차원 · 문맥 |
|---|---|---|---|
| 1세대 SBERT·SimCSE | |||
| KR-SBERT-V40K | D · ~110M | KR-BERT | 768 · 128 |
| KoSimCSE-roberta | D · ~110M | KLUE-RoBERTa | 768 · 512 |
| ko-sroberta-multitask | D · ~110M | KLUE-RoBERTa | 768 · 512 |
| kf-deberta-multitask | D · ~180M | KF-DeBERTa | 768 · — |
| 다국어 인코더 + 한국어 파인튜닝 | |||
| KoE5 | D · 560M | mE5-large | 1024 · 512 |
| KURE-v1 | D · 568M | bge-m3 | 1024 · 8192 |
| BGE-m3-ko | D · 568M | bge-m3 | 1024 · 8192 |
| snowflake-arctic-ko | D · 568M | arctic-l-v2.0 | 1024 · 8192 |
| PIXIE-Rune-v1.5 | D · ~0.5B | XLM-R | 1024 · 6144 |
| e5-small-ko-v2 | D · ~118M | mE5-small | 384 · 512 |
| 후기 상호작용 | |||
| colbert-ko-0.1b | MV · 149M | A.X Encoder | 32–128/토큰 · 2048 |
| colbert-ko-en-v2 | MV · 149M | A.X Encoder | 128/토큰 · 8192 |
| KURE-v2 | MV · 154M | A.X Encoder | 128/토큰 · 8192 |
| mLateOn | MV · 307M | mmBERT | 128/토큰 · 8192 |
| pplx-embed-v1-late | MV · 596M | pplx-embed-v1 | 128/토큰 · — |
| 디코더 기반 | |||
| Qwen3-Embedding-8B | Dec · 7.6B | Qwen3 | 4096 · 32k |
| comsat-embed-ko-8b | Dec · 7.6B | 비공개 | 4096 · 8192 |
| Harrier-OSS-v1-27b | Dec · 27B | — | 5376 · 32k |
| F2LLM-v2-8B | Dec · 7.6B | — | 4096 · — |
| 상용 API | |||
| Solar Embedding-1-large | API · 비공개 | 비공개 | — · — |
| 모델 | 풀링 | 입력 형식 | 핵심 학습 |
|---|---|---|---|
| 1세대 SBERT·SimCSE | |||
| KR-SBERT-V40K | 평균 | 없음 | NLI + 증강 STS |
| KoSimCSE-roberta | [CLS] | 없음 | SimCSE(KorNLI) |
| ko-sroberta-multitask | 평균 | 없음 | NLI+STS 멀티태스크 |
| kf-deberta-multitask | 평균 | 없음 | MNRL + CosSim |
| 다국어 인코더 + 한국어 파인튜닝 | |||
| KoE5 | 평균 | query:/passage: |
CachedMNRL |
| KURE-v1 | [CLS] | 없음 | CachedGIST |
| BGE-m3-ko | [CLS] | 없음 | 한국어 추가학습 |
| snowflake-arctic-ko | [CLS] | 질의만 query: |
AI Hub MRC |
| PIXIE-Rune-v1.5 | [CLS] | 질의만 query: |
항공우주 특화 |
| e5-small-ko-v2 | 평균 | query:/passage: |
Model Soup 6:4 |
| 후기 상호작용 | |||
| colbert-ko-0.1b | MaxSim | 없음 | Matryoshka |
| colbert-ko-en-v2 | MaxSim | 없음 | 한·영 이중언어 |
| KURE-v2 | MaxSim | 없음 | PFT→SFT+KL 증류 |
| mLateOn | MaxSim | 없음 | translate-train, 한국어 미학습 |
| pplx-embed-v1-late | MaxSim | — | 단일 벡터 → MaxSim 연속학습 |
| 디코더 기반 | |||
| Qwen3-Embedding-8B | 마지막 토큰 | 지시문 | 합성 1.5억 → 1,200만 → slerp |
| comsat-embed-ko-8b | 마지막 토큰 | 질의만 지시문 | 한국어 100만+ |
| Harrier-OSS-v1-27b | 마지막 토큰 | 지시문 | 다국어 대조학습 |
| F2LLM-v2-8B | 마지막 토큰 | 지시문 | 공개 6천만, MRL |
| 상용 API | |||
| Solar Embedding-1-large | — | 질의/문서 모델 분리 | — |
8. 태스크별 벤치마크는 무엇을 보여 줄까요
한마디로: 평균 점수가 비슷해도 태스크별로 보면 강약이 갈립니다. 장문은 긴 문서로 학습한 후기 상호작용 모델이, PDF 문서는 한국어 ColBERT 계열이, 법률·의료·추론형 질의는 디코더 대형 모델이 강합니다.
평균 점수 하나로는 모델의 성격이 보이지 않습니다. 아래에 MTEB(kor, v2) 한국어 검색 9개 태스크의 nDCG@10을 모았습니다.28 후기 상호작용 모델은 mteb와 PLAID 검색으로 직접 측정한 점수이고 단일 벡터 모델은 공식 MTEB 결과 저장소의 점수입니다. 표의 점수는 colbert-ko-en-v2 모델 카드를 기준으로 합니다.19 Belebele는 한국어 질의-한국어 코퍼스 부분집합입니다.
넓은 표를 태스크 성격별로 네 개로 나눴습니다. 각 열의 최고값은 굵게 표시했습니다. 표의 숫자는 1에 가까울수록 정답 문서를 상위 순위에 잘 올려놓았다는 뜻입니다.
평균과 문서 형식·장문 태스크
| 모델 | 평균 | AutoRAG | MLDR |
|---|---|---|---|
| 후기 상호작용 | |||
| KURE-v2 | 0.8160 | — | 0.7159 |
| colbert-ko-en-v2 | 0.8063 | 0.9686 | 0.6992 |
| mLateOn | 0.7906 | 0.9392 | 0.7005 |
| pplx-embed-v1-late | 0.7381 | 0.8557 | 0.2816 |
| colbert-ko-0.1b | 0.6776 | 0.9700 | 0.2872 |
| 단일 벡터 | |||
| comsat-embed-ko-8b | 0.7927 | 0.8518 | 0.5157 |
| Qwen3-Embedding-8B | 0.7826 | 0.8276 | 0.5046 |
| Qwen3-Embedding-4B | 0.7737 | 0.8431 | 0.5022 |
| Harrier-OSS-v1-27b | 0.7667 | 0.8176 | 0.4046 |
| snowflake-arctic-ko | 0.7653 | 0.9093 | 0.4304 |
| F2LLM-v2-8B | 0.7638 | 0.7678 | 0.4047 |
| PIXIE-Rune-v1.5 | 0.7618 | 0.8927 | 0.4482 |
| KURE-v1 | 0.7616 | 0.8708 | 0.4637 |
| BGE-m3-ko | 0.7547 | 0.8738 | 0.3899 |
| KoE5 | 0.7337 | 0.8434 | 0.3015 |
KURE-v2 공개 노트에는 태스크별 점수 중 평균과 MLDR만 나옵니다. 나머지 태스크 점수는 공식 MTEB 리더보드에서 볼 수 있으므로 아래 세 표에서는 KURE-v2를 뺐습니다.
지식·추론 태스크
| 모델 | LawIR | PublicHealthQA | Ko-StrategyQA |
|---|---|---|---|
| 후기 상호작용 | |||
| colbert-ko-en-v2 | 0.7181 | 0.8222 | 0.7940 |
| mLateOn | 0.6431 | 0.8061 | 0.7905 |
| pplx-embed-v1-late | 0.7285 | 0.8089 | 0.7973 |
| colbert-ko-0.1b | 0.4475 | 0.7482 | 0.7364 |
| 단일 벡터 | |||
| comsat-embed-ko-8b | 0.8164 | 0.8871 | 0.8394 |
| Qwen3-Embedding-8B | 0.8171 | 0.8721 | 0.8363 |
| Qwen3-Embedding-4B | 0.7769 | 0.8693 | 0.8270 |
| Harrier-OSS-v1-27b | 0.8737 | 0.8971 | 0.8361 |
| snowflake-arctic-ko | 0.7735 | 0.8337 | 0.8050 |
| F2LLM-v2-8B | 0.8405 | 0.9380 | 0.8371 |
| PIXIE-Rune-v1.5 | 0.7705 | 0.8426 | 0.8064 |
| KURE-v1 | 0.7426 | 0.8193 | 0.7999 |
| BGE-m3-ko | 0.7322 | 0.8155 | 0.7959 |
| KoE5 | 0.7756 | 0.8351 | 0.8001 |
위키 기반 대규모 코퍼스 태스크
| 모델 | MrTidy | MIRACL |
|---|---|---|
| 후기 상호작용 | ||
| colbert-ko-en-v2 | 0.5783 | 0.7230 |
| mLateOn | 0.5817 | 0.7135 |
| pplx-embed-v1-late | 0.5400 | 0.7064 |
| colbert-ko-0.1b | 0.3966 | 0.5685 |
| 단일 벡터 | ||
| comsat-embed-ko-8b | 0.6253 | 0.6964 |
| Qwen3-Embedding-8B | 0.6187 | 0.6783 |
| Qwen3-Embedding-4B | 0.6076 | 0.6803 |
| Harrier-OSS-v1-27b | 0.5306 | 0.6653 |
| snowflake-arctic-ko | 0.5712 | 0.6685 |
| F2LLM-v2-8B | 0.6162 | 0.6313 |
| PIXIE-Rune-v1.5 | 0.5492 | 0.6393 |
| KURE-v1 | 0.5909 | 0.6816 |
| BGE-m3-ko | 0.6099 | 0.6833 |
| KoE5 | 0.5841 | 0.6235 |
짧은 문단 검색 태스크
| 모델 | SQuADKor | Belebele |
|---|---|---|
| 후기 상호작용 | ||
| colbert-ko-en-v2 | 0.9846 | 0.9687 |
| mLateOn | 0.9803 | 0.9608 |
| pplx-embed-v1-late | 0.9696 | 0.9548 |
| colbert-ko-0.1b | 0.9794 | 0.9644 |
| 단일 벡터 | ||
| comsat-embed-ko-8b | 0.9168 | 0.9853 |
| Qwen3-Embedding-8B | 0.9063 | 0.9824 |
| Qwen3-Embedding-4B | 0.9044 | 0.9522 |
| Harrier-OSS-v1-27b | 0.9204 | 0.9546 |
| snowflake-arctic-ko | 0.9447 | 0.9518 |
| F2LLM-v2-8B | 0.8874 | 0.9513 |
| PIXIE-Rune-v1.5 | 0.9457 | 0.9617 |
| KURE-v1 | 0.9357 | 0.9502 |
| BGE-m3-ko | 0.9414 | 0.9503 |
| KoE5 | 0.8980 | 0.9425 |
비교 기준으로 원본 bge-m3의 태스크별 점수(comsat 모델 카드 기준)는 평균 0.7508, MIRACL 0.7015, MrTidy 0.6471, MLDR 0.4273입니다.24
태스크마다 어떤 계열이 강할까요
| 태스크 | 성격 | 강한 계열 | 읽을거리 |
|---|---|---|---|
| AutoRAG | 금융·공공·의료·법률·커머스 PDF 파싱 문서 | 한국어 ColBERT(0.97) | 표·목록이 섞인 문서에서 토큰 단위 매칭이 유리합니다. 디코더 대형은 0.82–0.85에 그칩니다. |
| MLDR | 장문 문서 검색 | 후기 상호작용(0.70–0.72) | 단일 벡터 최고가 0.52입니다. 단, 짧게 학습된 ColBERT(0.28–0.29)는 예외입니다. |
| LawIR | 법령·판례 검색 | 디코더 대형(0.82–0.87) | 추론과 법률 지식이 필요한 질의입니다. 한국어 ColBERT는 0.45–0.72입니다. |
| PublicHealthQA | 의료·공중보건 | 디코더 대형(0.87–0.94) | 전문 지식 질의에서 LLM 사전지식이 유리합니다. |
| Ko-StrategyQA | 다중 홉 추론형 질의 | 디코더 대형(0.83–0.84) | 질의 의도 해석이 관건입니다. |
| MrTidy · MIRACL | 위키 기반 대규모 코퍼스(약 150만 문서) | 혼전(0.58–0.72) | 원본 bge-m3가 MrTidy 0.6471로 강합니다. 한국어 파인튜닝이 오히려 점수를 낮추는 경우가 있습니다. |
| SQuADKor · Belebele | 짧은 문단 검색 | 모두 높음(0.90–0.98) | 천장 효과로 변별력이 낮습니다. |
다중 홉(multi-hop) 질의는 여러 근거를 차례로 이어야 답할 수 있는 질의입니다. 천장 효과는 대부분의 모델 점수가 최댓값 근처에 몰려 차이가 드러나지 않는 현상입니다.
9. 데이터는 무엇을 말해 줄까요
한마디로: 모델 크기보다 표현 방식과 데이터 정제가 점수를 크게 갈랐습니다. 다만 후기 상호작용의 장문 이점은 긴 문서로 학습했을 때 나타나고 서빙 비용은 질의 인코더가 좌우합니다.
7절과 8절의 수치를 겹쳐 보면 일곱 가지 관찰이 나옵니다.
① 표현 방식이 모델 크기를 이깁니다
154M의 KURE-v2가 7.6B 단일 벡터 모델을 2.3점, 27B 모델을 4.9점 앞섭니다. 307M인 mLateOn도 7.6B Qwen3-Embedding-8B를 넘습니다. 단일 벡터의 정보 병목은 파라미터를 키워서 푸는 것보다 표현 방식을 바꿔서 푸는 편이 파라미터 대비 훨씬 효율적입니다.
② 하지만 후기 상호작용의 우위는 조건부입니다
같은 후기 상호작용이라도 pplx-embed-v1-late(MLDR 0.28)와 colbert-ko-0.1b(0.29)는 장문에서 단일 벡터보다 약합니다. 장문 이점은 긴 문서로 학습했을 때 나타나며 후기 상호작용 구조만으로는 생기지 않습니다. colbert-ko-0.1b의 학습 문서 길이는 2,048토큰이었고 KURE-v2와 colbert-ko-en-v2는 8,192토큰이었습니다.
③ 디코더 대형 모델은 지식과 추론에서 강합니다
법률(LawIR), 의료(PublicHealthQA), 다중 홉 추론(Ko-StrategyQA)에서는 8절 표의 디코더 기반 모델 다섯 개가 1~5위를 차지합니다. 질의를 해석하는 데 사전지식이 필요한 태스크에서는 LLM 백본의 세계 지식이 검색 성능으로 이어집니다. 반대로 표면적 표현 매칭이 중요한 PDF 문서 검색(AutoRAG)에서는 오히려 약합니다. 두 계열은 경쟁한다기보다 강한 태스크가 서로 달라 상호보완 관계입니다.
④ 언어별 학습이 생각만큼 필수는 아닙니다
한국어 검색 데이터를 전혀 보지 않은 mLateOn이 한국어로 학습한 대부분의 단일 벡터 모델을 앞섭니다. 토큰 단위 매칭은 언어 간 전이가 잘 된다는 LightOn의 주장을 한국어 결과가 뒷받침합니다. 다만 같은 구조에 한국어 데이터를 더한 KURE-v2와 colbert-ko-en-v2가 mLateOn보다 1.5–2.5점 높습니다. 한국어 데이터의 가치가 사라진 것은 아닙니다.
⑤ 한국어 파인튜닝에는 득실이 있습니다
bge-m3 → KURE-v1은 평균 +1.1점입니다. 하지만 MrTidy는 0.6471 → 0.5909로 떨어지고 MLDR은 0.4273 → 0.4637로 오릅니다. 학습 데이터의 분포 쪽으로 모델이 이동한 결과입니다. KURE-v1과 BGE-m3-ko처럼 한국어 파인튜닝 모델이 특정 태스크에서 원본보다 낮은 경우가 있습니다. 그러니 자기 도메인 평가 없이 “한국어 특화”라는 이름만 보고 고르면 안 됩니다.
⑥ 성능을 가른 것은 데이터 정제입니다
같은 백본, 같은 크기의 colbert-ko-v1(0.6282)과 KURE-v2(0.8160)의 18점 차이는 데이터 규모, 하드 네거티브, 위음성 제거, 교사 증류에서 나왔습니다. GIST(KURE-v1), percpos와 교사 필터(KURE-v2), 95% 규칙(mLateOn), 마스크 InfoNCE(Qwen3)는 이름은 달라도 같은 문제, 즉 가짜 오답 문제를 풉니다.
⑦ 서빙 비용은 질의 인코더가 결정합니다
인덱스 검색은 1–2ms인데 7.6B 모델의 질의 인코딩은 38–40ms입니다. 대형 디코더 임베딩은 이 지연과 GPU 비용을 대가로 높은 품질을 얻습니다. 실시간 검색 서비스라면 문서 색인 비용보다 질의당 인코딩 비용을 먼저 계산해야 합니다.
10. 상황별로 어떤 모델을 고를까요
한마디로: 문서 길이, 언어, 도메인, 기존 인프라에 따라 알맞은 모델이 달라집니다. 어떤 모델이든 자기 데이터로 평가해 고르고 입력 형식을 그 모델에 맞춥니다.
| 상황 | 1순위 | 대안 | 이유 |
|---|---|---|---|
| 한국어 RAG, 장문·PDF 많음 | KURE-v2 | colbert-ko-en-v2 | 장문(MLDR)에서 가장 높고, 한국어 ColBERT 계열은 PDF 문서(AutoRAG)에서도 강합니다. 다중 벡터 인덱스가 필요합니다. |
| 기존 벡터 DB를 그대로 써야 함 | snowflake-arctic-ko / KURE-v1 | PIXIE-Rune, BGE-m3-ko | 단일 벡터 568M급 최상위입니다. bge-m3 계열은 차원·토크나이저가 호환됩니다. |
| 법률·의료·추론형 질의 | comsat-ko-8b / Qwen3-Embedding | Harrier, F2LLM | 지식 기반 질의 해석에 강합니다. GPU와 지연을 감수해야 합니다. |
| 한국어·영어 혼합 | KURE-v2 | bge-m3, mLateOn | 한·영 균형으로 학습했습니다. |
| 어휘 + 의미 하이브리드 | bge-m3(dense+sparse) | 단일 벡터 + 별도 BM25 | 한 번의 추론으로 두 신호를 얻습니다. |
| 항공우주·기술 문서 | PIXIE-Rune-v1.5 | — | 도메인 벤치마크로 검증됐습니다. |
| 경량·CPU | e5-small-ko-v2 | ko-sroberta, KoSimCSE | 384/768차원의 작은 모델입니다. |
| FAQ·문장 유사도 | KoSimCSE-multitask | kf-deberta-multitask | 짧은 대칭 쌍에 최적화됐습니다. |
| 인프라 없이 빠른 시작 | Upstage Solar | — | API입니다. 질의/문서 모델 구분이 필수입니다. |
모델마다 입력 형식은 어떻게 다를까요
모델을 바꿀 때 가장 실수하기 쉬운 부분이 입력 형식입니다. 계열별 입력 형식은 아래 치트시트로 정리했습니다. model은 각 모델을 불러온 객체이고 KURE-v2 예제는 PyLate 라이브러리를 씁니다.
# KURE-v1 / BGE-m3-ko : 접두어 없음
model.encode(["질의 또는 문서"])
# KoE5 / multilingual-e5-small-ko-v2 : 양쪽 모두 접두어
model.encode(["query: 훈민정음은 언제 만들어졌나?"])
model.encode(["passage: 세종대왕은 1443년에 훈민정음을 창제하였다."])
# snowflake-arctic-ko / PIXIE-Rune : 질의에만 프롬프트
q = model.encode(queries, prompt_name="query")
d = model.encode(documents)
# Qwen3-Embedding / comsat-ko-8b : 질의에만 지시문
q = model.encode(queries, prompt_name="query") # 또는 model.encode_query(...)
d = model.encode(documents) # 문서에는 아무것도 붙이지 않음
# KURE-v2 / colbert-ko-en-v2 : 다중 벡터, is_query 로 구분
from pylate import models, indexes, retrieve
model = models.ColBERT(model_name_or_path="nlpai-lab/KURE-v2")
index = indexes.PLAID(index_folder="idx", index_name="kure", override=True)
index.add_documents(documents_ids=ids,
documents_embeddings=model.encode(docs, is_query=False))
retriever = retrieve.ColBERT(index=index)
hits = retriever.retrieve(queries_embeddings=model.encode(queries, is_query=True), k=10)
도입할 때는 무엇부터 확인할까요
- 코퍼스 프로파일링: 문서 길이 분포(512토큰 초과 비율), 한국어/영어 비율, 표·목록 비중, 도메인을 먼저 잽니다.
- 평가셋 구축: 실제 질의 100–300건과 정답 문서를 만듭니다. 공개 벤치마크 순위와 자기 도메인 성능은 어긋날 수 있습니다. 평가셋을 만드는 방법은 RAG 평가 데이터셋 글에서 다뤘습니다.
- 후보 3종 비교: 단일 벡터 1종(KURE-v1 또는 snowflake-ko), 후기 상호작용 1종(KURE-v2), 디코더 1종(Qwen3-4B 또는 comsat)으로 nDCG@10과 Recall@10(정답 문서가 상위 10개 안에 들어온 비율)을 잽니다.
- 지연 측정: 배치 1 기준 질의 인코딩 시간과 p95 지연을 함께 봅니다.
- 리랭커 결합 검토: 1차 검색 Recall이 충분하면 크로스 인코더 리랭커로 상위 순위를 다듬습니다.
- 인덱스 재생성: 모델을 바꾸면 벡터 공간이 달라지므로 반드시 문서를 새 모델로 다시 임베딩해 인덱스를 새로 만듭니다.
주의: bge-m3 ↔ KURE-v1처럼 차원이 같아도, 서로 다른 모델의 벡터를 한 인덱스에 섞어 쓰면 안 됩니다.
11. 흔히 하는 오해와 실수는 무엇일까요
한마디로: 모델 출처, 버전 간 호환, 접두어, 점수 해석과 벤치마크 비교에서 실수가 자주 나옵니다.
- KURE를 서울대 모델로 혼동하기 쉽습니다. KURE는 고려대학교 NLP&AI 연구실과 HIAI 연구소의 모델입니다. 서울대 계산언어학 연구실의 모델은 KR-SBERT입니다.
- KURE-v2는 v1의 상위 호환이 아닙니다. 백본·차원·토크나이저·표현 방식이 모두 다릅니다. 단일 벡터 인덱스가 필요한 파이프라인에서는 v1이 여전히 맞는 선택입니다.
- “후기 상호작용이면 장문에 강하다”는 반만 맞습니다. 학습 문서 길이가 짧으면 장문 이점이 나타나지 않습니다(pplx-late, colbert-ko-0.1b).
- 접두어를 빼먹지 않습니다. E5 계열은 양쪽에 붙이고 Snowflake·PIXIE·Qwen3·comsat 계열은 질의 쪽에만 붙입니다. Solar는 질의 모델과 문서 모델을 반드시 구분해서 호출합니다.
- 리더보드 점수의 미세한 차이를 과대해석하지 않습니다. 같은 KURE-v2가 자료에 따라 0.8160 또는 0.8162로, colbert-ko-en-v2가 0.8063 또는 0.7984로 적혀 있습니다. 측정 파이프라인 버전, Belebele 부분집합 선택, 반올림의 차이입니다. 0.01 미만의 차이는 사실상 동률로 보는 편이 안전합니다.
- 벤치마크 출처를 섞지 않습니다. 2024년 KURE-v1 모델 카드(8개 데이터셋, XPQA 포함), AutoRAG 벤치마크(Top-k 정확도), MTEB(kor, v2)(9개 태스크, LawIR·SQuADKor 포함)는 서로 다른 평가이므로 숫자를 직접 비교하면 안 됩니다.
정리
한국어 임베딩은 문장 유사도에서 출발했습니다(SBERT·SimCSE). 이어 데이터를 만들고(KoE5) 강한 다국어 백본을 한국어로 조정한 뒤(KURE-v1, BGE-m3-ko, snowflake-ko), 마침내 표현 방식 자체를 바꿨습니다(KURE-v2). 이와 별도로 디코더 LLM을 임베딩 모델로 바꾸는 흐름(Qwen3, comsat)은 단일 벡터 모델 중 가장 높은 점수를 냈습니다.
KURE-v1은 bge-m3를 한국어 200만 건으로 파인튜닝한 단일 벡터 모델이고 GIST 손실로 가짜 오답을 걸러낸 것이 핵심이었습니다. KURE-v2는 백본을 154M 한국어 ModernBERT로 바꾸고 토큰마다 128차원 벡터를 남기는 후기 상호작용으로 설계를 전환했습니다. 여기에 약 2,070만 쌍의 약지도 사전학습과 약 303만 건의 정제된 지도 학습, 리랭커 증류를 더했습니다. 그 결과 “더 작고, 더 정확하고, 더 빠른” 모델이 됐습니다. 대신 다중 벡터 인덱스라는 새로운 서빙 스택을 갖춰야 합니다.
모델 지도를 그려 보면 정답은 하나가 아닙니다. 장문과 PDF 문서에는 후기 상호작용이 맞습니다. 법률·의료처럼 지식이 필요한 질의에는 디코더 대형 모델이, 기존 인프라를 그대로 써야 하면 568M급 단일 벡터가, 짧은 문장 비교에는 1세대 SBERT가 각각 합리적입니다. 모델의 유명세는 기준이 되지 못합니다. 모델은 내 코퍼스의 길이·언어·도메인, 그리고 감당할 수 있는 서빙 비용을 기준으로 고릅니다.
참고 자료
-
nlpai-lab/KoE5 모델 카드. multilingual-e5-large 백본, ko-triplet-v1.0, 학습 설정, 한국어 학습 데이터 부족 문제. ↩ ↩2
-
SimCSE. arXiv:2104.08821. 2021. 드롭아웃 기반 비지도 학습, NLI 지도 학습, STS 결과와 이방성 분석. ↩
-
E5: Text Embeddings by Weakly-Supervised Contrastive Pre-training. arXiv:2212.03533. 2022. CCPairs 일관성 필터, 대조 사전학습,
query:/passage:접두어. ↩ -
BGE M3-Embedding. arXiv:2402.03216. dense·sparse·multi-vector 점수, 자기 지식증류, RetroMAE 사전학습, MCLS. ↩
-
dragonkue/BGE-m3-ko 모델 카드. 한국어 추가 학습의 동기, AutoRAG 한국어 벤치마크 Top-1 결과. ↩ ↩2
-
GISTEmbed. arXiv:2402.16829. 2024. 가이드 모델로 배치 내 위음성을 마스킹하는 손실. ↩
-
장영준 — KURE-v2: a Korean-English bilingual late-interaction retriever. 다층 투영 헤드, PFT·SFT 데이터와 손실, Qwen3-32B 재판정, 어블레이션, 서빙 실험. ↩ ↩2 ↩3 ↩4
-
ColBERT. arXiv:2004.12832. 2020. 토큰별 벡터와 MaxSim 기반 후기 상호작용. ↩ ↩2
-
nlpai-lab — KURE 공식 저장소. 고려대학교 NLP&AI 연구실·HIAI 연구소의 한국어-영어 검색 임베딩 시리즈. ↩
-
nlpai-lab/KURE-v1 모델 카드. bge-m3 백본, 학습 데이터·
CachedGISTEmbedLoss·배치·학습률, 한국어 검색 벤치마크(8개 데이터셋 평균 Top-10 NDCG). ↩ ↩2 ↩3 ↩4 -
skt/A.X-Encoder-base 모델 카드. ModernBERT 구조, 최대 16,384토큰, KoBEST·KLUE 점수. ↩
-
snunlp/KR-SBERT. KR-BERT-V40K 백본, KLUE-NLI와 증강 KorSTS 학습, 문서 분류 정확도. ↩
-
BM-K/KoSimCSE-roberta 모델 카드, BM-K/Sentence-Embedding-Is-All-You-Need. 한국어 SimCSE 학습 설정과 KorSTS 성능, 한국어 문장 임베딩 구조 비교 환경. ↩
-
kakaobank/kf-deberta-base 모델 카드, upskyy/kf-deberta-multitask 모델 카드. KF-DeBERTa의 KLUE 점수, 멀티태스크 학습 손실과 KorSTS 점수. ↩
-
dragonkue/snowflake-arctic-embed-l-v2.0-ko 모델 카드. AI Hub 기계독해 데이터 재구성, 질의 전용
query:프롬프트, bf16 권장. ↩ -
telepix/PIXIE-Rune-v1.5 모델 카드. 항공우주 도메인 특화, STELLA 벤치마크 결과. ↩
-
dragonkue/multilingual-e5-small-ko-v2 모델 카드. 6:4 Model Soup, 리랭커 결합 권장. ↩
-
dragonkue/colbert-ko-0.1b 모델 카드. 문서 2,048·질의 32토큰 학습, 32·64·96·128차원 Matryoshka. ↩
-
yjoonjang/colbert-ko-en-v2 모델 카드. 단일 선형 헤드, 8,192/64 길이 설정, MTEB(kor, v2) 태스크별 nDCG@10 비교표. ↩ ↩2
-
lightonai/mLateOn 모델 카드. mmBERT-base 백본, 9개 학습 언어, 데이터 규모, 하드 네거티브 95% 규칙, 다층 투영 헤드. ↩
-
DenseOn with the LateOn. arXiv:2607.27178. 단일 벡터(mDenseOn)와 후기 상호작용의 학습 언어 밖 일반화 비교, MIRACL 결과. ↩
-
perplexity-ai/pplx-embed-v1-late-0.6b 모델 카드. 단일 벡터 모델에서 이어 학습한 MaxSim 대조 손실, 128차원. ↩
-
Qwen3 Embedding, QwenLM/Qwen3-Embedding. arXiv:2506.05176. 합성 약지도 쌍 대조 학습, 마스크 InfoNCE, slerp 병합, 모델 크기별 차원. ↩
-
sionic-ai/comsat-embed-ko-8b-preview 모델 카드. 7.6B·4096차원·마지막 토큰 풀링, MTEB 한국어 검색 표(원본 bge-m3·Solar 포함). ↩ ↩2 ↩3
-
microsoft/harrier-oss-v1-27b 모델 카드. 27B 디코더, 5,376차원, 32,768토큰, 다국어 대조 학습. ↩
-
codefuse-ai/F2LLM-v2-8B 모델 카드. 공개 데이터 6천만 건, 200개 이상 언어, Matryoshka, EOS 풀링. ↩
-
Upstage — Solar Embedding-1-large. 2024. 질의용·문서용 모델 분리, OpenAI text-embedding-3-large 대비 결과, Ko-MIRACL 향상. ↩