Witamy w usłudze wyszukiwania podobieństwa wektorowego Firebase Data Connect – implementacji wyszukiwania semantycznego w Firebase, która jest zintegrowana z Google Vertex AI.
Podstawą tej funkcji są wektory dystrybucyjne, czyli tablice liczb zmiennoprzecinkowych reprezentujące znaczenie semantyczne tekstu lub multimediów. Przeprowadzając wyszukiwanie najbliższych sąsiadów za pomocą wektora dystrybucyjnego, możesz znaleźć wszystkie treści podobne pod względem semantycznym. Data Connect korzysta z rozszerzenia PostgreSQLpgvector.
To zaawansowane wyszukiwanie semantyczne może być przydatne w przypadku systemów rekomendacji i wyszukiwarek. Jest to też kluczowy komponent generowania z wyszukiwaniem w przepływach generatywnej AI. Więcej informacji znajdziesz w dokumentacji Vertex AI. Dowiedz się więcej
Możesz korzystać z wbudowanej obsługi Data Connect, aby automatycznie generować wektory dystrybucyjne za pomocą interfejsu Embeddings API w Vertex AI, lub używać tego interfejsu API do ręcznego generowania wektorów.
Wymagania wstępne
Skonfiguruj Data Connect w projekcie.
Włącz interfejsy Vertex AI API.
Konfiguracja
Możesz wybrać lokalny proces tworzenia (jeśli jesteś deweloperem stron internetowych, aplikacji na Androida w języku Kotlin lub aplikacji na iOS) lub proces IDX (dla deweloperów stron internetowych). Do celów programistycznych możesz używać lokalnej bazy danych lub projektu produkcyjnego Data Connect i jego instancji Cloud SQL for PostgreSQL.
W tych instrukcjach przyjęto założenie, że Data Connectprojektzostał utworzony zgodnie z krótkim przewodnikiem.
Integracja z lokalną bazą danych PostgreSQL
- Skonfiguruj lokalną instancję PostgreSQL.
- Przyznaj sobie rolę uprawnień użytkownika Vertex AI.
- Skonfiguruj w swoim środowisku domyślne uwierzytelnianie aplikacji Google Cloud.
- Zainstaluj
pgvectorrozszerzenie w lokalnej instancji PostgreSQL. - Włącz rozszerzenie, korzystając z
CREATE EXTENSION vectorzgodnie zpgvectorinstrukcjami w repozytorium.
Integracja z IDX
- Skonfiguruj obszar roboczy IDX za pomocą szablonu Data Connect.
- Przyznaj sobie rolę uprawnień użytkownika Vertex AI.
- Włącz rozszerzenie, korzystając z
CREATE EXTENSION vectorzgodnie zpgvectorinstrukcjami w repozytorium.
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
Data Connect zapewnia zintegrowaną obsługę wektorów dystrybucyjnych z wartością serwera _embed. Powoduje to, że Data Connect generuje wektory dystrybucyjne, wewnętrznie wywołując interfejsy Embedding API w Vertex AI. Wartość _embed
serwera może być używana zarówno w mutacjach, jak i w zapytaniach.
Mutacje
Generowanie i przechowywanie wektora dystrybucyjnego za pomocą Data Connect
W aplikacji do wyszukiwania wektorowego prawdopodobnie zechcesz poprosić o wygenerowanie osadzeń od razu po dodaniu rekordów do bazy danych. Oto createMovie
mutacja, która dodaje rekord filmu do tabeli Movie, a także przekazuje opis filmu
z określonym osadzeniem model.
mutation createMovie($title: String!, $description: String!) {
movie_insert(data: {
title: $title,
description: $description,
descriptionEmbedding_embed: {model: "textembedding-gecko@003", text: $description}
})
}
W niektórych przypadkach możesz chcieć zaktualizować opis filmu i osadzanie.
mutation updateDescription($id: String!, $description: String!) {
movie_update(id: $id, data: {
description: $description,
descriptionEmbedding_embed: {model: "textembedding-gecko@003", text: $description}
})
}
Aby wywołać tę drugą mutację z poziomu klienta:
import { updateMovieDescription } from 'lib/dataconnect-sdk/';
await updateMovieDescription({ id: movieId, description: description});
// Use the response
Zapytania
Pobierz wektory dystrybucyjne za pomocą zapytania podobnego do tego poniżej. Pamiętaj, że wartość
descriptionEmbedding zwrócona przez zapytanie to tablica liczb zmiennoprzecinkowych, która zwykle nie jest czytelna dla człowieka. Dlatego Data Connect wygenerowane pakiety SDK nie obsługują
bezpośredniego zwracania tego parametru.
Zwrócone wektory dystrybucyjne możesz wykorzystać do wyszukiwania podobieństw, jak opisano w następnej sekcji.
query getMovieDescription($id: String!) @auth(level: PUBLIC) {
movie(id: $id)
id
description
descriptionEmbedding
}
Wyszukiwanie podobieństw
Teraz możemy przeprowadzić wyszukiwanie podobieństwa.
W przypadku każdego pola Vector funkcja Data Connect generuje funkcję GraphQL, która implementuje wyszukiwanie podobieństw. Nazwa tej wygenerowanej funkcji to ${pluralType}_${vectorFieldName}_similarity. Obsługuje kilka parametrów, co widać w przykładach poniżej i na liście referencyjnej.
Możesz zdefiniować funkcję GraphQL, która wywołuje wyszukiwanie podobieństw. Jak wspomnieliśmy powyżej, wartość serwera _embed kieruje Data Connect do generowania wektorów dystrybucyjnych za pomocą interfejsów API do tworzenia wektorów dystrybucyjnych Vertex AI. W tym przypadku służy do tworzenia wektorów dystrybucyjnych dla ciągu wyszukiwania używanego do porównywania z wektorami dystrybucyjnymi opisu filmu.
W tym przykładzie wyszukiwanie podobieństw zwróci maksymalnie 5 filmów, których opis jest semantycznie najbliższy zapytaniu wejściowemu. Zestaw wyników jest posortowany w kolejności rosnącej według odległości – od najbliższej do najdalszej.
query searchMovieDescriptionUsingL2Similarity ($query: String!) @auth(level: PUBLIC) {
movies_descriptionEmbedding_similarity(
compare_embed: {model: "textembedding-gecko@003", text: $query},
where: {content: {ne: "No info available for this movie."}}, limit: 5)
{
id
title
description
}
}
Dostosowywanie 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 zbyt różne wyniki lub brakuje w nich tych, które chcesz uwzględnić, spróbuj dostosować te parametry.
Aby znaleźć odpowiednią wartość dla 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ść within:
query searchMovieDescriptionUsingL2Similarity ($query: String!) @auth(level: PUBLIC) {
movies_descriptionEmbedding_similarity(
compare_embed: {model: "textembedding-gecko@003", 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: "textembedding-gecko@003", 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 masz ustawioną wartość within, po zmianie method musisz ją ponownie dostosować.
Wywołaj zapytanie o podobieństwo
Aby wywołać wyszukiwanie podobieństw z kodu klienta:
import { searchMovieDescriptionUsingL2similarity} from 'lib/dataconnect-sdk';
const response = await searchMovieDescriptionUsingL2similarity({ query });
// Use the response
Używanie niestandardowych wektorów dystrybucyjnych
Data Connect umożliwia też bezpośrednią pracę z wektorami osadzania jako Vectors, a nie generowanie ich za pomocą wartości serwera _embed.
Przechowywanie niestandardowego osadzania
Za pomocą interfejsu Vertex Embeddings API określ model dopasowywania 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 update
w celu zapisania.
mutation updateDescription($id: String!, $description: String!, $descriptionEmbedding: Vector!) {
movie_update(id: $id, data: {
// title, genre...
description: $description,
descriptionEmbedding: $descriptionEmbedding
})
}
Przeprowadzanie wyszukiwania podobieństw za pomocą niestandardowych wektorów dystrybucyjnych
Wykonaj tę samą operację, aby pobrać wektory dystrybucyjne dla wyszukiwanych haseł i obsady, a następnie przekształć 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
Wdróż schemat i oprogramowanie sprzęgające
Ostatnim krokiem typowej Data Connect iteracji 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 wiersza poleceń Firebase wykonuje niezbędne czynności, aby włączyć generowanie wektorów dystrybucyjnych oparte na Vertex AI w instancji Cloud SQL.
firebase deploy --only dataconnectJeśli chcesz ręcznie włączyć obsługę osadzania w instancji Cloud SQL lub napotkasz błąd interfejsu CLI, postępuj zgodnie z tymi instrukcjami.
Składnia wyszukiwania wektorowego
Rozszerzenia schematu
Typ danych Data Connect's Vector jest mapowany na typ vector PostgreSQL zgodnie z definicją pgvector rozszerzenia. Typ vector pgvector jest przechowywany jako tablica liczb zmiennoprzecinkowych pojedynczej precyzji w PostgreSQL.
W Data Connect typ Vector jest reprezentowany jako tablica liczb JSON. Dane wejściowe są przekształcane w tablicę wartości float32. Jeśli konwersja się nie powiedzie, pojawi się błąd.
Użyj parametru rozmiaru dyrektywy @col, aby ustawić wymiary wektora.
type Question @table {
text: String!
category: String!
textEmbedding: Vector! @col(size: 768)
}
size jest obsługiwany tylko w przypadku typów Vector. Vector, takie jak wyszukiwanie podobieństw, wymagają, aby wszystkie Vector 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
_embed wartość serwera w przypadku zapytań i mutacji;
_embed
Ta wartość serwera nakazuje usłudze Data Connect generowanie i przechowywanie wektorów za pomocą interfejsów API do tworzenia wektorów Vertex AI. Ta wartość serwera może być używana zarówno w zapytaniach, jak i w mutacjach.
Parametry wyszukiwania podobieństw
method: COSINE|INNER_PRODUCT|L2
Funkcja odległości używana do wyszukiwania najbliższych sąsiadów. Obecnie obsługiwane algorytmy stanowią 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.