Wyszukiwanie podobieństw wektorowych za pomocą Vertex AI

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

  1. Skonfiguruj lokalną instancję PostgreSQL.

  2. Przyznaj sobie rolę IAM Użytkownik Vertex AI.

  3. W swoim środowisku skonfiguruj Google Cloud domyślne uwierzytelnianie aplikacji.

  4. W lokalnej instancji PostgreSQL zainstaluj rozszerzenie pgvector.

  5. Włącz rozszerzenie za pomocą polecenia CREATE EXTENSION vector zgodnie z instrukcjami w repozytorium pgvector.

Integracja z IDX

  1. Skonfiguruj obszar roboczy IDX za pomocą szablonu SQL Connect.

  2. Przyznaj sobie rolę IAM Użytkownik Vertex AI.

  3. Włącz rozszerzenie za pomocą polecenia CREATE EXTENSION vector zgodnie z instrukcjami w repozytorium pgvector.

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 dataconnect

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