Esegui una ricerca di somiglianze vettoriali con Vertex AI

Ti diamo il benvenuto nella ricerca di somiglianza vettoriale di Firebase Data Connect, l'implementazione di Firebase della ricerca semantica che si integra con Google Vertex AI.

Al centro di questa funzionalità ci sono gli embedding vettoriali, ovvero array di numeri con virgola mobile che rappresentano il significato semantico di testo o contenuti multimediali. Eseguendo una ricerca del vicino più prossimo utilizzando un embedding vettore di input, puoi trovare tutti i contenuti semanticamente simili. Data Connect utilizza l'estensione pgvector di PostgreSQL per questa funzionalità.

Questa potente ricerca semantica può generare casi d'uso come motori di raccomandazione e motori di ricerca. È anche un componente chiave della generazione con recupero nei flussi di IA generativa. La documentazione di Vertex AI è un ottimo posto per scoprire di più.

Puoi fare affidamento sul supporto integrato di Data Connect per la generazione automatica di embedding vettoriali utilizzando l'API Embeddings di Vertex AI oppure utilizzare questa API per generarli manualmente.

Prerequisiti

  • Configura Data Connect per il tuo progetto.

  • Abilita le API Vertex AI.

Configurazione

Puoi scegliere tra un flusso di sviluppo locale (se sei uno sviluppatore web, Kotlin, Android o iOS) o un flusso IDX (per gli sviluppatori web). Per lo sviluppo puoi utilizzare un database locale o il tuo progetto Data Connect di produzione e la relativa istanza Cloud SQL per PostgreSQL.

Queste istruzioni presuppongono che tu abbia creato il tuo progetto Data Connect seguendo la guida rapida.

Eseguire l'integrazione con PostgreSQL locale

  1. Configura un'istanza PostgreSQL locale.
  2. Concedi a te stesso il ruolo IAM Utente Vertex AI.
  3. Configura le credenziali predefinite dell'applicazione Google Cloud nel tuo ambiente.
  4. Installa l'estensione pgvector nell'istanza PostgreSQL locale.
  5. Attiva l'estensione utilizzando CREATE EXTENSION vector come indicato nelle istruzioni del repository pgvector.

Integrazione con IDX

  1. Configura la tua area di lavoro IDX utilizzando il modello Data Connect.
  2. Concedi a te stesso il ruolo IAM Utente Vertex AI.
  3. Attiva l'estensione utilizzando CREATE EXTENSION vector come indicato nelle istruzioni del repository pgvector.

Progettare lo schema

Per eseguire la ricerca di vettori, aggiungi un nuovo campo di tipo Vector allo schema. Ad esempio, se vuoi eseguire una ricerca semantica utilizzando le descrizioni dei film, aggiungi un campo per contenere gli embedding vettoriali associati alla descrizione del film. In questo schema, descriptionEmbedding viene aggiunto per archiviare gli incorporamenti vettoriali per il campo 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)
 // ...
}

Genera e recupera gli incorporamenti

Data Connect offre il supporto integrato per gli embedding di vettori con il valore del server _embed. In questo modo, Data Connect genera embedding vettoriali chiamando internamente le API Embedding di Vertex AI. Il valore _embed server può essere utilizzato sia nelle mutazioni che nelle query.

Mutazioni

Genera e memorizza un'entità incorporata tramite Data Connect

Nell'app di ricerca vettoriale, probabilmente vorrai richiedere la generazione degli embedding non appena aggiungi record al database. Ecco una mutazione createMovie che aggiunge un record di film alla tabella Movie e passa anche una descrizione del film con un embedding model specificato.

mutation createMovie($movieData: Movie_Data! @pick(fields: ["title", "genre", "description"])) {
  movie_insert(data: {
    ...movieData,
    descriptionEmbedding_embed: {model: "textembedding-gecko@003", text: $movieData.description}
  })
}

In alcuni casi, potresti voler aggiornare la descrizione e l'embedding del film.

mutation updateDescription($id: String!, $description: String!) {
  movie_update(id: $id, data: {
    description: $description,
    descriptionEmbedding_embed: {model: "textembedding-gecko@003", text: $description}
  })
}

Per chiamare la seconda mutazione da un client:

import { updateMovieDescriptionWithEmbed } from 'lib/dataconnect-sdk/';

await updateMovieDescriptionWithEmbed({ id: movieId, description: description});

// Use the response

Query

Recupera gli embedding vettoriali utilizzando una query come la seguente. Tieni presente chedescriptionEmbedding restituito dalla query è un array di valori float, che in genere non è leggibile da un essere umano. Pertanto, gli SDK generati da Data Connect non supportano il suo ritorno diretto.

Puoi utilizzare gli incorporamenti vettoriali restituiti per eseguire ricerche di somiglianza, come descritto nella sezione successiva.

query getMovieDescription($id: String!) @auth(is: PUBLIC) {
 movie(id: $id)
   id
   description
   descriptionEmbedding
}

Eseguire una ricerca di somiglianze

Ora possiamo eseguire la ricerca di similarità.

Per ogni campo Vector, Data Connect genera una funzione GraphQL che implementa la ricerca di similarità. Il nome di questa funzione generata è ${pluralType}_${vectorFieldName}_similarity. Supporta alcuni parametri come mostrato negli esempi seguenti e nell'elenco di riferimento.

Puoi definire una funzione GraphQL che invoca la ricerca di somiglianze. Come accennato sopra, il valore del server _embed indica a Data Connect di generare gli embedding vettoriali utilizzando le API Embedding di Vertex AI, in questo caso per creare gli embedding per la stringa di ricerca utilizzata per il confronto con gli embedding delle descrizioni dei film.

In questo esempio, la ricerca di similarità restituirà fino a 5 film la cui descrizione è semanticamente più simile alla query di input. Il set di risultati viene ordinato in ordine crescente di distanza, dalla più vicina alla più lontana.

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
      }
  }

Chiama la query di somiglianza

Per chiamare una ricerca di somiglianze dal codice client:

import { searchMovieDescriptionUsingL2similarity} from 'lib/dataconnect-sdk';

const response = await searchMovieDescriptionUsingL2similarity({ query });

// Use the response

Utilizza embedding personalizzati

Data Connect ti consente inoltre di lavorare con gli embedding direttamente come Vector anziché utilizzare il valore del server _embed per generarli.

Memorizzare un'evidenziazione personalizzata

Utilizzando l'API Vertex Embeddings, specifica un modello di corrispondenza e richiedi risultati di embedding della dimensione corretta.

Poi, trasmetti l'array di valori float restituito a un Vector da passare all'operazione di aggiornamento per l'archiviazione.

mutation updateDescription($id: String!, $description: String!, $descriptionEmbedding: Vector!) {
  movie_update(id: $id, data: {
    // title, genre...
    description: $description,
    descriptionEmbedding: $descriptionEmbedding
  })
}

Eseguire la ricerca di somiglianze utilizzando embedding personalizzati

Esegui la stessa operazione per recuperare gli incorporamenti per i termini di ricerca e trasmettili a Vectors.

Quindi, chiama la query _similarity per eseguire ogni ricerca.

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
      }
  }

Distribuzione in produzione

Esegui il deployment dello schema e del connettore

L'ultimo passaggio di una tipica evoluzione Data Connect consiste nel eseguire il deployment degli asset in produzione.

Quando esegui il deployment dello schema contenente tipi Vector in CloudSQL utilizzando il comando firebase deploy, la CLI Firebase esegue i passaggi necessari per attivare la generazione di embedding basata su Vertex AI nell'istanza CloudSQL.

firebase deploy --only dataconnect

Se vuoi attivare manualmente il supporto dell'embedding nella tua istanza CloudSQL o se riscontri un errore CLI, segui queste istruzioni.

Sintassi di ricerca vettoriale

Estensioni dello schema

Il tipo di dati Vector di Data Connect viene mappato al tipo vector di PostgreSQL come definito dall'estensione pgvector. Il tipo vector di pgvector viene archiviato come array di numeri in virgola mobile con precisione singola in PostgreSQL.

In Data Connect, il tipo Vector è rappresentato come un array di numeri JSON. Gli input vengono forzati in un array di valori float32. Se la coercizione non riesce, viene generato un errore.

Utilizza il parametro size della direttiva @col per impostare le dimensioni del vettore.

type Question @table {
    text: String!
    category: String!
    textEmbedding: Vector! @col(size: 768)
}

size è supportato solo per i tipi Vector. Le operazioni Vector, come la ricerca di similarità, richiedono che tutti i Vector abbiano lo stesso numero di dimensioni.

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

Valore del server _embed per query e mutazioni

_embed

Questo valore del server indica al servizio Data Connect di generare e memorizzare gli embedding utilizzando le API di embedding di Vertex AI. Questo valore del server può essere utilizzato sia per le query che per le mutazioni.

Parametri per la ricerca di somiglianza

method: COSINE|INNER_PRODUCT|L2

La funzione di distanza utilizzata per cercare i vicini più prossimi. Gli algoritmi attualmente supportati sono un sottoinsieme degli algoritmi di ricerca pgvector.

within: float

Un vincolo sulla distanza entro la quale viene eseguita la ricerca del vicino più prossimo.

where: FDC filter condition

Consulta la guida a schemi, query e mutazioni.

limit: int

Il numero di risultati da restituire.