Key Characteristics
- Dense (single-vector): one 2,048-dimensional vector per text, scored by cosine similarity.
- Matryoshka embeddings: trained at 2,048, 1,024, 512 and 256 dimensions, so vectors can be truncated.
- Long documents: up to 8,192 tokens.
Usage
pip install -U sentence-transformers
from sentence_transformers import SentenceTransformer model = SentenceTransformer("nlpai-lab/KURE-v3", model_kwargs={"attn_implementation": "flash_attention_2"})# model = SentenceTransformer("nlpai-lab/KURE-v3", model_kwargs={"attn_implementation": "flash_attention_2"}, truncate_dim=1024) # smaller Matryoshka vectors query = "훈민정음은 언제 만들어졌나요?"documents = [ "세종대왕은 1443년에 훈민정음을 창제하고 1446년에 이를 반포하였다.", "김치는 배추나 무를 소금에 절인 뒤 고춧가루와 젓갈을 넣어 발효시킨 음식이다.", "한라산은 해발 1,947m로 남한에서 가장 높은 산이며 제주도 중앙에 자리한다.",] # encode_query / encode_document add the "query: " / "passage: " prompts KURE-v3 expectsquery_embeddings = model.encode_query(query)document_embeddings = model.encode_document(documents)print(query_embeddings.shape, document_embeddings.shape)# (2048,) (3, 2048) # Cosine similarity (higher is more relevant)scores = model.similarity(query_embeddings, document_embeddings)print(scores)# tensor([[ 0.5386, 0.0152, -0.0211]])
API
KURE-v3 is served at kure.kullm.ai through an OpenAI-compatible endpoint. Sign in with GitHub there to get an API key.
import os import numpy as npfrom openai import OpenAI client = OpenAI(base_url="https://kure.kullm.ai/api/v1", api_key=os.environ["KURE_API_KEY"]) query = "훈민정음은 언제 만들어졌나요?"documents = [ "세종대왕은 1443년에 훈민정음을 창제하고 1446년에 이를 반포하였다.", "김치는 배추나 무를 소금에 절인 뒤 고춧가루와 젓갈을 넣어 발효시킨 음식이다.", "한라산은 해발 1,947m로 남한에서 가장 높은 산이며 제주도 중앙에 자리한다.",] # input_type adds the query or document prompt. Vectors are 2048-d, pass dimensions=(256 to 2048) for a smaller Matryoshka sizequery_embedding = client.embeddings.create(model="kure-v3", input=query, extra_body={"input_type": "query"})document_embeddings = client.embeddings.create(model="kure-v3", input=documents, extra_body={"input_type": "document"}) # Vectors are L2-normalized, so the dot product is the cosine similarityq = np.array(query_embedding.data[0].embedding)d = np.array([e.embedding for e in document_embeddings.data])print((d @ q).round(4))# [ 0.5384 0.0145 -0.0207]
Evaluation
KURE-v3 is evaluated on the nine MTEB(kor, v2) Retrieval tasks. We report nDCG@10.
Matryoshka Dimensions
Truncated to 1,024 dimensions, KURE-v3 keeps 99% of its full-size score and still outperforms comsat-embed-ko-8b-preview and Qwen3-Embedding-8B (4,096 dimensions).
RTEB (Retrieval Embedding Benchmark)
We also evaluate dense (single-vector) models on RTEB, an English retrieval benchmark that combines open and private datasets to measure how well models generalize to real-world data. We evaluate its eight public English tasks outside the code domain, so the average differs from the RTEB leaderboard score. We report nDCG@10.
License
KURE-v3 is released under the Apache License 2.0.
Citation
@misc{kure-v3, title = {KURE-v3: a Korean-English bilingual dense retriever}, author = {Jang, Youngjoon and Son, Junyoung and Lee, Taemin and Hong, Seongtae and Lee, Jungseob and Lim, Heuiseok}, year = {2026}, url = {https://huggingface.co/nlpai-lab/KURE-v3},}
@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}}