Udostępnij za pośrednictwem


Wektory indeksów i zapytań w usłudze Azure Cosmos DB for NoSQL na platformie .NET.

DOTYCZY: NoSQL

Wyszukiwanie wektorowe w usłudze Azure Cosmos DB for NoSQL jest obecnie funkcją w wersji zapoznawczej. Przed rozpoczęciem korzystania z wersji zapoznawczej musisz zarejestrować się w wersji zapoznawczej. W tym artykule opisano następujące kroki:

  1. Rejestrowanie w celu uzyskania wersji zapoznawczej wyszukiwania wektorowego w usłudze Azure Cosmos DB for NoSQL
  2. Konfigurowanie kontenera usługi Azure Cosmos DB na potrzeby wyszukiwania wektorów
  3. Zasady osadzania wektorów tworzenia
  4. Dodawanie indeksów wektorów do zasad indeksowania kontenerów
  5. Tworzenie kontenera z indeksami wektorów i zasad osadzania wektorów
  6. Wykonywanie wyszukiwania wektorowego na przechowywanych danych.
  7. W tym przewodniku przedstawiono proces tworzenia danych wektorowych, indeksowania danych, a następnie wykonywania zapytań dotyczących danych w kontenerze.

Wymagania wstępne

  • Istniejące konto usługi Azure Cosmos DB for NoSQL.
    • Jeśli nie masz subskrypcji platformy Azure, wypróbuj bezpłatnie usługę Azure Cosmos DB dla noSQL.
    • Jeśli masz istniejącą subskrypcję platformy Azure, utwórz nowe konto usługi Azure Cosmos DB for NoSQL.
  • Najnowsza wersja zestawu .NET SDK usługi Azure Cosmos DB (wersja zapoznawcza 3.41.0-preview.0)

Rejestrowanie w celu korzystania z wersji zapoznawczej

Wyszukiwanie wektorowe dla usługi Azure Cosmos DB dla noSQL wymaga rejestracji funkcji w wersji zapoznawczej. Wykonaj poniższe kroki, aby się zarejestrować:

  1. Przejdź do strony zasobów usługi Azure Cosmos DB for NoSQL.

  2. Wybierz okienko "Funkcje" w elemencie menu "Ustawienia".

  3. Wybierz pozycję "Wyszukiwanie wektorowe w usłudze Azure Cosmos DB for NoSQL".

  4. Przeczytaj opis funkcji, aby potwierdzić, że chcesz zarejestrować się w wersji zapoznawczej.

  5. Wybierz pozycję "Włącz", aby zarejestrować się w wersji zapoznawczej.

Uwaga

Żądanie rejestracji zostanie automatycznie zatwierdzone, ale może upłynąć kilka minut.

W poniższych krokach założono, że wiesz, jak skonfigurować konto NoSQL usługi Cosmos DB i utworzyć bazę danych. Funkcja wyszukiwania wektorowego nie jest obecnie obsługiwana w istniejących kontenerach, dlatego należy utworzyć nowy kontener i określić zasady osadzania wektora na poziomie kontenera oraz zasady indeksowania wektorów w czasie tworzenia kontenera.

Przyjrzyjmy się przykładowi tworzenia bazy danych dla internetowej księgarni i przechowujesz tytuł, autor, ISBN i opis dla każdej książki. Definiujemy również dwie właściwości, które mają zawierać osadzanie wektorów. Pierwsza to właściwość "contentVector", która zawiera osadzanie tekstu wygenerowane na podstawie zawartości tekstowej książki (na przykład łączenie właściwości "title" "author" "isbn" i "description" przed utworzeniem osadzania). Drugi to "coverImageVector", który jest generowany na podstawie obrazów okładki książki.

  1. Twórz i przechowuj wektorowe osadzania dla pól, na których chcesz przeprowadzić wyszukiwanie wektorów.
  2. Określ ścieżki osadzania wektorów w zasadach osadzania wektorów.
  3. Uwzględnij wszystkie żądane indeksy wektorów w zasadach indeksowania dla kontenera.

W kolejnych sekcjach tego artykułu rozważymy poniższą strukturę elementów przechowywanych w naszym kontenerze:

{
"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] 
} 

Tworzenie zasad osadzania wektorów dla kontenera.

Następnie należy zdefiniować zasady wektora kontenera. Te zasady zawierają informacje używane do informowania aparatu zapytań usługi Azure Cosmos DB o sposobie obsługi właściwości wektorów w funkcjach systemu VectorDistance. Te zasady informują również zasady indeksowania wektorów o niezbędnych informacjach, jeśli chcesz je określić. Następujące informacje znajdują się w zasadach zawartych wektorów:

  • "path": ścieżka właściwości zawierająca wektory
  • "datatype": typ elementów wektora (wartość domyślna Float32)
  • "dimensions": długość każdego wektora w ścieżce (domyślnie 1536)
  • "distanceFunction": metryka używana do obliczania odległości/podobieństwa (domyślna cosinus)

W naszym przykładzie ze szczegółami książki zasady wektorów mogą wyglądać podobnie do poniższego przykładowego kodu JSON:

  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,
      }
  };

Tworzenie indeksu wektorowego w zasadach indeksowania

Po podjęciu decyzji o ścieżkach osadzania wektorów należy dodać indeksy wektorów do zasad indeksowania. Obecnie funkcja wyszukiwania wektorowego dla usługi Azure Cosmos DB for NoSQL jest obsługiwana tylko w nowych kontenerach, więc należy zastosować zasady wektorów w czasie tworzenia kontenera i nie można jej później modyfikować. W tym przykładzie zasady indeksowania będą wyglądać mniej więcej tak:

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

Ważne

Ścieżka wektorowa dodana do sekcji "excludedPaths" zasad indeksowania w celu zapewnienia zoptymalizowanej wydajności wstawiania. Dodanie ścieżki wektora do "excludedPaths" spowoduje wyższe obciążenie jednostek RU i opóźnienie dla wstawiania wektorów.

Ważne

Obecnie wyszukiwanie wektorów w usłudze Azure Cosmos DB for NoSQL jest obsługiwane tylko w nowych kontenerach. Należy ustawić zarówno zasady wektora kontenera, jak i wszelkie zasady indeksowania wektorów w czasie tworzenia kontenera, ponieważ nie można go później modyfikować. Obie zasady będą modyfikowalne w przyszłej ulepszeniu funkcji w wersji zapoznawczej.

Uruchamianie zapytania wyszukiwania podobieństwa wektorów

Po utworzeniu kontenera z żądanymi zasadami wektorów i wstawieniu danych wektorowych do kontenera można przeprowadzić wyszukiwanie wektorów przy użyciu funkcji systemowej Vector Distance w zapytaniu. Załóżmy, że chcesz wyszukać książki dotyczące przepisów spożywczych, patrząc na opis, musisz najpierw uzyskać osadzanie tekstu zapytania. W takim przypadku możesz wygenerować osadzanie dla tekstu zapytania — "przepis na żywność". Po osadzeniu zapytania wyszukiwania można go użyć w funkcji VectorDistance w zapytaniu wyszukiwania wektorowego i pobrać wszystkie elementy podobne do zapytania, jak pokazano poniżej:

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])   

To zapytanie pobiera tytuły książki wraz z wynikami podobieństwa w odniesieniu do zapytania. Oto przykład na platformie .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}");
      }
  }

Następne kroki