Гайд · TNWS AI

Как искать текстом через vectorizer Azure AI Search без передачи массива чисел

6 мин—

Настройка vectorizer и REST kind:text для русских вопросов: связка profile, модели и проверка результатов.

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

Актуальный русскоязычный запрос: «как искать текстом vectorizer Azure AI Search kind text». Официальная документация Microsoft проверена 19 сентября 2026 года. REST API 2026-04-01; индекс с настроенным vectorizer в vectorSearch и с привязкой через профиль к contentVector; применимо к поддерживаемой паре vectorizer и embedding-модели.

Задача здесь — выполнить и проверить конкретную операцию в Azure AI Search. Образцовые значения вроде ru-kb, p1 и policy-2026-01 принадлежат тестовому корпусу, а не обязательным именам в вашем сервисе. У вас должны быть полномочия на указанную операцию; для теста можно использовать административный ключ на доверенном сервере, но в пользовательском браузере нужен защищённый серверный посредник. Сначала снимите baseline по контрольному запросу и набору документов, затем меняйте только одну настройку за раз.

Что подтверждает документация

При kind:text поле text передаётся настроенному на поле vectorizer во время запроса. Azure AI Search требует соответствия embedding модели, использованной при индексации. Vectorizer и indexing skill являются разными компонентами: skill создаёт embeddings документов, vectorizer — embeddings запроса. В Microsoft Learn для Azure OpenAI приведены text-embedding-3-small/large и ada-002; отдельные провайдеры могут быть preview.

Это не обещание одинакового ранжирования для любого русского корпуса. Результат embedding зависит от deployment, подготовки текста, chunking, обновлений модели и состава индекса. Доступность предварительных функций и ограничения сверяйте с документацией и настройками собственного сервиса; цена и длительность операций здесь намеренно не указаны, потому что они не следуют из поискового ответа. Отделяйте успешный HTTP-запрос от оценки полезности найденного фрагмента.

Пошаговое выполнение

  1. Прочтите GET индекса и найдите vectorSearch.vectorizers; профиль contentVector должен ссылаться на существующий vectorizer.
  2. Сверьте deploymentId, modelName и размерность embedding с pipeline индексации; одинакового названия поля недостаточно.
  3. Если индекс готов, отправьте kind:text с text=русский вопрос и fields=contentVector; не передавайте одновременно фиктивный vector.
  4. Сравните IDs с запросом kind:vector, рассчитанным той же моделью отдельно.
  5. При смене deployment проверьте совместимость corpus и query; в противном случае переиндексируйте данные.

После каждого шага сохраняйте версию схемы, идентификатор тестового документа и ответ сервиса. При ошибке сначала установите, на каком слое она возникла: полномочия, схема, несовместимый vector, индексирование или собственно ранжирование. Не обновляйте рабочую схему, если не умеете вернуться к старому индексу. Для тестов доступа всегда предусмотрите документ другого tenant и отрицательный запрос.

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

POST /indexes/ru-kb/docs/search?api-version=2026-04-01
{"select":"id,title,content","vectorQueries":[{"kind":"text",
"text":"как оформить возврат товара","fields":"contentVector","k":5}]}

# Проверка индекса: GET /indexes/ru-kb?api-version=2026-04-01
# У профиля поля должен быть настроен vectorizer.

Подставьте своё имя сервиса в https://<service>.search.windows.net, передайте Content-Type: application/json и авторизацию выбранным поддерживаемым способом. Демонстрационный массив из трёх чисел или строка <embedding массива> — только описание формы; они не являются реальным embedding для поля с 1536 измерениями. Перед отправкой проверьте JSON, размерность и отсутствие ключа в клиентском коде.

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

Вход: вопрос «как оформить возврат товара», документ policy-2026-01 объясняет срок и процедуру, shipment-2026-01 — только доставку. Ожидается, что при одинаковой модели и успешном вызове vectorizer policy-2026-01 войдёт в top-5. Если вызов модели не проходит, правильный результат — ошибка, а не запасной ответ, выдаваемый за нейросетевой поиск.

Ожидаемый ID — проверяемая гипотеза на подготовленном тестовом наборе. При другом корпусе и другом embedding нельзя честно обещать конкретный score и порядок результатов. Сохраняйте как входное содержимое, так и текст возвращённого фрагмента: найденный ID без исходного подтверждения не годится для публикации ответа от имени компании.

Разбор и границы применения

kind:text удобен для простого клиентского контракта, но переносит вызов embedding-модели внутрь пути исполнения поиска. Это создаёт отдельные причины задержки и отказа: права доступа сервиса к модели, лимиты модели, доступность deployment. Измеряйте их отдельно от времени ANN-поиска. Vectorizer не создаст отсутствующие embeddings документов: при внешней загрузке данных вы всё равно обязаны получить vectors корпуса согласованной моделью. Когда одна модель разделена между индексацией и запросом, сохраняйте revision и настройки dimensions в конфигурации обоих этапов. Для теста держите один и тот же текст вопроса, внешний embedding и запрос kind:text; сравнивайте хотя бы top-k IDs, понимая, что обновление модели может менять ранжирование. Не путайте текст запроса с search: поле search включает лексическое ранжирование, а kind:text превращает текст именно в вектор. Для чистого измерения одного векторного канала опускайте search. Если индекс построен через wizard, проверьте сохранённый vector profile, а не предполагаемое имя deployment по скриншоту. Секрет модели нельзя помещать в поисковый запрос, отправляемый браузером.

Практический контроль именно этой задачи

Проведите диагностический опыт с одними и теми же десятью русскими вопросами. Для каждой строки заранее сохраните embedding, вычисленный непосредственно тем же deployment; выполните запрос kind:vector и kind:text и сопоставьте top-5 ids. Небольшие расхождения требуют расследования: возможно, различаются model revision, dimensions или нормализация исходного текста. Повторите запрос kind:text без search, иначе добавленная lexical ветка скроет причину расхождения. Если quota внешней модели исчерпана, это не пустой corpus и не низкий recall: отмечайте отказ отдельным статусом приложения и не кэшируйте его как результат «ничего не найдено». При изменении настроек vectorizer сначала испытайте новый профиль на копии индекса. Если ваша задача сводится к локальным embeddings и вы уже надёжно считаете их на сервере, kind:vector остаётся допустимой альтернативой без дополнительного вызова модели внутри поиска. Выбор — вопрос границ ответственности и измеренного времени ответа.

Критерии проверки

  • В JSON индекса vectorizer связан с profile нужного поля.
  • Deployment и размерность соответствуют документным embeddings.
  • kind:text находит контрольный id в top-5.
  • Отказ модели обрабатывается явно, а не маскируется пустой ссылкой.

Если хотя бы один критерий провален, не маскируйте проблему красивым ответом генеративной модели: возвращайте человеку найденные документы или явное сообщение о недостаточности данных. Сравнение версий проводите на одних и тех же контрольных вопросах, фиксируя документные ID и дату наблюдения.

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

  • Считать, что vectorizer сам создаёт embeddings старых документов.
  • Менять deployment только для запросов.
  • Одновременно задавать kind:text и демонстрационный vector.
  • Путать search с text внутри vectorQueries.

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

FAQ

Нужна ли передача массива чисел?

Нет, при kind:text и настроенном vectorizer.

Можно ли использовать иную модель для запроса?

Нужно согласовывать модель с индексацией.

Достаточно ли создать vectorizer?

Его надо связать через profile с целевым полем.

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

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

Нужна ли передача массива чисел?

Нет, при kind:text и настроенном vectorizer.

Можно ли использовать иную модель для запроса?

Нужно согласовывать модель с индексацией.

Достаточно ли создать vectorizer?

Его надо связать через profile с целевым полем.

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

Комментарии

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