Korean MTEB Retrieval Evaluators for SPLADE, Dense, and Reranking models
Python
14
42 commits
updated Jul 21, 2026
This repository provides two command-line evaluators for Korean retrieval tasks on MTEB:
evaluate_splade.py - a sparse evaluator that builds an inverted index over SPLADE document vectors for fast lookup.evaluate_dense.py - a dense evaluator that encodes the corpus once with SentenceTransformer and runs batched semantic search.evaluate_reranker.py - a hybrid pipeline that generates SPLADE candidates and then re-ranks them with a Cross-Encoder / HF Transformers rerankerAll scripts plug into MTEB and BEIR’s EvaluateRetrieval, reporting standard IR metrics (NDCG, MAP, Recall, Precision, and MRR) and measured timings (e.g., search time).
*MTEB.select_tasks)."search_time" to the result dict. Optional --save_predictions writes top-k results to JSON.<output_folder>/<normalized_model_name>/ (or <splade>__<reranker> for reranking).SparseEncoder.encode_document and only non-zero token weights are stored per token id.encode_query; scores are accumulated as Σ(q_token_weight × d_token_weight) over shared non-zero tokens../cache/<model>_<task>_<subset>_splade_index.pkl and re-used between runs.SentenceTransformer; keeps the tensor in memory. Optionally applies passage_prompt=True for specific backbones.query_prompt=True for certain embedding backbones (e.g., telepix/PIXIE-Rune-Preview, Snowflake/snowflake-arctic-embed-l-v2.0).util.semantic_search over the encoded corpus.--candidate_k.--reranker_engine crossencoder (Sentence-Transformers CrossEncoder), or--reranker_engine hf (Transformers AutoModelForSequenceClassification).--qwen3_mode wraps (query, document) pairs in the Qwen3 chat prompt style and supports custom --qwen3_instruction../cache_rerank/<splade>_<task>_<subset>_splade_index.pkl.# Python 3.10+ recommended
pip install -U sentence-transformers mteb beir numpy
python evaluate_splade.py \
--tasks Ko-StrategyQA AutoRAGRetrieval PublicHealthQA BelebeleRetrieval MultiLongDocRetrieval MIRACLRetrieval \
--model telepix/PIXIE-Splade-Preview \
--batch_size 32 \
--output_folder ./results_splade \
python evaluate_dense.py \
--tasks Ko-StrategyQA AutoRAGRetrieval PublicHealthQA BelebeleRetrieval MultiLongDocRetrieval MIRACLRetrieval \
--model telepix/PIXIE-Rune-Preview \
--batch_size 32 \
--output_folder ./results_dense \
python evaluate_reranker.py \
--tasks Ko-StrategyQA AutoRAGRetrieval PublicHealthQA BelebeleRetrieval MultiLongDocRetrieval MIRACLRetrieval \
--splade_model telepix/PIXIE-Splade-Preview \
--candidate_k 100 \
--reranker_engine hf \
--reranker_model Alibaba-NLP/gte-multilingual-reranker-base \
--rerank_batch_size 32 \
--rerank_max_length 8192 \
--output_folder ./results_rerank \
python evaluate_reranker.py \
--tasks Ko-StrategyQA AutoRAGRetrieval PublicHealthQA BelebeleRetrieval MultiLongDocRetrieval MIRACLRetrieval \
--splade_model telepix/PIXIE-Splade-Preview \
--reranker_engine crossencoder \
--reranker_model telepix/PIXIE-Spell-Reranker-Preview-0.6B\
--qwen3_mode \
--qwen3_instruction "Given a web search query, retrieve relevant passages that answer the query" \
--rerank_batch_size 2 \
--rerank_max_length 24576 \
--output_folder ./results_rerank \
Tip:
- For large corpora, GPU is strongly recommended for both SPLADE encoding and dense encoding.
- Qwen3-style rerankers are often length-hungry; increasing
--rerank_max_length(e.g., 24576) can improve quality.--candidate_kcontrols the SPLADE shortlist size; higher values help recall but increase rerank cost (default 100).
encode_document returns sparse bag-of-token weights; for each document, only non-zero token ids are appended to the postings list.encode_query, its non-zero token ids intersect the index, and scores accumulate as a weighted inner product on shared tokens../cache/… and re-loaded on subsequent runs.passage_prompt=True for specific backbones.query_prompt=True for specific backbones; otherwise encodes raw text.util.semantic_search over the cached embeddings.candidate_k docs per query using the cached inverted index.--qwen3_mode is enabled, wrap pairs in Qwen3 chat format.--reranker_engine crossencoder): uses Sentence-Transformers CrossEncoder.predict.--reranker_engine hf): tokenizes pairs and feeds them to AutoModelForSequenceClassification; logits are used as scores.Each evaluator produces a per-subset scores dictionary with IR metrics and search_time in seconds. With --save_predictions, it writes *_preds.json containing the top-k doc ids and scores for each query to the configured output folder.
The table below presents the retrieval performance of several embedding models evaluated on a variety of Korean MTEB benchmarks. We report Normalized Discounted Cumulative Gain (NDCG) scores, which measure how well a ranked list of documents aligns with ground truth relevance. Higher values indicate better retrieval quality.
Descriptions of the benchmark datasets used for evaluation are as follows:
Note: While many benchmark datasets are available for evaluation, in this project we chose to use only those that contain clean positive documents for each query. Keep in mind that a benchmark dataset is just that a benchmark. For real-world applications, it is best to construct an evaluation dataset tailored to your specific domain and evaluate embedding models, such as PIXIE, in that environment to determine the most suitable one.
| Model Name | # params | Avg. NDCG | NDCG@1 | NDCG@3 | NDCG@5 | NDCG@10 |
|---|---|---|---|---|---|---|
| telepix/PIXIE-Spell-Preview-1.7B | 1.7B | 0.7567 | 0.7149 | 0.7541 | 0.7696 | 0.7882 |
| telepix/PIXIE-Spell-Preview-0.6B | 0.6B | 0.7280 | 0.6804 | 0.7258 | 0.7448 | 0.7612 |
| telepix/PIXIE-Rune-v1.5 | 0.5B | 0.7345 | 0.6841 | 0.7382 | 0.7505 | 0.7651 |
| telepix/PIXIE-Rune-v1.0 | 0.5B | 0.7291 | 0.6808 | 0.7308 | 0.7444 | 0.7603 |
| telepix/PIXIE-Rune-Preview | 0.5B | 0.7383 | 0.6936 | 0.7356 | 0.7545 | 0.7698 |
| nvidia/llama-embed-nemotron-8b | 8B | 0.7534 | 0.7088 | 0.7547 | 0.7689 | 0.7813 |
| Qwen/Qwen3-Embedding-8B | 8B | 0.7507 | 0.7063 | 0.7494 | 0.7635 | 0.7839 |
| nlpai-lab/KURE-v1 | 0.5B | 0.7312 | 0.6826 | 0.7303 | 0.7478 | 0.7642 |
| dragonkue/BGE-m3-ko | 0.5B | 0.7206 | 0.6773 | 0.7188 | 0.7349 | 0.7514 |
| BAAI/bge-m3 | 0.5B | 0.7126 | 0.6613 | 0.7107 | 0.7301 | 0.7483 |
| Snowflake/snowflake-arctic-embed-l-v2.0 | 0.5B | 0.7050 | 0.6570 | 0.7015 | 0.7226 | 0.7390 |
| Qwen/Qwen3-Embedding-0.6B | 0.6B | 0.6872 | 0.6423 | 0.6833 | 0.7017 | 0.7215 |
| jinaai/jina-embeddings-v3 | 0.5B | 0.6731 | 0.6224 | 0.6715 | 0.6899 | 0.7088 |
| SamilPwC-AXNode-GenAI/PwC-Embedding_expr | 0.5B | 0.6709 | 0.6221 | 0.6694 | 0.6852 | 0.7069 |
| Octen/Octen-Embedding-0.6B | 0.6B | 0.6695 | 0.6249 | 0.6633 | 0.6842 | 0.7057 |
| Alibaba-NLP/gte-multilingual-base | 0.3B | 0.6679 | 0.6068 | 0.6673 | 0.6892 | 0.7084 |
| openai/text-embedding-3-large | N/A | 0.6465 | 0.5895 | 0.6467 | 0.6646 | 0.6853 |
| Model Name | # params | Avg. NDCG | NDCG@1 | NDCG@3 | NDCG@5 | NDCG@10 |
|---|---|---|---|---|---|---|
| telepix/PIXIE-Splade-v1.5 | 0.1B | 0.7343 | 0.6871 | 0.7322 | 0.7510 | 0.7670 |
| telepix/PIXIE-Splade-v1.0 | 0.1B | 0.6732 | 0.6314 | 0.6717 | 0.6873 | 0.7025 |
| telepix/PIXIE-Splade-Preview | 0.1B | 0.7253 | 0.6799 | 0.7217 | 0.7416 | 0.7579 |
| opensearch-project/opensearch-neural-sparse-encoding-multilingual-v1 | 0.2B | 0.4962 | 0.4358 | 0.4985 | 0.5148 | 0.5358 |
| BM25 | N/A | 0.4714 | 0.4194 | 0.4708 | 0.4886 | 0.5071 |
| naver/splade-v3 | 0.1B | 0.0582 | 0.0462 | 0.0566 | 0.0612 | 0.0685 |
| Model Name | # params | Avg. NDCG | NDCG@1 | NDCG@3 | NDCG@5 | NDCG@10 |
|---|---|---|---|---|---|---|
| telepix/PIXIE-Spell-Reranker-Preview-0.6B | 0.6B | 0.7896 | 0.7494 | 0.7910 | 0.8022 | 0.8168 |
| BAAI/bge-reranker-v2-m3 | 0.5B | 0.7861 | 0.7448 | 0.7868 | 0.7998 | 0.8133 |
| dragonkue/bge-reranker-v2-m3-ko | 0.5B | 0.7849 | 0.7505 | 0.7843 | 0.7959 | 0.8089 |
| Alibaba-NLP/gte-multilingual-reranker-base | 0.3B | 0.7594 | 0.7067 | 0.7610 | 0.7778 | 0.7922 |
| jinaai/jina-reranker-v3 | 0.6B | 0.7587 | 0.7304 | 0.7535 | 0.7670 | 0.7842 |
| jinaai/jina-reranker-v2-base-multilingual | 0.3B | 0.6879 | 0.6410 | 0.6888 | 0.7027 | 0.7192 |
Note: SPLADE shortlist size fixed at
candidate_k = 100for all experiments.
The Korean-MTEB-Retrieval-Evaluators is licensed under MIT License.
@software{Korean-MTEB-Retrieval-Evaluators,
title={Korean MTEB Retrieval Evaluators for SPLADE, Dense, and Reranking models},
author={TelePIX AI Research Team and Bongmin Kim},
year={2025},
url={https://github.com/BM-K/Korean-MTEB-Retrieval-Evaluators}
}
[1] telepix/PIXIE-Splade-Preview
[2] telepix/PIXIE-Rune-Preview
[3] nlpai-lab/KURE
Korean MTEB Retrieval Evaluators for SPLADE, Dense, and Reranking models
Python
14
42 commits
updated Jul 21, 2026
This repository provides two command-line evaluators for Korean retrieval tasks on MTEB:
evaluate_splade.py - a sparse evaluator that builds an inverted index over SPLADE document vectors for fast lookup.evaluate_dense.py - a dense evaluator that encodes the corpus once with SentenceTransformer and runs batched semantic search.evaluate_reranker.py - a hybrid pipeline that generates SPLADE candidates and then re-ranks them with a Cross-Encoder / HF Transformers rerankerAll scripts plug into MTEB and BEIR’s EvaluateRetrieval, reporting standard IR metrics (NDCG, MAP, Recall, Precision, and MRR) and measured timings (e.g., search time).
*MTEB.select_tasks)."search_time" to the result dict. Optional --save_predictions writes top-k results to JSON.<output_folder>/<normalized_model_name>/ (or <splade>__<reranker> for reranking).SparseEncoder.encode_document and only non-zero token weights are stored per token id.encode_query; scores are accumulated as Σ(q_token_weight × d_token_weight) over shared non-zero tokens../cache/<model>_<task>_<subset>_splade_index.pkl and re-used between runs.SentenceTransformer; keeps the tensor in memory. Optionally applies passage_prompt=True for specific backbones.query_prompt=True for certain embedding backbones (e.g., telepix/PIXIE-Rune-Preview, Snowflake/snowflake-arctic-embed-l-v2.0).util.semantic_search over the encoded corpus.--candidate_k.--reranker_engine crossencoder (Sentence-Transformers CrossEncoder), or--reranker_engine hf (Transformers AutoModelForSequenceClassification).--qwen3_mode wraps (query, document) pairs in the Qwen3 chat prompt style and supports custom --qwen3_instruction../cache_rerank/<splade>_<task>_<subset>_splade_index.pkl.# Python 3.10+ recommended
pip install -U sentence-transformers mteb beir numpy
python evaluate_splade.py \
--tasks Ko-StrategyQA AutoRAGRetrieval PublicHealthQA BelebeleRetrieval MultiLongDocRetrieval MIRACLRetrieval \
--model telepix/PIXIE-Splade-Preview \
--batch_size 32 \
--output_folder ./results_splade \
python evaluate_dense.py \
--tasks Ko-StrategyQA AutoRAGRetrieval PublicHealthQA BelebeleRetrieval MultiLongDocRetrieval MIRACLRetrieval \
--model telepix/PIXIE-Rune-Preview \
--batch_size 32 \
--output_folder ./results_dense \
python evaluate_reranker.py \
--tasks Ko-StrategyQA AutoRAGRetrieval PublicHealthQA BelebeleRetrieval MultiLongDocRetrieval MIRACLRetrieval \
--splade_model telepix/PIXIE-Splade-Preview \
--candidate_k 100 \
--reranker_engine hf \
--reranker_model Alibaba-NLP/gte-multilingual-reranker-base \
--rerank_batch_size 32 \
--rerank_max_length 8192 \
--output_folder ./results_rerank \
python evaluate_reranker.py \
--tasks Ko-StrategyQA AutoRAGRetrieval PublicHealthQA BelebeleRetrieval MultiLongDocRetrieval MIRACLRetrieval \
--splade_model telepix/PIXIE-Splade-Preview \
--reranker_engine crossencoder \
--reranker_model telepix/PIXIE-Spell-Reranker-Preview-0.6B\
--qwen3_mode \
--qwen3_instruction "Given a web search query, retrieve relevant passages that answer the query" \
--rerank_batch_size 2 \
--rerank_max_length 24576 \
--output_folder ./results_rerank \
Tip:
- For large corpora, GPU is strongly recommended for both SPLADE encoding and dense encoding.
- Qwen3-style rerankers are often length-hungry; increasing
--rerank_max_length(e.g., 24576) can improve quality.--candidate_kcontrols the SPLADE shortlist size; higher values help recall but increase rerank cost (default 100).
encode_document returns sparse bag-of-token weights; for each document, only non-zero token ids are appended to the postings list.encode_query, its non-zero token ids intersect the index, and scores accumulate as a weighted inner product on shared tokens../cache/… and re-loaded on subsequent runs.passage_prompt=True for specific backbones.query_prompt=True for specific backbones; otherwise encodes raw text.util.semantic_search over the cached embeddings.candidate_k docs per query using the cached inverted index.--qwen3_mode is enabled, wrap pairs in Qwen3 chat format.--reranker_engine crossencoder): uses Sentence-Transformers CrossEncoder.predict.--reranker_engine hf): tokenizes pairs and feeds them to AutoModelForSequenceClassification; logits are used as scores.Each evaluator produces a per-subset scores dictionary with IR metrics and search_time in seconds. With --save_predictions, it writes *_preds.json containing the top-k doc ids and scores for each query to the configured output folder.
The table below presents the retrieval performance of several embedding models evaluated on a variety of Korean MTEB benchmarks. We report Normalized Discounted Cumulative Gain (NDCG) scores, which measure how well a ranked list of documents aligns with ground truth relevance. Higher values indicate better retrieval quality.
Descriptions of the benchmark datasets used for evaluation are as follows:
Note: While many benchmark datasets are available for evaluation, in this project we chose to use only those that contain clean positive documents for each query. Keep in mind that a benchmark dataset is just that a benchmark. For real-world applications, it is best to construct an evaluation dataset tailored to your specific domain and evaluate embedding models, such as PIXIE, in that environment to determine the most suitable one.
| Model Name | # params | Avg. NDCG | NDCG@1 | NDCG@3 | NDCG@5 | NDCG@10 |
|---|---|---|---|---|---|---|
| telepix/PIXIE-Spell-Preview-1.7B | 1.7B | 0.7567 | 0.7149 | 0.7541 | 0.7696 | 0.7882 |
| telepix/PIXIE-Spell-Preview-0.6B | 0.6B | 0.7280 | 0.6804 | 0.7258 | 0.7448 | 0.7612 |
| telepix/PIXIE-Rune-v1.5 | 0.5B | 0.7345 | 0.6841 | 0.7382 | 0.7505 | 0.7651 |
| telepix/PIXIE-Rune-v1.0 | 0.5B | 0.7291 | 0.6808 | 0.7308 | 0.7444 | 0.7603 |
| telepix/PIXIE-Rune-Preview | 0.5B | 0.7383 | 0.6936 | 0.7356 | 0.7545 | 0.7698 |
| nvidia/llama-embed-nemotron-8b | 8B | 0.7534 | 0.7088 | 0.7547 | 0.7689 | 0.7813 |
| Qwen/Qwen3-Embedding-8B | 8B | 0.7507 | 0.7063 | 0.7494 | 0.7635 | 0.7839 |
| nlpai-lab/KURE-v1 | 0.5B | 0.7312 | 0.6826 | 0.7303 | 0.7478 | 0.7642 |
| dragonkue/BGE-m3-ko | 0.5B | 0.7206 | 0.6773 | 0.7188 | 0.7349 | 0.7514 |
| BAAI/bge-m3 | 0.5B | 0.7126 | 0.6613 | 0.7107 | 0.7301 | 0.7483 |
| Snowflake/snowflake-arctic-embed-l-v2.0 | 0.5B | 0.7050 | 0.6570 | 0.7015 | 0.7226 | 0.7390 |
| Qwen/Qwen3-Embedding-0.6B | 0.6B | 0.6872 | 0.6423 | 0.6833 | 0.7017 | 0.7215 |
| jinaai/jina-embeddings-v3 | 0.5B | 0.6731 | 0.6224 | 0.6715 | 0.6899 | 0.7088 |
| SamilPwC-AXNode-GenAI/PwC-Embedding_expr | 0.5B | 0.6709 | 0.6221 | 0.6694 | 0.6852 | 0.7069 |
| Octen/Octen-Embedding-0.6B | 0.6B | 0.6695 | 0.6249 | 0.6633 | 0.6842 | 0.7057 |
| Alibaba-NLP/gte-multilingual-base | 0.3B | 0.6679 | 0.6068 | 0.6673 | 0.6892 | 0.7084 |
| openai/text-embedding-3-large | N/A | 0.6465 | 0.5895 | 0.6467 | 0.6646 | 0.6853 |
| Model Name | # params | Avg. NDCG | NDCG@1 | NDCG@3 | NDCG@5 | NDCG@10 |
|---|---|---|---|---|---|---|
| telepix/PIXIE-Splade-v1.5 | 0.1B | 0.7343 | 0.6871 | 0.7322 | 0.7510 | 0.7670 |
| telepix/PIXIE-Splade-v1.0 | 0.1B | 0.6732 | 0.6314 | 0.6717 | 0.6873 | 0.7025 |
| telepix/PIXIE-Splade-Preview | 0.1B | 0.7253 | 0.6799 | 0.7217 | 0.7416 | 0.7579 |
| opensearch-project/opensearch-neural-sparse-encoding-multilingual-v1 | 0.2B | 0.4962 | 0.4358 | 0.4985 | 0.5148 | 0.5358 |
| BM25 | N/A | 0.4714 | 0.4194 | 0.4708 | 0.4886 | 0.5071 |
| naver/splade-v3 | 0.1B | 0.0582 | 0.0462 | 0.0566 | 0.0612 | 0.0685 |
| Model Name | # params | Avg. NDCG | NDCG@1 | NDCG@3 | NDCG@5 | NDCG@10 |
|---|---|---|---|---|---|---|
| telepix/PIXIE-Spell-Reranker-Preview-0.6B | 0.6B | 0.7896 | 0.7494 | 0.7910 | 0.8022 | 0.8168 |
| BAAI/bge-reranker-v2-m3 | 0.5B | 0.7861 | 0.7448 | 0.7868 | 0.7998 | 0.8133 |
| dragonkue/bge-reranker-v2-m3-ko | 0.5B | 0.7849 | 0.7505 | 0.7843 | 0.7959 | 0.8089 |
| Alibaba-NLP/gte-multilingual-reranker-base | 0.3B | 0.7594 | 0.7067 | 0.7610 | 0.7778 | 0.7922 |
| jinaai/jina-reranker-v3 | 0.6B | 0.7587 | 0.7304 | 0.7535 | 0.7670 | 0.7842 |
| jinaai/jina-reranker-v2-base-multilingual | 0.3B | 0.6879 | 0.6410 | 0.6888 | 0.7027 | 0.7192 |
Note: SPLADE shortlist size fixed at
candidate_k = 100for all experiments.
The Korean-MTEB-Retrieval-Evaluators is licensed under MIT License.
@software{Korean-MTEB-Retrieval-Evaluators,
title={Korean MTEB Retrieval Evaluators for SPLADE, Dense, and Reranking models},
author={TelePIX AI Research Team and Bongmin Kim},
year={2025},
url={https://github.com/BM-K/Korean-MTEB-Retrieval-Evaluators}
}
[1] telepix/PIXIE-Splade-Preview
[2] telepix/PIXIE-Rune-Preview
[3] nlpai-lab/KURE