import torch from sentence_transformers import SentenceTransformer from sentence_transformers.evaluation import ( InformationRetrievalEvaluator, SequentialEvaluator, ) from sentence_transformers.util import cos_sim from datasets import load_dataset, concatenate_datasets model_id = "BAAI/bge-base-en-v1.5" # Hugging Face model ID matryoshka_dimensions = [768, 512, 256, 128, 64] # Important: large to small # Load a model model = SentenceTransformer( model_id, device="cuda" if torch.cuda.is_available() else "cpu" ) # load test dataset test_dataset = load_dataset("json", data_files="test_dataset.json", split="train") train_dataset = load_dataset("json", data_files="train_dataset.json", split="train") corpus_dataset = concatenate_datasets([train_dataset, test_dataset]) # Convert the datasets to dictionaries corpus = dict( zip(corpus_dataset["id"], corpus_dataset["positive"]) ) # Our corpus (cid => document) queries = dict( zip(test_dataset["id"], test_dataset["anchor"]) ) # Our queries (qid => question) # Create a mapping of relevant document (1 in our case) for each query relevant_docs = {} # Query ID to relevant documents (qid => set([relevant_cids]) for q_id in queries: relevant_docs[q_id] = [q_id] matryoshka_evaluators = [] # Iterate over the different dimensions for dim in matryoshka_dimensions: ir_evaluator = InformationRetrievalEvaluator( queries=queries, corpus=corpus, relevant_docs=relevant_docs, name=f"dim_{dim}", truncate_dim=dim, # Truncate the embeddings to a certain dimension score_functions={"cosine": cos_sim}, ) matryoshka_evaluators.append(ir_evaluator) # Create a sequential evaluator evaluator = SequentialEvaluator(matryoshka_evaluators)