Wektory indeksowania i zapytań w usłudze Azure Cosmos DB for NoSQL w języku Python.
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:
- Rejestrowanie w celu uzyskania wersji zapoznawczej wyszukiwania wektorowego w usłudze Azure Cosmos DB for NoSQL
- Konfigurowanie kontenera usługi Azure Cosmos DB na potrzeby wyszukiwania wektorów
- Zasady osadzania wektorów tworzenia
- Dodawanie indeksów wektorów do zasad indeksowania kontenerów
- Tworzenie kontenera z indeksami wektorów i zasad osadzania wektorów
- Wykonywanie wyszukiwania wektorowego na przechowywanych danych.
- 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 SDK języka Python usługi Azure Cosmos DB.
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ć:
Przejdź do strony zasobów usługi Azure Cosmos DB for NoSQL.
Wybierz okienko "Funkcje" w elemencie menu "Ustawienia".
Wybierz pozycję "Wyszukiwanie wektorowe w usłudze Azure Cosmos DB for NoSQL".
Przeczytaj opis funkcji, aby potwierdzić, że chcesz zarejestrować się w wersji zapoznawczej.
Wybierz pozycję "Włącz", aby zarejestrować się w wersji zapoznawczej.
Uwaga
Żądanie rejestracji zostanie automatycznie zatwierdzone, ale może upłynąć kilka minut.
Opis kroków związanych z wyszukiwaniem wektorowym
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. Zdefiniujemy również dwie właściwości zawierające 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.
- Twórz i przechowuj wektorowe osadzania dla pól, na których chcesz przeprowadzić wyszukiwanie wektorów.
- Określ ścieżki osadzania wektorów w zasadach osadzania wektorów.
- 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. Informuje to 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ć jak przykładowy kod JSON:
vector_embedding_policy = {
"vectorEmbeddings": [
{
"path": "/coverImageVector",
"dataType": "float32",
"distanceFunction": "dotproduct",
"dimensions": 8
},
{
"path": "/contentVector",
"dataType": "float32",
"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. W tym przykładzie zasady indeksowania będą wyglądać mniej więcej tak:
indexing_policy = {
"includedPaths": [
{
"path": "/*"
}
],
"excludedPaths": [
{
"path": "/\"_etag\"/?",
"path": "/coverImageVector/*",
"path": "/contentVector/*"
}
],
"vectorIndexes": [
{"path": "/coverImageVector",
"type": "quantizedFlat"
},
{"path": "/contentVector",
"type": "quantizedFlat"
}
]
}
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.
Tworzenie kontenera za pomocą zasad wektorów
Obecnie funkcja wyszukiwania wektorowego dla usługi Azure Cosmos DB for NoSQL jest obsługiwana tylko w nowych kontenerach, dlatego należy zastosować zasady wektorów w czasie tworzenia kontenera i nie można jej później modyfikować.
try:
container = db.create_container_if_not_exists(
id=CONTAINER_NAME,
partition_key=PartitionKey(path='/id'),
indexing_policy=indexing_policy,
vector_embedding_policy=vector_embedding_policy)
print('Container with id \'{0}\' created'.format(id))
except exceptions.CosmosHttpResponseError:
raise
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 w języku Python:
query_embedding = [1,2,3,4,5,6,7,8,9,10]
# Query for items
for item in container.query_items(
query='SELECT c.title, VectorDistance(c.contentVector,@embedding) AS SimilarityScore FROM c ORDER BY VectorDistance(c.contentVector,@embedding)',
parameters=[
{"name": "@embedding", "value": query_embedding}
],
enable_cross_partition_query=True):
print(json.dumps(item, indent=True))