12 мин · Январь 2025 · Александр, NLP Lead

Руководство по внедрению семантического поиска

От эмбеддингов до production: практическое руководство по созданию системы семантического поиска для бизнеса.

Введение

Семантический поиск меняет правила игры в работе с корпоративными данными. В отличие от традиционного ключевого поиска, он понимает смысл запроса и находит релевантные документы даже при отсутствии точных совпадений слов.

В этом руководстве разберем полный цикл внедрения: от выбора модели эмбеддингов до масштабирования на миллионы документов.

Архитектура системы

Типичная система семантического поиска состоит из трех компонентов:

1. Embedding Model

Преобразует текст в вектор фиксированной размерности (обычно 384-1536). Качество модели определяет качество поиска.

2. Vector Database

Хранит векторы и обеспечивает быстрый поиск по сходству (ANN — Approximate Nearest Neighbors).

3. Reranker (опционально)

Уточняет результаты, используя более точную модель на топ-N кандидатах.

Выбор модели эмбеддингов

Для русского языка рекомендуем рассмотреть следующие модели (по состоянию на 2025):

МодельРазмерностьКонтекстЛучше для
intfloat/multilingual-e5-large1024512Универсальный выбор
sentence-transformers/paraphrase-multilingual-mpnet-base-v2768128Скорость + качество
cointegrated/rubert-tiny23122048Ресурсоемкие задачи
Важно: Не используйте голые LLM (GPT, LLaMA) для эмбеддингов — они не оптимизированы для этого. Используйте специализированные embedding-модели.

Chunking: разбиение документов

Длинные документы нужно разбивать на фрагменты (chunks), которые поместятся в контекст модели. Размер чанка — ключевой параметр:

  • Маленькие (128-256 токенов): высокая точность, но теряется контекст
  • Средние (512-1024 токена): оптимальный баланс для большинства задач
  • Большие (2048+ токенов): сохраняют контекст, но ниже гранулярность

Рекомендуемый подход — overlapping chunks с перекрытием 10-20%:

# Пример chunking с перекрытием
def create_chunks(text, chunk_size=512, overlap=50):
    tokens = tokenizer.encode(text)
    chunks = []

    for i in range(0, len(tokens), chunk_size - overlap):
        chunk = tokens[i:i + chunk_size]
        chunks.append(tokenizer.decode(chunk))

    return chunks

Выбор Vector Database

Для production-систем рассмотрите:

База данныхМакс. векторовОсобенности
pgvector (PostgreSQL)10M+Если уже используете PostgreSQL
PineconeБезлимитManaged, простой старт
WeaviateБезлимитГибридный поиск из коробки
Milvus/ZillizБезлимитВысокая производительность

Оценка качества

До запуска в production измерьте качество на ваших данных:

  1. Соберите тестовый датасет: 50-100 пар (запрос, релевантный документ)
  2. Метрики:
    • Recall@K — доля релевантных документов в топ-K
    • MRR (Mean Reciprocal Rank) — средняя позиция первого релевантного
    • NDCG — учитывает порядок релевантных документов
  3. Целевые значения: Recall@5 ≥ 0.8, MRR ≥ 0.7

Production-оптимизации

Кэширование

Запросы часто повторяются. Кэшируйте результаты на уровне приложения (Redis/Memcached) с TTL 1-24 часа.

Гибридный поиск

Комбинируйте семантический и ключевой поиск для лучших результатов: объединяйте scores с весами (например, 0.7 * semantic + 0.3 * BM25).

Фильтрация метаданных

Добавьте pre-filtering по метаданным (дата, категория, автор) перед векторным поиском — это ускоряет запросы и улучшает релевантность.

Чек-лист внедрения

Заключение

Семантический поиск — мощный инструмент, но требует внимания к деталям. Начните с простой архитектуры, измеряйте качество на ваших данных и итеративно улучшайте систему.

Если вам нужна помощь с внедрением — свяжитесь с нами. Мы специализируемся на production-ready NLP-решениях.