Гайд · TNWS AI
Как создать векторный индекс Azure AI Search с верной размерностью
Рабочая схема REST для vector field, HNSW и profile: согласование dimensions с embedding и тест ошибки несовпадения.
Задача и применимость
Актуальный русскоязычный запрос: «как создать векторный индекс Azure AI Search dimensions». Официальная документация Microsoft проверена 19 сентября 2026 года. REST API 2026-04-01; готовые embeddings из одной версии text-embedding-3-small с явно заданной размерностью 1536. Пример относится к Azure AI Search, а не к Azure OpenAI как месту хранения векторов.
Задача здесь — выполнить и проверить конкретную операцию в Azure AI Search. Образцовые значения вроде ru-kb, p1 и policy-2026-01 принадлежат тестовому корпусу, а не обязательным именам в вашем сервисе. У вас должны быть полномочия на указанную операцию; для теста можно использовать административный ключ на доверенном сервере, но в пользовательском браузере нужен защищённый серверный посредник. Сначала снимите baseline по контрольному запросу и набору документов, затем меняйте только одну настройку за раз.
Что подтверждает документация
Каждому документу требуется строковый key. Поле embedding задаётся как Collection(Edm.Single), searchable:true, dimensions равен фактической длине embedding, vectorSearchProfile указывает существующий профиль. У векторного поля filterable, facetable и sortable должны быть false. Для Azure OpenAI в руководстве указан cosine; профиль связывает поле с алгоритмом hnsw.
Это не обещание одинакового ранжирования для любого русского корпуса. Результат embedding зависит от deployment, подготовки текста, chunking, обновлений модели и состава индекса. Доступность предварительных функций и ограничения сверяйте с документацией и настройками собственного сервиса; цена и длительность операций здесь намеренно не указаны, потому что они не следуют из поискового ответа. Отделяйте успешный HTTP-запрос от оценки полезности найденного фрагмента.
Пошаговое выполнение
- Зафиксируйте deployment и один контрольный embedding; проверьте len(vector) до создания схемы. Не смешивайте уменьшенную и исходную размерности.
- Создайте текстовые id, title, content и числовое vector поле; оставьте title и content retrievable для диагностики.
- Добавьте vectorSearch.algorithms с hnsw и metric cosine и vectorSearch.profiles с именем p1.
- Отправьте POST /indexes с api-version=2026-04-01 с правами изменения индекса.
- Прочтите GET определения индекса: профиль и dimensions должны совпасть с отправленными; только затем грузите реальные embeddings.
После каждого шага сохраняйте версию схемы, идентификатор тестового документа и ответ сервиса. При ошибке сначала установите, на каком слое она возникла: полномочия, схема, несовместимый vector, индексирование или собственно ранжирование. Не обновляйте рабочую схему, если не умеете вернуться к старому индексу. Для тестов доступа всегда предусмотрите документ другого tenant и отрицательный запрос.
Готовый REST-шаблон
POST /indexes?api-version=2026-04-01
{"name":"ru-kb","fields":[{"name":"id","type":"Edm.String","key":true},
{"name":"title","type":"Edm.String","searchable":true,"retrievable":true},
{"name":"content","type":"Edm.String","searchable":true,"retrievable":true},
{"name":"contentVector","type":"Collection(Edm.Single)","searchable":true,
"retrievable":false,"dimensions":1536,"vectorSearchProfile":"p1"}],
"vectorSearch":{"algorithms":[{"name":"h1","kind":"hnsw",
"hnswParameters":{"metric":"cosine"}}],"profiles":[{"name":"p1","algorithm":"h1"}]}}
Подставьте своё имя сервиса в https://<service>.search.windows.net, передайте Content-Type: application/json и авторизацию выбранным поддерживаемым способом. Демонстрационный массив из трёх чисел или строка <embedding массива> — только описание формы; они не являются реальным embedding для поля с 1536 измерениями. Перед отправкой проверьте JSON, размерность и отсутствие ключа в клиентском коде.
Входные данные и ожидаемый результат
Входной документ id=refund-7, title=Возврат, content=Срок возврата 14 дней и вектор из 1536 чисел. Ожидается, что определение индекса принимает схему, а загрузка полного вектора не выдаёт ошибку размерности. Если локальная модель вернула 512 чисел, правильный результат проверки — остановка загрузки, не дописывание нулей до 1536.
Ожидаемый ID — проверяемая гипотеза на подготовленном тестовом наборе. При другом корпусе и другом embedding нельзя честно обещать конкретный score и порядок результатов. Сохраняйте как входное содержимое, так и текст возвращённого фрагмента: найденный ID без исходного подтверждения не годится для публикации ответа от имени компании.
Разбор и границы применения
Размерность — свойство пары «поле/модель», а не удобное число для JSON. Проверьте три контрольных фразы и сохраните lengths и идентификатор deployment вместе с версией схемы. При миграции на модель с другой длиной создайте новую схему или новое поле и переиндексируйте корпус: отдельные документы в одном vector field не могут иметь разную длину. Наличие одного загруженного документа не доказывает, что большой корпус однороден. Проверяйте долю ошибочных документов в ответе индексатора. HNSW строит структуру для приблизительного поиска; маленькая коллекция может выглядеть идеально при неправильных параметрах, поэтому тестируйте и на репрезентативной выборке. Храните человекочитаемый content рядом с вектором: числовые компоненты нельзя превратить обратно в цитату для RAG. Если источники содержат секреты, решите вопрос доступа до создания индекса; retrievable:false для вектора само по себе не защищает текст content. Выбирайте аналитику по запросам после загрузки, когда у вас есть документные ID и ожидаемые релевантные фрагменты.
Практический контроль именно этой задачи
План теста схемы: создайте два независимых набора данных с похожими названиями полей, но разными версиями модели. Первый идёт в ru-kb, второй храните вне загрузки до явной миграции. Для трёх коротких русских предложений запишите реальную длину массива и значения первых нескольких компонент, не публикуя пользовательский текст с персональными сведениями. Сравните field dimensions, output генератора и сведения о deployment: все три должны согласоваться. Проверка массива до сети сокращает число частично принятых пакетов. Отдельно создайте неверный тестовый payload с отсутствующим id: он должен быть отклонён вашей локальной валидацией ключа. После создания индекса выполните GET и сравните не только имя, но и algorithm и profile. Документируйте способ повторного развёртывания схемы в чистом окружении: иначе исправление параметров в живом индексе может потребовать переиндексации. Смысл теста — доказать воспроизводимость структуры, а не превосходство HNSW над другими индексами.
Критерии проверки
- GET индекса возвращает contentVector с dimensions=1536 и profile p1.
- Контрольный embedding в исходном массиве содержит ровно 1536 значений.
- Пример с 512 значениями не попадает в рабочую очередь загрузки.
- Поля title/content доступны для проверки найденных документов.
Если хотя бы один критерий провален, не маскируйте проблему красивым ответом генеративной модели: возвращайте человеку найденные документы или явное сообщение о недостаточности данных. Сравнение версий проводите на одних и тех же контрольных вопросах, фиксируя документные ID и дату наблюдения.
Типичные ошибки и что не делать
- Приравнивать dimensions к максимальной длине модели при фактически сокращённом выводе.
- Делать вектор filterable вместо фильтрации по отдельным metadata.
- Загружать документы раньше создания профиля.
- Считать индекс с пустым корпусом доказательством качества поиска.
Не обучайте и не оценивайте систему только на запросах, скопированных из заголовков: нужна и перефразировка, и отрицательные тесты. Не называйте близость векторов гарантом правдивости: источник может устареть, противоречить другому документу или оказаться недоступным данному пользователю. При внедрении RAG передавайте генератору текст, ID и разрешённую ссылку на первоисточник, а неподтверждённые утверждения не включайте в итоговый ответ.
FAQ
Можно ли менять размерность одного документа?
Нет, все vectors одного поля соответствуют dimensions схемы.
Зачем нужен profile?
Он привязывает vector field к алгоритму поиска.
Нужен ли читаемый content?
Да, если результат должен объяснять найденное совпадение.
Официальные источники
Частые вопросы
Можно ли менять размерность одного документа?
Нет, все vectors одного поля соответствуют dimensions схемы.
Зачем нужен profile?
Он привязывает vector field к алгоритму поиска.
Нужен ли читаемый content?
Да, если результат должен объяснять найденное совпадение.
Читайте также
Как фильтровать векторный поиск 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 качества и задержки.
Комментарии
Пока тихо. Скажите первое слово