KURE is a family of Korean-English retrieval embedding models developed by the NLP & AI Lab and the HIAI Institute at Korea University.
- 2026.08.29: π€ KURE-v2 released: a Korean-English bilingual late-interaction (multi-vector) model, state of the art on the MTEB(kor, v2) retrieval benchmark.
- 2024.12.21: π€ KURE-v1 released with the MTEB-ko-retrieval leaderboard.
- 2024.10.02: π€ KoE5 and π€ ko-triplet-v1.0 released.
| Model | Type | Params | Base model |
|---|---|---|---|
| KURE-v2 | Late-interaction (multi-vector) | 154M | skt/A.X-Encoder-base |
| KURE-v1 | Dense (single-vector) | 568M | BAAI/bge-m3 |
| KoE5 | Dense (single-vector) | 560M | intfloat/multilingual-e5-large |
KURE-v2 encodes every token into a 128-dimensional vector and scores query-document pairs with MaxSim, which preserves token-level semantics that single-vector models compress away. It supports documents up to 8,192 tokens and needs no instruction prefixes.
We use uv to manage the environment.
uv syncPyLate
uv add pylatefrom 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)
documents_ids = ["1", "2", "3"]
documents = [
"μΈμ’
λμμ 1443λ
μ νλ―Όμ μμ μ°½μ νκ³ 1446λ
μ μ΄λ₯Ό λ°ν¬νμλ€.",
"κΉμΉλ λ°°μΆλ 무λ₯Ό μκΈμ μ μΈ λ€ κ³ μΆ§κ°λ£¨μ μ κ°μ λ£μ΄ λ°ν¨μν¨ μμμ΄λ€.",
"νλΌμ°μ ν΄λ° 1,947mλ‘ λ¨νμμ κ°μ₯ λμ μ°μ΄λ©° μ μ£Όλ μ€μμ μ리νλ€.",
]
documents_embeddings = model.encode(documents, is_query=False)
index.add_documents(documents_ids=documents_ids, documents_embeddings=documents_embeddings)
retriever = retrieve.ColBERT(index=index)
queries_embeddings = model.encode(["νλ―Όμ μμ μΈμ λ§λ€μ΄μ‘λμ?"], is_query=True)
scores = retriever.retrieve(queries_embeddings=queries_embeddings, k=10)Sentence-Transformers
uv add sentence-transformersfrom sentence_transformers import MultiVectorEncoder
model = MultiVectorEncoder("nlpai-lab/KURE-v2")
query = "νλ―Όμ μμ μΈμ λ§λ€μ΄μ‘λμ?"
documents = [
"μΈμ’
λμμ 1443λ
μ νλ―Όμ μμ μ°½μ νκ³ 1446λ
μ μ΄λ₯Ό λ°ν¬νμλ€.",
"κΉμΉλ λ°°μΆλ 무λ₯Ό μκΈμ μ μΈ λ€ κ³ μΆ§κ°λ£¨μ μ κ°μ λ£μ΄ λ°ν¨μν¨ μμμ΄λ€.",
]
query_embeddings = model.encode_query(query)
document_embeddings = model.encode_document(documents)
# MaxSim late-interaction scoring (higher is more relevant)
scores = model.similarity(query_embeddings, document_embeddings)Sentence-Transformers
from sentence_transformers import SentenceTransformer
model = SentenceTransformer("nlpai-lab/KURE-v1")
# model = SentenceTransformer("nlpai-lab/KoE5") # needs "query: " / "passage: " prefixes
embeddings = model.encode(["첫 λ²μ§Έ λ¬Έμ₯", "λ λ²μ§Έ λ¬Έμ₯"])
similarities = model.similarity(embeddings, embeddings)We evaluate on the nine MTEB(kor, v2) Retrieval tasks with the latest mteb (v2.x), using the Korean subsets only (Belebele: kor_Hang-kor_Hang; MLDR is the mean of its dev/test splits):
- Ko-StrategyQA: Korean ODQA multi-hop retrieval (translated StrategyQA)
- AutoRAGRetrieval: document retrieval over parsed PDFs in finance, public sector, healthcare, law, and commerce
- MIRACLRetrieval: Wikipedia-based retrieval, ~1.5M documents
- PublicHealthQA: medical / public-health domain retrieval
- BelebeleRetrieval: FLORES-200-based retrieval
- MrTidyRetrieval: Wikipedia-based retrieval, ~1.5M documents
- MultiLongDocRetrieval: long-document retrieval across domains
- LawIRKo: Korean statute / case-law retrieval
- SQuADKorV1Retrieval: KorQuAD v1 passage retrieval
Late-interaction models are measured directly with mteb + PLAID retrieval; dense rows come from the official MTEB results repository. To evaluate a model yourself, pass its name and paradigm:
uv run python eval/evaluate.py nlpai-lab/KURE-v2 multi-vector
uv run python eval/evaluate.py nlpai-lab/KURE-v1 single-vectorThe per-task result files backing the leaderboard are in eval/results, and the table below is regenerated from them:
uv run python eval/make_leaderboard.pyAverage over the nine tasks. Full per-task results are on the official MTEB Leaderboard.
| Model | Type | Params | Avg nDCG@10 | Avg Recall@10 |
|---|---|---|---|---|
| nlpai-lab/KURE-v2 | Late-interaction | 154M | 0.8160 | 0.8921 |
| yjoonjang/colbert-ko-en-v2 | Late-interaction | 149M | 0.8063 | 0.8827 |
| sionic-ai/comsat-embed-ko-8b-preview | Dense | 7.6B | 0.7927 | 0.8876 |
| lightonai/mLateOn | Late-interaction | 307M | 0.7906 | 0.8740 |
| Qwen/Qwen3-Embedding-8B | Dense | 7.6B | 0.7826 | 0.8815 |
| Qwen/Qwen3-Embedding-4B | Dense | 4.0B | 0.7737 | 0.8753 |
| microsoft/harrier-oss-v1-27b | Dense | 27.0B | 0.7667 | 0.8624 |
| dragonkue/snowflake-arctic-embed-l-v2.0-ko | Dense | 568M | 0.7653 | 0.8609 |
| codefuse-ai/F2LLM-v2-8B | Dense | 7.6B | 0.7638 | 0.8593 |
| telepix/PIXIE-Rune-v1.5 | Dense | 568M | 0.7618 | 0.8596 |
| nlpai-lab/KURE-v1 | Dense | 568M | 0.7616 | 0.8629 |
| dragonkue/BGE-m3-ko | Dense | 568M | 0.7547 | 0.8513 |
| BAAI/bge-m3 | Dense | 568M | 0.7509 | 0.8588 |
| perplexity-ai/pplx-embed-v1-late-0.6b | Late-interaction | 596M | 0.7381 | 0.8328 |
| nlpai-lab/KoE5 | Dense | 560M | 0.7337 | 0.8300 |
| nlpai-lab/KURE-v2-unsupervised | Late-interaction | 154M | 0.7283 | 0.8268 |
| dragonkue/colbert-ko-0.1b | Late-interaction | 149M | 0.6776 | 0.7723 |
| yjoonjang/colbert-ko-v1 | Late-interaction | 149M | 0.6282 | 0.7212 |
The full two-stage training code is in train/late-interaction.
- Built on skt/A.X-Encoder-base with a multi-layer projection head (128-d per token, MaxSim scoring); trained with PyLate.
- Stage 1 (PFT): large in-batch contrastive learning on 20.7M weakly related Korean/English pairs, released as KURE-v2-unsupervised.
- Stage 2 (SFT): contrastive learning + KL distillation from a reranker teacher on 3.03M triplets with hard negatives and false-negative filtering.
Training code in train/dense.
- Fine-tuned from BAAI/bge-m3 on ~2M Korean query-document-hard-negative(5) pairs.
- CachedGISTEmbedLoss, batch size 4,096, lr 2e-5, 1 epoch.
- Fine-tuned from intfloat/multilingual-e5-large on ko-triplet-v1.0 (~700K+ examples).
- CachedMultipleNegativesRankingLoss, batch size 512, lr 1e-5, 1 epoch. Requires
query:/passage:prefixes.
KURE-v2 is a late-interaction model: each document is stored as a set of token vectors, so the practical questions for deployment are index size and search cost. We benchmarked KURE-v2 across ANN backends and compression schemes on the 9 Korean MTEB retrieval tasks, against five single-vector baselines served with faiss HNSW. All numbers are end-to-end: batch-1 query encoding + index search, measured serially on one A100 80GB.
Runnable versions of these configurations are in deploy/late-interaction (uv run deploy/late-interaction/run.py --index plaid).
Two things the figures show:
- Hierarchical token pooling (x2) halves the index (24.2 -> 12.5 GB) with no measurable nDCG loss. Asymmetric binary quantization (1-bit document tokens, bf16 queries) shrinks it 4.8x for 0.98. Stacking the two (pooling x3 + binary), the entire 9-corpus index fits in 1.7 GB, smaller than every single-vector HNSW index (7.0-25.4 GB, fp16 vectors), while still outscoring the best single-vector model.
- A live query arrives as text: 4B-8B single-vector models spend 38-40 ms encoding it, capping them at ~25 QPS no matter how fast HNSW is. KURE-v2 encodes in 13.8 ms (154M params), so every configuration except MUVERA serves 44-57 QPS, roughly 2x the 8B single-vector models, at higher quality.
On the largest corpus (MIRACL, ~1.5M documents) an exhaustive 1-bit scan costs O(corpus): p95 climbs to 156 ms, and pooling the tokens 3x only brings it to 74 ms. Generating candidates with faiss BinaryIVF (Hamming search over the same 1-bit index) and re-scoring them with exact asymmetric MaxSim cuts p95 to 38 ms on the same 2.2 GB index, lower tail latency than the 4B-8B single-vector baselines (42 ms) at higher nDCG. For large collections, use a candidate-generating index (PLAID or BinaryIVF), not an exhaustive scan.
Measurement details
- Hardware: 1x NVIDIA A100 80GB, 2x AMD EPYC 7513 (64 cores), 1.2 TB RAM.
- Software: faiss-cpu 1.15.0, fast-plaid 1.6.0, sentence-transformers 6.0.0, PyTorch 2.8.0.
- Protocol: batch-1, serial. Index-search latency: 10 warmup queries, then every query of the task measured once (QPS = 1/mean). Query-encoding latency: 5 warmup, 50 measured. End-to-end = encoding + search.
- Precision: encoding in bf16; each index stores its own format (HNSW fp16 vectors, PLAID 4-bit residuals, binary 1-bit).
- Index size: the full serialized index on disk (vectors, graph, codebooks; external doc-id mapping excluded). PLAID indexes are frozen (fast-plaid
freeze()): the merged search-time codes/residuals only, without the per-shard build copies or the raw embeddings fast-plaid keeps for corpora of <= 1,000 documents. - Tasks: the 9 Korean MTEB retrieval tasks; MLDR is the mean of its dev/test splits; nDCG@10 x100.
- HNSW:
IndexHNSWSQwith fp16-stored vectors (inner product on L2-normalized embeddings; lossless for the bf16 embeddings), M=32, efConstruction=200, efSearch=64. - PLAID: nbits=4, all other settings fast-plaid defaults (kmeans_niters=4, n_ivf_probe=8, n_full_scores=4096). nbits=2/1 give 14.2/9.1 GB at 81.40/80.70 nDCG.
- MUVERA: num_repetitions=10, num_simhash_projections=6, final_projection_dimension=8192, exact-MaxSim rerank of the top 1,000.
- BinaryIVF: nlist=floor(sqrt(total tokens)) capped at 65,536, nprobe=32, top-128 Hamming tokens per query token, exact asymmetric-MaxSim rerank of the top 1,000 documents.
- Token pooling: hierarchical (Ward linkage), pool_factor 2-3, documents only.
MIT
If you find our models helpful, please consider citing:
@misc{kure-v2,
title = {KURE-v2: a Korean-English bilingual late-interaction retriever},
author = {Jang, Youngjoon and Son, Junyoung and Lee, Taemin and Hong, Seongtae and Lim, Heuiseok},
year = {2026},
url = {https://huggingface.co/nlpai-lab/KURE-v2},
}@inproceedings{jang2025kure,
title={KURE: Embedding Model for Korean-Specific Retrieval},
author={Jang, Youngjoon and Son, Junyoung and Lee, Taemin and Hong, Seongtae and Park, JeongBae and Lim, Heuiseok},
booktitle={Annual Conference on Human and Language Technology},
pages={129--134},
year={2025},
organization={Human and Language Technology}
}@inproceedings{jang2024koe5,
title={KoE5: A New Dataset and Model for Improving Korean Embedding Performance},
author={Jang, Youngjoon and Son, Junyoung and Park, Chanjun and Choi, Soonwoo and Lee, Byeonggoo and Lee, Taemin and Lim, Heuiseok},
booktitle={Annual Conference on Human and Language Technology},
pages={239--244},
year={2024},
organization={Human and Language Technology}
}

