Synergistic Effect: The cocktail model outperforms both parent models through optimal weight combination!
Model Details
Model Description
Model Type: Sentence Transformer (LM-Cocktail)
Base Models: BGE-M3 fine-tuned on Russian legal documents
Maximum Sequence Length: 512 tokens (optimized for speed)
Output Dimensionality: 1024 dimensions
Similarity Function: Cosine Similarity
Language: Russian
Domain: Legal documents (court decisions, federal laws, regional legislation)
License: MIT
Key Features
✅ Best Recall@5 among all tested models (91.79%)
✅ No prefix required (inherited from bge-m3-legal-ru-updata)
✅ Balanced performance across all legal document types
✅ Production-ready for Russian legal semantic search
Performance
Benchmark Results (dataset2: 7,187 test examples)
Metric
Score
Rank
Recall@1
76.66%
#1
Recall@5
91.79%
🥇 #1
Recall@10
94.85%
#1
Performance by Dataset Type
Dataset
Recall@1
Recall@5
Recall@10
Description
court_law
66.01%
86.47%
91.08%
Court decisions and rulings
other_law
90.44%
95.80%
96.97%
Federal laws and codes
reg_law
75.52%
93.09%
96.49%
Regional legislation
Average
76.66%
91.79%
94.85%
Across all domains
Comparison with Parent Models
Model
Recall@5
Improvement
Cocktail 40/60 (this model)
91.79%
Baseline
bge-m3-russian-legal
91.43%
+0.36%
bge-m3-legal-ru-updata
91.28%
+0.51%
The cocktail demonstrates synergistic effect - it outperforms both parent models!
Usage
Installation
pip install -U sentence-transformers
Basic Usage
python
1from sentence_transformers import SentenceTransformer
23# Load the model4model = SentenceTransformer("Roflmax/bge-m3-legal-ru-cocktail-40-60")5model.max_seq_length =512# Optimized for speed67# Example: Semantic search in legal documents8query ="Какое наказание предусмотрено за управление транспортным средством в состоянии опьянения?"910documents =[11"Статья 264.1 УК РФ. Нарушение правил дорожного движения лицом, подвергнутым административному наказанию...",12"КоАП РФ Статья 12.8. Управление транспортным средством водителем, находящимся в состоянии опьянения...",13"Статья 228 УК РФ. Незаконные приобретение, хранение, перевозка, изготовление..."14]1516# Encode17query_embedding = model.encode(query, normalize_embeddings=True)18doc_embeddings = model.encode(documents, normalize_embeddings=True)1920# Calculate similarity21from sklearn.metrics.pairwise import cosine_similarity
22similarities = cosine_similarity([query_embedding], doc_embeddings)[0]2324# Get top results25top_indices = similarities.argsort()[::-1]26for idx in top_indices:27print(f"Score: {similarities[idx]:.4f} | {documents[idx][:100]}...")
Batch Processing
python
1from sentence_transformers import SentenceTransformer
2import numpy as np
34model = SentenceTransformer("Roflmax/bge-m3-legal-ru-cocktail-40-60")5model.max_seq_length =51267# Batch encode documents8documents =[9"Первый документ...",10"Второй документ...",11# ... more documents12]1314# Process in batches for efficiency15embeddings = model.encode(16 documents,17 batch_size=32,18 normalize_embeddings=True,19 show_progress_bar=True20)2122print(f"Generated {len(embeddings)} embeddings of dimension {embeddings.shape[1]}")
Semantic Search Pipeline
python
1from sentence_transformers import SentenceTransformer, util
23model = SentenceTransformer("Roflmax/bge-m3-legal-ru-cocktail-40-60")45# Your corpus6corpus =[7"Документ 1: содержание...",8"Документ 2: содержание...",9# ... more documents10]1112# Encode corpus once13corpus_embeddings = model.encode(corpus, convert_to_tensor=True, normalize_embeddings=True)1415# Query16query ="Ваш поисковый запрос"17query_embedding = model.encode(query, convert_to_tensor=True, normalize_embeddings=True)1819# Search20hits = util.semantic_search(query_embedding, corpus_embeddings, top_k=5)[0]2122# Display results23for hit in hits:24print(f"Score: {hit['score']:.4f} | {corpus[hit['corpus_id']][:100]}...")
Important Notes
No Prefix Required
Unlike some BGE models, this model does NOT require query/passage prefixes. Simply encode your text directly:
python
1# ✅ Correct - no prefix needed2embedding = model.encode("Ваш текст")34# ❌ Not needed5embedding = model.encode("Represent this sentence for searching relevant passages: Ваш текст")
Sequence Length
The model is optimized for 512 tokens:
Fast inference speed
Minimal quality loss (< 1% documents truncated)
Ideal for most legal document fragments
For longer documents, consider chunking:
python
1from sentence_transformers import SentenceTransformer
23model = SentenceTransformer("Roflmax/bge-m3-legal-ru-cocktail-40-60")4model.max_seq_length =51256# Split long document into chunks7defchunk_text(text, max_length=2000):8# Simple character-based chunking9return[text[i:i+max_length]for i inrange(0,len(text), max_length)]1011long_document ="Очень длинный документ..."12chunks = chunk_text(long_document)13chunk_embeddings = model.encode(chunks, normalize_embeddings=True)1415# Use average embedding for the whole document16import numpy as np
17document_embedding = np.mean(chunk_embeddings, axis=0)
1@article{jiang2023lmcocktail,
2 title={LM-Cocktail: Resilient Tuning of Language Models via Model Merging},
3 author={Jiang, Shitao and others},
4 journal={arXiv preprint arXiv:2311.13534},
5 year={2023}
6}
Framework Versions
Python: 3.12.3
Sentence Transformers: 5.1.2
Transformers: 4.57.1
PyTorch: 2.8.0+cu128
LM-Cocktail: 0.0.4
License
MIT License - free for commercial and non-commercial use.
Note: This model achieves state-of-the-art performance on Russian legal document retrieval tasks. For best results, use with normalize_embeddings=True and cosine similarity.