Дообучение Embedding-модели под домен заказчика
Представьте: вы внедрили RAG-пайплайн с современной embedding-моделью — BAAI/bge-m3 или OpenAI text-embedding-3. На общих запросах всё работает, но как только доходит до профильных документов — медицинских протоколов, судебных решений или технических стандартов — точность поиска падает. Модель путает термины домена, context recall застревает на 0.6-0.7, а в top-K лезут семантически похожие, но тематически нерелевантные документы. Мы решаем эту проблему дообучением модели на ваших данных. Без замены инфраструктуры. Наш подход: генерация синтетических пар через LLM, fine-tuning с MultipleNegativesRankingLoss и тщательная оценка. Результат — прирост NDCG на 15-30%. За 5 лет мы выполнили более 30 проектов по кастомизации NLP-моделей.
«Domain-specific fine-tuning of embedding models can improve retrieval metrics by 15-30% without changing infrastructure» — из отчёта о проекте
Когда необходимо дообучение embedding-модели?
Симптомы, которые говорят о необходимости fine-tuning:
- Общая модель путает специфические термины: MeSH terms в медицине, юридические конструкции в праве, технические аббревиатуры.
- Context recall RAG-системы застрял ниже 0.75, даже после оптимизации чанкинга и поискового индекса.
- Высокая доля ложных срабатываний — семантически похожие, но тематически нерелевантные документы попадают в top-K.
Если вы заметили эти признаки, fine-tuning даст прирост метрик на 15-30% без изменения архитектуры.
Почему fine-tuning выгоднее замены модели?
Замена на более крупную модель (например, с 768 до 1536 размерности) увеличивает latency и стоимость хранения векторов. Fine-tuning той же модели на доменных данных — дешевле и быстрее. Мы используем MultipleNegativesRankingLoss — он эффективнее triplet loss для задач retrieval. Экономия на инфраструктуре может достигать 30%, а затраты на API для генерации данных окупаются за счёт точности.
Как мы дообучаем: стек и конфигурация
Используем sentence-transformers, PyTorch, Hugging Face Transformers. Базовая модель — BAAI/bge-m3 или intfloat/multilingual-e5-large. Обучаем на A100 (80GB) с batch size 32, learning rate 2e-5, warmup 10%.
Генерация обучающих пар с LLM
Для создания датасета без ручной разметки применяем GPT-4o-mini. Пример генерации:
from openai import OpenAI import json client = OpenAI() def generate_queries_for_document(doc_text: str, n: int = 5) -> list[str]: response = client.chat.completions.create( model="gpt-4o-mini", messages=[{ "role": "user", "content": f"""Сгенерируй {n} поисковых запросов...""" }], response_format={"type": "json_object"}, ) return json.loads(response.choices[0].message.content)["queries"] Типично: 1000 документов × 5 запросов = 5000 пар за ~2 часа и 5-15 долларов на API.
Пошаговый процесс fine-tuning
- Анализ домена и сбор репрезентативных документов. Определяем ключевые темы и типы запросов.
- Генерация синтетических пар запрос-документ. Используем LLM (GPT-4o-mini) для создания до 5000 пар.
- Ручное ревью и коррекция (опционально). Привлекаем экспертов домена для повышения качества.
- Fine-tuning. Запускаем обучение на A100 с MultipleNegativesRankingLoss.
- Оценка. Сравниваем метрики на тестовой выборке до и после.
- Деплой. Заменяем файл весов — инфраструктура не меняется.
Объёмы данных: минимальные и оптимальные
| Тип набора | Количество пар (запрос-документ) | Ожидаемый прирост NDCG@10 |
|---|---|---|
| Минимальный | 300–500 | 5–10% |
| Оптимальный | 2000–5000 | 15–30% |
Из нашей практики: юридические документы
Мы работали с крупной юридической компанией. Их задача — поиск по судебным решениям и нормативным актам. Базовая модель BAAI/bge-m3 давала NDCG@10 = 0.68. Мы дообучили на 8000 пар (6500 синтетических через GPT-4o-mini, 1500 ручных от экспертов). Результаты:
| Метрика | До FT | После FT |
|---|---|---|
| NDCG@10 | 0.68 | 0.84 |
| Recall@5 | 0.61 | 0.79 |
| MRR@5 | 0.65 | 0.82 |
| Latency (inference) | без изменений | без изменений |
+24% к NDCG без изменения инфраструктуры — только обновление весов модели. Клиент получил систему поиска, которая находит нужные документы вдвое точнее.
Что входит в работу
- Анализ ваших данных и выявление проблем retrieval.
- Подготовка обучающего датасета (синтетическая + ручная разметка при необходимости).
- Fine-tuning модели на выбранном стеке.
- Оценка на ваших тестовых запросах.
- Деплой дообученной модели в вашу инфраструктуру (Docker, SageMaker, Triton).
- Документация и обучение команды.
Закажите оценку вашего проекта — мы подберём оптимальную стратегию дообучения.
Сроки
- Генерация датасета: 3-7 дней.
- Fine-tuning: 2-4 часа (на A100) до суток при большом объёме.
- Оценка и сравнение: 2-3 дня.
- Итого от 1 до 3 недель в зависимости от сложности.
Как оценить качество после дообучения?
Используем InformationRetrievalEvaluator из sentence-transformers:
evaluator = InformationRetrievalEvaluator( queries=test_queries, corpus=test_corpus, relevant_docs=relevance_labels, precision_recall_at_k=[1,5,10], ndcg_at_k=[10], ) Сравниваем базовую и дообученную модель. Результаты визуализируем и отдаём заказчику.
Чтобы избежать типичных ошибок, мы используем достаточный объём данных, отделяем тестовую выборку и нормализуем эмбеддинги на inference. Благодаря 5-летнему опыту в NLP и более чем 30 успешным проектам по дообучению мы гарантируем результат.
Свяжитесь с нами — мы оценим ваш проект и предложим оптимальное решение. Работаем под ключ: от анализа данных до деплоя. Получите консультацию — это бесплатно.







