Вибір та налаштування Embedding-моделі для RAG

Вибір та налаштування Embedding-моделі для RAG

Напрямки 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

Ми часто стикаємося з ситуацією, коли RAG-система працює, але retrieval видає нерелевантні документи. Найчастіше проблема в embedding-моделі — вона не підходить під мову вашого корпусу або контекст запитів. Зміна моделі може підняти recall на 10–15% без зміни архітектури. Замовте аудит вашої системи — ми підберемо оптимальну модель і налаштуємо її під ваші дані. Наші інженери мають 10 років досвіду в NLP і реалізували понад 50 RAG-проєктів для Enterprise.

Помилка у виборі моделі може коштувати до 40% точності відповідей. Ми гарантуємо, що після налаштування під ваш домен recall виросте мінімум на 10%. Зв'яжіться з нами для безкоштовного аудиту.

Як вибрати Embedding-модель для RAG?

Embedding-модель — один з найбільш критичних компонентів RAG-системи. Якість retrieval безпосередньо залежить від того, наскільки добре модель представляє тексти у векторному просторі. Зміна embedding-моделі може дати більший приріст recall, ніж оптимізація чанкінгу або параметрів пошуку.

Категорії embedding-моделей

Пропрієтарні API-моделі:

  • text-embedding-3-large (OpenAI, dim=3072): найкраща якість на більшості бенчмарків MTEB
  • text-embedding-3-small (OpenAI, dim=1536): гарне співвідношення ціна/якість
  • embed-v3 (Cohere): сильний на retrieval задачах, підтримує параметр input_type

Відкриті моделі (self-hosted):

  • BAAI/bge-m3 (dim=1024): багатомовний, підтримує dense+sparse+colbert
  • BAAI/bge-large-en-v1.5 (dim=1024): найкращий для англійської
  • intfloat/multilingual-e5-large (dim=1024): добре на українській та російській
  • nomic-ai/nomic-embed-text-v1.5 (dim=768): матрьошковий (кратні розмірності)

Порівняння моделей за MTEB

На задачах Retrieval (BEIR benchmark, усереднений nDCG@10) актуальні дані з MTEB leaderboard:

Модель NDCG@10 (BEIR avg) Dim Макс. токени Тип Latency p99
text-embedding-3-large 54.9 3072 8191 API 200ms
text-embedding-3-small 51.7 1536 8191 API 100ms
cohere embed-v3 55.0 1024 512 API 150ms
BAAI/bge-m3 54.0 1024 8192 Open 80ms (GPU)
intfloat/e5-mistral-7b 56.9 4096 32768 Open 400ms (GPU)
nomic-embed-text-v1.5 53.5 768 8192 Open 50ms (GPU)

Для українськомовних завдань картина інша — рекомендуємо тестувати на власному домені. Ми проводимо тріал на вашому корпусі та надаємо звіт з метриками.

Налаштування Cohere Embed v3 з input_type

Cohere embed-v3 вимагає вказання input_type — це важливо для retrieval. Використання правильного input_type підвищує recall на 8–15%:

import cohere co = cohere.Client(api_key="...") def embed_documents(texts: list[str]) -> list[list[float]]: """Для індексації документів""" response = co.embed( texts=texts, model="embed-multilingual-v3.0", input_type="search_document", # Для документів при індексації ) return response.embeddings def embed_query(query: str) -> list[float]: """Для пошукового запиту""" response = co.embed( texts=[query], model="embed-multilingual-v3.0", input_type="search_query", # Асиметрична модель — різні типи ) return response.embeddings[0] 

Self-hosted BGE-M3

BGE-M3 — найбільш універсальна open-source модель: підтримує dense, sparse (SPLADE) та ColBERT-стиль multi-vector retrieval з однієї моделі. Економія на інфраструктурі — одна модель замість трьох:

from FlagEmbedding import BGEM3FlagModel model = BGEM3FlagModel( "BAAI/bge-m3", use_fp16=True, # Економія пам'яті device="cuda", ) # Dense embeddings (для стандартного ANN пошуку) dense_embeddings = model.encode( texts, batch_size=32, max_length=8192, return_dense=True, return_sparse=False, return_colbert_vecs=False, )["dense_vecs"] # Sparse embeddings (для BM25-подібного пошуку) sparse_embeddings = model.encode( texts, return_dense=False, return_sparse=True, )["lexical_weights"] # dict {token: weight} # Hybrid retrieval score def compute_bge_m3_score(query_dense, doc_dense, query_sparse, doc_sparse, alpha=0.5) -> float: dense_score = np.dot(query_dense, doc_dense) sparse_score = sum( query_sparse.get(token, 0) * doc_sparse.get(token, 0) for token in query_sparse ) return alpha * dense_score + (1 - alpha) * sparse_score 

Вибір розмірності: Matryoshka Embeddings

Nomic Embed та ряд інших моделей підтримують матрьошкові embeddings — можна використовувати перші N вимірів без переучування. Це знижує вимоги до RAM векторної БД у 2× при незначній (2–5%) втраті якості:

from openai import OpenAI client = OpenAI() # text-embedding-3-large зі зменшеною розмірністю response = client.embeddings.create( model="text-embedding-3-large", input=texts, dimensions=1536, # Зменшуємо розмірність ) 

Що впливає на якість retrieval?

Крім вибору моделі, важливі: препроцесинг текстів, довжина чанків, стратегія злиття результатів sparse+dense. Ми враховуємо всі ці фактори при налаштуванні RAG під ваш домен.

Практичний вибір embedding-моделі

  • Якщо дані конфіденційні / on-premise: BGE-M3 або E5-mistral-7b (self-hosted).
  • Якщо потрібна найкраща українська/російська мова: тестуємо BGE-M3, multilingual-e5-large та text-embedding-3-large на своєму домені. Універсального переможця немає.
  • Якщо мінімальна latency: text-embedding-3-small (API) або nomic-embed-text-v1.5 (self-hosted).
  • Якщо потрібен hybrid sparse+dense без двох моделей: BGE-M3 — єдина open-source модель з нативною підтримкою обох режимів.

Оцінка на своєму домені

from ragas import evaluate from ragas.metrics import context_recall, context_precision for model_name in ["text-embedding-3-small", "text-embedding-3-large"]: retriever = build_retriever(model_name) scores = evaluate(test_dataset, metrics=[context_recall, context_precision], retriever=retriever) print(f"{model_name}: recall={scores['context_recall']:.3f}, " f"precision={scores['context_precision']:.3f}") 

Що входить у налаштування RAG під ключ

  • Аналіз вашого корпусу та сценаріїв використання
  • Вибір та тестування 2–3 embedding-моделей
  • Налаштування індексації (розмір чанків, overlap, векторна БД)
  • Інтеграція з вашим бекендом (API, gRPC)
  • Документація та навчання вашої команди
  • Пост-релізна підтримка 2 тижні

Терміни та вартість

  • Налаштування embedding-моделі та індексація: 2–5 днів
  • Порівняльне тестування 2–3 моделей: 3–5 днів
  • Разом: 1–2 тижні
  • Вартість розраховується індивідуально під проєкт. Оцінимо ваше завдання за один робочий день безкоштовно.

Напишіть нам, і ми підберемо оптимальну модель для вашого RAG. Гарантуємо підвищення recall мінімум на 10% за вашими метриками.