BMEmbed: Aadpating General-Purpose Embedding to Your Own Datasets
3
stars
0
commits
Python
primary language
Jun 10, 2025
updated
BMEmbed is an unsupervised pipeline for adapting general-purpose text embedding models to private or proprietary datasets. It leverages BM25-based ranking signals as pseudo-supervision to fine-tune models in a label-free manner, making it ideal for enterprise-specific information retrieval tasks.
The training pipeline consists of three main stages:
Synthetic Query Generation
Data Sampling via BM25-Based Ranking Score
Model List-wise Fine-Tuning
Evaluation Script
Requirements:
Install dependencies:
pip install -r requirements.txt
python private_data_processing/corpus2chunks.py \
--base_model qwen-7b \
--corpus_file_path ./data/sythetic_data/multihop-rag/raw_corpus.json \
--dataset_name multihop-rag # chunk original corpus
This script:
./data/sythetic_data/multihop-rag/chunked_corpus.json.python private_data_processing/corpus2qa_processing.py \
--corpus_file_path ./data/sythetic_data/multihop-rag/chunked_corpus.json \
--dataset_name multihop-rag # generate synthetic query
This script:
./data/sythetic_data/multihop-rag/doc2query.json.Make sure your raw data (e.g., JSON or text files) is accessible to the script.
Run the following command to generate a score-labeled dataset:
python ranking_sampling/data_sampler.py \
--dataset multihop-rag \
--topk 1000 \
--strategy fine-to-coarse \
--interval_multiplier 1.2 \
--num_samples 1
This script:
--strategy, --num_samples, --topk, and --interval_multiplier./data/sythetic_data/multihop-rag/{timestamp}/bm25_dataset.json.With your newly generated data in place, fine-tune your model:
accelerate launch listwise_finetuning/qwen_trainer.py \
--model_name_or_path qwen-7b \
--dataset_name multihop-rag \
--dataset_file_path ./data/sythetic_data/multihop-rag/{timestamp}/ \
--per_device_train_batch_size 2 \
--learning_rate 1e-5 \
--max_seq_length 256 \
--bf16 \
--gradient_accumulation_steps 8 \
--listwise \
--label_scaling 0.2 \
--output_dir ./output/multihop-rag/
Your trained model is saved in ./output/multihop-rag/.
After training completes, evaluate your model with:
python simple_retrieval.py \
--base_model qwen-7b \
--dataset_name multihop-rag \
--dataset_file_path ../data/sythetic_data/multihop-rag/{timestamp} \
--cache_dir ./ \
--output_dir ./output/multihop-rag/ \
--listwise \
--save_retrieval_result \
--save_embedding_database \
--label_scaling 0.2
├── .gitignore
├── README.md
├── data
│ ├── evaluation_set
│ │ └── multihop-rag
│ │ └── retrieval_dataset.json
│ └── sythetic_data
│ └── multihop-rag
│ ├── chunked_corpus.json
│ └── doc2query.json
├── listwise_finetuning
│ ├── accelerate_config.yaml
│ ├── all_mini_l6_v2_trainer.py
│ ├── lora.json
│ ├── loss.py
│ ├── models
│ │ ├── __init__.py
│ │ └── qwen_embedding.py
│ └── qwen_trainer.py
├── private_data_processing
│ ├── corpus2chunks.py
│ ├── corpus2qa_processing.py
│ ├── prompts.py
│ └── utils.py
├── ranking_sampling
│ ├── bm25_retrieval.py
│ ├── data_sampler.py
│ ├── data_sampler_scores.py
│ └── partitioning_strategy.py
├── requirements.txt
├── retrieval_evaluating.py
└── simple_retrieval.py
Python
100.0%
BMEmbed: Aadpating General-Purpose Embedding to Your Own Datasets
3
stars
0
commits
Python
primary language
Jun 10, 2025
updated
BMEmbed is an unsupervised pipeline for adapting general-purpose text embedding models to private or proprietary datasets. It leverages BM25-based ranking signals as pseudo-supervision to fine-tune models in a label-free manner, making it ideal for enterprise-specific information retrieval tasks.
The training pipeline consists of three main stages:
Synthetic Query Generation
Data Sampling via BM25-Based Ranking Score
Model List-wise Fine-Tuning
Evaluation Script
Requirements:
Install dependencies:
pip install -r requirements.txt
python private_data_processing/corpus2chunks.py \
--base_model qwen-7b \
--corpus_file_path ./data/sythetic_data/multihop-rag/raw_corpus.json \
--dataset_name multihop-rag # chunk original corpus
This script:
./data/sythetic_data/multihop-rag/chunked_corpus.json.python private_data_processing/corpus2qa_processing.py \
--corpus_file_path ./data/sythetic_data/multihop-rag/chunked_corpus.json \
--dataset_name multihop-rag # generate synthetic query
This script:
./data/sythetic_data/multihop-rag/doc2query.json.Make sure your raw data (e.g., JSON or text files) is accessible to the script.
Run the following command to generate a score-labeled dataset:
python ranking_sampling/data_sampler.py \
--dataset multihop-rag \
--topk 1000 \
--strategy fine-to-coarse \
--interval_multiplier 1.2 \
--num_samples 1
This script:
--strategy, --num_samples, --topk, and --interval_multiplier./data/sythetic_data/multihop-rag/{timestamp}/bm25_dataset.json.With your newly generated data in place, fine-tune your model:
accelerate launch listwise_finetuning/qwen_trainer.py \
--model_name_or_path qwen-7b \
--dataset_name multihop-rag \
--dataset_file_path ./data/sythetic_data/multihop-rag/{timestamp}/ \
--per_device_train_batch_size 2 \
--learning_rate 1e-5 \
--max_seq_length 256 \
--bf16 \
--gradient_accumulation_steps 8 \
--listwise \
--label_scaling 0.2 \
--output_dir ./output/multihop-rag/
Your trained model is saved in ./output/multihop-rag/.
After training completes, evaluate your model with:
python simple_retrieval.py \
--base_model qwen-7b \
--dataset_name multihop-rag \
--dataset_file_path ../data/sythetic_data/multihop-rag/{timestamp} \
--cache_dir ./ \
--output_dir ./output/multihop-rag/ \
--listwise \
--save_retrieval_result \
--save_embedding_database \
--label_scaling 0.2
├── .gitignore
├── README.md
├── data
│ ├── evaluation_set
│ │ └── multihop-rag
│ │ └── retrieval_dataset.json
│ └── sythetic_data
│ └── multihop-rag
│ ├── chunked_corpus.json
│ └── doc2query.json
├── listwise_finetuning
│ ├── accelerate_config.yaml
│ ├── all_mini_l6_v2_trainer.py
│ ├── lora.json
│ ├── loss.py
│ ├── models
│ │ ├── __init__.py
│ │ └── qwen_embedding.py
│ └── qwen_trainer.py
├── private_data_processing
│ ├── corpus2chunks.py
│ ├── corpus2qa_processing.py
│ ├── prompts.py
│ └── utils.py
├── ranking_sampling
│ ├── bm25_retrieval.py
│ ├── data_sampler.py
│ ├── data_sampler_scores.py
│ └── partitioning_strategy.py
├── requirements.txt
├── retrieval_evaluating.py
└── simple_retrieval.py
Python
100.0%