Effectuer une recherche de similarité vectorielle avec Vertex AI

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

  1. Configurez une instance PostgreSQL locale.
  2. Attribuez-vous le rôle IAM "Utilisateur Vertex AI".
  3. Configurez les identifiants par défaut de l'application Google Cloud dans votre environnement.
  4. Installez l'extension pgvector dans votre instance PostgreSQL locale.
  5. Activez l'extension à l'aide de CREATE EXTENSION vector conformément aux instructions du dépôt pgvector.

Intégrer à IDX

  1. Configurez votre espace de travail IDX à l'aide du modèle Data Connect.
  2. Attribuez-vous le rôle IAM "Utilisateur Vertex AI".
  3. Activez l'extension à l'aide de CREATE EXTENSION vector conformément aux instructions du dépôt pgvector.

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.