CoolFace
Datasetpublic

robro612/trec-covid_mlateon

trec-covid_mlateon Multi-vector (late-interaction) embeddings of BEIR trec-covid (beir/trec-covid), encoded with lightonai/mLateOn at revision edd378f99593c0ac8a15518b97ad89786b02685e. Source data: ir_datasets beir/trec-covid (ir_datasets 0.6.3), which downloads trec-covid.zip (md5 ce62140cb23feb9becf6270d0d1fe6d1). BEIR also publishes this corpus on the Hub as BeIR/trec-covid, whose card gives this dataset's license; the data here was loaded through ir_datasets, not from that… See the full description on the dataset page: https://huggingface.co/datasets/robro612/trec-covid_mlateon.

sourceHugging Facecc-by-sa-4.0updated 2h agoView on Hugging Face
0likes
Dataset Card

trec-covid_mlateon

Multi-vector (late-interaction) embeddings of BEIR trec-covid (beir/trec-covid), encoded with [lightonai/mLateOn](https://huggingface.co/lightonai/mLateOn) at revision edd378f99593c0ac8a15518b97ad89786b02685e.

Source data: ir_datasets beir/trec-covid (irdatasets 0.6.3), which downloads [trec-covid.zip](https://public.ukp.informatik.tu-darmstadt.de/thakur/BEIR/datasets/trec-covid.zip) (md5 `ce62140cb23feb9becf6270d0d1fe6d1`). BEIR also publishes this corpus on the Hub as [`BeIR/trec-covid`](https://huggingface.co/datasets/BeIR/trec-covid), whose card gives this dataset's license; the data here was loaded through irdatasets, not from that repo. Document, query and qrel ids are the source's own ids, unchanged.

Every document is one variable-length set of 128-d vectors; every query is one variable-length set of 128-d vectors. Documents and queries are stored at different precisions (fp16 and fp32 respectively), see Encoding.

Files

filedtypeshapecontents
documents.npyfloat16 (<f2)[40,023,891, 128]every document vector, concatenated document by document (9,771.5 MiB)
doclens.npyint32[171,332]vectors per document; cumsum gives offsets
token_ids.npyuint32[40,023,891]tokenizer id of each documents.npy row, 1:1
doc_ids.npy<U8[171,332]original document ids
queries.npyfloat32 (<f4)[50, 34, 128]query vectors, zero-padded at the end (0.8 MiB)
query_lens.npyint32[50]true vectors per query, before padding
queries_ids.npy<U2[50]original query ids
qrels.test.tsvtext66,336 rowsTREC qrels, qid \t 0 \t docid \t relevance, no header
gt_top100.tsvtext5,000 rowsexact MaxSim top-100, see below

All positional indices (gt_top100.tsv, and the row order of every .npy file) refer to the order of doc_ids.npy and queries_ids.npy. Reordering either file invalidates gt_top100.tsv.

Statistics

documents171,332
document vectors40,023,891
vectors per document (min / median / mean / max)3 / 230 / 233.6 / 8192
queries50
vectors per query (min / median / max)11 / 17 / 34
queries with at least one qrel50
qrels rows66,336
embedding dimension128

Encoding

modellightonai/mLateOn
model revisionedd378f99593c0ac8a15518b97ad89786b02685e
librarysentence-transformers 6.1.0 MultiVectorEncoder (transformers 5.17.0, torch 2.13.0+cu126)
document compute dtypefloat16 (model weights loaded at this dtype for the document pass)
document storage dtypefp16
query compute dtypefloat32 (model weights loaded at this dtype for the query pass)
query storage dtypefp32
normalizationL2, by the model's own Normalize module, before the storage cast
document truncation8,192 tokens (the checkpoint's document_length), before the skiplist; longest document here 8,192 vectors
query truncation8,192 tokens (the checkpoint's query_length)
document skiplistnone (empty skiplist_words): every document token is kept, so doclens is the real token count
document inputtitle + "\n\n" + text when the corpus has a title, else text; stripped
query inputquery text, stripped of surrounding whitespace, formatted by the model's own query prompt/template
query vectorsevery vector the model emits for the query is kept, including any query-expansion tokens its template adds; query_lens counts them all
document paddingnone: documents.npy holds real vectors only, sum(doclens) == n_tokens
query paddingrows at or beyond query_lens[i] in queries.npy[i] are exactly zero
token_idstokenizer id of each kept document token (no skiplist, so every token), aligned 1:1 with documents.npy

Ground truth: gt_top100.tsv

Exact brute-force MaxSim top-100 per query over the full corpus, from the vectors in this repo. No header; tab-separated qidx docidx rank score:

  • —qidx: 0-based row into queries_ids.npy / queries.npy
  • —docidx: 0-based position into doc_ids.npy / doclens.npy
  • —rank: 1-based, descending score
  • —score: sum over the query's query_lens[qidx] vectors of max over the document's vectors of the dot product, computed in fp32 with the fp16 document vectors upcast to fp32. Expansion vectors are included in the sum. Printed to 6 decimals.

No query id appears as a document id, so there are no self-matches.

Retrieval quality

Sanity check of the vectors, not a leaderboard number: exact MaxSim over the full corpus scored against qrels.test.tsv with ir_measures.

nDCG@10Recall@100MRR@10MAP
0.81940.15700.94670.1281

Loading

python
import numpy as np

documents = np.load("documents.npy", mmap_mode="r")      # [n_tokens, 128] float16
doclens = np.load("doclens.npy")                         # [n_docs] int32
offsets = np.concatenate([[0], np.cumsum(doclens)])
doc_ids = np.load("doc_ids.npy")                         # [n_docs] str

def document(i):
    return documents[offsets[i]:offsets[i + 1]]           # [doclens[i], 128]

queries = np.load("queries.npy")                         # [n_queries, 34, 128] float32
query_lens = np.load("query_lens.npy")                   # [n_queries] int32
query_ids = np.load("queries_ids.npy")                   # [n_queries] str

def query(j):
    return queries[j, :query_lens[j]]                     # [query_lens[j], 128]

def maxsim(q, d):
    return (q @ d.astype(np.float32).T).max(axis=1).sum()

Validation

Checks run by the exporter on the files exactly as written here:

  • —✅ file set — missing=[] extra=[]
  • —✅ documents.npy dtype/shape — <f2 (40023891, 128)
  • —✅ doclens.npy dtype/shape — <i4 (171332,)
  • —✅ doc_ids.npy is a string array — <U8 (171332,)
  • —✅ queries.npy dtype/shape — <f4 (50, 34, 128)
  • —✅ query_lens.npy dtype/shape — <i4 (50,)
  • —✅ queries_ids.npy is a string array — <U2 (50,)
  • —✅ sum(doclens) == n_tokens — 40023891 vs 40023891
  • —✅ no empty documents — min doclen 3
  • —✅ len(doc_ids) == len(doclens) == corpus size — 171332, 171332, 171332
  • —✅ doc_ids unique
  • —✅ query arrays aligned — 50, 50, 50
  • —✅ doc and query dim agree — 128 / 128
  • —✅ token_ids.npy dtype/shape — <u4 (40023891,)
  • —✅ document vectors unit-norm (100k sample) — norm range [0.9994, 1.0006]
  • —✅ query vectors unit-norm — norm range [1.000000, 1.000000]
  • —✅ all vectors finite
  • —✅ gt_top100.tsv has k rows per query — 5000 rows, k=100
  • —✅ gt rows grouped by qidx with ranks 1..k and descending scores
  • —✅ gt indices in range

Provenance

exported2026-09-25
hardwareTesla V100S-PCIE-32GB