Bienvenue dans la recherche de similarité vectorielle de Firebase Data Connect, l'implémentation de la recherche sémantique de Firebase qui s'intègre à Google Vertex AI.
Au cœur de cette fonctionnalité se trouvent des représentations vectorielles continues, qui sont des tableaux de nombres à virgule flottante représentant la signification sémantique du texte ou des contenus multimédias. En effectuant une recherche de voisin le plus proche à l'aide d'un embedding vectoriel d'entrée, vous pouvez trouver tous les contenus sémantiquement similaires. Data Connect utilise l'extension pgvector
de PostgreSQL pour cette fonctionnalité.
Cette puissante recherche sémantique peut alimenter des cas d'utilisation tels que les moteurs de recommandations et les moteurs de recherche. Il s'agit également d'un composant clé de la génération avec augmentation du rappel dans les flux d'IA générative. La documentation Vertex AI est un excellent moyen de en savoir plus.
Vous pouvez vous appuyer sur la compatibilité intégrée de Data Connect pour générer automatiquement des embeddings vectoriels à l'aide de l'API d'embeddings de Vertex AI, ou utiliser cette API pour les générer manuellement.
Prérequis
Configurez Data Connect pour votre projet.
Activez les API Vertex AI.
Prérequis
Vous pouvez choisir entre un flux de développement local (si vous êtes un développeur Web, Kotlin Android ou iOS) ou un flux IDX (pour les développeurs Web). Vous pouvez utiliser une base de données locale ou votre projet Data Connect de production et son instance Cloud SQL pour PostgreSQL pour le développement.
Ces instructions supposent que vous avez créé votre projet Data Connect en suivi du guide de démarrage rapide.
Intégrer à PostgreSQL local
- Configurez une instance PostgreSQL locale.
- Attribuez-vous le rôle IAM "Utilisateur Vertex AI".
- Configurez les identifiants par défaut de l'application Google Cloud dans votre environnement.
- Installez l'extension
pgvector
dans votre instance PostgreSQL locale. - Activez l'extension à l'aide de
CREATE EXTENSION vector
conformément aux instructions du dépôtpgvector
.
Intégrer à IDX
- Configurez votre espace de travail IDX à l'aide du modèle Data Connect.
- Attribuez-vous le rôle IAM "Utilisateur Vertex AI".
- Activez l'extension à l'aide de
CREATE EXTENSION vector
conformément aux instructions du dépôtpgvector
.
Concevoir votre schéma
Pour effectuer une recherche vectorielle, ajoutez un champ de type Vector
dans votre schéma. Par exemple, si vous souhaitez effectuer une recherche sémantique à l'aide de descriptions de films, ajoutez un champ pour contenir les embeddings vectoriels associés à la description du film. Dans ce schéma, descriptionEmbedding
est ajouté pour stocker les embeddings vectoriels du champ 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)
// ...
}
Générer et récupérer des embeddings
Data Connect offre une prise en charge intégrée des embeddings vectoriels avec la valeur de serveur _embed
. Cela indique à Data Connect de générer des représentations vectorielles continues en appelant en interne les API d'embedding de Vertex AI. La valeur du serveur _embed
peut être utilisée à la fois dans les mutations et les requêtes.
Mutations
Générer et stocker un embedding via Data Connect
Dans votre application de recherche vectorielle, vous souhaiterez probablement demander que des représentations vectorielles continues soient générées dès que vous ajoutez des enregistrements à votre base de données. Voici une mutation createMovie
qui ajoute un enregistrement de film à la table Movie
et transmet également une description de film avec un model
d'encapsulation spécifié.
mutation createMovie($movieData: Movie_Data! @pick(fields: ["title", "genre", "description"])) {
movie_insert(data: {
...movieData,
descriptionEmbedding_embed: {model: "textembedding-gecko@003", text: $movieData.description}
})
}
Dans certains cas, vous pouvez modifier la description et l'intégration du film.
mutation updateDescription($id: String!, $description: String!) {
movie_update(id: $id, data: {
description: $description,
descriptionEmbedding_embed: {model: "textembedding-gecko@003", text: $description}
})
}
Pour appeler la dernière mutation à partir d'un client:
import { updateMovieDescriptionWithEmbed } from 'lib/dataconnect-sdk/';
await updateMovieDescriptionWithEmbed({ id: movieId, description: description});
// Use the response
Requêtes
Récupérez des embeddings vectoriels à l'aide d'une requête semblable à celle-ci. Notez que le descriptionEmbedding
renvoyé par la requête est un tableau de nombres à virgule flottante, qui n'est généralement pas lisible par l'homme. Par conséquent, les SDK générés par Data Connect ne permettent pas de le renvoyer directement.
Vous pouvez utiliser les représentations vectorielles continues renvoyées pour effectuer une recherche de similarité, comme décrit dans la section suivante.
query getMovieDescription($id: String!) @auth(is: PUBLIC) {
movie(id: $id)
id
description
descriptionEmbedding
}
Effectuer une recherche de similarité
Nous pouvons maintenant effectuer une recherche de similarité.
Pour chaque champ Vector
, Data Connect génère une fonction GraphQL qui implémente la recherche par similarité. Le nom de cette fonction générée est ${pluralType}_${vectorFieldName}_similarity
. Elle accepte quelques paramètres, comme indiqué dans les exemples suivants et dans la liste de référence.
Vous pouvez définir une fonction GraphQL qui appelle la recherche par similarité. Comme indiqué ci-dessus, la valeur du serveur _embed
indique à Data Connect de générer les représentations vectorielles continues à l'aide des API d'embedding de Vertex AI, dans ce cas pour créer des représentations vectorielles continues pour la chaîne de recherche utilisée à des fins de comparaison avec les représentations vectorielles continues de la description du film.
Dans cet exemple, la recherche de similarité renvoie jusqu'à cinq films dont la description est sémantiquement la plus proche de la requête d'entrée. L'ensemble de résultats est trié par ordre croissant de la distance, de la plus proche à la plus éloignée.
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
}
}
Appeler la requête de similarité
Pour appeler une recherche de similarité à partir du code client:
import { searchMovieDescriptionUsingL2similarity} from 'lib/dataconnect-sdk';
const response = await searchMovieDescriptionUsingL2similarity({ query });
// Use the response
Utiliser des représentations vectorielles continues personnalisées
Data Connect vous permet également de travailler directement avec des représentations vectorielles continues en tant que Vector
au lieu d'utiliser la valeur du serveur _embed
pour les générer.
Stocker un embedding personnalisé
À l'aide de l'API Vertex Embeddings, spécifiez un modèle de correspondance et demandez les résultats d'embedding de la bonne dimension.
Ensuite, castez le tableau de nombres à virgule flottante renvoyé en Vector
pour le transmettre à l'opération de mise à jour à des fins de stockage.
mutation updateDescription($id: String!, $description: String!, $descriptionEmbedding: Vector!) {
movie_update(id: $id, data: {
// title, genre...
description: $description,
descriptionEmbedding: $descriptionEmbedding
})
}
Effectuer une recherche de similarité à l'aide d'embeddings personnalisés
Effectuez la même opération pour récupérer des représentations vectorielles continues pour les termes de recherche et les caster en Vectors
.
Appelez ensuite la requête _similarity
pour effectuer chaque recherche.
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
}
}
Déployer en production
Déployer votre schéma et votre connecteur
La dernière étape d'une itération Data Connect typique consiste à déployer vos composants en production.
Lorsque vous déployez votre schéma contenant des types Vector
dans CloudSQL à l'aide de la commande firebase deploy
, la CLI Firebase prend les mesures nécessaires pour activer la génération d'embeddings basée sur Vertex AI sur votre instance CloudSQL.
firebase deploy --only dataconnect
Si vous souhaitez activer manuellement la prise en charge de l'intégration dans votre instance Cloud SQL ou si vous rencontrez une erreur CLI, suivez ces instructions.
Syntaxe de recherche vectorielle
Extensions de schéma
Le type de données Vector
de Data Connect est mappé sur le type vector
de PostgreSQL, tel que défini par l'extension pgvector
. Le type vector
de pgvector est stocké sous la forme d'un tableau de nombres à virgule flottante à précision simple dans PostgreSQL.
Dans Data Connect, le type Vector
est représenté sous la forme d'un tableau de nombres JSON. Les entrées sont converties en tableau de valeurs float32
. Si la coercition échoue, une erreur est générée.
Utilisez le paramètre de taille de la directive @col
pour définir les dimensions du vecteur.
type Question @table {
text: String!
category: String!
textEmbedding: Vector! @col(size: 768)
}
size
n'est compatible qu'avec les types Vector
. Les opérations Vector
, telles que la recherche de similarité, exigent que tous les Vector
aient le même nombre de dimensions.
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
Valeur du serveur _embed
pour les requêtes et les mutations
_embed
Cette valeur de serveur indique au service Data Connect de générer et de stocker des embeddings à l'aide des API d'embedding de Vertex AI. Cette valeur de serveur peut être utilisée à la fois pour les requêtes et les mutations.
Paramètres pour la recherche de similarités
method: COSINE|INNER_PRODUCT|L2
Fonction de distance utilisée pour rechercher des voisins à proximité. Les algorithmes actuellement acceptés sont un sous-ensemble des algorithmes de recherche pgvector.
within: float
Contrainte sur la distance dans laquelle la recherche des plus proches voisins est effectuée.
where: FDC filter condition
Consultez le guide des schémas, des requêtes et des mutations.
limit: int
Nombre de résultats à renvoyer.