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]},
]);
Wykonywanie wyszukiwania wektorowego
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ć efSearch
wartość , 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 numList
s 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=2
każdy klaster zawiera więcej wektorów niż jeśli numLists=3
itd. 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.
Wektory zapytań i odległości wektorów (czyli wyniki podobieństwa) przy użyciu $search"
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ć nProbes
wartość , 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
$nin
i .$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 m
wartości , efConstruction
lub efSearch
w przypadku korzystania z systemu HNSW lub numLists
lub 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.
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.
Powiązana zawartość
- .NET RAG Pattern retail reference solution (Rozwiązanie do dokumentacji handlu detalicznego dla wzorca RAG platformy .NET)
- Samouczek platformy .NET — czatbot przepis
- Wzorzec RAG języka C# — integrowanie usług Open AI Services z usługą Cosmos
- Wzorzec RAG języka Python — czatbot produktu platformy Azure
- Samouczek dotyczący notesu języka Python — integracja bazy danych wektorów za pośrednictwem usługi LangChain
- Samouczek dotyczący notesu w języku Python — integracja buforowania LLM za pośrednictwem usługi LangChain
- Python — integracja z llamaIndex
- Python — integracja pamięci jądra semantycznego