Delen via


Index- en queryvectors in Azure Cosmos DB for NoSQL in .NET

Voordat u vectorindexering en zoekopdrachten gebruikt, moet u eerst de functie inschakelen. In dit artikel worden de volgende stappen behandeld:

  1. De vectorzoekfunctie inschakelen in Azure Cosmos DB voor NoSQL.
  2. De Azure Cosmos DB-container instellen voor vectorzoekopdrachten
  3. Beleid voor het insluiten van vectoren ontwerpen
  4. Vectorindexen toevoegen aan het indexeringsbeleid voor containers
  5. Een container maken met vectorindexen en beleid voor het insluiten van vectoren
  6. Een vectorzoekopdracht uitvoeren op de opgeslagen gegevens

In deze handleiding wordt het proces voor het maken van vectorgegevens beschreven, het indexeren van de gegevens en het uitvoeren van query's op de gegevens in een container.

Vereisten

De functie inschakelen

Vector search for Azure Cosmos DB for NoSQL vereist het inschakelen van de functie door de volgende stappen uit te voeren:

  1. Navigeer naar de resourcepagina van Azure Cosmos DB for NoSQL.
  2. Selecteer het deelvenster Functies onder het menu-item Instellingen.
  3. Selecteer voor 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 om NoSQL Vector Search te ondersteunen.

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

Notitie

De registratieaanvraag wordt automatisch goedgekeurd; Het kan echter 15 minuten duren voordat het van kracht wordt.

Laten we een voorbeeld nemen van het maken van een database voor een internetboekwinkel en u titel, auteur, ISBN en beschrijving voor elk boek opslaat. We definiëren ook twee eigenschappen voor het insluiten van vectoren. De eerste is de eigenschap contentVector, die tekst insluitingen bevat die zijn gegenereerd op basis van de tekstinhoud van het boek (bijvoorbeeld het samenvoegen van de eigenschappen 'title' 'author' 'isbn' en 'description' voordat u de insluiting maakt). De tweede is 'coverImageVector', die wordt gegenereerd op basis van afbeeldingen van de omslag van het boek.

  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 gewenste vectorindexen op in het indexeringsbeleid voor de container.

Voor volgende secties van dit artikel bekijken we de onderstaande structuur voor de items die zijn opgeslagen in onze 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

Vervolgens moet u 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 informeert ook het vectorindexeringsbeleid van de benodigde informatie, als u ervoor kiest om er een op te geven. De volgende informatie is opgenomen in het ingesloten vectorbeleid:

  • "pad": het eigenschapspad dat vectoren bevat
  • "datatype": het type van de elementen van de vector (standaard Float32)
  • "dimensies": de lengte van elke vector in het pad (standaard 1536)
  • "distanceFunction": de metrische waarde die wordt gebruikt voor het berekenen van afstand/gelijkenis (standaardcosinus)

Voor ons voorbeeld met boekdetails kan het vectorbeleid er als volgt uitzien:

  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

Zodra de paden voor het insluiten van vectoren zijn besloten, moeten vectorindexen worden toegevoegd aan het indexeringsbeleid. Op dit moment wordt de vectorzoekfunctie voor Azure Cosmos DB voor NoSQL alleen ondersteund voor nieuwe containers, dus u moet het vectorbeleid toepassen tijdens het maken van de container en kan later niet meer worden gewijzigd. In dit voorbeeld ziet het indexeringsbeleid 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 is toegevoegd aan de sectie 'excludedPaths' van het indexeringsbeleid om te zorgen voor geoptimaliseerde prestaties voor invoeging. Als u het vectorpad niet toevoegt aan 'excludedPaths', leidt dit tot hogere RU-kosten en latentie voor vectorinvoegingen.

Query voor het uitvoeren van vector-overeenkomsten

Zodra u een container met het gewenste vectorbeleid hebt gemaakt en vectorgegevens in de container hebt ingevoegd, kunt u een vectorzoekopdracht uitvoeren met behulp van de functie Vector Distance in een query. Stel dat u wilt zoeken naar boeken over recepten voor voedsel door de beschrijving te bekijken. U moet eerst de insluitingen voor uw querytekst ophalen. In dit geval wilt u mogelijk insluitingen genereren voor de querytekst: 'recept voor voedsel'. Zodra u de insluiting voor uw zoekquery hebt, kunt u deze gebruiken in de functie VectorDistance in de vectorzoekquery en alle items ophalen die vergelijkbaar zijn met uw query, zoals hier wordt weergegeven:

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}");
      }
  }