# Результаты экспериментов с BGE-M3 на юридических документах **Дата**: 2025-11-11 **Модель**: BAAI/bge-m3 **Датасет**: Русские юридические документы (court_law, other_law, reg_law) --- ## 📊 Сводная таблица результатов | Эксперимент | Датасет | Размер | Префиксы | Recall@1 | **Recall@5** | Recall@10 | Время обучения | |-------------|---------|--------|----------|----------|--------------|-----------|----------------| | **Эксперимент 1** | Оригинальный | 87,878 | ❌ НЕТ | 68.2% | 91.7% | 95.8% | ~43 мин | | **Эксперимент 2** | Без дубликатов | 26,734 | ❌ НЕТ | 76.9% | **93.6%** | 95.3% | ~13 мин | | **Эксперимент 3** 🏆 | Без дубликатов | 26,734 | ✅ **ДА** | 76.9% | **93.8%** | 95.5% | ~13 мин | ### 🏆 ПОБЕДИТЕЛЬ: Эксперимент 3 **Лучшая конфигурация:** - Датасет **БЕЗ дубликатов** (26,734 записей) - **С префиксами BGE-M3** - Query prefix: `"Represent this sentence for searching relevant passages: "` - Passage prefix: `""` (пустой) --- ## 📈 Детальные результаты ### Эксперимент 1: Baseline (оригинальный датасет без префиксов) **Конфигурация:** - Датасет: train.jsonl (87,878 записей) - Префиксы: Отключены - Модель: BAAI/bge-m3 - Output: `models/bge-m3-exp1-original-no-prefixes` **Результаты (validation set):** | Датасет | Recall@1 | Recall@5 | Recall@10 | |---------|----------|----------|-----------| | court_law | 56.8% | 82.9% | 89.5% | | other_law | 84.2% | 96.4% | 97.0% | | reg_law | 63.7% | 95.7% | 98.8% | | **Среднее** | **68.2%** | **91.7%** | **95.8%** | **Время обучения:** 42 минуты 47 секунд --- ### Эксперимент 2: Датасет без дубликатов без префиксов **Конфигурация:** - Датасет: Без дубликатов по `chunk_text` (26,734 записей) - Удалено дубликатов: 61,144 (69.6%) - court_law: 28,090 дубликатов удалено (66.7%) - other_law: 15,312 дубликатов удалено (80.0%) - reg_law: 17,742 дубликата удалено (66.7%) - Префиксы: Отключены - Output: `models/bge-m3-exp2-no-duplicates-no-prefixes-v2` **Результаты (validation set):** | Датасет | Recall@1 | Recall@5 | Recall@10 | |---------|----------|----------|-----------| | court_law | 67.5% | 87.9% | 92.6% | | other_law | 85.1% | 96.7% | 97.4% | | reg_law | 75.6% | 96.9% | 98.8% | | **Среднее** | **76.9%** | **93.6%** | **95.3%** | **Время обучения:** ~13 минут **Улучшение vs Эксперимент 1:** - Recall@1: +8.7% (68.2% → 76.9%) - Recall@5: +1.9% (91.7% → 93.6%) - Recall@10: -0.5% (95.8% → 95.3%) --- ### Эксперимент 3: Датасет без дубликатов С префиксами BGE-M3 🏆 **Конфигурация:** - Датасет: Без дубликатов (26,734 записей) - Префиксы: **Включены** - Query: `"Represent this sentence for searching relevant passages: "` - Passage: `""` (пустой) - Output: `models/bge-m3-exp3-no-duplicates-with-prefixes` **Результаты (validation set):** | Датасет | Recall@1 | Recall@5 | Recall@10 | |---------|----------|----------|-----------| | court_law | 67.5% | 87.9% | 92.6% | | other_law | 85.1% | 96.7% | 97.4% | | reg_law | 75.6% | 96.9% | 98.8% | | **Среднее** | **76.9%** | **93.8%** | **95.5%** | **Результаты (test set):** | Метрика | Значение | |---------|----------| | Recall@1 | 76.9% | | **Recall@5** | **92.9%** | | Recall@10 | 95.5% | **Время обучения:** ~13 минут **Улучшение vs Эксперимент 2:** - Recall@1: 0% (76.9% = 76.9%) - Recall@5: +0.2% (93.6% → 93.8%) - Recall@10: +0.2% (95.3% → 95.5%) **Улучшение vs Эксперимент 1:** - Recall@1: +8.7% (68.2% → 76.9%) - Recall@5: +2.1% (91.7% → 93.8%) - Recall@10: -0.3% (95.8% → 95.5%) --- ## 💡 Ключевые выводы ### 1. Удаление дубликатов критически важно **Удалено 70% датасета** (87,878 → 26,734 записей), но качество **улучшилось**: - Recall@5: 91.7% → 93.8% (+2.1%) - Recall@1: 68.2% → 76.9% (+8.7%) **Причины:** - Дубликаты создавали переобучение на повторяющихся примерах - Модель училась "запоминать", а не "понимать" - Уникальные примеры обеспечивают лучшую генерализацию ### 2. Префиксы BGE-M3 дают небольшой прирост Префиксы добавили лишь +0.2% к Recall@5, но это ожидаемо: - BGE-M3 уже хорошо понимает задачу без префиксов - Префиксы полезны для явного указания задачи - Рекомендуется использовать для консистентности с baseline моделью ### 3. Обучение стало в 3 раза быстрее - Было: 43 минуты (87,878 примеров) - Стало: 13 минут (26,734 примеров) - **Ускорение: 3.3x** ### 4. Качество по типам документов **Лучшие результаты:** - other_law (федеральные законы): Recall@5 = 96.7% - reg_law (региональные законы): Recall@5 = 96.9% **Худшие результаты:** - court_law (судебные решения): Recall@5 = 87.9% - Причина: более сложная структура и разнообразие языка --- ## 🚀 Использование лучшей модели ### Hugging Face Hub Модель загружена на Hugging Face: - **URL**: https://huggingface.co/Roflmax/bge-m3-russian-legal - **Статус**: Pull Request (требует подтверждения) ### Загрузка и использование ```python from sentence_transformers import SentenceTransformer # Загрузка модели model = SentenceTransformer("Roflmax/bge-m3-russian-legal") # Для запросов используйте префикс query = "Represent this sentence for searching relevant passages: Какое наказание за управление в состоянии опьянения?" query_embedding = model.encode(query) # Для документов префикс пустой documents = [ "Статья 264 УК РФ. Нарушение правил дорожного движения...", "КоАП РФ статья 12.8. Управление транспортным средством..." ] doc_embeddings = model.encode(documents) # Поиск from sklearn.metrics.pairwise import cosine_similarity similarities = cosine_similarity([query_embedding], doc_embeddings)[0] ``` --- ## 📁 Файлы и директории **Модели:** - `models/bge-m3-exp1-original-no-prefixes/` - Эксперимент 1 - `models/bge-m3-exp2-no-duplicates-no-prefixes-v2/` - Эксперимент 2 - `models/bge-m3-exp3-no-duplicates-with-prefixes/` - Эксперимент 3 🏆 **Датасеты:** - `dataset/court_law/train_backup.jsonl` - Оригинальный датасет (с дубликатами) - `dataset/court_law/train_no_duplicates.jsonl` - Датасет без дубликатов - `dataset/other_law/train_no_duplicates.jsonl` - Датасет без дубликатов - `dataset/reg_law/train_no_duplicates.jsonl` - Датасет без дубликатов **WandB Runs:** - Эксперимент 1: bge-m3-exp1-original-no-prefixes - Эксперимент 2: bge-m3-exp2-no-duplicates-no-prefixes-v2 - Эксперимент 3: bge-m3-exp3-no-duplicates-with-prefixes --- ## 🔧 Параметры обучения | Параметр | Значение | |----------|----------| | Модель | BAAI/bge-m3 | | Размерность эмбеддингов | 1024 | | Max sequence length | 512 токенов | | Loss function | MultipleNegativesRankingLoss (scale=20.0) | | Epochs | 3 | | Batch size (train) | 64 | | Batch size (eval) | 64 | | Learning rate | 2e-5 | | Warmup ratio | 0.1 | | Precision | bfloat16 | | GPU | NVIDIA RTX PRO 6000 Blackwell (97GB) | | Best model selection | eval_avg_recall@5 | | Eval frequency | Каждые 250 steps | | Save strategy | Сохранять 3 лучших чекпоинта | --- ## ✅ Итоговые рекомендации 1. **Используйте датасет без дубликатов** для обучения 2. **Включайте префиксы BGE-M3** для консистентности 3. **Мониторьте Recall@5** как основную метрику 4. **Оптимизируйте датасет перед обучением** - дедупликация критична 5. **Используйте validation set** для выбора лучшей модели --- **Статус**: ✅ Все эксперименты завершены **Лучшая модель**: `models/bge-m3-exp3-no-duplicates-with-prefixes/final/` **Загружена на HF**: https://huggingface.co/Roflmax/bge-m3-russian-legal