Witamy w wyszukiwaniu wektorowym Firebase Data Connect – implementacji wyszukiwania semantycznego w Firebase, która integruje się z Google Vertex AI.
Podstawą tej funkcji są wektory dystrybucyjne wektorowe, czyli tablice liczb zmiennoprzecinkowych reprezentujących semantyczne znaczenie tekstu lub multimediów. Przeprowadzając wyszukiwanie najbliższych sąsiadów za pomocą wektora dystrybucyjnego wektora wejściowego, możesz znaleźć wszystkie treści podobne semantycznie. Data Connect używa do tego celu rozszerzenia pgvector
w PostgreSQL.
Ta zaawansowana wyszukiwarka semantyczna może być wykorzystywana w przypadkach takich jak systemy rekomendacji i wyszukiwarki. Jest to też kluczowy element generowania wspomaganego przez wyszukiwanie w ramach procesów generatywnej AI. Więcej informacji znajdziesz w dokumentacji Vertex AI.
Możesz polegać na wbudowanym w Data Connect mechanizmie automatycznego generowania wektorów dystrybucyjnych za pomocą interfejsu Embeddings API Vertex AI lub użyć tego interfejsu do ich ręcznego generowania.
Wymagania wstępne
Skonfiguruj Data Connect w przypadku swojego projektu.
Włącz interfejsy Vertex AI API.
Konfiguracja
Możesz wybrać lokalny proces tworzenia aplikacji (jeśli jesteś deweloperem witryn internetowych, Kotlina, Androida lub iOS) albo proces IDX (dla deweloperów witryn internetowych). Do celów programistycznych możesz użyć lokalnej bazy danych lub produkcyjnego projektu Data Connect i jego instancji Cloud SQL for PostgreSQL.
W tych instrukcjach przyjęto założenie, że masz utworzony projekt Data Connectzgodnie z instrukcjami z krótkiego przewodnika.
Integracja z lokalną bazą danych PostgreSQL
- skonfigurować lokalną instancję PostgreSQL;
- Przypisz sobie rolę użytkownika Vertex AI.
- Skonfiguruj domyślne uwierzytelnianie aplikacji Google Cloud w swoim środowisku.
- Zainstaluj rozszerzenie
pgvector
w lokalnej instancji PostgreSQL. - Włącz rozszerzenie za pomocą polecenia
CREATE EXTENSION vector
zgodnie z instrukcjami dotyczącymi repozytoriumpgvector
.
Integracja z IDX
- Skonfiguruj obszar roboczy IDX za pomocą szablonu Data Connect.
- Przypisz sobie rolę użytkownika Vertex AI.
- Włącz rozszerzenie za pomocą
CREATE EXTENSION vector
zgodnie z instrukcjami w repozytoriumpgvector
.
Projektowanie schematu
Aby przeprowadzić wyszukiwanie wektorów, dodaj w schemacie nowe pole typu Vector
. Jeśli na przykład chcesz przeprowadzić wyszukiwanie semantyczne za pomocą opisów filmów, dodaj pole, w którym będą przechowywane wektory dystrybucyjne powiązane z opisem filmu. W tym schemacie obiekt descriptionEmbedding
jest dodawany do przechowywania wektorów dystrybucyjnych w polu 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 wektorów z wartością serwera _embed
. W ten sposób usługa Data Connect generuje wektory dystrybucyjne, wywołując wewnętrznie interfejsy osadzania Vertex AI. Wartość serwera _embed
może być używana zarówno w mutacjach, jak i zapytaniach.
Mutacje
Generowanie i przechowywanie kodu osadzania za pomocą Data Connect
W aplikacji do wyszukiwania wektorów prawdopodobnie będziesz chciał(-a) poprosić o wygenerowanie wektorów w chwili dodania rekordów do bazy danych. Oto mutacja createMovie
, która dodaje rekord filmu do tabeli Movie
, a także przekazuje opis filmu z określonym elementem osadzania model
.
mutation createMovie($movieData: Movie_Data! @pick(fields: ["title", "genre", "description"])) {
movie_insert(data: {
...movieData,
descriptionEmbedding_embed: {model: "textembedding-gecko@003", text: $movieData.description}
})
}
W niektórych przypadkach warto zaktualizować opis filmu i opcję osadzenia.
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ę mutację z poziomu klienta:
import { updateMovieDescriptionWithEmbed } from 'lib/dataconnect-sdk/';
await updateMovieDescriptionWithEmbed({ id: movieId, description: description});
// Use the response
Zapytania
Pobierz wektory dystrybucyjne wektorów przy użyciu zapytania podobnego do poniższego. Pamiętaj, że zmienna descriptionEmbedding
zwracana przez zapytanie to tablica typu float, która zazwyczaj nie jest czytelna dla człowieka. W związku z tym pakiety SDK wygenerowane przez Data Connect nie zwracają ich bezpośrednio.
Zwrócone wektory dystrybucyjne możesz wykorzystać do wyszukiwania podobieństw, jak opisano w następnej sekcji.
query getMovieDescription($id: String!) @auth(is: PUBLIC) {
movie(id: $id)
id
description
descriptionEmbedding
}
Przeprowadzanie wyszukiwania podobieństwa
Możemy teraz przeprowadzać wyszukiwanie podobieństw.
W przypadku każdego pola Vector
funkcja Data Connect generuje funkcję GraphQL, która implementuje wyszukiwanie podobieństw. Ta wygenerowana funkcja nazywa się ${pluralType}_${vectorFieldName}_similarity
. Obsługuje on kilka parametrów, jak pokazano w następujących przykładach i w liście referencyjnej.
Możesz zdefiniować funkcję GraphQL, która będzie wywoływać wyszukiwanie podobieństw. Jak wspomnieliśmy powyżej, wartość serwera _embed
kieruje Data Connect do generowania wektorów dystrybucyjnych za pomocą interfejsów API Vertex AI, w tym przypadku do tworzenia wektorów dystrybucyjnych dla ciągu wyszukiwania używanego do porównania z wektorami dystrybucyjnymi opisu filmu.
W tym przykładzie wyszukiwanie podobieństw zwróci do 5 filmów, których opis jest semantycznie najbardziej zbliżony do zapytania wejściowego. Zestaw wyników jest sortowany w rosnącej kolejności 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},
method: L2,
within: 2,
where: {content: {ne: "No info available for this movie."}}, limit: 5)
{
id
title
description
}
}
Wywołaj zapytanie o podobieństwo
Aby wywołać wyszukiwanie podobieństw w kodzie klienta:
import { searchMovieDescriptionUsingL2similarity} from 'lib/dataconnect-sdk';
const response = await searchMovieDescriptionUsingL2similarity({ query });
// Use the response
Korzystanie z wektorów dystrybucyjnych niestandardowych
Data Connect umożliwia też bezpośrednią pracę z wbudowanymi elementami jako Vector
zamiast generowania ich za pomocą wartości serwera _embed
.
Przechowywanie niestandardowego osadzenia
Za pomocą interfejsu Vertex Embeddings API określ odpowiedni model i poproś o wyniki wbudowania w odpowiednim wymiarze.
Następnie przekonwertuj zwrócony tablicowy wektor liczb zmiennoprzecinkowych na Vector
, aby przekazać go operacji aktualizacji w celu zapisania.
mutation updateDescription($id: String!, $description: String!, $descriptionEmbedding: Vector!) {
movie_update(id: $id, data: {
// title, genre...
description: $description,
descriptionEmbedding: $descriptionEmbedding
})
}
Wykonywanie wyszukiwania podobieństw za pomocą niestandardowych wektorów dystrybucyjnych
Wykonaj tę samą operację, aby pobrać wektory dystrybucyjne dla wyszukiwanych haseł i przesłać je do obiektu 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 gałęzi produkcyjnej
Wdrażanie schematu i sprzęgającego
Ostatnim krokiem w typowym cyklu Data Connect jest wdrożenie zasobów do wersji produkcyjnej.
Podczas wdrażania schematu zawierającego typy Vector
do CloudSQL za pomocą polecenia firebase deploy
interfejs wiersza poleceń Firebase wykonuje niezbędne czynności, aby umożliwić generowanie wektorów dystrybucyjnych na podstawie Vertex AI w Twojej instancji CloudSQL.
firebase deploy --only dataconnect
Jeśli chcesz ręcznie włączyć obsługę umieszczania w instancji CloudSQL lub napotkasz błąd w interfejsie wiersza poleceń, wykonaj te instrukcje.
Składnia wyszukiwania wektorowego
Rozszerzenia schematu
Typ danych Vector
w usłudze Data Connect jest mapowany na typ vector
w usłudze PostgreSQL zgodnie z definicją w rozszerzeniu pgvector
. Typ danych vector
w usłudze pgvector jest przechowywany w usłudze PostgreSQL jako tablica liczb zmiennoprzecinkowych o pojedynczej precyzji.
W elementach Data Connect typ Vector
jest reprezentowany jako tablica liczb JSON. Dane wejściowe są przekształcane w tablicę wartości float32
. Jeśli przymus się nie uda, występuje błąd.
Aby ustawić wymiary wektora, użyj parametru size dyrektywy @col
.
type Question @table {
text: String!
category: String!
textEmbedding: Vector! @col(size: 768)
}
Pole size
jest obsługiwane tylko w przypadku typów Vector
. Operacje Vector
, takie jak wyszukiwanie podobnych elementów, 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 dla zapytań i mutacji
_embed
Ta wartość serwera kieruje usługę Data Connect do generowania i przechowywania wektorów za pomocą interfejsów Vertex AI Embedding API. Tej wartości serwera można używać zarówno w przypadku zapytań, jak i mutacji.
Parametry wyszukiwania podobieństw
method: COSINE|INNER_PRODUCT|L2
Funkcja odległości używana do wyszukiwania sąsiadów w pobliżu. Obecnie obsługiwane algorytmy to podzbiór algorytmów wyszukiwania pgvector.
within: float
Ograniczenie odległości, w której wykonywane jest wyszukiwanie najbliższych sąsiadów.
where: FDC filter condition
Zobacz przewodnik po schematach, zapytaniach i mutacjach.
limit: int
Liczba wyników do zwrócenia.