Partager via


Prise en charge des champs multi-vecteurs dans Azure AI Search

Remarque

Cette fonctionnalité est actuellement disponible en préversion publique. Cette préversion est fournie sans contrat de niveau de service et n’est pas recommandée pour les charges de travail de production. Certaines fonctionnalités peuvent être limitées ou non prises en charge. Pour plus d’informations, consultez Conditions d’utilisation supplémentaires pour les préversions de Microsoft Azure.

La fonctionnalité de support des champs à plusieurs vecteurs dans Azure AI Search permet d'indexer plusieurs vecteurs enfants dans un seul champ de document. Cette fonctionnalité est utile pour les cas d’usage tels que les données modales ou les documents de longue durée, où la représentation du contenu avec un seul vecteur entraînerait une perte de détails importants.

Limites

  • Le ranker sémantique n’est pas pris en charge pour les blocs imbriqués dans un champ complexe. Par conséquent, le ranker sémantique ne prend pas en charge les vecteurs imbriqués dans les champs à vecteurs multiples.

Comprendre la prise en charge des champs multi-vecteurs

Traditionnellement, les types de vecteurs, par exemple Collection(Edm.Single) , ne peuvent être utilisés que dans les champs de niveau supérieur. Avec l’introduction de la prise en charge des champs multi-vecteurs, vous pouvez désormais utiliser des types de vecteurs dans des champs imbriqués de collections complexes, ce qui permet à plusieurs vecteurs d’être associés à un seul document.

Un document unique peut inclure jusqu’à 100 vecteurs au total, dans tous les champs de collection complexes. Les champs vectoriels ne peuvent être imbriqués qu’à un niveau profond.

Définition d’index avec champ multi-vecteur

Aucune nouvelle propriété d’index n’est nécessaire pour cette fonctionnalité. Voici un exemple de définition d’index :

{
  "name": "multivector-index",
  "fields": [
    {
      "name": "id",
      "type": "Edm.String",
      "key": true,
      "searchable": true
    },
    {
      "name": "title",
      "type": "Edm.String",
      "searchable": true
    },
    {
      "name": "description",
      "type": "Edm.String",
      "searchable": true
    },
    {
      "name": "descriptionEmbedding",
      "type": "Collection(Edm.Single)",
      "dimensions": 3,
      "searchable": true,
      "retrievable": true,
      "vectorSearchProfile": "hnsw"
    },
    {
      "name": "scenes",
      "type": "Collection(Edm.ComplexType)",
      "fields": [
        {
          "name": "embedding",
          "type": "Collection(Edm.Single)",
          "dimensions": 3,
          "searchable": true,
          "retrievable": true,
          "vectorSearchProfile": "hnsw"
        },
        {
          "name": "timestamp",
          "type": "Edm.Int32",
          "retrievable": true
        },
        {
          "name": "description",
          "type": "Edm.String",
          "searchable": true,
          "retrievable": true
        },
        {
          "name": "framePath",
          "type": "Edm.String",
          "retrievable": true
        }
      ]
    }
  ]
}

Exemple de document d’ingestion

Voici un exemple de document qui illustre la façon dont vous pouvez utiliser des champs multi-vecteurs dans la pratique :

{
  "id": "123",
  "title": "Non-Existent Movie",
  "description": "A fictional movie for demonstration purposes.",
  "descriptionEmbedding": [1, 2, 3],
  "releaseDate": "2025-08-01",
  "scenes": [
    {
      "embedding": [4, 5, 6],
      "timestamp": 120,
      "description": "A character is introduced.",
      "framePath": "nonexistentmovie\\scenes\\scene120.png"
    },
    {
      "embedding": [7, 8, 9],
      "timestamp": 2400,
      "description": "The climax of the movie.",
      "framePath": "nonexistentmovie\\scenes\\scene2400.png"
    }
  ]
}

Dans cet exemple, le champ de scènes est une collection complexe contenant plusieurs vecteurs (champs d’incorporation), ainsi que d’autres données associées. Chaque vecteur représente une scène du film et peut être utilisé pour trouver des scènes similaires dans d’autres films, entre autres cas d’usage potentiels.

Requête avec prise en charge des champs multi-vecteurs

La fonctionnalité de prise en charge des champs multi-vecteurs introduit des modifications dans le mécanisme de requête d'Azure AI Search. Toutefois, le processus d’interrogation principal reste largement le même. Auparavant, vectorQueries seuls les champs vectoriels cibles définis en tant que champs d’index de niveau supérieur pouvaient être ciblés. Avec cette fonctionnalité, nous allons assouplir cette restriction et autoriser vectorQueries à cibler des champs imbriqués dans une collection de types complexes (jusqu’à un niveau profond). En outre, un nouveau paramètre de temps de requête est disponible : perDocumentVectorLimit.

  • Paramétrer perDocumentVectorLimit à 1 garantit qu’au plus un vecteur par document est apparié, assurant que les résultats proviennent de documents distincts.
  • Le paramètre perDocumentVectorLimit sur 0 (illimité) permet à plusieurs vecteurs pertinents du même document d’être mis en correspondance.
{
  "vectorQueries": [
    {
      "kind": "text",
      "text": "whales swimming",
      "K": 50,
      "fields": "scenes/embedding",
      "perDocumentVectorLimit": 0
    }
  ],
  "select": "title, scenes/timestamp, scenes/framePath"
}

Classer selon plusieurs vecteurs dans un seul champ

Lorsque plusieurs vecteurs sont associés à un document unique, Recherche AZURE AI utilise le score maximal parmi eux pour le classement. Le système utilise le vecteur le plus pertinent pour noter chaque document, ce qui empêche une dilution par des éléments moins pertinents.

Récupérer des éléments pertinents dans une collection

Lorsqu’une collection de types complexes est incluse dans le $select paramètre, seuls les éléments correspondant à la requête vectorielle sont retournés. Cela est utile pour récupérer les métadonnées associées, telles que les horodatages, les descriptions de texte ou les chemins d’accès aux images.

Remarque

Pour réduire la taille de la charge utile, évitez d’inclure les valeurs vectorielles elles-mêmes dans le $select paramètre. Envisagez d’omettre entièrement le stockage vectoriel s’il n’est pas nécessaire.

Déboguer des requêtes multi-vecteurs (aperçu)

Lorsqu’un document inclut plusieurs vecteurs incorporés, tels que du texte et des incorporations d’images dans différents sous-champs, le système utilise le score de vecteur le plus élevé entre tous les éléments pour classer le document.

Pour déboguer la façon dont chaque vecteur a contribué, utilisez le mode débogage innerHits (disponible dans la dernière API REST en préversion).

POST /indexes/my-index/docs/search?api-version=2025-11-01-preview
{
  "vectorQueries": [
    {
      "kind": "vector",
      "field": "keyframes.imageEmbedding",
      "kNearestNeighborsCount": 5,
      "vector": [ /* query vector */ ]
    }
  ],
  "debug": "innerHits"
}

Exemple de forme de réponse

"@search.documentDebugInfo": {
  "innerHits": {
    "keyframes": [
      {
        "ordinal": 0,
        "vectors": [
          {
            "imageEmbedding": {
              "searchScore": 0.958,
              "vectorSimilarity": 0.956
            },
            "textEmbedding": {
              "searchScore": 0.958,
              "vectorSimilarity": 0.956
            }
          }
        ]
      },
      {
        "ordinal": 1,
        "vectors": [
          {
            "imageEmbedding": null,
            "textEmbedding": {
              "searchScore": 0.872,
              "vectorSimilarity": 0.869
            }
          }
        ]
      }
    ]
  }
}

Descriptions de champs

Champ Descriptif
ordinal Index de base zéro de l’élément à l’intérieur de la collection.
vectors Une entrée par champ de vecteur pouvant faire l’objet d’une recherche contenue dans l’élément.
searchScore Score final pour ce champ, après tout rescoring et boosts.
vectorSimilarity Similarité brute retournée par la fonction de distance.

Remarque

innerHits indique actuellement uniquement les champs vectoriels.

Relation à déboguer=vector

Voici quelques faits sur cette propriété :

  • Le commutateur existant debug=vector reste inchangé.

  • Lorsqu’il est utilisé avec des champs à vecteurs multiples, @search.documentDebugInfo.vector.subscore affiche le score maximal utilisé pour classer le document parent, mais pas les détails par élément.

  • Permet innerHits d’obtenir des informations sur la façon dont les éléments individuels ont contribué au score.