241 lines
9.5 KiB
Markdown
241 lines
9.5 KiB
Markdown
|
|
# Результаты экспериментов с 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
|