Créer un magasin vectoriel

Dans la Recherche Azure AI, un magasin de vecteurs a un schéma d’index qui définit des champs vectoriels et non vectoriels, une configuration vectorielle pour les algorithmes qui créent l’espace d’incorporation et les paramètres sur les définitions de champ vectoriel utilisées dans les requêtes de requête. L’API Créer un index crée le magasin de vecteurs.

Procédez comme suit pour indexer les données vectorielles :

  • Définissez un schéma avec une ou plusieurs configurations vectorielles spécifiant des algorithmes d’indexation et de recherche.
  • Ajoutez un ou plusieurs champs vectoriels.
  • Chargez des données prévectorisées en tant qu’étape distincte ou utilisez la vectorisation intégrée (préversion) pour la segmentation et l’encodage des données pendant l’indexation.

Cet article s’applique à la préversion générale de la Recherche vectorielle, qui suppose que votre code d’application appelle des ressources externes pour le segmentation et l’encodage.

Remarque

Vous cherchez de l’aide sur la migration à partir de 2023-07-01-preview ? Consultez Mettre à niveau les API REST.

Prérequis

  • La Recherche Azure AI, dans n’importe quelle région et sur n’importe quel niveau. La plupart des services existants prennent en charge la recherche vectorielle. Pour les services créés avant janvier 2019, un petit sous-ensemble ne prend pas en charge la recherche vectorielle. Si un index contenant des champs vectoriels ne parvient pas à être créé ou mis à jour, il s’agit d’un indicateur. Dans ce cas, un nouveau service doit être créé.

  • Incorporations de vecteurs préexistantes dans vos documents sources. Recherche Azure AI ne génère pas de vecteurs dans la version en disponibilité générale des API REST et des Kits de développement logiciel (SDK) Azure. Nous recommandons les modèles d'intégration Azure OpenAI, mais vous pouvez utiliser n'importe quel modèle pour la vectorisation. Pour plus d’informations, consultez Générer une implémentation.

  • Vous devez connaître la limite des dimensions du modèle utilisé pour créer les incorporations et la façon dont la similarité est calculée. Dans Azure OpenAI, pour text-embedding-ada-002, la longueur du vecteur numérique est 1536. La similarité est calculée en utilisant cosine. Les valeurs valides sont comprises entre 2 et 3 072 dimensions.

  • Vous devez être familiarisé avec la création d'un index. Le schéma doit inclure un champ pour la clé de document, d’autres champs que vous souhaitez rechercher ou filtrer, ainsi que d’autres configurations pour les comportements nécessaires lors de l’indexation et des requêtes.

Préparer des documents pour l’indexation

Avant l’indexation, vous devez assembler un document qui comprend des champs de données vectorielles et non vectorielles. La structure du document doit être conforme au schéma de l'index.

Vérifiez que vos documents sont les suivants :

  1. Fournissez un champ ou une propriété de métadonnées qui identifie de manière unique chaque document. Tous les index de recherche nécessitent une clé de document. Pour répondre aux exigences de clé de document, un document source doit avoir un champ ou une propriété qui peut l’identifier de manière unique dans l’index. Ce champ source doit être mappé à un champ d’index de type Edm.String et key=true dans l’index de recherche.

  2. Fournir des données vectorielles (un tableau de nombres à virgule flottante en simple précision) dans les champs source.

    Les champs vectoriels contiennent des données numériques générées par des modèles incorporés, une incorporation par champ. Nous recommandons les modèles d'intégration dans Azure OpenAI, tels que text-embedding-ada-002 pour les documents textuels ou l’API REST Recherche d'images pour les images. Seuls les champs vectoriels de niveau supérieur d’index sont pris en charge : les sous-champs Vecteur ne sont actuellement pas pris en charge.

  3. Fournissez d’autres champs avec du contenu alphanumérique lisible par l’homme pour la réponse à la requête et pour les scénarios de requête hybrides qui incluent la recherche en texte intégral ou le classement sémantique dans la même requête.

Votre index de recherche doit inclure des champs et du contenu pour tous les scénarios de requête que vous souhaitez prendre en charge. Supposons que vous souhaitez rechercher ou filtrer les noms de produits, les versions, les métadonnées ou les adresses. Dans ce cas, la recherche de similarité n’est pas particulièrement utile. La recherche par mot clé, la recherche géographique ou les filtres seraient un meilleur choix. Un index de recherche qui comprend une collection complète de données vectorielles et non vectorielles offre une flexibilité maximale pour la construction des requêtes et la composition de la réponse.

Un bref exemple d’une charge utile de documents qui comprend des champs vectoriels et non vectoriels est présenté dans la section charge des données vectorielles de cet article.

Ajouter une configuration de recherche vectorielle

Une configuration vectorielle spécifie l'algorithme de recherche vectorielle et les paramètres utilisés lors de l'indexation pour créer les informations sur les "voisins les plus proches" parmi les nœuds du vecteur :

  • Hierarchical Navigable Small Worlds (HNSW)
  • Exhaustive KNN

Si vous choisissez HNSW sur un champ, vous pouvez opter pour un KNN exhaustif au moment de la requête. Mais l’autre direction ne fonctionnera pas : si vous choisissez exhaustive, vous ne pouvez pas demander ultérieurement la recherche HNSW, car les structures de données supplémentaires qui activent la recherche approximative n’existent pas.

Vous cherchez de l’aide pour migrer de la préversion vers la version stable ? Pour les étapes à suivre, consultez Mettre à niveau les API REST.

La version de l’API REST 2023-11-01 prend en charge une configuration vectorielle ayant :

  • Algorithmes vectorSearch, plus proches voisins hnsw et exhaustiveKnn, avec des paramètres pour l’indexation et le scoring.
  • vectorProfiles pour de multiples combinaisons de configurations d'algorithmes.

Veillez à avoir une stratégie pour vectoriser votre contenu. La version stable ne fournit pas de vectoriseurs pour l’incorporation intégrée.

  1. Utilisez l’API Créer ou mettre à jour l’index pour créer l’index.

  2. Ajoutez une section vectorSearch dans l’index qui spécifie les algorithmes de recherche utilisés pour créer l’espace d’incorporation.

     "vectorSearch": {
         "algorithms": [
             {
                 "name": "my-hnsw-config-1",
                 "kind": "hnsw",
                 "hnswParameters": {
                     "m": 4,
                     "efConstruction": 400,
                     "efSearch": 500,
                     "metric": "cosine"
                 }
             },
             {
                 "name": "my-hnsw-config-2",
                 "kind": "hnsw",
                 "hnswParameters": {
                     "m": 8,
                     "efConstruction": 800,
                     "efSearch": 800,
                     "metric": "cosine"
                 }
             },
             {
                 "name": "my-eknn-config",
                 "kind": "exhaustiveKnn",
                 "exhaustiveKnnParameters": {
                     "metric": "cosine"
                 }
             }
    
         ],
         "profiles": [
           {
             "name": "my-default-vector-profile",
             "algorithm": "my-hnsw-config-2"
           }
         ]
     }
    

    Points essentiels :

    • Nom de la configuration. Le nom doit être unique dans l'index.
    • profiles ajouter une couche d’abstraction pour accueillir des définitions plus riches. Un profil est défini dans vectorSearch, puis référencé par nom sur chaque champ vectoriel.
    • "hnsw" et "exhaustiveKnn" sont les algorithmes de voisins les plus proches (ANN) approximatifs utilisés pour organiser le contenu vectoriel pendant l’indexation.
    • "m" (nombre de liens bidirectionnels) par défaut est 4. La fourchette est comprise entre 4 et 10. Les valeurs inférieures doivent retourner moins de bruit dans les résultats.
    • "efConstruction" la valeur par défaut est 400. La plage est comprise entre 100 et 1,000. Il s’agit du nombre de voisins les plus proches utilisés lors de l’indexation.
    • "efSearch" la valeur par défaut est 500. La plage est comprise entre 100 et 1,000. C'est le nombre de voisins les plus proches utilisés lors de la recherche.
    • "metric" doit être « cosinus » si vous utilisez Azure OpenAI, sinon utilisez la métrique de similarité associée au modèle d’incorporation que vous utilisez. Les valeurs prises en charge sont les suivantes : cosine, dotProduct, euclidean.

Ajouter un champ vectoriel à la collection de champs

La collection de champs doit inclure un champ pour la clé de document, les champs vectoriels et tous les autres champs dont vous avez besoin pour les scénarios de recherche hybride.

Les champs vectoriels sont de type Collection(Edm.Single) et des valeurs à virgule flottante simple précision. Un champ de ce type a également une propriété dimensions et spécifie une configuration vectorielle.

Utilisez cette version si vous souhaitez des fonctionnalités généralement disponibles uniquement.

  1. Utilisez l’index Créer ou mettre à jour pour créer l’index.

  2. Définissez un champ vectoriel avec les attributs suivants. Vous pouvez stocker un incorporation généré par champ. Pour chaque champ vectoriel :

    • type doit être Collection(Edm.Single).
    • dimensions retourne le nombre de dimensions dans le modèle d’incorporation. Pour text-embedding-ada-002, c'est 1536.
    • vectorSearchProfile est le nom d’un profil défini ailleurs dans l’index.
    • searchable doit être true.
    • retrievable peut avoir la valeur « true » ou « false ». True retourne les vecteurs bruts (1536 d’entre eux) sous forme de texte brut et consomme de l’espace de stockage. Définissez la valeur true si vous transmettez un résultat vectoriel à une application en aval.
    • filterable, facetable, sortable doit être false.
  3. Si vous souhaitez appeler le préfiltrage ou le post-filtrage sur la requête vectorielle , ajoutez des champs non vectoriels filtrables à la collection, tels que « titre » avec filterable défini sur true.

  4. Ajoutez d’autres champs qui définissent la substance et la structure du contenu textuel que vous indexez. Au minimum, vous avez besoin d'une clé de document.

    Vous devez également ajouter des champs utiles à la requête ou à la réponse. L’exemple suivant montre des champs vectoriels pour le titre et le contenu (« titleVector », « contentVector ») équivalents aux vecteurs. Il fournit également des champs pour le contenu textuel équivalent (« titre », « contenu ») utile pour le tri, le filtrage et la lecture dans un résultat de recherche.

    L'exemple suivant montre la collection de champs :

    PUT https://my-search-service.search.windows.net/indexes/my-index?api-version=2023-11-01&allowIndexDowntime=true
    Content-Type: application/json
    api-key: {{admin-api-key}}
    {
        "name": "{{index-name}}",
        "fields": [
            {
                "name": "id",
                "type": "Edm.String",
                "key": true,
                "filterable": true
            },
            {
                "name": "title",
                "type": "Edm.String",
                "searchable": true,
                "filterable": true,
                "sortable": true,
                "retrievable": true
            },
            {
                "name": "titleVector",
                "type": "Collection(Edm.Single)",
                "searchable": true,
                "retrievable": true,
                "dimensions": 1536,
                "vectorSearchProfile": "my-default-vector-profile"
            },
            {
                "name": "content",
                "type": "Edm.String",
                "searchable": true,
                "retrievable": true
            },
            {
                "name": "contentVector",
                "type": "Collection(Edm.Single)",
                "searchable": true,
                "retrievable": true,
                "dimensions": 1536,
                "vectorSearchProfile": "my-default-vector-profile"
            }
        ],
        "vectorSearch": {
            "algorithms": [
                {
                    "name": "my-hnsw-config-1",
                    "kind": "hnsw",
                    "hnswParameters": {
                        "m": 4,
                        "efConstruction": 400,
                        "efSearch": 500,
                        "metric": "cosine"
                    }
                }
            ],
            "profiles": [
                {
                    "name": "my-default-vector-profile",
                    "algorithm": "my-hnsw-config-1"
                }
            ]
        }
    }
    

Charger des données vectorielles pour l’indexation

Le contenu que vous fournissez pour l'indexation doit être conforme au schéma de l'index et inclure une chaîne de valeur unique pour la clé du document. Les données prévectorisées sont chargées dans un ou plusieurs champs vectoriels, qui peuvent coexister avec d’autres champs contenant du contenu alphanumérique.

Vous pouvez utiliser méthodologies push ou pull pour l’ingestion de données.

Utilisez Index Documents (2023-11-01), Index documents (2023-10-01-préversion), ou le Ajouter, Mettre à jour ou Supprimer des documents (2023-07-01-préversion) pour envoyer (push) des documents contenant des données vectorielles.

POST https://{{search-service-name}}.search.windows.net/indexes/{{index-name}}/docs/index?api-version=2023-11-01
Content-Type: application/json
api-key: {{admin-api-key}}
{
    "value": [
        {
            "id": "1",
            "title": "Azure App Service",
            "content": "Azure App Service is a fully managed platform for building, deploying, and scaling web apps. You can host web apps, mobile app backends, and RESTful APIs. It supports a variety of programming languages and frameworks, such as .NET, Java, Node.js, Python, and PHP. The service offers built-in auto-scaling and load balancing capabilities. It also provides integration with other Azure services, such as Azure DevOps, GitHub, and Bitbucket.",
            "category": "Web",
            "titleVector": [
                -0.02250031754374504,
                 . . . 
                        ],
            "contentVector": [
                -0.024740582332015038,
                 . . .
            ],
            "@search.action": "upload"
        },
        {
            "id": "2",
            "title": "Azure Functions",
            "content": "Azure Functions is a serverless compute service that enables you to run code on-demand without having to manage infrastructure. It allows you to build and deploy event-driven applications that automatically scale with your workload. Functions support various languages, including C#, F#, Node.js, Python, and Java. It offers a variety of triggers and bindings to integrate with other Azure services and external services. You only pay for the compute time you consume.",
            "category": "Compute",
            "titleVector": [
                -0.020159931853413582,
                . . .
            ],
            "contentVector": [
                -0.02780858241021633,
                 . . .
            ],
            "@search.action": "upload"
        }
        . . .
    ]
}

Vérifiez le contenu vectoriel de votre index

À des fins de validation, vous pouvez interroger l’index à l’aide de l’Explorateur de recherche dans le Portail Azure ou d’un appel d’API REST. Étant donné qu’Azure AI Search ne peut pas convertir un vecteur en texte lisible par l’homme, essayez de renvoyer des champs du même document qui fournissent des preuves de la correspondance. Par exemple, si la requête vectorielle cible le champ « titleVector », vous pouvez sélectionner « titre » pour les résultats de la recherche.

Les champs doivent être attribués comme « récupérables » pour être inclus dans les résultats.

Utilisez l’Explorateur de recherche pour interroger l’index. L’Explorateur de recherche a deux vues : vue requête (par défaut) et vue JSON.

  • Utiliser la vue JSON pour les requêtes vectorielles, collage dans une définition JSON de la requête vectorielle que vous souhaitez exécuter.

  • Utilisez la vue Requête par défaut pour une confirmation rapide que l’index contient des vecteurs. L’affichage de requête est destiné à la recherche en texte intégral. Bien que vous ne puissiez pas l’utiliser pour les requêtes vectorielles, vous pouvez envoyer une recherche vide (search=*) pour rechercher du contenu. Le contenu de tous les champs, y compris les champs vectoriels, est retourné sous forme de texte brut.

Mettre à jour un magasin vectoriel

Pour mettre à jour un magasin vectoriel, modifiez le schéma et, si nécessaire, rechargez les documents pour remplir de nouveaux champs. Les API pour les mises à jour de schéma incluent Create or Update Index (REST), CreateOrUpdateIndex dans le SDK Azure pour .NET, create_or_update_index dans le SDK Azure pour Python et des méthodes similaires dans d’autres SDK Azure.

L’aide standard pour la mise à jour d’un index est disponible dans Supprimer et régénérer un index.

Les points clés sont les suivants :

  • La suppression et la régénération sont souvent requises pour les mises à jour et la suppression de champs existants.

  • Toutefois, vous pouvez mettre à jour un schéma existant avec les modifications suivantes, sans aucune régénération requise :

    • Ajouter de nouveaux champs à une collection de champs.
    • Ajouter de nouvelles configurations vectorielles (affectées à de nouveaux champs, mais pas à des champs existants déjà vectorisés).
    • Modifier « retrievable » (les valeurs sont true ou false) sur un champ existant. Les champs vectoriels doivent pouvoir faire l’objet d’une recherche et être récupérables. Toutefois, si vous souhaitez désactiver l’accès à un champ vectoriel dans des situations où la suppression et la régénération ne sont pas réalisables, vous pouvez définir retrievable sur false.

Étapes suivantes

À l’étape suivante, nous vous recommandons d' données de vecteur de requête dans un index de recherche.

Les exemples de code du dépôt azure-search-vector illustrent des workflows de bout en bout qui incluent la définition de schéma, la vectorisation, l’indexation et les requêtes.

Le code de démonstration est disponible en Python, C# et JavaScript.