Гайд · TNWS AI
Как выполнить vector query в Azure AI Search через REST
Стабильный REST-запрос kind:vector, k и select с проверкой совместимости embedding и исходных документов.
Задача и применимость
Актуальный русскоязычный запрос: «как выполнить vectorQueries kind vector Azure AI Search». Официальная документация Microsoft проверена 19 сентября 2026 года. Azure AI Search REST API 2026-04-01; в индексе ru-kb есть contentVector и retrievable текст, запрос рассчитан той же моделью, что и документы.
Задача здесь — выполнить и проверить конкретную операцию в Azure AI Search. Образцовые значения вроде ru-kb, p1 и policy-2026-01 принадлежат тестовому корпусу, а не обязательным именам в вашем сервисе. У вас должны быть полномочия на указанную операцию; для теста можно использовать административный ключ на доверенном сервере, но в пользовательском браузере нужен защищённый серверный посредник. Сначала снимите baseline по контрольному запросу и набору документов, затем меняйте только одну настройку за раз.
Что подтверждает документация
Стабильный Search - POST использует vectorQueries, kind:vector, vector, fields и k. Параметр select ограничивает возвращаемые retrievable поля. Vector search возвращает ближайшие k документов, если в доступном корпусе их достаточно, даже когда семантическое сходство невелико. @search.score не является вероятностью истинности ответа.
Это не обещание одинакового ранжирования для любого русского корпуса. Результат embedding зависит от deployment, подготовки текста, chunking, обновлений модели и состава индекса. Доступность предварительных функций и ограничения сверяйте с документацией и настройками собственного сервиса; цена и длительность операций здесь намеренно не указаны, потому что они не следуют из поискового ответа. Отделяйте успешный HTTP-запрос от оценки полезности найденного фрагмента.
Пошаговое выполнение
- Получите embedding вопроса тем же deployment и с теми же dimensions, что использовали для корпуса.
- Отправьте Search - POST с vectorQueries и select=id,title,content: это делает результат объяснимым без выдачи 1536 чисел.
- Возьмите топ-5 IDs и тексты, сверяйте с контрольными релевантными источниками.
- Если ответ пустой, проверьте количество документов, profile, fields и length массива до смены параметра k.
- Показывайте пользователю исходный фрагмент и ссылку на источник; генератору запрещайте придумывать отсутствующие факты.
После каждого шага сохраняйте версию схемы, идентификатор тестового документа и ответ сервиса. При ошибке сначала установите, на каком слое она возникла: полномочия, схема, несовместимый vector, индексирование или собственно ранжирование. Не обновляйте рабочую схему, если не умеете вернуться к старому индексу. Для тестов доступа всегда предусмотрите документ другого tenant и отрицательный запрос.
Готовый REST-шаблон
POST /indexes/ru-kb/docs/search?api-version=2026-04-01
{"select":"id,title,content","vectorQueries":[{"kind":"vector",
"vector":[0.1,0.2,0.3],"fields":"contentVector","k":5}]}
# Массив заменяется embedding запроса из 1536 чисел; пример из трёх
# компонентов не является исполнимым для описанного индекса.
Подставьте своё имя сервиса в https://<service>.search.windows.net, передайте Content-Type: application/json и авторизацию выбранным поддерживаемым способом. Демонстрационный массив из трёх чисел или строка <embedding массива> — только описание формы; они не являются реальным embedding для поля с 1536 измерениями. Перед отправкой проверьте JSON, размерность и отсутствие ключа в клиентском коде.
Входные данные и ожидаемый результат
Вход: вопрос «сколько дней на возврат», embedding той же модели и два документа: policy-2026-01 о 14 днях и shipment-2026-01 о доставке. Ожидаемый для подготовленного тестового корпуса результат: policy-2026-01 встречается в top-5, content содержит формулировку о сроке. Точная позиция и score зависят от модели, поэтому без живого аккаунта их не обещаем.
Ожидаемый ID — проверяемая гипотеза на подготовленном тестовом наборе. При другом корпусе и другом embedding нельзя честно обещать конкретный score и порядок результатов. Сохраняйте как входное содержимое, так и текст возвращённого фрагмента: найденный ID без исходного подтверждения не годится для публикации ответа от имени компании.
Разбор и границы применения
Для небольшого корпуса k=5 почти не различает хороший поиск от случайного: пять ближайших вернутся даже при отсутствии ответа. Добавьте отрицательные вопросы «можно ли вернуть подписку через год», для которых корректно не давать уверенного ответа по фрагменту о товаре. Если бизнес-логика требует порога релевантности, калибруйте его на размеченных запросах с учётом того, что опция vector threshold относится к preview API, а не к выбранной стабильной версии. Не переносите score между индексами с разными алгоритмами или моделями как абсолютную меру. Разделите проверку retrieval и генерации: сначала вручную убедитесь, что топ содержит нужный документ, потом вводите LLM. Для запроса с наименованием SKU добавьте буквальный поиск или отдельную стратегию hybrid: векторный поиск хорошо улавливает смысл, но не гарантирует точное совпадение артикула. Анализируйте случаи нулевой релевантности и статистику Recall@5 по русским вопросам, а не единичный удачный пример. Секреты Azure остаются на сервере; в браузер передавайте только разрешённые метаданные и текст.
Практический контроль именно этой задачи
Составьте контрольный набор из пяти положительных и пяти отрицательных вопросов. Положительный вопрос имеет заранее записанный id и фразу, которая служит доказательством ответа. Отрицательный либо вообще не освещён в базе, либо похож лексически, но описывает другой объект. Для каждого запроса записывайте top-5 ids, текстовый фрагмент, модель запроса и длину vector. Если контрольная фраза находится, но ответ генератора всё равно ошибочен, не меняйте поиск вслепую: дефект может быть в инструкции генератору или слишком большом контексте. Если нужного фрагмента нет даже в top-20, изучайте chunking, модель и качество документа. В интерфейсе показывайте не абстрактное число @search.score, а цитату и источник. Повторяйте тест после переиндексации, потому что изменение границ фрагментов меняет конкуренцию ближайших соседей. Так проверяется вся цепочка доказательств от вопроса до выбранного текста.
Критерии проверки
- Длина query vector равна dimensions поля.
- В top-5 контрольного вопроса присутствует нужный id.
- Выдача содержит текст-основание, а не только score.
- Отрицательный вопрос не превращается в выдуманный ответ.
Если хотя бы один критерий провален, не маскируйте проблему красивым ответом генеративной модели: возвращайте человеку найденные документы или явное сообщение о недостаточности данных. Сравнение версий проводите на одних и тех же контрольных вопросах, фиксируя документные ID и дату наблюдения.
Типичные ошибки и что не делать
- Вставлять в боевой запрос сокращённый массив из документации.
- Передавать query embedding другой модели.
- Интерпретировать score как вероятность.
- Отправлять admin api-key из клиентского JavaScript.
Не обучайте и не оценивайте систему только на запросах, скопированных из заголовков: нужна и перефразировка, и отрицательные тесты. Не называйте близость векторов гарантом правдивости: источник может устареть, противоречить другому документу или оказаться недоступным данному пользователю. При внедрении RAG передавайте генератору текст, ID и разрешённую ссылку на первоисточник, а неподтверждённые утверждения не включайте в итоговый ответ.
FAQ
Что задаёт k?
Число ближайших кандидатов vector query.
Может ли выдача содержать нерелевантные документы?
Да, поиск ближайших соседей сам по себе не устанавливает порог истинности.
Как получить текст?
Отметить поле retrievable и включить его в select.
Официальные источники
Частые вопросы
Что задаёт k?
Число ближайших кандидатов vector query.
Может ли выдача содержать нерелевантные документы?
Да, поиск ближайших соседей сам по себе не устанавливает порог истинности.
Как получить текст?
Отметить поле retrievable и включить его в select.
Читайте также
Как фильтровать векторный поиск Azure AI Search по tenant без утечки данных
OData filter и vectorFilterMode preFilter для tenant, негативный тест изоляции и сравнение с postFilter.
Как искать текстом через vectorizer Azure AI Search без передачи массива чисел
Настройка vectorizer и REST kind:text для русских вопросов: связка profile, модели и проверка результатов.
Как измерить recall HNSW в Azure AI Search через exhaustive KNN
Точный baseline exhaustive:true, Recall@k, стабильный набор запросов и диагностика trade-off качества и задержки.
Комментарии
Пока тихо. Скажите первое слово