Witamy w wyszukiwaniu podobieństwa wektorów w Firebase SQL Connect's – implementacji wyszukiwania semantycznego w Firebase's , która integruje się z Google Vertex AI.
Podstawą tej funkcji są wektory dystrybucyjne, czyli tablice liczb zmiennoprzecinkowych reprezentujące znaczenie semantyczne tekstu lub multimediów. Uruchamiając wyszukiwanie najbliższych sąsiadów za pomocą wejściowego wektora dystrybucyjnego, możesz znaleźć wszystkie treści podobne semantycznie. SQL Connect używa do tego rozszerzenia
pgvector PostgreSQL.
To zaawansowane wyszukiwanie semantyczne może być przydatne w takich przypadkach jak systemy rekomendacji i wyszukiwarki. Jest też kluczowym elementem generowania z wykorzystaniem pobierania w przepływach generatywnej AI. Więcej informacji znajdziesz w dokumentacji Vertex AI. Dowiedz się więcej.
Możesz korzystać z wbudowanej obsługi generowania wektorów dystrybucyjnych w SQL Connect's za pomocą interfejsu Vertex AI Embeddings API, lub używać tego interfejsu do ręcznego generowania wektorów.
Wymagania wstępne
Skonfiguruj SQL Connect na potrzeby projektu.
Włącz interfejsy Vertex AI API.
Konfiguracja
Możesz wybrać lokalny przepływ programowania (jeśli jesteś programistą aplikacji internetowych, Kotlin Android lub iOS) albo przepływ IDX (dla programistów aplikacji internetowych). Do programowania możesz używać lokalnej bazy danych lub projektu SQL Connect w środowisku produkcyjnym oraz jego Cloud SQL instancji for PostgreSQL.
W tych instrukcjach przyjęto założenie, że projekt SQL Connect został utworzony zgodnie z przewodnikiem Szybki start.
Integracja z lokalną bazą danych PostgreSQL
Skonfiguruj lokalną instancję PostgreSQL.
Przyznaj sobie rolę IAM Użytkownik Vertex AI.
W swoim środowisku skonfiguruj Google Cloud domyślne uwierzytelnianie aplikacji.
W lokalnej instancji PostgreSQL zainstaluj rozszerzenie
pgvector.Włącz rozszerzenie za pomocą polecenia
CREATE EXTENSION vectorzgodnie z instrukcjami w repozytoriumpgvector.
Integracja z IDX
Skonfiguruj obszar roboczy IDX za pomocą szablonu SQL Connect.
Przyznaj sobie rolę IAM Użytkownik Vertex AI.
Włącz rozszerzenie za pomocą polecenia
CREATE EXTENSION vectorzgodnie z instrukcjami w repozytoriumpgvector.
Projektowanie schematu
Aby przeprowadzić wyszukiwanie wektorowe, dodaj do schematu nowe pole typu Vector. Jeśli na przykład chcesz przeprowadzić wyszukiwanie semantyczne za pomocą opisów filmów, dodaj pole do przechowywania wektorów dystrybucyjnych powiązanych z opisem filmu. W
tym schemacie dodano descriptionEmbedding do przechowywania wektorów dystrybucyjnych dla
pola description.
type Movie @table {
id: ID! @col(name: "movie_id") @default(id: ID! @col(name: "movie_id") @default(expr: "uuidV4()")
title: String!
description: String
descriptionEmbedding: Vector! @col(size:768)
// ...
}
Generowanie i pobieranie wektorów dystrybucyjnych
SQL Connect zapewnia zintegrowaną obsługę wektorów dystrybucyjnych za pomocą
wartości serwera _embed. Powoduje to, że SQL Connect generuje
wektory dystrybucyjne, wewnętrznie wywołując interfejsy Vertex AI Embedding API. Wartości serwera _embed można używać zarówno w mutacjach, jak i zapytaniach.
Mutacje
Generowanie i przechowywanie wektora dystrybucyjnego za pomocą SQL Connect
W aplikacji do wyszukiwania wektorowego prawdopodobnie będziesz chcieć, aby wektory dystrybucyjne były generowane od razu po dodaniu rekordów do bazy danych. Ta createMovie
mutacja dodaje rekord filmu do tabeli Movie i przekazuje opis filmu z określonym wektorem dystrybucyjnym model.
mutation createMovie($title: String!, $description: String!) {
movie_insert(data: {
title: $title,
description: $description,
descriptionEmbedding_embed: {model: "text-embedding-005", text: $description}
})
}
W niektórych przypadkach możesz chcieć zaktualizować opis filmu i wektor dystrybucyjny.
mutation updateDescription($id: String!, $description: String!) {
movie_update(id: $id, data: {
description: $description,
descriptionEmbedding_embed: {model: "text-embedding-005", text: $description}
})
}
Aby wywołać tę mutację z klienta:
import { updateMovieDescription } from 'lib/dataconnect-sdk/';
await updateMovieDescription({ id: movieId, description: description});
// Use the response
Zapytania
Pobierz wektory dystrybucyjne za pomocą zapytania takiego jak to. Pamiętaj, że descriptionEmbedding zwracany przez zapytanie to tablica liczb zmiennoprzecinkowych, która zwykle nie jest czytelna dla człowieka. Dlatego wygenerowane przez SQL Connect pakiety SDK nie
obsługują bezpośredniego zwracania tej tablicy.
Możesz używać zwróconych wektorów dystrybucyjnych do wyszukiwania podobieństwa, jak opisano w następnej sekcji.
query getMovieDescription($id: String!) @auth(level: PUBLIC) {
movie(id: $id)
id
description
descriptionEmbedding
}
Wyszukiwanie podobieństwa
Teraz możemy przeprowadzić wyszukiwanie podobieństwa.
W przypadku każdego pola Vector, SQL Connect generuje funkcję GraphQL
, która implementuje wyszukiwanie podobieństwa. Nazwa tej wygenerowanej funkcji to ${pluralType}_${vectorFieldName}_similarity. Obsługuje ona kilka parametrów
jak pokazano w przykładach poniżej i na liście referencyjnej.
Możesz zdefiniować funkcję GraphQL, która wywołuje wyszukiwanie podobieństwa. Jak
wspomnieliśmy powyżej, wartość serwera _embed powoduje, że SQL Connect generuje wektory dystrybucyjne za pomocą interfejsów Vertex AI Embedding API. W tym przypadku
służy do tworzenia wektorów dystrybucyjnych dla ciągu wyszukiwania używanego do porównywania z wektorami dystrybucyjnymi opisów filmów.
W tym przykładzie wyszukiwanie podobieństwa zwróci maksymalnie 5 filmów, których opis jest semantycznie najbliższy zapytaniu wejściowemu. Zestaw wyników jest sortowany w kolejności rosnącej odległości – od najbliższego do najdalszego.
query searchMovieDescriptionUsingL2Similarity ($query: String!) @auth(level: PUBLIC) {
movies_descriptionEmbedding_similarity(
compare_embed: {model: "text-embedding-005", text: $query},
where: {content: {ne: "No info available for this movie."}}, limit: 5)
{
id
title
description
}
}
Dostrajanie zapytania o podobieństwo
Wartości domyślne parametrów wyszukiwania, takich jak method i within, sprawdzają się w większości przypadków użycia. Jeśli jednak zauważysz, że zapytanie zwraca wyniki, które są zbyt odmienne, lub brakuje w nim wyników, które chcesz uwzględnić, spróbuj dostroić te parametry.
Aby znaleźć odpowiednią wartość parametru within, możemy dodać _metadata.distance do wybranych pól, aby sprawdzić, jak daleko od wektora zapytania znajduje się każdy wynik. Na podstawie zwróconych wartości distance możemy ustawić parametr within. Uwzględnione zostaną tylko wyniki, których odległość jest mniejsza niż wartość parametru within:
query searchMovieDescriptionUsingL2Similarity ($query: String!) @auth(level: PUBLIC) {
movies_descriptionEmbedding_similarity(
compare_embed: {model: "text-embedding-005", text: $query},
within: 2,
where: {content: {ne: "No info available for this movie."}}, limit: 5)
{
id
title
description
_metadata {
distance
}
}
}
Możesz też eksperymentować z różnymi funkcjami odległości, ustawiając parametr method.
query searchMovieDescriptionUsingL2Similarity ($query: String!) @auth(level: PUBLIC) {
movies_descriptionEmbedding_similarity(
compare_embed: {model: "text-embedding-005", text: $query},
within: .5,
method: COSINE,
where: {content: {ne: "No info available for this movie."}}, limit: 5)
{
id
title
description
_metadata {
distance
}
}
}
Pamiętaj, że różne metody zwracają bardzo różne wartości odległości. Jeśli ustawisz parametr within, po zmianie parametru method musisz ponownie dostroić tę wartość.
Wywoływanie zapytania o podobieństwo
Aby wywołać wyszukiwanie podobieństwa z kodu klienta:
import { searchMovieDescriptionUsingL2similarity} from 'lib/dataconnect-sdk';
const response = await searchMovieDescriptionUsingL2similarity({ query });
// Use the response
Używanie niestandardowych wektorów dystrybucyjnych
SQL Connect umożliwia też bezpośrednią pracę z wektorami dystrybucyjnymi jako Vectors
zamiast używać wartości serwera _embed do ich generowania.
Przechowywanie niestandardowego wektora dystrybucyjnego
Za pomocą interfejsu Vertex Embeddings API określ pasujący model i poproś o wyniki wektorów dystrybucyjnych o odpowiednim wymiarze.
Następnie przekształć zwróconą tablicę liczb zmiennoprzecinkowych w Vector, aby przekazać ją do operacji aktualizacji w celu przechowywania.
mutation updateDescription($id: String!, $description: String!, $descriptionEmbedding: Vector!) {
movie_update(id: $id, data: {
// title, genre...
description: $description,
descriptionEmbedding: $descriptionEmbedding
})
}
Wyszukiwanie podobieństwa za pomocą niestandardowych wektorów dystrybucyjnych
Wykonaj tę samą operację, aby pobrać wektory dystrybucyjne dla wyszukiwanych haseł i przekształcić je w Vectors.
Następnie wywołaj zapytanie _similarity, aby przeprowadzić każde wyszukiwanie.
query searchMovieDescriptionUsingL2Similarity($compare: Vector!, $within: Float, $excludesContent: String, $limit: Int) @auth(level: PUBLIC) {
movies_descriptionEmbedding_similarity(
compare: $compare,
method: L2,
within: $within,
where: {content: {ne: $excludesContent}}, limit: $limit)
{
id
title
description
}
}
Wdrażanie w środowisku produkcyjnym
Wdrażanie schematu i oprogramowania sprzęgającego
Ostatnim krokiem w typowej iteracji SQL Connect jest wdrożenie zasobów w środowisku produkcyjnym.
Podczas wdrażania schematu zawierającego typy Vector w Cloud SQL
za pomocą polecenia
firebase deploy interfejs Firebase CLI wykonuje niezbędne czynności, aby
włączyć generowanie wektorów dystrybucyjnych w oparciu o Vertex AI w instancji Cloud SQL.
firebase deploy --only dataconnectJeśli chcesz ręcznie włączyć obsługę wektorów dystrybucyjnych w instancji Cloud SQL Cloud SQL lub napotkasz błąd interfejsu CLI, postępuj zgodnie z tymi instrukcjami.
Składnia wyszukiwania wektorowego
Rozszerzenia schematu
Typ danych Vector SQL Connect jest mapowany na typ vector PostgreSQL
zdefiniowany przez rozszerzenie pgvector.
Typ vector pgvector jest przechowywany w PostgreSQL jako tablica liczb zmiennoprzecinkowych pojedynczej precyzji.
W SQL Connect, typ Vector jest reprezentowany jako tablica liczb JSON. Dane wejściowe są przekształcane w tablicę wartości float32. Jeśli przekształcenie się nie powiedzie, zostanie zgłoszony błąd.
Aby ustawić wymiary wektora, użyj parametru size dyrektywy @col.
type Question @table {
text: String!
category: String!
textEmbedding: Vector! @col(size: 768)
}
Parametr size jest obsługiwany tylko w przypadku typów Vector. Operacje Vector, takie jak wyszukiwanie podobieństwa, wymagają, aby wszystkie Vectors miały tę samą liczbę wymiarów.
directive @col(
# … existing args
"""
Defines a fixed column size for certain scalar types.
- For Vector, size is required.
- For all other types, size is currently unsupported and hence supplying it will result in a schema error.
"""
size: Int
) on FIELD_DEFINITION
Wartość serwera _embed w przypadku zapytań i mutacji
_embed
Ta wartość serwera powoduje, że usługa SQL Connect generuje i przechowuje wektory dystrybucyjne za pomocą interfejsów Vertex AI Embedding API. Tej wartości serwera można używać zarówno w zapytaniach, jak i mutacjach.
Parametry wyszukiwania podobieństwa
method: COSINE|INNER_PRODUCT|L2
Funkcja odległości używana do wyszukiwania najbliższych sąsiadów. Obecnie obsługiwane algorytmy to podzbiór algorytmów wyszukiwania pgvector.
within: float
Ograniczenie odległości, w której przeprowadzane jest wyszukiwanie najbliższych sąsiadów.
where: FDC filter condition
Zapoznaj się z przewodnikiem po schematach, zapytaniach i mutacjach.
limit: int
Liczba wyników do zwrócenia.