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.
Alla base di questa caratteristica ci sono gli incorporamenti vettoriali, ovvero array di numeri in 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.
Integrazione con PostgreSQL locale
- Configura un'istanza PostgreSQL locale.
- Concedi a te stesso il ruolo IAM Utente Vertex AI.
- Configura le credenziali predefinite dell'applicazione Google Cloud nel tuo ambiente.
- Installa l'estensione
pgvector
nell'istanza PostgreSQL locale. - Attiva l'estensione utilizzando
CREATE EXTENSION vector
come indicato nelle istruzioni del repositorypgvector
.
Integrazione con IDX
- Configura la tua area di lavoro IDX utilizzando il modello Data Connect.
- Concedi a te stesso il ruolo IAM Utente Vertex AI.
- Abilita l'estensione utilizzando
CREATE EXTENSION vector
in base alle istruzioni del repositorypgvector
.
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, viene aggiunto descriptionEmbedding
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 del server _embed
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 per il film alla tabella Movie
e trasmette anche una descrizione del filmato con un model
di incorporamento 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 che il valore descriptionEmbedding
restituito dalla query è un array di numeri in virgola mobile, che in genere non è leggibile. Pertanto, gli SDK generati da Data Connect non supportano il suo ritorno diretto.
Puoi utilizzare gli incorporamenti vettoriali restituiti per eseguire ricerche di somiglianze, 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 una ricerca di somiglianze.
Per ogni campo Vector
, Data Connect genera una funzione GraphQL che implementa la ricerca di somiglianze. Il nome di questa funzione generata è
${pluralType}_${vectorFieldName}_similarity
. Supporta alcuni parametri, come mostrato nei seguenti esempi 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 consente inoltre di lavorare con gli incorporamenti 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 trasmetterli 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 in Cloud SQL dello schema contenente i tipi Vector
utilizzando il comando firebase deploy
, l'interfaccia a riga di comando Firebase segue i passaggi necessari per abilitare la generazione di incorporamenti basati su Vertex AI nell'istanza Cloud SQL.
firebase deploy --only dataconnect
Se vuoi attivare manualmente il supporto dell'inserimento nell'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 con virgola mobile di singola precisione 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 va a buon fine, 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 somiglianze
method: COSINE|INNER_PRODUCT|L2
La funzione di distanza utilizzata per cercare vicini nelle vicinanze. 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.