Wyszukiwanie podobieństw wektorowych za pomocą Vertex AI

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 element 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 Vertex AI Embeddings API, 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 programowania (jeśli jesteś deweloperem stron internetowych, aplikacji na Androida w Kotlinie lub aplikacji na iOS) lub proces IDX (dla deweloperów stron internetowych). Do celów deweloperskich 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

  1. Skonfiguruj lokalną instancję PostgreSQL.
  2. Przyznaj sobie rolę uprawnień użytkownika Vertex AI.
  3. Skonfiguruj w swoim środowisku domyślne uwierzytelnianie aplikacji Google Cloud.
  4. Zainstaluj pgvectorrozszerzenie w lokalnej instancji PostgreSQL.
  5. Włącz rozszerzenie, korzystając z CREATE EXTENSION vector zgodnie z pgvectorinstrukcjami w repozytorium.

Integracja z IDX

  1. Skonfiguruj obszar roboczy IDX za pomocą szablonu Data Connect.
  2. Przyznaj sobie rolę uprawnień użytkownika Vertex AI.
  3. Włącz rozszerzenie, korzystając z CREATE EXTENSION vector zgodnie z pgvectorinstrukcjami w repozytorium.

Projektowanie schematu

Aby przeprowadzić wyszukiwanie wektorowe, dodaj w schemacie 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 pole 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 reprezentacji właściwościowych 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 będziesz chcieć, aby po dodaniu rekordów do bazy danych generowane były osadzania. Oto createMoviemutacja, 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.

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
}

Przeprowadzanie wyszukiwania podobieństw

Teraz możemy przeprowadzić wyszukiwanie podobieństw.

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, _embed wartość serwera kieruje Data Connect do generowania wektorów dystrybucyjnych za pomocą interfejsów Embedding API w 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 do 5 filmów, których opis jest semantycznie najbardziej zbliżony do zapytania wejściowego. 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 methodwithin, 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 osadzonymi elementami 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 w typowym procesie iteracyjnym Data 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 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 dataconnect

Jeś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.

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 size 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 w Vertex AI. Tej wartości serwera można używać 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.