SbertDistilV2 / README.md
Ponimash's picture
Update README.md
d7aec75 verified
---
license: apache-2.0
language:
- ru
base_model:
- FractalGPT/SbertDistil
- intfloat/multilingual-e5-large-instruct
library_name: sentence-transformers
tags:
- sentence-transformers
- sentence-similarity
- feature-extraction
- embeddings
- distillation
- nli
- masl
- task-specification
- agent
pipeline_tag: sentence-similarity
---
# SbertDistilV2
**Автор:** Потанин М. В.
## Описание модели
SbertDistilV2 — компактная модель эмбеддингов, специализированная для работы с задачами NLI (Natural Language Interface) и преобразования команд в формат MASL (Multi-agent system language). Модель получена путём двухэтапного обучения с применением дистилляции знаний и дообучения на специализированном датасете.
### Ключевые характеристики
- **Базовая модель**: `FractalGPT/SbertDistil`
- **Модель-учитель**: `intfloat/multilingual-e5-large-instruct`
- **Размерность эмбеддингов**: 384 (против 1024 у учителя)
- **Язык**: Русский
- **Специализация**: NLI задачи, MASL спецификации
## Архитектура обучения
Обучение проводилось в **два этапа**:
### Этап 1: Дистилляция знаний
Передача знаний от большой модели-учителя (`multilingual-e5-large-instruct`, 1024 dim) к компактной модели-ученику (`SbertDistil`, 384 dim).
**Метод согласования размерностей:**
- SVD-проекция для сжатия 1024-мерных эмбеддингов учителя в 384-мерное пространство ученика с минимальными потерями информации
**Комбинированная функция потерь:**
$$\mathcal{L}_{\text{total}} = \alpha \cdot \mathcal{L}_{\text{MSE}} + \beta \cdot \mathcal{L}_{\text{cosine}} + \gamma \cdot \mathcal{L}_{\text{InfoNCE}}$$
Где:
$$\mathcal{L}_{\text{MSE}}$$ — среднеквадратичная ошибка для прямого согласования эмбеддингов (вес: **1.0**)
$$\mathcal{L}_{\text{cosine}}$$ — косинусное сходство для сохранения направлений векторов (вес: **0.5**)
$$\mathcal{L}_{\text{InfoNCE}}$$ — контрастное обучение для улучшения различимости представлений (вес: **0.3**)
**Датасет:** Запросы на естественном языке
### Этап 2: Дообучение на MASL
Специализация модели на задачах преобразования NL-команд в MASL спецификации.
**Датасет:** Пары "запрос на естественном языке / MASL структура" (9 999 примеров)
## Датасет
Модель дообучена на синтетическом датасете NLI Task Specification Dataset (MASL):
- **Размер**: 9 999 примеров
- **Структура**: пары "команда → JSON структура"
- **Формат**: Входные и выходные коннекторы с типами данных, семантическими категориями и областями знаний
Подробнее о датасете см. документацию к [NLI Dataset](https://huggingface.co/datasets/Ponimash/nli_dataset).
## Использование
### Установка
```bash
pip install sentence-transformers
```
### Базовое использование
```python
from sentence_transformers import SentenceTransformer
# Загрузка модели
model = SentenceTransformer("FractalGPT/SbertDistilV2")
# Пример команд
commands = [
"Преобразуй эту аудиозапись в текстовый формат",
"Создай презентацию с анализом медицинских данных",
"Ответь на вопрос о квантовой физике голосом"
]
# Получение эмбеддингов
embeddings = model.encode(commands)
print(f"Размерность эмбеддингов: {embeddings.shape[1]}")
print(f"Количество векторов: {embeddings.shape[0]}")
```
### Поиск похожих команд
```python
from sentence_transformers import SentenceTransformer, util
import torch
model = SentenceTransformer("FractalGPT/SbertDistilV2")
# База команд
commands_db = [
"Преобразуй речь в текст",
"Создай презентацию по физике",
"Сделай аудио ответ на вопрос",
"Проанализируй медицинский документ",
"Переведи аудио в текстовый файл"
]
# Запрос пользователя
query = "Транскрибируй голосовое сообщение в txt"
# Получение эмбеддингов
query_embedding = model.encode(query, convert_to_tensor=True)
db_embeddings = model.encode(commands_db, convert_to_tensor=True)
# Вычисление косинусного сходства
cosine_scores = util.cos_sim(query_embedding, db_embeddings)[0]
# Сортировка результатов
results = torch.argsort(cosine_scores, descending=True)
print(f"Запрос: {query}\n")
print("Наиболее похожие команды:")
for idx in results[:3]:
print(f" {commands_db[idx]} (Score: {cosine_scores[idx]:.4f})")
```
### Кластеризация команд
```python
from sentence_transformers import SentenceTransformer
from sklearn.cluster import KMeans
import numpy as np
model = SentenceTransformer("FractalGPT/SbertDistilV2")
commands = [
"Преобразуй аудио в текст",
"Транскрибируй голос в txt",
"Создай презентацию по биологии",
"Сделай pptx с анализом данных",
"Ответь голосом на вопрос",
"Озвучь ответ на запрос"
]
# Получение эмбеддингов
embeddings = model.encode(commands)
# Кластеризация (3 кластера: транскрипция, презентации, голосовые ответы)
kmeans = KMeans(n_clusters=3, random_state=42)
clusters = kmeans.fit_predict(embeddings)
# Группировка по кластерам
for i in range(3):
cluster_commands = [cmd for cmd, cluster in zip(commands, clusters) if cluster == i]
print(f"\nКластер {i+1}:")
for cmd in cluster_commands:
print(f" - {cmd}")
```
## Применение
Модель оптимизирована для следующих задач:
### 1. Семантический поиск команд
Поиск похожих команд в базе знаний мультиагентной системы для переиспользования существующих решений.
### 2. Кластеризация задач
Группировка схожих запросов для оптимизации маршрутизации в агентных системах.
### 3. Классификация намерений
Определение типа задачи (транскрипция, генерация отчётов, голосовые ответы и т.д.) по векторному представлению.
### 4. Ранжирование инструментов
Поиск наиболее подходящих инструментов для выполнения пользовательской команды на основе семантического сходства.
### 5. Дедупликация запросов
Выявление дублирующихся или очень похожих запросов для оптимизации обработки.
## Технические детали
### Оптимизации обучения
- **Mixed Precision Training**: использование bfloat16/float16 для ускорения обучения
- **Gradient Accumulation**: накопление градиентов для эффективной работы с большими батчами
- **SVD Projection**: оптимальное сжатие размерности с сохранением максимальной дисперсии
### Математическое обоснование
**MSE Loss** (прямое согласование):
$$\mathcal{L}_{\text{MSE}} = \frac{1}{N} \sum_{i=1}^{N} \|\text{SVD}(\mathbf{h}_{\text{teacher}}^{(i)}) - \mathbf{h}_{\text{student}}^{(i)}\|^2$$
**Cosine Similarity Loss** (сохранение направлений):
$$\mathcal{L}_{\text{cosine}} = 1 - \frac{1}{N} \sum_{i=1}^{N} \frac{\mathbf{h}_{\text{teacher}}^{(i)} \cdot \mathbf{h}_{\text{student}}^{(i)}}{\|\mathbf{h}_{\text{teacher}}^{(i)}\| \|\mathbf{h}_{\text{student}}^{(i)}\|}$$
**InfoNCE Loss** (контрастное обучение):
$$\mathcal{L}_{\text{InfoNCE}} = -\log \frac{\exp(\text{sim}(\mathbf{h}_i, \mathbf{h}_i^+) / \tau)}{\sum_{j=1}^{N} \exp(\text{sim}(\mathbf{h}_i, \mathbf{h}_j) / \tau)}$$
Где $\tau$ — температурный параметр контрастного обучения.
## Ограничения
- Модель оптимизирована для **русского языка**
- Специализирована на задачах NLI и MASL, может показывать сниженное качество на общих задачах эмбеддингов
- Размерность 384 может быть недостаточной для очень сложных семантических различий
## Связанные модели
- [Qwen2.5-NLI-7B](https://huggingface.co/Ponimash/Qwen2.5-nli-7b) — генеративная модель для создания MASL спецификаций
- [FractalGPT/SbertDistil](https://huggingface.co/FractalGPT/SbertDistil) — базовая модель
- [multilingual-e5-large-instruct](https://huggingface.co/intfloat/multilingual-e5-large-instruct) — модель-учитель
## Примеры результатов
### Пример 1: Транскрипция
```python
query = "Преобразуй голосовое сообщение в текст"
similar = [
"Транскрибируй аудио в txt",
"Переведи речь в текстовый формат",
"Распознай речь и сохрани в файл"
]
```
### Пример 2: Генерация отчётов
```python
query = "Создай презентацию с анализом данных"
similar = [
"Сделай pptx с результатами исследования",
"Подготовь слайды с выводами",
"Оформи отчёт в виде презентации"
]
```
## Цитирование
```bibtex
@misc{sbertdistilv2-nli-masl,
author = {Потанин, М. В.},
title = {SbertDistilV2-NLI-MASL: Compact Embeddings for Natural Language Interface Tasks},
year = {2024},
publisher = {HuggingFace},
howpublished = {\url{https://huggingface.co/FractalGPT/SbertDistilV2}}
}
```
## Лицензия
Модель распространяется под лицензией Apache 2.0.