Гайд · TNWS AI

Как уменьшить размер embeddings через truncate_dim без потери контроля качества

5 мин—

Проверяем форму усечённого вектора и Recall@k, отдельно объясняем, почему truncation не делает любую модель Matryoshka.

Задача и применимость

Поисковый запрос: «как уменьшить размер вектора SentenceTransformer truncate_dim». Ниже одна практическая задача для Python с библиотекой Sentence Transformers 6.1.0, опубликованной 18 сентября 2026 года, и checkpoint sentence-transformers/all-mpnet-base-v2. Пример на английских предложениях выбран потому, что поддержка русского выбранной демонстрационной моделью не должна подразумеваться автоматически. Для реального русского корпуса подберите подтверждённую карточкой языков модель и повторите оценку. Внешний поиск, генерация LLM и принятие бизнес-решения остаются отдельными этапами.

Фактическая основа: Метод encode поддерживает truncate_dim, а контекстный менеджер model.truncate_embeddings временно меняет выходную размерность. Официальный API показывает пример сокращения до 16 измерений, но физическая возможность обрезать массив не доказывает сохранение качества произвольной моделью. Для сильного сокращения лучше заранее проверять модель, обученную под Matryoshka. Точный прогноз значений векторных оценок без запуска весов модели не обещается. Примеры кода ниже сверены с текущей официальной документацией и проверены на синтаксис Python; в этом окружении сами веса не загружались. При обновлении модели или зависимости сначала повторите контрольный пример.

Нумерованная инструкция

  1. Зафиксируйте базовый результат поиска на исходной размерности и контрольные IDs.
  2. Получите два набора vectors от одной модели: полный и усечённый.
  3. Проверьте реальные размеры и одинаковый порядок исходных документов.
  4. Измерьте Recall@k и p95 для двух схем на копиях индекса.
  5. Только после приемлемого качества переносите всю коллекцию в новую схему.

Подготовьте изолированное окружение и установите зафиксированный пакет: pip install "sentence-transformers==6.1.0". Библиотека потребует подходящих зависимостей и свободной памяти под выбранные веса; установка пакета не скачивает заранее любую модель. Перед тестом напечатайте установленную версию и зафиксируйте имя checkpoint. Не отправляйте в примеры клиентские имена, закрытые документы или ключи доступа.

Готовый шаблон

from sentence_transformers import SentenceTransformer

model = SentenceTransformer("sentence-transformers/all-mpnet-base-v2")
docs = ["Returns are allowed for 14 days.",
        "Delivery is possible on weekdays."]
full = model.encode(docs)
with model.truncate_embeddings(truncate_dim=16):
    short = model.encode(docs)
print("original", full.shape, "short", short.shape)
assert full.shape[0] == short.shape[0]
assert short.shape[1] == 16

Запускайте первый раз на очень маленьком обезличенном наборе. Для каждой строки и документа сохраняйте стабильный ID: иначе невозможно выяснить, почему нейросеть выбрала конкретную запись. Если вывод отличается от ожидаемой формы, сначала проверьте состав входа, затем конфигурацию модели и только после этого настройки ранжирования. Не маскируйте ошибки ручной подстановкой заранее «правильного» ответа.

Конкретный вход и ожидаемый результат

На входе два документа о возврате и доставке. Ожидаемая структура — две строки в обоих массивах и 16 координат у short. Само по себе это не подтверждает, что вопрос о возврате найдёт нужный документ при 16 измерениях: качество нужно проверить отдельными запросами.

Проверяйте структуру отдельно от смысла. Массив верного размера не означает хорошего поиска, а высокий score не удостоверяет факт в документе. Сохраните реальные выводы программы и сопоставьте их с заранее размеченными эталонными ID. При переносе на другой корпус обновите проверочные данные; простая замена входного предложения в коде не доказывает обобщения метода.

Разбор метода и ограничений

Сокращение числа координат действительно уменьшает объём представления одного документа, но риск потерять полезную информацию зависит от обучения модели. У Matryoshka-модели префиксы вектора специально оптимизируют для разных длин, у обычного checkpoint такой гарантии нет. В API демонстрационный all-mpnet-base-v2 лишь показывает механизм truncate_embeddings; не объявляйте 16 измерений производственным решением. Нельзя хранить полные и обрезанные вектора в одном поле индекса, если схема требует фиксированную размерность. Даже когда backend принимает разные поля, вопросы надо кодировать до той же длины, что и документы. Объём экономии считайте вместе с индексом, метаданными и копиями, а не как обещание общего уменьшения базы в 48 раз.

Дополнительный сценарий проверки

Сформируйте таблицу baseline для нескольких значений размерности — исходной, средней и минимальной — но только для модели, которую реально планируете использовать. На ста вручную размеченных вопросах сравните hit@1, recall@10 и частоту потери редких артикулов. Если у короткого вектора неожиданно ухудшилось качество, возвратитесь к большей длине или выберите специализированную Matryoshka-модель с проверенной карточкой. Переключайте индекс атомарно после подготовки контрольного набора; нельзя изменить размерность работающего поля и предположить, что старые записи автоматически преобразуются. Храните model ID, truncate_dim и метрику на стороне пишущего и читающего приложения. Для русского корпуса использованный английский пример не служит доказательством качества, поэтому языковую оценку проводите отдельно.

Критерии принятия

  • Исходные и короткие вектора соответствуют тем же IDs.
  • Укороченный массив имеет выбранную размерность.
  • Recall@k после сокращения удовлетворяет заранее заданному допуску.

Если один пункт не проходит, настройка не готова для массового применения. При перезапуске сервиса повторно прогоните контрольный запрос и сверяйте ID, а не только наличие числовой оценки. Разделяйте ошибки получения embeddings, поиска кандидатов, фильтрации доступа и формирования финального ответа; хорошая метрика одного этапа не подтверждает работу остальных.

Типичные ошибки и что не делать

  • Не объявлять любую модель Matryoshka из-за наличия truncate_dim.
  • Не смешивать разные размерности в одном поле.
  • Не оценивать качество одним примером из двух документов.

Не обещайте точность и экономию ресурсов без измерений на своём оборудовании и корпусе. Не подменяйте документ нейросетевым выводом при объяснении решения пользователю. Помните о правах на доступ к исходным материалам: embedding не является анонимизацией приватного текста. При изменении модели, языка или способа подготовки данных повторите тесты до переключения рабочего трафика.

FAQ

Что делает truncate_dim?

Ограничивает число выходных координат embedding.

Гарантирует ли 16 измерений качество?

Нет, качество проверяют отдельно.

Нужно ли сократить и вектора запросов?

Да, схема сравнения должна совпадать.

Официальные источники

Частые вопросы

Что делает truncate_dim?

Ограничивает число выходных координат embedding.

Гарантирует ли 16 измерений качество?

Нет, качество проверяют отдельно.

Нужно ли сократить и вектора запросов?

Да, схема сравнения должна совпадать.

Читайте также

Комментарии

Пока тихо. Скажите первое слово