Поделиться через


Краткое руководство. Поиск вектора с помощью REST

Узнайте, как использовать ИНТЕРФЕЙСы REST API поиска для создания, загрузки и запроса в службе поиска ИИ Azure.

В службе "Поиск ИИ Azure" векторное хранилище содержит схему индекса, которая определяет поля векторов и невекторов, конфигурацию векторного поиска для алгоритмов, создающих пространство внедрения и параметры определений векторных полей, которые вычисляются во время запроса. REST API создания индекса создает хранилище векторов.

Если у вас нет подписки Azure, создайте бесплатную учетную запись, прежде чем приступить к работе.

Примечание.

В этом кратком руководстве описывается шаг векторизации и предоставляется внедрение в примеры документов. Если вы хотите добавить встроенные блоки данных и векторизацию по собственному содержимому, попробуйте мастер импорта и векторизации данных для сквозного пошагового руководства.

Необходимые компоненты

  • Visual Studio Code с клиентом REST.

  • Поиск ИИ Azure в любом регионе и на любом уровне. Создайте или найдите существующий ресурс поиска ИИ Azure в текущей подписке.

    • Уровень "Бесплатный" можно использовать для большинства из этого краткого руководства, но для больших файлов данных рекомендуется использовать базовый или более высокий уровень.
    • Чтобы запустить пример запроса, который вызывает семантические повторения, служба поиска должна быть базовой или более поздней, с поддержкой семантического рангера.

Получение сведений о ресурсе

Запросы к конечной точке поиска должны проходить проверку подлинности и авторизованы. Для этой задачи можно использовать ключи ИЛИ роли API. Рекомендуется использовать бессерверное подключение с помощью идентификатора Microsoft Entra.

Выберите вкладку, соответствующую предпочтительному методу проверки подлинности. Используйте один и тот же метод для всех запросов в этом кратком руководстве.

  1. Войдите в портал Azure и найдите службу поиска.

  2. На домашней странице обзора найдите URL-адрес. Пример конечной точки может выглядеть так: https://mydemo.search.windows.net.

    Снимок экрана: свойство URL-адреса на странице обзора.

  3. Выполните действия, описанные в кратком руководстве без ключа, чтобы получить маркер Microsoft Entra.

    Вы получите маркер при выполнении az account get-access-token команды на шаге 3 предыдущего краткого руководства.

    az account get-access-token --scope https://search.azure.com/.default --query accessToken --output tsv
    

Создание или скачивание файла кода

Для выполнения всех запросов в этом кратком руководстве используется один .rest или .http файл. Вы можете скачать REST-файл, содержащий код для этого краткого руководства, или создать новый файл в Visual Studio Code и скопировать его в него.

  1. В Visual Studio Code создайте файл с расширением или .http расширением.rest. Например, az-search-vector-quickstart.rest. Скопируйте и вставьте необработанное содержимое файла Azure-Samples/azure-search-rest-samples/blob/main/Quickstart-vectors/az-search-vector-quickstart.rest file в этот новый файл.

  2. В верхней части файла замените значение @baseUrl заполнителя URL-адресом службы поиска. Инструкции по поиску URL-адреса службы поиска см. в разделе "Получение сведений о ресурсе".

    @baseUrl = PUT-YOUR-SEARCH-SERVICE-URL-HERE
    
  3. В верхней части файла замените значение заполнителя для проверки подлинности. Инструкции по получению маркера Microsoft Entra или ключа API см. в разделе "Получение сведений о ресурсе".

    Для рекомендуемой проверки подлинности без ключа с помощью идентификатора Microsoft Entra необходимо заменить @apiKey переменной@token.

    @token = PUT-YOUR-MICROSOFT-ENTRA-TOKEN-HERE
    

    Если вы предпочитаете использовать ключ API, замените @apiKey его ключом, скопированным из портал Azure.

    @apiKey = PUT-YOUR-ADMIN-KEY-HERE
    
  4. Для рекомендуемой проверки подлинности без ключа с помощью идентификатора Microsoft Entra необходимо заменить api-key: {{apiKey}} на Authorization: Bearer {{token}} заголовки запроса. Замените все экземпляры api-key: {{apiKey}} , которые находятся в файле.

Создание векторного индекса

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

Схема индекса в этом примере организована вокруг содержимого отеля. Пример данных состоит из векторных и невекторных имен и описаний вымышленных отелей. Эта схема включает конфигурации для индексирования векторов и запросов, а также для семантического ранжирования.

  1. В Visual Studio Code откройте az-search-vector-quickstart.rest созданный ранее файл.

  2. ### Create a new index Найдите блок кода в файле. Этот блок содержит запрос на создание hotels-vector-quickstart индекса в службе поиска.

    ### Create a new index
    POST  {{baseUrl}}/indexes?api-version=2023-11-01  HTTP/1.1
    Content-Type: application/json
    Authorization: Bearer {{token}}
    
    {
        "name": "hotels-vector-quickstart",
        "fields": [
            {
                "name": "HotelId", 
                "type": "Edm.String",
                "searchable": false, 
                "filterable": true, 
                "retrievable": true, 
                "sortable": false, 
                "facetable": false,
                "key": true
            },
            {
                "name": "HotelName", 
                "type": "Edm.String",
                "searchable": true, 
                "filterable": false, 
                "retrievable": true, 
                "sortable": true, 
                "facetable": false
            },
            {
                "name": "HotelNameVector",
                "type": "Collection(Edm.Single)",
                "searchable": true,
                "retrievable": true,
                "dimensions": 1536,
                "vectorSearchProfile": "my-vector-profile"
            },
            {
                "name": "Description", 
                "type": "Edm.String",
                "searchable": true, 
                "filterable": false, 
                "retrievable": true, 
                "sortable": false, 
                "facetable": false
            },
            {
                "name": "DescriptionVector",
                "type": "Collection(Edm.Single)",
                "searchable": true,
                "retrievable": true,
                "dimensions": 1536,
                "vectorSearchProfile": "my-vector-profile"
            },
                    {
                "name": "Description_fr", 
                "type": "Edm.String",
                "searchable": true, 
                "filterable": false, 
                "retrievable": true, 
                "sortable": false, 
                "facetable": false,
                "analyzer": "en.microsoft"
            },
            {
                "name": "Description_frvector",
                "type": "Collection(Edm.Single)",
                "searchable": true,
                "retrievable": true,
                "dimensions": 1536,
                "vectorSearchProfile": "my-vector-profile"
            },
            {
                "name": "Category", 
                "type": "Edm.String",
                "searchable": true, 
                "filterable": true, 
                "retrievable": true, 
                "sortable": true, 
                "facetable": true
            },
            {
                "name": "Tags",
                "type": "Collection(Edm.String)",
                "searchable": true,
                "filterable": true,
                "retrievable": true,
                "sortable": false,
                "facetable": true
            },
                    {
                "name": "ParkingIncluded",
                "type": "Edm.Boolean",
                "searchable": false,
                "filterable": true,
                "retrievable": true,
                "sortable": true,
                "facetable": true
            },
            {
                "name": "LastRenovationDate",
                "type": "Edm.DateTimeOffset",
                "searchable": false,
                "filterable": true,
                "retrievable": true,
                "sortable": true,
                "facetable": true
            },
            {
                "name": "Rating",
                "type": "Edm.Double",
                "searchable": false,
                "filterable": true,
                "retrievable": true,
                "sortable": true,
                "facetable": true
            },
            {
                "name": "Address", 
                "type": "Edm.ComplexType",
                "fields": [
                    {
                        "name": "StreetAddress", "type": "Edm.String",
                        "searchable": true, "filterable": false, "retrievable": true, "sortable": false, "facetable": false
                    },
                    {
                        "name": "City", "type": "Edm.String",
                        "searchable": true, "filterable": true, "retrievable": true, "sortable": true, "facetable": true
                    },
                    {
                        "name": "StateProvince", "type": "Edm.String",
                        "searchable": true, "filterable": true, "retrievable": true, "sortable": true, "facetable": true
                    },
                    {
                        "name": "PostalCode", "type": "Edm.String",
                        "searchable": true, "filterable": true, "retrievable": true, "sortable": true, "facetable": true
                    },
                    {
                        "name": "Country", "type": "Edm.String",
                        "searchable": true, "filterable": true, "retrievable": true, "sortable": true, "facetable": true
                    }
                ]
            },
            {
                "name": "Location",
                "type": "Edm.GeographyPoint",
                "searchable": false, 
                "filterable": true, 
                "retrievable": true, 
                "sortable": true, 
                "facetable": false
            }
        ],
        "vectorSearch": {
            "algorithms": [
                {
                    "name": "my-hnsw-vector-config-1",
                    "kind": "hnsw",
                    "hnswParameters": 
                    {
                        "m": 4,
                        "efConstruction": 400,
                        "efSearch": 500,
                        "metric": "cosine"
                    }
                },
                {
                    "name": "my-hnsw-vector-config-2",
                    "kind": "hnsw",
                    "hnswParameters": 
                    {
                        "m": 4,
                        "metric": "euclidean"
                    }
                },
                {
                    "name": "my-eknn-vector-config",
                    "kind": "exhaustiveKnn",
                    "exhaustiveKnnParameters": 
                    {
                        "metric": "cosine"
                    }
                }
            ],
            "profiles": [      
                {
                    "name": "my-vector-profile",
                    "algorithm": "my-hnsw-vector-config-1"
                }
          ]
        },
        "semantic": {
            "configurations": [
                {
                    "name": "my-semantic-config",
                    "prioritizedFields": {
                        "titleField": {
                            "fieldName": "HotelName"
                        },
                        "prioritizedContentFields": [
                            { "fieldName": "Description" }
                        ],
                        "prioritizedKeywordsFields": [
                            { "fieldName": "Category" }
                        ]
                    }
                }
            ]
        }
    }
    
  3. Щелкните Отправить запрос. У вас должен быть HTTP/1.1 201 Created ответ.

Текст ответа должен содержать представление JSON схемы индекса.

{
    "@odata.context": "https://my-demo-search.search.windows.net/$metadata#indexes/$entity",
    "@odata.etag": "\"0x8DD2E70E6C36D8E\"",
    "name": "hotels-vector-quickstart",
    "defaultScoringProfile": null,
    "fields": [
    {
        "name": "HotelId",
        "type": "Edm.String",
        "searchable": false,
        "filterable": true,
        "retrievable": true,
        "sortable": false,
        "facetable": false,
        "key": true,
        "indexAnalyzer": null,
        "searchAnalyzer": null,
        "analyzer": null,
        "dimensions": null,
        "vectorSearchProfile": null,
        "synonymMaps": []
    },
    [MORE FIELD DEFINITIONS OMITTED FOR BREVITY]
    ],
    "scoringProfiles": [],
    "corsOptions": null,
    "suggesters": [],
    "analyzers": [],
    "tokenizers": [],
    "tokenFilters": [],
    "charFilters": [],
    "encryptionKey": null,
    "similarity": {
    "@odata.type": "#Microsoft.Azure.Search.BM25Similarity",
    "k1": null,
    "b": null
    },
    "vectorSearch": {
    "algorithms": [
        {
        "name": "my-hnsw-vector-config-1",
        "kind": "hnsw",
        "hnswParameters": {
            "metric": "cosine",
            "m": 4,
            "efConstruction": 400,
            "efSearch": 500
        },
        "exhaustiveKnnParameters": null
        },
        {
        "name": "my-hnsw-vector-config-2",
        "kind": "hnsw",
        "hnswParameters": {
            "metric": "euclidean",
            "m": 4,
            "efConstruction": 400,
            "efSearch": 500
        },
        "exhaustiveKnnParameters": null
        },
        {
        "name": "my-eknn-vector-config",
        "kind": "exhaustiveKnn",
        "hnswParameters": null,
        "exhaustiveKnnParameters": {
            "metric": "cosine"
        }
        }
    ],
    "profiles": [
        {
        "name": "my-vector-profile",
        "algorithm": "my-hnsw-vector-config-1"
        }
    ]
    },
    "semantic": {
    "defaultConfiguration": null,
    "configurations": [
        {
        "name": "my-semantic-config",
        "prioritizedFields": {
            "titleField": {
            "fieldName": "HotelName"
            },
            "prioritizedContentFields": [
            {
                "fieldName": "Description"
            }
            ],
            "prioritizedKeywordsFields": [
            {
                "fieldName": "Category"
            }
            ]
        }
        }
    ]
    }
}

Основные сведения о REST API создания индекса :

  • Коллекция fields содержит обязательные ключевые поля и текстовые и векторные поля (например Description , и DescriptionVector) для поиска текста и вектора. Совместное размещение полей вектора и невектора в том же индексе позволяет выполнять гибридные запросы. Например, можно объединить фильтры, текстовый поиск с семантическим ранжированием и векторы в одну операцию запроса.

  • Поля векторов должны быть type: Collection(Edm.Single) со свойствами dimensions и vectorSearchProfile свойствами.

  • Этот vectorSearch раздел представляет собой массив приблизительных конфигураций и профилей ближайших соседних алгоритмов. Поддерживаемые алгоритмы включают иерархический навигацию по небольшому миру и исчерпывающий k-ближайший сосед. Дополнительные сведения см. в разделе оценки релевантности в векторном поиске.

  • Конфигурация (необязательно) semantic позволяет повторно использовать результаты поиска. Вы можете повторно выполнять запросы типа semantic для строковых полей, указанных в конфигурации. Дополнительные сведения см. в обзоре семантического ранжирования.

Отправить документы

Создание и загрузка индекса являются отдельными шагами. На предыдущем шаге вы создали схему индекса. Теперь необходимо загрузить документы в индекс.

В службе поиска ИИ Azure индекс содержит все данные, доступные для поиска, и запросы, выполняемые в службе поиска. Для вызовов REST данные предоставляются в виде документов JSON. Используйте REST API индексов для этой задачи. Универсальный код ресурса (URI) расширен для включения docs коллекции и index операции.

  1. В Visual Studio Code откройте az-search-vector-quickstart.rest созданный ранее файл.

  2. ### Upload documents Найдите блок кода в файле. Этот блок содержит запрос на отправку документов в hotels-vector-quickstart индекс в службе поиска.

    ### Upload documents
    POST {{baseUrl}}/indexes/hotels-quickstart-vectors/docs/index?api-version=2023-11-01  HTTP/1.1
    Content-Type: application/json
    Authorization: Bearer {{token}}
    
    {
        "value": [
            {
                "@search.action": "mergeOrUpload",
                "HotelId": "1",
                "HotelName": "Stay-Kay City Hotel",
                "HotelNameVector": [VECTOR ARRAY OMITTED],
                "Description": 
                    "The hotel is ideally located on the main commercial artery of the city 
                    in the heart of New York.",
                "DescriptionVector": [VECTOR ARRAY OMITTED],
                "Category": "Boutique",
                "Tags": [
                    "pool",
                    "air conditioning",
                    "concierge"
                ],
            },
            {
                "@search.action": "mergeOrUpload",
                "HotelId": "2",
                "HotelName": "Old Century Hotel",
                "HotelNameVector": [VECTOR ARRAY OMITTED],
                "Description": 
                    "The hotel is situated in a  nineteenth century plaza, which has been 
                    expanded and renovated to the highest architectural standards to create a modern, 
                    functional and first-class hotel in which art and unique historical elements 
                    coexist with the most modern comforts.",
                "DescriptionVector": [VECTOR ARRAY OMITTED],
                "Category": "Boutique",
                "Tags": [
                    "pool",
                    "air conditioning",
                    "free wifi",
                    "concierge"
                ]
            },
            {
                "@search.action": "mergeOrUpload",
                "HotelId": "3",
                "HotelName": "Gastronomic Landscape Hotel",
                "HotelNameVector": [VECTOR ARRAY OMITTED],
                "Description": 
                    "The Hotel stands out for its gastronomic excellence under the management of 
                    William Dough, who advises on and oversees all of the Hotel’s restaurant services.",
                "DescriptionVector": [VECTOR ARRAY OMITTED],
                "Category": "Resort and Spa",
                "Tags": [
                    "air conditioning",
                    "bar",
                    "continental breakfast"
                ]
            }
            {
                "@search.action": "mergeOrUpload",
                "HotelId": "4",
                "HotelName": "Sublime Palace Hotel",
                "HotelNameVector": [VECTOR ARRAY OMITTED],
                "Description": 
                    "Sublime Palace Hotel is located in the heart of the historic center of 
                    Sublime in an extremely vibrant and lively area within short walking distance to 
                    the sites and landmarks of the city and is surrounded by the extraordinary beauty 
                    of churches, buildings, shops and monuments. 
                    Sublime Palace is part of a lovingly restored 1800 palace.",
                "DescriptionVector": [VECTOR ARRAY OMITTED],
                "Category": "Boutique",
                "Tags": [
                    "concierge",
                    "view",
                    "24-hour front desk service"
                ]
            },
            {
                "@search.action": "mergeOrUpload",
                "HotelId": "13",
                "HotelName": "Luxury Lion Resort",
                "HotelNameVector": [VECTOR ARRAY OMITTED],
                "Description": 
                    "Unmatched Luxury.  Visit our downtown hotel to indulge in luxury 
                    accommodations. Moments from the stadium, we feature the best in comfort",
                "DescriptionVector": [VECTOR ARRAY OMITTED],
                "Category": "Resort and Spa",
                "Tags": [
                    "view",
                    "free wifi",
                    "pool"
                ]
            },
            {
                "@search.action": "mergeOrUpload",
                "HotelId": "48",
                "HotelName": "Nordick's Valley Motel",
                "HotelNameVector": [VECTOR ARRAY OMITTED],
                "Description": 
                    "Only 90 miles (about 2 hours) from the nation's capital and nearby 
                    most everything the historic valley has to offer.  Hiking? Wine Tasting? Exploring 
                    the caverns?  It's all nearby and we have specially priced packages to help make 
                    our B&B your home base for fun while visiting the valley.",
                "DescriptionVector": [VECTOR ARRAY OMITTED],
                "Category": "Boutique",
                "Tags": [
                    "continental breakfast",
                    "air conditioning",
                    "free wifi"
                ],
            },
            {
                "@search.action": "mergeOrUpload",
                "HotelId": "49",
                "HotelName": "Swirling Currents Hotel",
                "HotelNameVector": [VECTOR ARRAY OMITTED],
                "Description": 
                    "Spacious rooms, glamorous suites and residences, rooftop pool, walking 
                    access to shopping, dining, entertainment and the city center.",
                "DescriptionVector": [VECTOR ARRAY OMITTED],
                "Category": "Luxury",
                "Tags": [
                    "air conditioning",
                    "laundry service",
                    "24-hour front desk service"
                ]
            }
        ]
    }
    

    Внимание

    Код в этом примере не выполняется. Для краткости удаляются несколько символов или строк. Используйте код в az-search-vector-quickstart.rest файле для выполнения запроса.

  3. Щелкните Отправить запрос. У вас должен быть HTTP/1.1 200 OK ответ. Текст ответа должен содержать представление JSON документов поиска.

Ключи выноски о запросе REST API для документов:

  • Документы в полезных данных состоят из полей, определенных в схеме индекса.

  • Векторные поля содержат значения с плавающей запятой. Атрибут измерений имеет не менее 2 и не более 3072 значений с плавающей запятой. В этом кратком руководстве атрибут измерений присваивается значение 1536, так как это размер внедрения, созданных моделью Azure OpenAI text-embedding-ada-002 .

Выполнение запросов

Теперь, когда документы загружены, вы можете выдавать векторные запросы к ним с помощью документов — post (REST).

В следующих разделах мы запускаем запросы к индексу hotels-vector-quickstart . К запросам относятся:

Примеры векторных запросов основаны на двух строках:

  • Строка поиска: historic hotel walk to restaurants and shopping
  • Строка векторного запроса (векторизованная в математическое представление): classic lodging near running trails, eateries, retail

Строка векторного запроса семантически похожа на строку поиска, но она содержит термины, которые не существуют в индексе поиска. Если вы выполняете поиск classic lodging near running trails, eateries, retailпо ключевому слову, результаты равны нулю. В этом примере показано, как можно получить соответствующие результаты, даже если нет подходящих условий.

  1. В Visual Studio Code откройте az-search-vector-quickstart.rest созданный ранее файл.

  2. ### Run a single vector query Найдите блок кода в файле. Этот блок содержит запрос на запрос к индексу поиска.

    ### Run a single vector query
    POST {{baseUrl}}/indexes/hotels-vector-quickstart/docs/search?api-version=2023-11-01  HTTP/1.1
        Content-Type: application/json
        Authorization: Bearer {{token}}
    
        {
            "count": true,
            "select": "HotelId, HotelName, Description, Category",
            "vectorQueries": [
                {
                    "vector"": [0.01944167, 0.0040178085
                        . . .  TRIMMED FOR BREVITY
                        010858015, -0.017496133],
                    "k": 7,
                    "fields": "DescriptionVector",
                    "kind": "vector",
                    "exhaustive": true
                }
            ]
        }
    

    Этот векторный запрос сокращен для краткости. Содержит vectorQueries.vector векторный текст входных данных запроса, fields определяет, какие поля векторов выполняются поиск, а k также указывает число ближайших соседей, возвращаемых.

    Строка векторного запроса , classic lodging near running trails, eateries, retailкоторая векторизирована в 1536 внедрения для этого запроса.

    Внимание

    Код в этом примере не выполняется. Для краткости удаляются несколько символов или строк. Используйте код в az-search-vector-quickstart.rest файле для выполнения запроса.

  3. Щелкните Отправить запрос. У вас должен быть HTTP/1.1 200 OK ответ. Текст ответа должен содержать представление результатов поиска в формате JSON.

Ответ для векторного эквивалента classic lodging near running trails, eateries, retail включает семь результатов. Каждый результат предоставляет оценку поиска и поля, перечисленные в select. В поиске сходства ответ всегда содержит k результаты, упорядоченные по оценке сходства значений.

{
  "@odata.context": "https://my-demo-search.search.windows.net/indexes('hotels-vector-quickstart')/$metadata#docs(*)",
  "@odata.count": 7,
  "value": [
    {
      "@search.score": 0.85773647,
      "HotelId": "48",
      "HotelName": "Nordick's Motel",
      "Description": "Only 90 miles (about 2 hours) from the nation's capital and nearby most everything the historic valley has to offer.  Hiking? Wine Tasting? Exploring the caverns?  It's all nearby and we have specially priced packages to help make our B&B your home base for fun while visiting the valley.",
      "Category": "Boutique"
    },
    {
      "@search.score": 0.8399132,
      "HotelId": "49",
      "HotelName": "Old Carrabelle Hotel",
      "Description": "Spacious rooms, glamorous suites and residences, rooftop pool, walking access to shopping, dining, entertainment and the city center.",
      "Category": "Luxury"
    },
    {
      "@search.score": 0.83839583,
      "HotelId": "13",
      "HotelName": "Historic Lion Resort",
      "Description": "Unmatched Luxury.  Visit our downtown hotel to indulge in luxury accommodations. Moments from the stadium, we feature the best in comfort",
      "Category": "Resort and Spa"
    },
    {
      "@search.score": 0.82543474,
      "HotelId": "4",
      "HotelName": "Sublime Cliff Hotel",
      "Description": "Sublime Cliff Hotel is located in the heart of the historic center of Sublime in an extremely vibrant and lively area within short walking distance to the sites and landmarks of the city and is surrounded by the extraordinary beauty of churches, buildings, shops and monuments. Sublime Cliff is part of a lovingly restored 1800 palace.",
      "Category": "Boutique"
    },
    {
      "@search.score": 0.82380104,
      "HotelId": "1",
      "HotelName": "Secret Point Hotel",
      "Description": "The hotel is ideally located on the main commercial artery of the city in the heart of New York.",
      "Category": "Boutique"
    },
    {
      "@search.score": 0.8151413,
      "HotelId": "2",
      "HotelName": "Twin Dome Hotel",
      "Description": "The hotel is situated in a  nineteenth century plaza, which has been expanded and renovated to the highest architectural standards to create a modern, functional and first-class hotel in which art and unique historical elements coexist with the most modern comforts.",
      "Category": "Boutique"
    },
    {
      "@search.score": 0.8133767,
      "HotelId": "3",
      "HotelName": "Triple Landscape Hotel",
      "Description": "The Hotel stands out for its gastronomic excellence under the management of William Dough, who advises on and oversees all of the Hotel\u2019s restaurant services.",
      "Category": "Resort and Spa"
    }
  ]
}

Поиск одного вектора с фильтром

Вы можете добавить фильтры, но фильтры применяются к содержимому невектора в индексе. В этом примере фильтр применяется к Tags полю для фильтрации всех отелей, которые не предоставляют бесплатный Wi-Fi.

  1. В Visual Studio Code откройте az-search-vector-quickstart.rest созданный ранее файл.

  2. ### Run a vector query with a filter Найдите блок кода в файле. Этот блок содержит запрос на запрос к индексу поиска.

    ### Run a vector query with a filter
    POST {{baseUrl}}/indexes/hotels-vector-quickstart/docs/search?api-version=2023-11-01  HTTP/1.1
        Content-Type: application/json
        Authorization: Bearer {{token}}
    
        {
            "count": true,
            "select": "HotelId, HotelName, Category, Tags, Description",
            "filter": "Tags/any(tag: tag eq 'free wifi')",
            "vectorFilterMode": "postFilter",
            "vectorQueries": [
            {
                "vector": [ VECTOR OMITTED ],
                "k": 7,
                "fields": "DescriptionVector",
                "kind": "vector",
                "exhaustive": true
            },
        ]
    }
    

    Внимание

    Код в этом примере не выполняется. Для краткости удаляются несколько символов или строк. Используйте код в az-search-vector-quickstart.rest файле для выполнения запроса.

  3. Щелкните Отправить запрос. У вас должен быть HTTP/1.1 200 OK ответ. Текст ответа должен содержать представление результатов поиска в формате JSON.

Запрос был таким же, как и в предыдущем примере поиска с одним вектором, но он включает фильтр исключения после обработки и возвращает только три отеля с бесплатным Wi-Fi.

{
  "@odata.context": "https://my-demo-search.search.windows.net/indexes('hotels-vector-quickstart')/$metadata#docs(*)",
  "@odata.count": 3,
  "value": [
    {
      "@search.score": 0.85773647,
      "HotelId": "48",
      "HotelName": "Nordick's Motel",
      "Description": "Only 90 miles (about 2 hours) from the nation's capital and nearby most everything the historic valley has to offer.  Hiking? Wine Tasting? Exploring the caverns?  It's all nearby and we have specially priced packages to help make our B&B your home base for fun while visiting the valley.",
      "Category": "Boutique",
      "Tags": [
        "continental breakfast",
        "air conditioning",
        "free wifi"
      ]
    },
    {
      "@search.score": 0.83839583,
      "HotelId": "13",
      "HotelName": "Historic Lion Resort",
      "Description": "Unmatched Luxury.  Visit our downtown hotel to indulge in luxury accommodations. Moments from the stadium, we feature the best in comfort",
      "Category": "Resort and Spa",
      "Tags": [
        "view",
        "free wifi",
        "pool"
      ]
    },
    {
      "@search.score": 0.8151413,
      "HotelId": "2",
      "HotelName": "Twin Dome Hotel",
      "Description": "The hotel is situated in a  nineteenth century plaza, which has been expanded and renovated to the highest architectural standards to create a modern, functional and first-class hotel in which art and unique historical elements coexist with the most modern comforts.",
      "Category": "Boutique",
      "Tags": [
        "pool",
        "free wifi",
        "air conditioning",
        "concierge"
      ]
    }
  ]
}

Гибридный поиск состоит из ключевых запросов и векторных запросов в одном запросе поиска. В этом примере выполняется векторный запрос и полнотекстовый поиск одновременно:

  • Строка поиска: historic hotel walk to restaurants and shopping
  • Строка векторного запроса (векторизованная в математическое представление): classic lodging near running trails, eateries, retail
  1. В Visual Studio Code откройте az-search-vector-quickstart.rest созданный ранее файл.

  2. ### Run a hybrid query Найдите блок кода в файле. Этот блок содержит запрос на запрос к индексу поиска.

    ### Run a hybrid query
    POST {{baseUrl}}/indexes/hotels-vector-quickstart/docs/search?api-version=2023-11-01  HTTP/1.1
        Content-Type: application/json
        Authorization: Bearer {{token}}
    
    {
        "count": true,
        "search": "historic hotel walk to restaurants and shopping",
        "select": "HotelName, Description",
        "top": 7,
        "vectorQueries": [
            {
                "vector": [ VECTOR OMITTED],
                "k": 7,
                "fields": "DescriptionVector",
                "kind": "vector",
                "exhaustive": true
            }
        ]
    }
    

    Внимание

    Код в этом примере не выполняется. Для краткости удаляются несколько символов или строк. Используйте код в az-search-vector-quickstart.rest файле для выполнения запроса.

  3. Щелкните Отправить запрос. У вас должен быть HTTP/1.1 200 OK ответ. Текст ответа должен содержать представление результатов поиска в формате JSON.

Так как это гибридный запрос, результаты ранжируются по RRF. RRF оценивает оценки поиска нескольких результатов поиска, принимает обратное, а затем объединяет и сортирует объединенные результаты. Возвращается top количество результатов.

Просмотрите ответ:

{
    "@odata.count": 7,
    "value": [
        {
            "@search.score": 0.03279569745063782,
            "HotelName": "Luxury Lion Resort",
            "Description": "Unmatched Luxury.  Visit our downtown hotel to indulge in luxury accommodations. Moments from the stadium, we feature the best in comfort"
        },
        {
            "@search.score": 0.03226646035909653,
            "HotelName": "Sublime Palace Hotel",
            "Description": "Sublime Palace Hotel is located in the heart of the historic center of Sublime in an extremely vibrant and lively area within short walking distance to the sites and landmarks of the city and is surrounded by the extraordinary beauty of churches, buildings, shops and monuments. Sublime Palace is part of a lovingly restored 1800 palace."
        },
        {
            "@search.score": 0.03226646035909653,
            "HotelName": "Swirling Currents Hotel",
            "Description": "Spacious rooms, glamorous suites and residences, rooftop pool, walking access to shopping, dining, entertainment and the city center."
        },
        {
            "@search.score": 0.03205128386616707,
            "HotelName": "Nordick's Valley Motel",
            "Description": "Only 90 miles (about 2 hours) from the nation's capital and nearby most everything the historic valley has to offer.  Hiking? Wine Tasting? Exploring the caverns?  It's all nearby and we have specially priced packages to help make our B&B your home base for fun while visiting the valley."
        },
        {
            "@search.score": 0.03128054738044739,
            "HotelName": "Gastronomic Landscape Hotel",
            "Description": "The Hotel stands out for its gastronomic excellence under the management of William Dough, who advises on and oversees all of the Hotel’s restaurant services."
        },
        {
            "@search.score": 0.03100961446762085,
            "HotelName": "Old Century Hotel",
            "Description": "The hotel is situated in a  nineteenth century plaza, which has been expanded and renovated to the highest architectural standards to create a modern, functional and first-class hotel in which art and unique historical elements coexist with the most modern comforts."
        },
        {
            "@search.score": 0.03077651560306549,
            "HotelName": "Stay-Kay City Hotel",
            "Description": "The hotel is ideally located on the main commercial artery of the city in the heart of New York."
        }
    ]
}

Так как RRF объединяет результаты, он помогает просматривать входные данные. Ниже приведены результаты только полнотекстового запроса. Лучшие два результата : Отель Sublime Palace и History Lion Resort. Отель Sublime Palace имеет более сильную оценку релевантности BM25.

{
    "@search.score": 2.2626662,
    "HotelName": "Sublime Palace Hotel",
    "Description": "Sublime Palace Hotel is located in the heart of the historic center of Sublime in an extremely vibrant and lively area within short walking distance to the sites and landmarks of the city and is surrounded by the extraordinary beauty of churches, buildings, shops and monuments. Sublime Palace is part of a lovingly restored 1800 palace."
},
{
    "@search.score": 0.86421645,
    "HotelName": "Luxury Lion Resort",
    "Description": "Unmatched Luxury.  Visit our downtown hotel to indulge in luxury accommodations. Moments from the stadium, we feature the best in comfort"
},

В запросе только для вектора, который использует HNSW для поиска совпадений, отель Sublime Palace удаляется на четвертую позицию. Исторический лев, который был вторым в полнотекстовом поиске и третьем в векторном поиске, не имеет того же диапазона колебания, поэтому он отображается в качестве верхнего совпадения в однородном результирующем наборе.

"value": [
    {
        "@search.score": 0.857736,
        "HotelId": "48",
        "HotelName": "Nordick's Valley Motel",
        "Description": "Only 90 miles (about 2 hours) from the nation's capital and nearby most everything the historic valley has to offer.  Hiking? Wine Tasting? Exploring the caverns?  It's all nearby and we have specially priced packages to help make our B&B your home base for fun while visiting the valley.",
        "Category": "Boutique"
    },
    {
        "@search.score": 0.8399129,
        "HotelId": "49",
        "HotelName": "Swirling Currents Hotel",
        "Description": "Spacious rooms, glamorous suites and residences, rooftop pool, walking access to shopping, dining, entertainment and the city center.",
        "Category": "Luxury"
    },
    {
        "@search.score": 0.8383954,
        "HotelId": "13",
        "HotelName": "Luxury Lion Resort",
        "Description": "Unmatched Luxury.  Visit our downtown hotel to indulge in luxury accommodations. Moments from the stadium, we feature the best in comfort",
        "Category": "Resort and Spa"
    },
    {
        "@search.score": 0.8254346,
        "HotelId": "4",
        "HotelName": "Sublime Palace Hotel",
        "Description": "Sublime Palace Hotel is located in the heart of the historic center of Sublime in an extremely vibrant and lively area within short walking distance to the sites and landmarks of the city and is surrounded by the extraordinary beauty of churches, buildings, shops and monuments. Sublime Palace is part of a lovingly restored 1800 palace.",
        "Category": "Boutique"
    },
    {
        "@search.score": 0.82380056,
        "HotelId": "1",
        "HotelName": "Stay-Kay City Hotel",
        "Description": "The hotel is ideally located on the main commercial artery of the city in the heart of New York.",
        "Category": "Boutique"
    },
    {
        "@search.score": 0.81514084,
        "HotelId": "2",
        "HotelName": "Old Century Hotel",
        "Description": "The hotel is situated in a  nineteenth century plaza, which has been expanded and renovated to the highest architectural standards to create a modern, functional and first-class hotel in which art and unique historical elements coexist with the most modern comforts.",
        "Category": "Boutique"
    },
    {
        "@search.score": 0.8133763,
        "HotelId": "3",
        "HotelName": "Gastronomic Landscape Hotel",
        "Description": "The Hotel stands out for its gastronomic excellence under the management of William Dough, who advises on and oversees all of the Hotel’s restaurant services.",
        "Category": "Resort and Spa"
    }
]

Семантический гибридный поиск с фильтром

Ниже приведен последний запрос в коллекции. Этот гибридный запрос с семантической ранжированием фильтруется, чтобы показать только отели в радиусе 500 километров от Вашингтона. Можно задать vectorFilterMode значение NULL, что эквивалентно умолчанию (preFilter для более новых индексов и postFilter для старых).

  1. В Visual Studio Code откройте az-search-vector-quickstart.rest созданный ранее файл.

  2. ### Run a hybrid query with semantic reranking Найдите блок кода в файле. Этот блок содержит запрос на запрос к индексу поиска.

    ### Run a hybrid query with semantic reranking
    POST {{baseUrl}}/indexes/hotels-vector-quickstart/docs/search?api-version=2023-11-01  HTTP/1.1
        Content-Type: application/json
        Authorization: Bearer {{token}}
    
    {
        "count": true,
        "search": "historic hotel walk to restaurants and shopping",
        "select": "HotelId, HotelName, Category, Description,Address/City, Address/StateProvince",
        "filter": "geo.distance(Location, geography'POINT(-77.03241 38.90166)') le 500",
        "vectorFilterMode": null,
        "facets": [ "Address/StateProvince"],
        "top": 7,
        "queryType": "semantic",
        "answers": "extractive|count-3",
        "captions": "extractive|highlight-true",
        "semanticConfiguration": "my-semantic-config",
        "vectorQueries": [
            {
                "vector": [ VECTOR OMITTED ],
                "k": 7,
                "fields": "DescriptionVector",
                "kind": "vector",
                "exhaustive": true
            }
        ]
    }
    

    Внимание

    Код в этом примере не выполняется. Для краткости удаляются несколько символов или строк. Используйте код в az-search-vector-quickstart.rest файле для выполнения запроса.

  3. Щелкните Отправить запрос. У вас должен быть HTTP/1.1 200 OK ответ. Текст ответа должен содержать представление результатов поиска в формате JSON.

Проверьте ответ. Ответ равен трем отелям, которые фильтруются по расположению и семантически StateProvince переназначаются для повышения результатов, которые ближе всего к запросу строки поиска (historic hotel walk to restaurants and shopping).

Отель Swirling Currents теперь движется в верхней точке. Без семантического ранжирования, мотель в долине Нордик является номером один. С семантического ранжирования модели машинного понимания признают, что historic относится к "отель, в пределах ходьбы от столовой (ресторанов) и покупок".

{
  "@odata.context": "https://my-demo-search.search.windows.net/indexes('hotels-vector-quickstart')/$metadata#docs(*)",
  "@odata.count": 2,
  "@search.facets": {
    "Address/StateProvince": [
      {
        "count": 1,
        "value": "VA"
      }
    ]
  },
  "@search.answers": [],
  "value": [
    {
      "@search.score": 0.03306011110544205,
      "@search.rerankerScore": 2.8773112297058105,
      "HotelId": "49",
      "HotelName": "Old Carrabelle Hotel",
      "Description": "Spacious rooms, glamorous suites and residences, rooftop pool, walking access to shopping, dining, entertainment and the city center.",
      "Category": "Luxury",
      "Address": {
        "City": "Arlington",
        "StateProvince": "VA"
      }
    },
    {
      "@search.score": 0.03306011110544205,
      "@search.rerankerScore": 2.1703834533691406,
      "HotelId": "48",
      "HotelName": "Nordick's Motel",
      "Description": "Only 90 miles (about 2 hours) from the nation's capital and nearby most everything the historic valley has to offer.  Hiking? Wine Tasting? Exploring the caverns?  It's all nearby and we have specially priced packages to help make our B&B your home base for fun while visiting the valley.",
      "Category": "Boutique",
      "Address": {
        "City": "Washington D.C.",
        "StateProvince": null
      }
    }
  ]
}

Ключевые выносы о документах — REST API для поиска после публикации :

  • Поиск вектора vectors.value определяется с помощью свойства. Поиск по ключевому слову search определяется с помощью свойства.

  • В гибридном поиске можно интегрировать векторный поиск с полнотекстовый поиск по ключевым словам. Фильтры, проверка орфографии и семантический ранжирование применяются только к текстовому содержимому, а не к векторам. В этом окончательном запросе нет семантики answer , так как система не получила достаточно сильного.

  • Фактические результаты включают более подробные сведения, включая семантические субтитры и выделения. Результаты были изменены для удобства чтения. Чтобы получить полную структуру ответа, выполните запрос в клиенте REST.

Очистка

Если вы работаете в собственной подписке, в конце проекта следует решить, нужны ли вам созданные ресурсы. Ресурсы, которые продолжат работать, могут быть платными. Вы можете удалить ресурсы по отдельности либо удалить всю группу ресурсов.

Ресурсы и управление ими можно найти в портал Azure с помощью ссылки "Все ресурсы" или "Группы ресурсов" в левой области.

Если вы хотите сохранить службу поиска, но удалить индекс и документы, можно использовать DELETE команду в клиенте REST. Эта команда (в конце az-search-vector-quickstart.rest файла) удаляет hotels-vector-quickstart индекс:

### Delete an index
DELETE  {{baseUrl}}/indexes/hotels-vector-quickstart?api-version=2023-11-01 HTTP/1.1
    Content-Type: application/json
    Authorization: Bearer {{token}}

Следующие шаги

На следующем шаге мы рекомендуем научиться вызывать вызовы REST API без ключей API.

Вы также можете просмотреть демонстрационный код для Python, C#или JavaScript.