Дообучення Embedding-моделі під домен замовника: результати та вартість

Дообучення Embedding-моделі під домен замовника: результати та вартість

Напрямки AI-розробки

Часті запитання

Останні роботи

  • image_website-b2b-advance_0.webp
    Розробка сайту компанії B2B ADVANCE
    1440
  • image_web-applications_feedme_466_0.webp
    Розробка веб-додатків для компанії FEEDME
    1301
  • image_websites_belfingroup_462_0.webp
    Розробка веб-сайту для компанії БЕЛФІНГРУП
    997
  • image_ecommerce_furnoro_435_0.webp
    Розробка інтернет магазину для компанії FURNORO
    1264
  • image_logo-advance_0.webp
    Розробка логотипу компанії B2B Advance
    712
  • image_crm_enviok_479_0.webp
    Розробка веб-додатків для компанії Enviok
    1002

Дообучення 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-моделей.

Вартість робіт: від $2000 для малих проєктів (300-500 пар) до $10000 для великих (5000+ пар). Економія на інфраструктурі сягає 30% порівняно з заміною моделі, а окупність настає через 2-3 місяці використання.

Які ознаки свідчать про необхідність дообучення embedding-моделі?

Симптоми, які свідчать про необхідність fine-tuning:

  • Загальна модель плутає специфічні терміни: MeSH terms у медицині, юридичні конструкції в праві, технічні абревіатури.
  • Context recall RAG-системи застряг нижче 0.75, навіть після оптимізації чанкінгу та пошукового індексу.
  • Висока частка хибних спрацьовувань — семантично схожі, але тематично нерелевантні документи потрапляють у top-K.

Якщо ви помітили ці ознаки, fine-tuning дасть приріст метрик на 15-30% без зміни архітектури.

Чому fine-tuning кращий за заміну моделі в 2-3 рази?

Заміна на більшу модель (наприклад, з 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%. Застосовуємо контрастивне навчання (contrastive learning) з batch hard mining для покращення розділення доменних понять.

Приклад конфігурації fine-tuning
from sentence_transformers import SentenceTransformer, SentenceTransformerTrainer from sentence_transformers.losses import MultipleNegativesRankingLoss from sentence_transformers.training_args import SentenceTransformerTrainingArguments model = SentenceTransformer('BAAI/bge-m3') train_dataset = ... # ваші дані args = SentenceTransformerTrainingArguments( output_dir='./finetuned', per_device_train_batch_size=32, learning_rate=2e-5, warmup_ratio=0.1, num_train_epochs=3, fp16=True, ) loss = MultipleNegativesRankingLoss(model) trainer = SentenceTransformerTrainer( model=model, args=args, train_dataset=train_dataset, loss=loss, ) trainer.train() 

Генерація навчальних пар з 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

  1. Аналіз домену та збір репрезентативних документів. Визначаємо ключові теми та типи запитів.
  2. Генерація синтетичних пар запит-документ. Використовуємо LLM (GPT-4o-mini) для створення до 5000 пар.
  3. Ручне рев'ю та корекція (опціонально). Залучаємо експертів домену для підвищення якості.
  4. Fine-tuning. Запускаємо навчання на A100 з MultipleNegativesRankingLoss.
  5. Оцінка. Порівнюємо метрики на тестовій вибірці до і після.
  6. Деплой. Замінюємо файл ваг — інфраструктура не змінюється.

Обсяги даних: мінімальні та оптимальні

Тип набору Кількість пар (запит-документ) Очікуваний приріст 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 успішним проєктам з дообучення ми гарантуємо результат.

Зв'яжіться з нами — ми оцінимо ваш проєкт і запропонуємо оптимальне рішення. Працюємо під ключ: від аналізу даних до деплою. Отримайте консультацію — це безкоштовно.