Udostępnij za pośrednictwem


Magazyn wektorów w usłudze Azure Cosmos DB dla rdzeni wirtualnych bazy danych MongoDB

Użyj zintegrowanej bazy danych wektorów w usłudze Azure Cosmos DB dla bazy danych MongoDB (rdzeni wirtualnych), aby bezproblemowo połączyć aplikacje oparte na sztucznej inteligencji z danymi przechowywanymi w usłudze Azure Cosmos DB. Ta integracja może obejmować aplikacje utworzone przy użyciu osadzania usługi Azure OpenAI. Natywnie zintegrowana baza danych wektorów umożliwia efektywne przechowywanie, indeksowanie i wykonywanie zapytań względem danych wektorów o wysokim wymiarach przechowywanych bezpośrednio w usłudze Azure Cosmos DB for MongoDB (rdzeń wirtualny) wraz z oryginalnymi danymi, z których są tworzone dane wektorowe. Eliminuje to konieczność transferu danych do alternatywnych magazynów wektorów i ponoszenia dodatkowych kosztów.

Co to jest magazyn wektorów?

Magazyn wektorów lub baza danych wektorów to baza danych przeznaczona do przechowywania osadzeń wektorów i zarządzania nimi, które są matematycznymi reprezentacjami danych w przestrzeni wielowymiarowej. W tej przestrzeni każdy wymiar odpowiada funkcji danych, a dziesiątki tysięcy wymiarów może służyć do reprezentowania zaawansowanych danych. Położenie wektora w tym obszarze reprezentuje jego cechy. Wyrazy, frazy lub całe dokumenty oraz obrazy, dźwięk i inne typy danych mogą być wektoryzowane.

Jak działa magazyn wektorów?

W magazynie wektorów algorytmy wyszukiwania wektorowego są używane do indeksowania i osadzania zapytań. Niektóre dobrze znane algorytmy wyszukiwania wektorów obejmują hierarchiczny mały świat (HNSW), odwrócony plik (IVF), DiskANN itp. Wyszukiwanie wektorowe to metoda, która ułatwia znajdowanie podobnych elementów na podstawie ich cech danych, a nie dokładnych dopasowań w polu właściwości. Ta technika jest przydatna w aplikacjach, takich jak wyszukiwanie podobnego tekstu, znajdowanie powiązanych obrazów, tworzenie zaleceń, a nawet wykrywanie anomalii. Służy do wykonywania zapytań dotyczących osadzania wektorów (list liczb) danych utworzonych przy użyciu modelu uczenia maszynowego przy użyciu interfejsu API osadzania. Przykładami osadzania interfejsów API są osadzanie w usłudze Azure OpenAI lub przytulanie twarzy na platformie Azure. Wyszukiwanie wektorowe mierzy odległość między wektorami danych a wektorem zapytania. Wektory danych, które znajdują się najbliżej wektora zapytania, to te, które są najbardziej podobne semantycznie.

W zintegrowanej bazie danych wektorów w usłudze Azure Cosmos DB dla bazy danych MongoDB (rdzeń wirtualny) osadzanie można przechowywać, indeksować i wykonywać zapytania obok oryginalnych danych. Takie podejście eliminuje dodatkowy koszt replikowania danych w oddzielnej czystej bazie danych wektorów. Ponadto ta architektura przechowuje wektorowe osadzania i oryginalne dane razem, co usprawnia operacje na danych wielomodalnych i zapewnia większą spójność danych, skalę i wydajność.

Usługa Azure Cosmos DB dla bazy danych MongoDB (rdzeń wirtualny) zapewnia niezawodne funkcje wyszukiwania wektorów, co umożliwia szybkie wyszukiwanie podobieństw w złożonych zestawach danych. Aby przeprowadzić wyszukiwanie wektorów w usłudze Azure Cosmos DB dla bazy danych MongoDB, należy najpierw utworzyć indeks wektorowy. Usługa Cosmos DB obecnie obsługuje trzy typy indeksów wektorów:

  • DiskANN (zalecane): Idealne rozwiązanie dla zestawów danych na dużą skalę, wykorzystując dyski SSD do wydajnego użycia pamięci przy zachowaniu wysokiej kompletności w przybliżonych wyszukiwaniach najbliższego sąsiada (ANN).
  • HNSW: odpowiednie dla zestawów danych o umiarkowanym rozmiarze wymagających wysokiej kompletności, ze strukturą opartą na grafach, która równoważy dokładność i wydajność zasobów.
  • IVF: używa klastrowania do optymalizowania szybkości wyszukiwania w ekspansywnych zestawach danych, koncentrując się na wyszukiwaniach w klastrach docelowych w celu przyspieszenia wydajności.

Indeksy DiskANN są dostępne w warstwach M40 i nowszych. Aby utworzyć indeks DiskANN, ustaw "kind" parametr na "vector-diskann" następujący szablon:

{ 
    "createIndexes": "<collection_name>",
    "indexes": [
        {
            "name": "<index_name>",
            "key": {
                "<path_to_property>": "cosmosSearch"
            },
            "cosmosSearchOptions": { 
                "kind": "vector-diskann", 
                "dimensions": <integer_value>,
                "similarity": <string_value>,
                "maxDegree" : <integer_value>, 
                "lBuild" : <integer_value>, 
            } 
        } 
    ] 
}
Pole Typ opis
index_name string Unikatowa nazwa indeksu.
path_to_property string Ścieżka do właściwości zawierającej wektor. Ta ścieżka może być właściwością najwyższego poziomu lub ścieżką notacji kropkowej do właściwości. Wektory muszą być number[] indeksowane i używane w wynikach wyszukiwania wektorowego. Użycie innego typu, takiego jak double[], uniemożliwia indeksowanie dokumentu. Nieindeksowane dokumenty nie zostaną zwrócone w wyniku wyszukiwania wektorowego.
kind string Typ indeksu wektorowego do utworzenia. Dostępne opcje to vector-ivf, vector-hnswi vector-diskann.
dimensions integer Liczba wymiarów podobieństwa wektorów. Usługa DiskANN obsługuje maksymalnie 2000 wymiarów, a przyszła pomoc techniczna zaplanowana na 40 000+.
similarity string Metryka podobieństwa do użycia z indeksem. Możliwe opcje to COS (odległość cosinusu), L2 (odległość euklidesowa) i IP (produkt wewnętrzny).
maxDegree integer Maksymalna liczba krawędzi na węzeł na grafie. Ten parametr waha się od 20 do 2048 (wartość domyślna to 32). Wyższe maxDegree jest odpowiednie dla zestawów danych o wysokiej wymiarowości i/lub wysokich wymaganiach dotyczących dokładności.
lBuild integer Ustawia liczbę kandydatów sąsiadów ocenianych podczas budowy indeksu DiskANN. Ten parametr, który waha się od 10 do 500 (wartość domyślna to 50), równoważy dokładność i obciążenie obliczeniowe: wyższe wartości zwiększają jakość i dokładność indeksu, ale zwiększają czas kompilacji

Wyszukiwanie wektorów za pomocą nazwy DiskANN

Aby przeprowadzić wyszukiwanie wektorowe, użyj etapu $search potoku agregacji i wykonaj zapytanie za pomocą cosmosSearch operatora . Funkcja DiskANN umożliwia wyszukiwanie o wysokiej wydajności w ogromnych zestawach danych z opcjonalnym filtrowaniem, takim jak filtry geoprzestrzenne lub tekstowe.

{
  "$search": {
    "cosmosSearch": {
      "path": "<path_to_property>",
      "query": "<query_vector>",  
      "k": <num_results_to_return>,  
      "filter": {"$and": [
        { "<attribute_1>": { "$eq": <value> } },
        {"<location_attribute>": {"$geoWithin": {"$centerSphere":[[<longitude_integer_value>, <latitude_integer_value>], <radius>]}}}
      ]}
    }
  }
},
Pole Typ Opis
lSearch integer Określa rozmiar listy kandydatów dynamicznych do wyszukiwania. Wartość domyślna to 40, z konfigurowalnym zakresem od 10 do 1000. Zwiększenie wartości zwiększa kompletność, ale może zmniejszyć szybkość wyszukiwania.
k integer Definiuje liczbę wyników wyszukiwania do zwrócenia. Wartość k musi być mniejsza lub równa lSearch.

Włączanie nazwy DiskANN w nowym klastrze

Aby włączyć indeks wektora diskANN w nowo aprowizowanym klastrze usługi Azure Cosmos DB dla bazy danych MongoDB (rdzenie wirtualne), wykonaj następujące kroki, aby przeprowadzić rejestrację na poziomie klastra za pośrednictwem interfejsu wiersza polecenia platformy Azure:

  1. Logowanie się do interfejsu wiersza polecenia platformy Azure
az login
  1. Pobierz bieżące ustawienia flag funkcji w klastrze. Dzięki temu zachowasz wszystkie istniejące flagi podczas dodawania nowej funkcji.
az resource show --ids "/subscriptions/<sub id>/resourceGroups/<resource group name>/providers/Microsoft.DocumentDB/mongoClusters/<resource name of your Cosmos DB for MongoDB cluster>" --api-version <cluster's api version>
  1. Dodaj flagę DiskANNIndex do listy funkcji w wersji zapoznawczej bez usuwania istniejących.
az resource patch --ids "/subscriptions/<sub id>/resourceGroups/<resource group name>/providers/Microsoft.DocumentDB/mongoClusters/<resource name of your Cosmos DB for MongoDB cluster>" --api-version <cluster's api version> --properties "{\"previewFeatures\": [\"GeoReplicas\", \"DiskANNIndex\"]}" 

Przykład użycia indeksu DiskANN z filtrowaniem

Dodawanie wektorów do bazy danych

Aby użyć wyszukiwania wektorowego z filtrami geoprzestrzennymi, dodaj dokumenty zawierające zarówno wektorowe osadzanie, jak i współrzędne lokalizacji. Osadzanie można utworzyć przy użyciu własnego modelu, osadzania usługi Azure OpenAI lub innego interfejsu API (takiego jak Hugging Face na platformie Azure).

from pymongo import MongoClient

client = MongoClient("<your_connection_string>")
db = client["test"]
collection = db["testCollection"]

documents = [
    {"name": "Eugenia Lopez", "bio": "CEO of AdventureWorks", "is_open": 1, "location": [-118.9865, 34.0145], "contentVector": [0.52, 0.20, 0.23]},
    {"name": "Cameron Baker", "bio": "CFO of AdventureWorks", "is_open": 1, "location": [-0.1278, 51.5074], "contentVector": [0.55, 0.89, 0.44]},
    {"name": "Jessie Irwin", "bio": "Director of Our Planet initiative", "is_open": 0, "location": [-118.9865, 33.9855], "contentVector": [0.13, 0.92, 0.85]},
    {"name": "Rory Nguyen", "bio": "President of Our Planet initiative", "is_open": 1, "location": [-119.0000, 33.9855], "contentVector": [0.91, 0.76, 0.83]}
]

collection.insert_many(documents)

Tworzenie indeksu wektora DiskANN

W poniższym przykładzie pokazano, jak skonfigurować indeks wektora DiskANN z funkcjami filtrowania. Obejmuje to tworzenie indeksu wektorowego na potrzeby wyszukiwania podobieństwa, dodawanie dokumentów z właściwościami wektorowymi i geoprzestrzennymi oraz indeksowanie pól na potrzeby dodatkowego filtrowania.

db.command({
    "createIndexes": "testCollection",
    "indexes": [
        {
            "name": "DiskANNVectorIndex",
            "key": {
                "contentVector": "cosmosSearch"
            },
            "cosmosSearchOptions": {
                "kind": "vector-diskann",
                "dimensions": 3,
                "similarity": "COS",
                "maxDegree": 32,
                "lBuild": 64
            }
        },
        { 
            "name": "is_open",
            "key": { 
                "is_open": 1 
            }      
        },
        {
            "name": "locationIndex",
            "key": {
                "location": 1
            }
        }
    ]
})

To polecenie tworzy indeks wektora contentVector DiskANN w polu w exampleCollectionprogramie , włączając wyszukiwanie podobieństwa. Dodaje również:

  • Indeks w is_open polu, który umożliwia filtrowanie wyników na podstawie tego, czy firmy są otwarte.
  • Indeks geoprzestrzenny w location polu do filtrowania według odległości geograficznej.

Aby znaleźć dokumenty z podobnymi wektorami w określonym promieniu geograficznym, określ queryVector wyszukiwanie podobieństwa i uwzględnij filtr geoprzestrzenny.

query_vector = [0.52, 0.28, 0.12]
pipeline = [
    {
        "$search": {
            "cosmosSearch": {
                "path": "contentVector",
                "vector": query_vector,
                "k": 5,
                "filter": {
                    "$and": [
                        {"is_open": {"$eq": 1}},
                        {"location": {"$geoWithin": {"$centerSphere": [[-119.7192861804, 34.4102485028], 100 / 3963.2]}}}
                    ]
                }
            }
        }
    }
]

results = list(collection.aggregate(pipeline))
for result in results:
    print(result)

W tym przykładzie wyszukiwanie podobieństwa wektorów zwraca najbardziej najbliższe k wektory na podstawie określonej COS metryki podobieństwa, filtrując wyniki w celu uwzględnienia tylko otwartych firm w promieniu 100 mil.

[
  {
    similarityScore: 0.9745354109084544,
    document: {
      _id: ObjectId("645acb54413be5502badff94"),
      name: 'Eugenia Lopez',
      bio: 'CEO of AdventureWorks',
      is_open: 1,
      location: [-118.9865, 34.0145],
      contentVector: [0.52, 0.20, 0.23]
    }
  },
  {
    similarityScore: 0.9006955671333992,
    document: {
      _id: ObjectId("645acb54413be5502badff97"),
      name: 'Rory Nguyen',
      bio: 'President of Our Planet initiative',
      is_open: 1,
      location: [-119.7302, 34.4005],
      contentVector: [0.91, 0.76, 0.83]
    }
  }
]

Ten wynik przedstawia najważniejsze dokumenty podobne do queryVector, ograniczone do promienia 100 mil i otwartych firm. Każdy wynik zawiera wynik podobieństwa i metadane, pokazując, jak funkcja DiskANN w usłudze Cosmos DB dla bazy danych MongoDB obsługuje wektory połączone i zapytania geoprzestrzenne dla wzbogaconych, wrażliwych na lokalizację środowisk wyszukiwania.

Pobieranie definicji indeksu wektorowego

Aby pobrać definicję indeksu wektora z kolekcji, użyj listIndexes polecenia :

db.exampleCollection.getIndexes();

W tym przykładzie vectorIndex jest zwracany ze wszystkimi cosmosSearch parametrami, które zostały użyte do utworzenia indeksu:

[
  { v: 2, key: { _id: 1 }, name: '_id_', ns: 'test.exampleCollection' },
  {
    v: 2,
    key: { vectorContent: 'cosmosSearch' },
    name: 'vectorSearchIndex',
    cosmosSearch: {
      kind: <index_type>, // options are `vector-ivf`, `vector-hnsw`, and `vector-diskann`
      numLists: 3,
      similarity: 'COS',
      dimensions: 3
    },
    ns: 'test.exampleCollection'
  }
]

Filtrowanie wyszukiwania wektorów (wersja zapoznawcza)

Teraz można wykonywać wyszukiwania wektorów przy użyciu dowolnego obsługiwanego filtru zapytań, takiego jak $lt, , $gte$eq$lte$gt$in$neq$nini .$regex Włącz funkcję wyszukiwania wektorów filtrowania na karcie "Funkcje w wersji zapoznawczej" subskrypcji platformy Azure. Dowiedz się więcej o funkcjach w wersji zapoznawczej tutaj.

Najpierw należy zdefiniować indeks dla filtru oprócz indeksu wektorowego. Można na przykład zdefiniować indeks filtru we właściwości

db.runCommand({ 
     "createIndexes": "<collection_name",
    "indexes": [ {
        "key": { 
            "<property_to_filter>": 1 
               }, 
        "name": "<name_of_filter_index>" 
    }
    ] 
});

Następnie możesz dodać "filter" termin do wyszukiwania wektorów, jak pokazano poniżej. W tym przykładzie filtr szuka dokumentów, w których "title" właściwość nie znajduje się na liście ["not in this text", "or this text"].


db.exampleCollection.aggregate([
  {
      '$search': {
          "cosmosSearch": {
              "vector": "<query_vector>",
              "path": <path_to_vector>,
              "k": num_results,
              "filter": {<property_to_filter>: {"$nin": ["not in this text", "or this text"]}}
          },
          "returnStoredSource": True }},
      {'$project': { 'similarityScore': { '$meta': 'searchScore' }, 'document' : '$$ROOT' }
}
]);

Ważne

W wersji zapoznawczej wyszukiwanie wektorów filtrowanych może wymagać dostosowania parametrów indeksu wektorowego w celu uzyskania większej dokładności. Na przykład zwiększenie mwartości , efConstructionlub efSearch w przypadku korzystania z systemu HNSW lub numListslub nProbes w przypadku korzystania z funkcji IVF może prowadzić do lepszych wyników. Przed użyciem należy przetestować konfigurację, aby upewnić się, że wyniki są zadowalające.

Korzystanie z narzędzi orkiestracji LLM

Używanie jako wektorowej bazy danych z jądrem semantycznym

Użyj jądra semantycznego, aby zorganizować pobieranie informacji z usługi Azure Cosmos DB for MongoDB vCore i LLM. Dowiedz się więcej tutaj.

https://github.com/microsoft/semantic-kernel/tree/main/python/semantic_kernel/connectors/memory/azure_cosmosdb

Używanie jako wektorowej bazy danych w języku LangChain

Użyj biblioteki LangChain, aby zorganizować pobieranie informacji z usługi Azure Cosmos DB for MongoDB vCore i LLM. Dowiedz się więcej tutaj.

Używanie jako semantycznej pamięci podręcznej w usłudze LangChain

Użyj języka LangChain i usługi Azure Cosmos DB dla bazy danych MongoDB (rdzeń wirtualny), aby zorganizować buforowanie semantyczne przy użyciu wcześniej zarejestrowanych odpowiedzi LLM, które mogą zaoszczędzić koszty interfejsu API LLM i zmniejszyć opóźnienie odpowiedzi. Więcej informacji znajdziesz tutaj

Funkcje i ograniczenia

  • Obsługiwane metryki odległości: L2 (Euclidean), produkt wewnętrzny i cosinus.
  • Obsługiwane metody indeksowania: IVFFLAT, HNSW i DiskANN (wersja zapoznawcza)
  • Indeksowanie wektorów o rozmiarze do 2000 wymiarów.
  • Indeksowanie dotyczy tylko jednego wektora na ścieżkę.
  • Na ścieżkę wektorową można utworzyć tylko jeden indeks.

Podsumowanie

W tym przewodniku pokazano, jak utworzyć indeks wektorowy, dodać dokumenty, które mają dane wektorowe, przeprowadzić wyszukiwanie podobieństwa i pobrać definicję indeksu. Korzystając z naszej zintegrowanej bazy danych wektorów, można efektywnie przechowywać, indeksować i wykonywać zapytania dotyczące danych wektorów o wysokim wymiarach bezpośrednio w usłudze Azure Cosmos DB dla rdzeni wirtualnych bazy danych MongoDB. Umożliwia to odblokowanie pełnego potencjału danych za pomocą osadzeń wektorów i umożliwia tworzenie bardziej dokładnych, wydajnych i zaawansowanych aplikacji.

Następny krok