Udostępnij za pośrednictwem


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

DOTYCZY: Rdzenie wirtualne bazy danych MongoDB

Użyj zintegrowanej bazy danych wektorów w usłudze Azure Cosmos DB dla rdzeni wirtualnych bazy danych MongoDB, 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 rdzeniach wirtualnych usługi Azure Cosmos DB for MongoDB 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 rdzeni wirtualnych bazy danych MongoDB 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ść.

Tworzenie indeksu wektorowego

Aby przeprowadzić wyszukiwanie wektorów symulowanych we właściwościach wektorów w dokumentach, należy najpierw utworzyć indeks wektorowy.

Tworzenie indeksu wektorowego przy użyciu HNSW

Można tworzyć (hierarchiczne indeksy nawigowalnego małego świata) w warstwach klastra M40 i wyższe. Aby utworzyć indeks HSNW, należy utworzyć indeks wektora z parametrem "kind" ustawionym na "vector-hnsw" następujący szablon:

{ 
    "createIndexes": "<collection_name>",
    "indexes": [
        {
            "name": "<index_name>",
            "key": {
                "<path_to_property>": "cosmosSearch"
            },
            "cosmosSearchOptions": { 
                "kind": "vector-hnsw", 
                "m": <integer_value>, 
                "efConstruction": <integer_value>, 
                "similarity": "<string_value>", 
                "dimensions": <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. Jeśli jest używana ścieżka notacji kropkowej, wszystkie elementy inne niżle nie mogą być tablicami. Wektory muszą być number[] indeksowane i zwracane w wynikach wyszukiwania wektorowego.
kind string Typ indeksu wektorowego do utworzenia. Dostępne są vector-ivf opcje i vector-hnsw. Uwaga vector-ivf jest dostępna we wszystkich warstwach klastra i vector-hnsw jest dostępna w warstwach klastra M40 i nowszych.
m integer Maksymalna liczba połączeń na warstwę (16 domyślnie minimalna wartość to 2, wartość maksymalna to 100). Wyższe m jest odpowiednie dla zestawów danych o wysokiej wymiarowości i/lub wysokich wymaganiach dotyczących dokładności.
efConstruction integer rozmiar listy kandydatów dynamicznych do konstruowania grafu (64 domyślnie wartość minimalna to 4, wartość maksymalna to 1000). Wyższe efConstruction spowoduje lepszą jakość indeksu i większą dokładność, ale zwiększy również czas wymagany do utworzenia indeksu. efConstruction musi być co najmniej 2 * m
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).
dimensions integer Liczba wymiarów podobieństwa wektorów. Maksymalna liczba obsługiwanych wymiarów to 2000.

Wykonywanie wyszukiwania wektorów za pomocą HNSW

Aby przeprowadzić wyszukiwanie wektorowe, użyj etapu $search potoku agregacji zapytania z operatorem cosmosSearch .

{
    "$search": {
        "cosmosSearch": {
            "vector": <query_vector>,
            "path": "<path_to_property>",
            "k": <num_results_to_return>,
            "efSearch": <integer_value>
        },
    }
  }
}

Pole Typ Opis
efSearch integer Rozmiar listy kandydatów dynamicznych do wyszukiwania (40 domyślnie). Wyższa wartość zapewnia lepszą kompletność kosztem szybkości.
k integer Liczba wyników do zwrócenia. powinna być mniejsza lub równa efSearch

Uwaga

Utworzenie indeksu HSNW z dużymi zestawami danych może spowodować wyczerpanie pamięci zasobu rdzenia wirtualnego usługi Azure Cosmos DB dla bazy danych MongoDB lub ograniczenie wydajności innych operacji uruchomionych w bazie danych. Jeśli wystąpią takie problemy, można je rozwiązać, skalując zasób do wyższej warstwy klastra lub zmniejszając rozmiar zestawu danych.

Tworzenie indeksu wektora przy użyciu funkcji IVF

Aby utworzyć indeks wektorowy przy użyciu algorytmu IVF (Odwrócony plik), użyj następującego createIndexes szablonu i ustaw "kind" parametr na "vector-ivf":

{
  "createIndexes": "<collection_name>",
  "indexes": [
    {
      "name": "<index_name>",
      "key": {
        "<path_to_property>": "cosmosSearch"
      },
      "cosmosSearchOptions": {
        "kind": "vector-ivf",
        "numLists": <integer_value>,
        "similarity": "<string_value>",
        "dimensions": <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. Jeśli jest używana ścieżka notacji kropkowej, wszystkie elementy inne niżle nie mogą być tablicami. Wektory muszą być number[] indeksowane i zwracane w wynikach wyszukiwania wektorowego.
kind string Typ indeksu wektorowego do utworzenia. Dostępne są vector-ivf opcje i vector-hnsw. Uwaga vector-ivf jest dostępna we wszystkich warstwach klastra i vector-hnsw jest dostępna w warstwach klastra M40 i nowszych.
numLists integer Ta liczba całkowita to liczba klastrów używanych przez indeks inverted file (IVF) do grupowania danych wektorowych. Zalecamy, aby numLists documentCount/1000 dla maksymalnie 1 miliona dokumentów i sqrt(documentCount) dla ponad 1 miliona dokumentów. numLists Użycie wartości 1 jest związane z wykonywaniem wyszukiwania siłowego, co ma ograniczoną wydajność.
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).
dimensions integer Liczba wymiarów podobieństwa wektorów. Maksymalna liczba obsługiwanych wymiarów to 2000.

Ważne

Prawidłowe ustawienie parametru numLists jest ważne w celu osiągnięcia dobrej dokładności i wydajności. Zalecamy, aby numLists documentCount/1000 dla maksymalnie 1 miliona dokumentów i sqrt(documentCount) dla ponad 1 miliona dokumentów.

Wraz ze wzrostem liczby elementów w bazie danych należy dostroić numLists , aby osiągnąć dobrą wydajność opóźnienia dla wyszukiwania wektorów.

Jeśli eksperymentujesz z nowym scenariuszem lub tworzysz mały pokaz, możesz zacząć od numLists ustawienia , aby 1 przeprowadzić wyszukiwanie siłowe we wszystkich wektorach. Powinno to zapewnić najdokładniejsze wyniki z wyszukiwania wektorowego, jednak należy pamiętać, że szybkość wyszukiwania i opóźnienie będą powolne. Po początkowej konfiguracji należy dostroić parametr, numLists korzystając z powyższych wskazówek.

Wyszukiwanie wektorów za pomocą funkcji IVF

Aby przeprowadzić wyszukiwanie wektorowe, użyj etapu $search potoku agregacji w zapytaniu bazy danych MongoDB. Aby użyć indeksu cosmosSearch , użyj nowego cosmosSearch operatora.

{
  {
  "$search": {
    "cosmosSearch": {
        "vector": <query_vector>,
        "path": "<path_to_property>",
        "k": <num_results_to_return>,
      },
      "returnStoredSource": True }},
  {
    "$project": { "<custom_name_for_similarity_score>": {
           "$meta": "searchScore" },
            "document" : "$$ROOT"
        }
  }
}

Aby pobrać wynik podobieństwa (searchScore) wraz z dokumentami znalezionymi przez wyszukiwanie wektorowe, użyj $project operatora , aby uwzględnić searchScore go i zmienić jego nazwę w wynikach <custom_name_for_similarity_score> . Następnie dokument jest również przewidywany jako obiekt zagnieżdżony. Należy pamiętać, że wynik podobieństwa jest obliczany przy użyciu metryki zdefiniowanej w indeksie wektorowym.

Ważne

Wektory muszą być number[] indeksowane. Użycie innego typu, takiego jak double[], uniemożliwia indeksowanie dokumentu. Nieindeksowane dokumenty nie zostaną zwrócone w wyniku wyszukiwania wektorowego.

Przykład użycia indeksu HNSW.

W poniższych przykładach pokazano, jak indeksować wektory, dodawać dokumenty, które mają właściwości wektora, wykonywać wyszukiwanie wektorów i pobierać konfigurację indeksu.

use test;

db.createCollection("exampleCollection");

db.runCommand({ 
    "createIndexes": "exampleCollection",
    "indexes": [
        {
            "name": "VectorSearchIndex",
            "key": {
                "contentVector": "cosmosSearch"
            },
            "cosmosSearchOptions": { 
                "kind": "vector-hnsw", 
                "m": 16, 
                "efConstruction": 64, 
                "similarity": "COS", 
                "dimensions": 3
            } 
        } 
    ] 
});

To polecenie tworzy indeks HNSW względem contentVector właściwości w dokumentach przechowywanych w określonej kolekcji . exampleCollection Właściwość cosmosSearchOptions określa parametry indeksu wektora HNSW. Jeśli dokument ma wektor przechowywany we właściwości zagnieżdżonej, możesz ustawić tę właściwość przy użyciu ścieżki notacji kropkowej. Możesz na przykład użyć text.contentVector wartości , jeśli contentVector jest podwłaściwością .text

Dodawanie wektorów do bazy danych

Aby dodać wektory do kolekcji bazy danych, najpierw musisz utworzyć osadzanie przy użyciu własnego modelu, osadzania usługi Azure OpenAI lub innego interfejsu API (takiego jak Przytulanie twarzy na platformie Azure). W tym przykładzie nowe dokumenty są dodawane za pomocą przykładowych osadzeń:

db.exampleCollection.insertMany([
  {name: "Eugenia Lopez", bio: "Eugenia is the CEO of AdvenureWorks.", vectorContent: [0.51, 0.12, 0.23]},
  {name: "Cameron Baker", bio: "Cameron Baker CFO of AdvenureWorks.", vectorContent: [0.55, 0.89, 0.44]},
  {name: "Jessie Irwin", bio: "Jessie Irwin is the former CEO of AdventureWorks and now the director of the Our Planet initiative.", vectorContent: [0.13, 0.92, 0.85]},
  {name: "Rory Nguyen", bio: "Rory Nguyen is the founder of AdventureWorks and the president of the Our Planet initiative.", vectorContent: [0.91, 0.76, 0.83]},
]);

Kontynuuj korzystanie z ostatniego przykładu, utwórz inny wektor , queryVector. Wyszukiwanie wektorowe mierzy odległość między queryVector i wektory w contentVector ścieżce dokumentów. Możesz ustawić liczbę wyników zwracanych przez wyszukiwanie, ustawiając parametr k, który jest ustawiony tutaj 2 . Można również ustawić efSearchwartość , która jest liczbą całkowitą, która kontroluje rozmiar listy wektorów kandydatów. Wyższa wartość może poprawić dokładność, jednak wyszukiwanie będzie wolniejsze w wyniku. Jest to opcjonalny parametr z wartością domyślną 40.

const queryVector = [0.52, 0.28, 0.12];
db.exampleCollection.aggregate([
  {
    "$search": {
        "cosmosSearch": {
            "vector": "queryVector",
            "path": "contentVector",
            "k": 2,
            "efSearch": 40
        },
    }
  }
}
]);

W tym przykładzie wyszukiwanie wektorów jest wykonywane przy użyciu queryVector jako danych wejściowych za pośrednictwem powłoki Mongo. Wynik wyszukiwania to lista dwóch elementów, które są najbardziej podobne do wektora zapytania posortowanego według ich wyników podobieństwa.

[
  {
    similarityScore: 0.9465376,
    document: {
      _id: ObjectId("645acb54413be5502badff94"),
      name: 'Eugenia Lopez',
      bio: 'Eugenia is the CEO of AdvenureWorks.',
      vectorContent: [ 0.51, 0.12, 0.23 ]
    }
  },
  {
    similarityScore: 0.9006955,
    document: {
      _id: ObjectId("645acb54413be5502badff97"),
      name: 'Rory Nguyen',
      bio: 'Rory Nguyen is the founder of AdventureWorks and the president of the Our Planet initiative.',
      vectorContent: [ 0.91, 0.76, 0.83 ]
    }
  }
]

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: { contentVector: 'cosmosSearch' },
    name: 'vectorSearchIndex',
    cosmosSearch: {
      kind: 'vector-hnsw',
      m: 40,
      efConstruction: 64,
      similarity: 'COS',
      dimensions: 3
    },
    ns: 'test.exampleCollection'
  }
]

Przykład użycia indeksu IVF

Indeksowanie odwróconego pliku (IVF) to metoda, która organizuje wektory w klastry. Podczas wyszukiwania wektorowego wektor jest najpierw porównywany z centrami tych klastrów. Wyszukiwanie jest następnie przeprowadzane w klastrze, którego środek znajduje się najbliżej wektora zapytania.

Parametr numLists określa liczbę klastrów do utworzenia. Pojedynczy klaster oznacza, że wyszukiwanie jest przeprowadzane względem wszystkich wektorów w bazie danych, podobnie jak wyszukiwanie siłowe lub kNN. To ustawienie zapewnia najwyższą dokładność, ale także największe opóźnienie.

numLists Zwiększenie wartości powoduje zwiększenie liczby klastrów, z których każda zawiera mniej wektorów. Na przykład jeśli numLists=2każdy klaster zawiera więcej wektorów niż jeśli numLists=3itd. Mniejsza liczba wektorów na klaster przyspiesza wyszukiwanie (mniejsze opóźnienie, większe zapytania na sekundę). Zwiększa to jednak prawdopodobieństwo braku najbardziej podobnego wektora w bazie danych do wektora zapytania. Jest to spowodowane niedoskonałym charakterem klastrowania, w którym wyszukiwanie może skupić się na jednym klastrze, podczas gdy rzeczywisty wektor "najbliższy" znajduje się w innym klastrze.

Parametr nProbes steruje liczbą klastrów do przeszukania. Domyślnie jest ona ustawiona na 1, co oznacza, że wyszukuje tylko klaster z centrum najbliżej wektora zapytania. Zwiększenie tej wartości umożliwia przeszukiwanie większej liczby klastrów, zwiększenie dokładności, ale także zwiększenie opóźnienia (w związku z tym zmniejszenie liczby zapytań na sekundę) w miarę przeszukiwania większej liczby klastrów i wektorów.

W poniższych przykładach pokazano, jak indeksować wektory, dodawać dokumenty, które mają właściwości wektora, wykonywać wyszukiwanie wektorów i pobierać konfigurację indeksu.

Tworzenie indeksu wektorowego

use test;

db.createCollection("exampleCollection");

db.runCommand({
  createIndexes: 'exampleCollection',
  indexes: [
    {
      name: 'vectorSearchIndex',
      key: {
        "vectorContent": "cosmosSearch"
      },
      cosmosSearchOptions: {
        kind: 'vector-ivf',
        numLists: 3,
        similarity: 'COS',
        dimensions: 3
      }
    }
  ]
});

To polecenie tworzy vector-ivf indeks względem vectorContent właściwości w dokumentach przechowywanych w określonej kolekcji . exampleCollection Właściwość cosmosSearchOptions określa parametry indeksu wektora IVF. Jeśli dokument ma wektor przechowywany we właściwości zagnieżdżonej, możesz ustawić tę właściwość przy użyciu ścieżki notacji kropkowej. Możesz na przykład użyć text.vectorContent wartości , jeśli vectorContent jest podwłaściwością .text

Dodawanie wektorów do bazy danych

Aby dodać wektory do kolekcji bazy danych, najpierw musisz utworzyć osadzanie przy użyciu własnego modelu, osadzania usługi Azure OpenAI lub innego interfejsu API (takiego jak Przytulanie twarzy na platformie Azure). W tym przykładzie nowe dokumenty są dodawane za pomocą przykładowych osadzeń:

db.exampleCollection.insertMany([
  {name: "Eugenia Lopez", bio: "Eugenia is the CEO of AdvenureWorks.", vectorContent: [0.51, 0.12, 0.23]},
  {name: "Cameron Baker", bio: "Cameron Baker CFO of AdvenureWorks.", vectorContent: [0.55, 0.89, 0.44]},
  {name: "Jessie Irwin", bio: "Jessie Irwin is the former CEO of AdventureWorks and now the director of the Our Planet initiative.", vectorContent: [0.13, 0.92, 0.85]},
  {name: "Rory Nguyen", bio: "Rory Nguyen is the founder of AdventureWorks and the president of the Our Planet initiative.", vectorContent: [0.91, 0.76, 0.83]},
]);

Wykonywanie wyszukiwania wektorowego

Aby przeprowadzić wyszukiwanie wektorowe, użyj etapu $search potoku agregacji w zapytaniu bazy danych MongoDB. Aby użyć indeksu cosmosSearch , użyj nowego cosmosSearch operatora.

{
  {
  "$search": {
    "cosmosSearch": {
        "vector": <vector_to_search>,
        "path": "<path_to_property>",
        "k": <num_results_to_return>,
      },
      "returnStoredSource": True }},
  {
    "$project": { "<custom_name_for_similarity_score>": {
           "$meta": "searchScore" },
            "document" : "$$ROOT"
        }
  }
}

Aby pobrać wynik podobieństwa (searchScore) wraz z dokumentami znalezionymi przez wyszukiwanie wektorowe, użyj $project operatora , aby uwzględnić searchScore go i zmienić jego nazwę w wynikach <custom_name_for_similarity_score> . Następnie dokument jest również przewidywany jako obiekt zagnieżdżony. Należy pamiętać, że wynik podobieństwa jest obliczany przy użyciu metryki zdefiniowanej w indeksie wektorowym.

Kontynuuj korzystanie z ostatniego przykładu, utwórz inny wektor , queryVector. Wyszukiwanie wektorowe mierzy odległość między queryVector i wektory w vectorContent ścieżce dokumentów. Możesz ustawić liczbę wyników zwracanych przez wyszukiwanie, ustawiając parametr k, który jest ustawiony tutaj 2 . Można również ustawić nProbeswartość , która jest liczbą całkowitą kontrolującą liczbę pobliskich klastrów, które są sprawdzane w każdym wyszukiwaniu. Wyższa wartość może poprawić dokładność, jednak wyszukiwanie będzie wolniejsze w wyniku. Jest to opcjonalny parametr o wartości domyślnej 1 i nie może być większy niż numLists wartość określona w indeksie wektorowym.

const queryVector = [0.52, 0.28, 0.12];
db.exampleCollection.aggregate([
  {
    $search: {
      "cosmosSearch": {
        "vector": queryVector,
        "path": "vectorContent",
        "k": 2
      },
    "returnStoredSource": true }},
  {
    "$project": { "similarityScore": {
           "$meta": "searchScore" },
            "document" : "$$ROOT"
        }
  }
]);

W tym przykładzie wyszukiwanie wektorów jest wykonywane przy użyciu queryVector jako danych wejściowych za pośrednictwem powłoki Mongo. Wynik wyszukiwania to lista dwóch elementów, które są najbardziej podobne do wektora zapytania posortowanego według ich wyników podobieństwa.

[
  {
    similarityScore: 0.9465376,
    document: {
      _id: ObjectId("645acb54413be5502badff94"),
      name: 'Eugenia Lopez',
      bio: 'Eugenia is the CEO of AdvenureWorks.',
      vectorContent: [ 0.51, 0.12, 0.23 ]
    }
  },
  {
    similarityScore: 0.9006955,
    document: {
      _id: ObjectId("645acb54413be5502badff97"),
      name: 'Rory Nguyen',
      bio: 'Rory Nguyen is the founder of AdventureWorks and the president of the Our Planet initiative.',
      vectorContent: [ 0.91, 0.76, 0.83 ]
    }
  }
]

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: 'vector-ivf',
      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 (rdzenia wirtualnego), aby zorganizować buforowanie semantyczne przy użyciu wcześniej wycofanych 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 (GA) i HSNW (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