Delen via


Index- en queryvectoren in Azure Cosmos DB voor NoSQL in .NET

Dit artikel begeleidt u bij het maken van vectorgegevens, het indexeren van de gegevens en het uitvoeren van query's op de gegevens in een container.

Voordat u vectorindexering en zoekopdrachten gebruikt, moet u eerst vectorzoekopdrachten inschakelen in Azure Cosmos DB voor NoSQL. Nadat u de Azure Cosmos DB-container voor vectorzoekopdrachten hebt ingesteld, maakt u een beleid voor het insluiten van vectoren. Vervolgens voegt u vectorindexen toe aan het indexeringsbeleid voor containers. Vervolgens maakt u een container met vectorindexen en een beleid voor het insluiten van vectoren. Ten slotte voert u een vectorzoekopdracht uit op de opgeslagen gegevens.

Vereisten

De functie inschakelen

Voer de volgende stappen uit om vectorzoekopdrachten in te schakelen voor Azure Cosmos DB voor NoSQL:

  1. Ga naar de pagina van de Azure Cosmos DB for NoSQL-bron.
  2. Selecteer Functies in het linkerdeelvenster onder Instellingen.
  3. Selecteer Vector Search in Azure Cosmos DB voor NoSQL.
  4. Lees de beschrijving van de functie om te bevestigen dat u deze wilt inschakelen.
  5. Selecteer Inschakelen om vectorzoekopdrachten in te schakelen in Azure Cosmos DB voor NoSQL.

Tip

U kunt ook de Azure CLI gebruiken om de mogelijkheden van uw account bij te werken ter ondersteuning van Azure Cosmos DB voor NoSQL Vector Search.

az cosmosdb update \
     --resource-group <resource-group-name> \
     --name <account-name> \
     --capabilities EnableNoSQLVectorSearch

De registratieaanvraag wordt automatisch goedgekeurd, maar het kan 15 minuten duren voordat deze van kracht is.

In de volgende stappen wordt ervan uitgegaan dat u weet hoe u een Azure Cosmos DB for NoSQL-account instelt en een database maakt. De vectorzoekfunctie wordt momenteel niet ondersteund voor de bestaande containers. U moet een nieuwe container maken. Wanneer u de container maakt, geeft u het insluitbeleid voor vectoren op containerniveau en het indexeringsbeleid voor vectoren op.

Laten we een voorbeeld nemen van het maken van een database voor een internetboekwinkel. U wilt titel-, auteur-, ISBN- en beschrijvingsinformatie voor elk boek opslaan. U moet ook de volgende twee eigenschappen definiëren voor het insluiten van vectoren:

  • De contentVector eigenschap bevat tekst insluitingen die worden gegenereerd op basis van de tekstinhoud van het boek. U voegt bijvoorbeeld de eigenschappen title, author, isbn en description samen voordat u de insluiting maakt.
  • De coverImageVector eigenschap wordt gegenereerd op basis van afbeeldingen van de omslag van het boek.

Als u een vectorzoekopdracht wilt uitvoeren, gaat u als volgt te werk:

  1. Vector insluitingen maken en opslaan voor de velden waarop u vectorzoekopdrachten wilt uitvoeren.
  2. Geef de paden voor het insluiten van vectoren op in het beleid voor het insluiten van vectoren.
  3. Neem eventuele vectorindexen op die u wilt opnemen in het indexeringsbeleid voor de container.

Bekijk voor volgende secties van dit artikel de volgende structuur voor de items die zijn opgeslagen in uw container:

{
"title": "book-title", 
"author": "book-author", 
"isbn": "book-isbn", 
"description": "book-description", 
"contentVector": [2, -1, 4, 3, 5, -2, 5, -7, 3, 1], 
"coverImageVector": [0.33, -0.52, 0.45, -0.67, 0.89, -0.34, 0.86, -0.78] 
} 

Een vectorinsluitingsbeleid maken voor uw container

U moet nu een containervectorbeleid definiëren. Dit beleid bevat informatie die wordt gebruikt om de Azure Cosmos DB-query-engine te informeren over het verwerken van vectoreigenschappen in de VectorDistance systeemfuncties. Dit beleid biedt ook noodzakelijke informatie aan het vectorindexeringsbeleid, als u ervoor kiest om er een op te geven.

De volgende informatie is opgenomen in het containervectorbeleid:

Maatstaf Beschrijving
path Het eigenschapspad dat vectoren bevat.
datatype Het type van de elementen van de vector. (De standaardwaarde is Float32.)
dimensions De lengte van elke vector in het pad. (De standaardwaarde is 1536.)
distanceFunction De metrische waarde die wordt gebruikt voor het berekenen van afstand/overeenkomsten. (De standaardwaarde is Cosine.)

Voor het voorbeeld met boekdetails kan het vectorbeleid eruitzien als in het volgende voorbeeld:

  Database db = await client.CreateDatabaseIfNotExistsAsync("vector-benchmarking");
  List<Embedding> embeddings = new List<Embedding>()
  {
      new Embedding()
      {
          Path = "/coverImageVector",
          DataType = VectorDataType.Float32,
          DistanceFunction = DistanceFunction.Cosine,
          Dimensions = 8,
      },
      new Embedding()
      {
          Path = "/contentVector",
          DataType = VectorDataType.Float32,
          DistanceFunction = DistanceFunction.Cosine,
          Dimensions = 10,
      }
  };

Een vectorindex maken in het indexeringsbeleid

Nadat u de paden voor het insluiten van vectoren hebt bepaald, moet u vectorindexen toevoegen aan het indexeringsbeleid. Momenteel wordt de vectorzoekfunctie voor Azure Cosmos DB voor NoSQL alleen ondersteund voor nieuwe containers. Wanneer u de container maakt, past u het vectorbeleid toe. U kunt het beleid later niet meer wijzigen. Het indexeringsbeleid ziet er ongeveer als volgt uit:

    Collection<Embedding> collection = new Collection<Embedding>(embeddings);
    ContainerProperties properties = new ContainerProperties(id: "vector-container", partitionKeyPath: "/id")
    {   
        VectorEmbeddingPolicy = new(collection),
        IndexingPolicy = new IndexingPolicy()
        {
            VectorIndexes = new()
            {
                new VectorIndexPath()
                {
                    Path = "/vector",
                    Type = VectorIndexType.QuantizedFlat,
                }
            }
        },
    };
    properties.IndexingPolicy.IncludedPaths.Add(new IncludedPath { Path = "/*" });    
    properties.IndexingPolicy.ExcludedPaths.Add(new ExcludedPath { Path = "/vector/*" });

Belangrijk

Het vectorpad wordt toegevoegd aan de excludedPaths sectie van het indexeringsbeleid om geoptimaliseerde prestaties voor invoeging te garanderen. Als het vectorpad niet wordt toegevoegd aan excludedPaths, leidt dit tot hogere kosten per aanvraageenheid en grotere latentie voor vectorinvoegingen.

Een zoekquery voor vector-overeenkomsten uitvoeren

Nadat u een container hebt gemaakt met het vectorbeleid dat u wilt gebruiken en vectorgegevens in de container hebt ingevoegd, gebruikt u de functie VectorDistance in een query om een vectorzoekopdracht uit te voeren.

Stel dat u wilt zoeken naar boeken over voedselrecepten door de beschrijving te bekijken. U moet eerst de embeddingen voor uw query-tekst ophalen. In dit geval wilt u mogelijk insluitingen genereren voor de querytekst food recipe. Nadat u de insluiting voor uw zoekquery hebt uitgevoerd, kunt u deze gebruiken in de VectorDistance functie in de vectorzoekquery om alle items op te halen die vergelijkbaar zijn met uw query:

SELECT TOP 10 c.title, VectorDistance(c.contentVector, [1,2,3,4,5,6,7,8,9,10]) AS SimilarityScore   
FROM c  
ORDER BY VectorDistance(c.contentVector, [1,2,3,4,5,6,7,8,9,10])   

Met deze query worden de boektitels samen met overeenkomstenscores opgehaald met betrekking tot uw query. Hier volgt een voorbeeld in .NET:

  float[] embedding = {1f,2f,3f,4f,5f,6f,7f,8f,9f,10f};
  var queryDef = new QueryDefinition(
      query: $"SELECT c.title, VectorDistance(c.contentVector,@embedding) AS SimilarityScore FROM c ORDER BY VectorDistance(c.contentVector,@embedding)"
      ).WithParameter("@embedding", embedding);
  using FeedIterator<Object> feed = container.GetItemQueryIterator<Object>(
      queryDefinition: queryDef
  );
  while (feed.HasMoreResults) 
  {
      FeedResponse<Object> response = await feed.ReadNextAsync();
      foreach ( Object item in response)
      {
          Console.WriteLine($"Found item:\t{item}");
      }
  }