Гайд · TNWS AI
Как настроить composite embedders Meilisearch для индексации и поиска
Экспериментальный compositeEmbedders: разные среды одной модели, равная размерность, совместимость vectors и план отката.
Задача, применимость и подтверждённые факты
Русскоязычный запрос: «как настроить composite embedders Meilisearch». Документация производителя проверена 19 сентября 2026 года. Нужно создавать document vectors на мощном удалённом сервисе, а query vectors локально ради меньшей задержки. Для этой задачи существует composite embedder с indexingEmbedder и searchEmbedder, но официальная документация прямо называет его экспериментальным. Включайте только если можете выдержать изменение или исчезновение API, иначе оставьте обычный единый embedder.
Для composite нужно включить compositeEmbedders в /experimental-features, задать source:composite и оба вложенных embedder. По документации их dimensions и pooling должны совпадать, но одного совпадения длины недостаточно: нужна точно та же модель и revision/конфигурация с обеих сторон. Ни одна вложенная сторона не может быть composite или userProvided; binaryQuantized и distribution относятся к верхнему уровню. Это не механизм смешивания векторов разных производителей.
Прежде чем менять рабочий индекс, сохраните его настройки и небольшой набор контрольных документов с ожидаемыми ID. Важно отделять принятие конфигурации сервером от готовности асинхронной обработки: поисковая выдача до завершения задачи не служит честным тестом качества. Для примеров с токенами ${OPENAI_API_KEY} нужен реальный секрет в защищённом окружении; строки-заглушки не являются рабочими ключами.
Порядок действий
- Подтвердите одинаковый checksum/revision модели, tokenizer, pooling и dimension на сервисе индексации и в локальном поиске.
- На отдельном тестовом окружении включите experimental flag через PATCH /experimental-features.
- Создайте composite с именем,
indexingEmbedderиsearchEmbedder; используйте только конфигурации, поддерживаемые обеими сторонами. - Проиндексируйте небольшой корпус и измерьте топ-10 IDs относительно той же модели в обычном режиме.
- Измерьте задержку поиска, ошибки провайдеров и план отката на обычный embedder до production-решения.
После каждого шага сохраняйте ID операции или задачи, связанные с тестом версии модели, а не только HTTP-статус. Если задача окончилась ошибкой, не скрывайте её повторным запросом к поиску: сначала устраняйте причину. Применение к Meilisearch Cloud и самостоятельной установке зависит от доступности endpoint и полномочий ключа; здесь используются точные имена HTTP API из официальной документации, но не выдуманные пункты интерфейса.
Готовый запрос или шаблон
PATCH /experimental-features
{"compositeEmbedders":true}
PATCH /indexes/kb/settings/embedders
{"split-v1":{"source":"composite",
"indexingEmbedder":{"source":"rest","url":"https://provider.example/embed",
"request":{"input":"{{text}}"},
"response":{"data":[{"embedding":"{{embedding}}"}]},"dimensions":768},
"searchEmbedder":{"source":"huggingFace","model":"BAAI/bge-base-en-v1.5"}}}
# Это схема полей; указанный REST API и модель должны быть ОДНОЙ версии и совместимы.
Никогда не копируйте заглушки URL, API key, model ID или тестовые vectors в рабочую систему без замены и проверки. Векторы длины три демонстрируют контракт данных; они не представляют реальную языковую модель и не позволяют обещать заданный порядок поисковых результатов.
Пример входа и ожидаемого результата
Вход: индексный provider и локальная сторона оба заявляют dimension 768, но контрольный текст «refund policy» даёт различающиеся векторы из-за другой версии tokenizer. Ожидаемое решение — отклонить релиз, даже если PATCH принимает настройки: топологическая совместимость не доказывает семантическую. На исправленном варианте сравните top-10 IDs и задержку с baseline.
Что важно при внедрении
Официальный пример использует отдельные источники для двух частей, но документация предупреждает о требовании одной и той же модели. Это важнее стоимости и скорости: vectors разных пространств не станут сопоставимыми только потому, что имеют 768 чисел. Проверьте выход двух реализаций на нескольких фиксированных фразах, включая русский текст, отрицания и короткие заголовки; если результаты не совпадают ожидаемым образом, остановите эксперимент. Меняйте только место исполнения, а не модель, preprocessing или размерность одновременно. При сбое удалённой стороны может нарушиться индексация новых документов, даже если поиск продолжает работать: контролируйте раздельные tasks и свежесть данных. Экспериментальный API может измениться; документируйте версию развернутого Meilisearch и сохраняйте путь возвращения к исходному embedder, не обещая SLA по одной демоверсии.
Сравнение решений
| Архитектура | Индексация | Поиск |
|---|---|---|
| Один embedder | тот же источник | тот же источник |
| Composite | удалённый или batch | локальный или low-latency при той же модели |
Сравнивайте режимы на фиксированном наборе вопросов и ID: табличные свойства указывают механизм, а не гарантируют результат на вашем корпусе.
Критерии проверки
- Experimental flag доступен именно в используемой сборке.
- Идентичность модели и pooling подтверждена контрольными vectors.
- Проверены tasks и качество top-10, а не только dimensions.
- Откат и мониторинг двух сторон зафиксированы.
Сделайте повторный запуск тех же запросов после изменения модели, схемы, API поставщика или состава корпуса. Фиксируйте source IDs, текст-основание ответа, долю верных top-k и задержку на одинаковых данных. Для RAG найденный hit — свидетельство релевантности, не разрешение придумывать содержание: генератору передавайте только допустимые фрагменты, а утверждения проверяйте по первоисточнику.
Ошибки и чего не делать
- Совмещать разные модели с одинаковой dimension.
- Выдавать experimental за стабильный интерфейс.
- Использовать userProvided как вложенный source.
- Менять модель одновременно с разделением инфраструктуры.
Не используйте высокий _rankingScore как вероятность истинности текста. При незнакомом вопросе возвращайте недостаточность данных вместо уверенной генерации на случайном соседнем документе. Если у вас есть tenant или права доступа, отфильтровывайте документы до передачи LLM и проверяйте отрицательным тестом отсутствие чужого источника.
FAQ
Это стабильная функция?
Нет, документация помечает её экспериментальной.
Достаточно одинаковой dimension?
Нет, нужны та же модель, revision и pooling.
Где задать BQ?
Только на верхнем composite embedder.
Можно ли использовать userProvided вложенно?
Нет, документация запрещает.
Официальные источники
Частые вопросы
Это стабильная функция?
Нет, документация помечает её экспериментальной.
Достаточно одинаковой dimension?
Нет, нужны та же модель, revision и pooling.
Где задать BQ?
Только на верхнем composite embedder.
Можно ли использовать userProvided вложенно?
Нет, документация запрещает.
Читайте также
Как сохранить несколько embeddings одного документа в Meilisearch
Массив векторов одного документа в _vectors.embeddings для нескольких абзацев, их обновление и проверка релевантности.
Как настроить distribution в Meilisearch для слишком высоких semantic scores
Проверка showRankingScore, подбор mean/sigma и контроль порога релевантности без переиндексации vectors.
Как настроить два embedders в Meilisearch для разных типов запросов
Раздельные named embedders для краткого названия и длинной спецификации, выбор hybrid.embedder и тест несовместимых vectors.
Комментарии
Пока тихо. Скажите первое слово