coredot.today
기술 탐색으로 돌아가기
임베딩실험

KURE-v2

문서를 한 점으로 누르지 않는 한국어 검색 모델 — 토큰마다 128차원 벡터를 남기는 154M late interaction

직접 해보기 5빠른 시작
종류
모델
라이선스
Apache-2.0
사실 확인
2026.10.24
pip install -U pylate

TRY IT

직접 해보기

OVERVIEW

개요

무엇인가

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).

score(q,d)=∑i∈qmax⁡j∈d  qi⋅dj\text{score}(q, d) = \sum_{i \in q} \max_{j \in d} \; q_i \cdot d_j

1. 색인
문서 토큰마다 128차원 벡터를 미리 계산해 저장한다. 문서는 8,192토큰까지 통째로 넣을 수 있다.
2. 질의 인코딩
질의만 새로 인코딩한다. 과제 지시문(instruction prefix)이 필요 없고, 질의는 모델이 64토큰으로 확장한다.
3. 후보 생성
큰 컬렉션에서는 PLAID 또는 BinaryIVF 인덱스로 후보 문서를 먼저 좁힌다.
4. MaxSim 재채점
후보 안에서만 정밀 MaxSim을 계산한다. 어느 질의 토큰이 짝을 못 찾았는지가 그대로 남아 점수를 설명할 수 있다.

학습은 두 단계입니다. 레이블 없는 2,070만 쌍으로 대조 사전학습을 하고(KURE-v2-unsupervised로 따로 공개), 대조 손실과 재랭커로부터의 KL 증류로 지도 미세조정을 합니다. 조사·어미가 붙고 띄어쓰기가 흔들리고 "POS 단말기"처럼 영한이 섞이는 한국어에서 토큰 단위 비교가 유리할 수 있다는 것이 코어닷투데이의 설명 가설입니다 — 저장소가 하나하나 실험으로 증명한 것은 아닙니다.

빠른 시작

모델 카드의 PyLate 예시입니다. 문서는 is_query=False, 질의는 is_query=True로 인코딩합니다.

python
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-v2Qwen3-Emb-8B무엇을 재나
MultiLongDocRetrieval0.71590.5046긴 문서
AutoRAGRetrieval0.97180.8276금융·공공·의료·법률·커머스 실무 문서
Ko-StrategyQA0.80700.8363다중 홉 추론
PublicHealthQA0.82290.8721보건·의료
LawIRKo0.75500.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 조건이다.

DEEP DIVE

더 깊이 읽기