--- 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.