무엇인가
KURE-v2는 고려대학교 NLP&AI 연구실이 2026년 8월 29일 공개한 한국어·영어 이중언어 late interaction 검색 모델입니다. SKT의 한국어 인코더 A.X-Encoder-base 위에서 학습했고, 크기는 154M입니다.
대부분의 임베딩 모델은 문서 하나를 벡터 하나로 만듭니다. 3,000토큰짜리 규정 문서에 조항이 열 개 있으면 벡터는 열 조항의 평균이 됩니다. KURE-v2는 문서의 토큰마다 128차원 벡터를 남겨 두고, 질의 토큰 하나하나가 문서에서 가장 잘 맞는 토큰을 찾아 그 점수를 더합니다(MaxSim). 2020년 스탠퍼드 ColBERT의 방식입니다.
그 결과가 저장소 리더보드 첫 줄입니다. MTEB 한국어 검색 9과제 평균 nDCG@10 0.8160 — Qwen3-Embedding-8B(7.6B, 0.7826)보다 높습니다. 파라미터는 49분의 1입니다.
어떻게 동작하나
MaxSim 점수는 이렇게 계산합니다(ColBERT, Khattab & Zaharia 2020).
학습은 두 단계입니다. 레이블 없는 2,070만 쌍으로 대조 사전학습을 하고(KURE-v2-unsupervised로 따로 공개), 대조 손실과 재랭커로부터의 KL 증류로 지도 미세조정을 합니다. 조사·어미가 붙고 띄어쓰기가 흔들리고 "POS 단말기"처럼 영한이 섞이는 한국어에서 토큰 단위 비교가 유리할 수 있다는 것이 코어닷투데이의 설명 가설입니다 — 저장소가 하나하나 실험으로 증명한 것은 아닙니다.
빠른 시작
모델 카드의 PyLate 예시입니다. 문서는 is_query=False, 질의는 is_query=True로 인코딩합니다.
from pylate import indexes, models, retrieve
model = models.ColBERT(model_name_or_path="nlpai-lab/KURE-v2")
index = indexes.PLAID(index_folder="pylate-index", index_name="index", override=True)
docs = [
"세종대왕은 1443년에 훈민정음을 창제하고 1446년에 이를 반포하였다.",
"한라산은 해발 1,947m로 남한에서 가장 높은 산이며 제주도 중앙에 자리한다.",
]
index.add_documents(
documents_ids=["1", "2"],
documents_embeddings=model.encode(docs, batch_size=32, is_query=False),
)
retriever = retrieve.ColBERT(index=index)
q = model.encode(["훈민정음은 언제 만들어졌나요?"], batch_size=32, is_query=True)
print(retriever.retrieve(queries_embeddings=q, k=10))
색인 없이 1차 후보만 다시 정렬하려면 pylate.rank.rerank를 쓰고, sentence-transformers에서는 MultiVectorEncoder("nlpai-lab/KURE-v2")로도 불러올 수 있습니다.
언제 쓰고, 언제 피하나
평균 1위 뒤에 과제별 승패가 있습니다(nDCG@10, 저장소 리더보드).
| 과제 | KURE-v2 | Qwen3-Emb-8B | 무엇을 재나 |
|---|---|---|---|
| MultiLongDocRetrieval | 0.7159 | 0.5046 | 긴 문서 |
| AutoRAGRetrieval | 0.9718 | 0.8276 | 금융·공공·의료·법률·커머스 실무 문서 |
| Ko-StrategyQA | 0.8070 | 0.8363 | 다중 홉 추론 |
| PublicHealthQA | 0.8229 | 0.8721 | 보건·의료 |
| LawIRKo | 0.7550 | 0.8171 | 법령·판례 |
- 잘 맞는다: 긴 공고문·보고서의 특정 부분을 겨누는 질의, 영한 혼용 용어, 고유명사·품번의 정확한 매칭. 기본 경로(BM25 + 단일 벡터 하이브리드)가 놓친 고가치 한국어 질의의 상위 경로로 붙인다.
- 다른 방법을 먼저 본다: 법률 개념·의학 지식이 필요한 추론형 질의(크기가 이긴다 — late interaction은 매칭의 해상도를 올리지 이해의 깊이를 올리지 않는다), 한·영 밖의 언어가 섞이는 코퍼스(Qwen3의 다국어가 그 자리다).
운영 부담은 생각보다 작습니다. 9개 평가 코퍼스 전체 기준으로 압축 없는 전수 스캔은 24.2GB, BinaryIVF는 2.2GB(정확도 그대로), 토큰 풀링 ×3 + 1비트 양자화는 1.7GB(0.8097)였습니다. 같은 조건에서 8B·4B급 단일 벡터 HNSW는 7.0~25.4GB입니다. A100 한 장에서 질의 인코딩은 13.8ms(8B 단일 벡터는 38~40ms)였습니다.
한계와 주의
- 평가 코드가 다르다. late interaction 모델은 PyLate + PLAID로 직접 평가했고, 단일 벡터 모델은 가능한 경우 공식 MTEB 결과를 썼다. 소수점 둘째 자리 차이로 결정하지 않는다.
- 0.8160은 전수 스캔 기준이다. 운영 구성(풀링·양자화·후보 생성)에서는 근사 손실을 감안한다.
- 구조만으로는 안 된다. 같은 구조의 KURE-v2-unsupervised는 0.7283으로 bge-m3 아래다. 지도 학습과 증류가 점수를 만든다.
- 다중 벡터 인덱스는 운영 기능이 덜 성숙하다. PLAID는 고정형이라 새 문서 삽입이 재구축에 가깝다. 매일 문서가 들어오면 BinaryIVF나 풀링 + 양자화가 낫다. ACL·날짜 필터를 검색 전에 거는 방법은 따로 검토한다.
- 라이선스 표기가 다르다. 모델 카드는 Apache-2.0, GitHub 저장소는 MIT다(2026-10 확인).
- 공정 비교의 조건: 같은 청킹·같은 전처리·우리 질의 200문항 이상, 그리고 재랭커 없이 먼저 잰다. 서빙 수치는 A100 80GB·EPYC 7513 두 개·RAM 1.2TB 조건이다.




