Sommaire
Post Tab Link
Post Tab Link

{{bloc-notion-2}}

L’introduction de la recherche vectorielle dans BigQuery

{{bloc-notion-3}}

La recherche vectorielle dans BigQuery nécessite une base de données contenant des "embeddings" afin de calculer les distances entre les éléments et d'évaluer leur similitude.

Il y a plusieurs moyens pour créer des embeddings, cependant, on se focalisera sur la fonctionnalité intégrée de BigQuery pour le faire : ML.GENERATE_EMBEDDING.

La fonction ML.GENERATE_EMBEDDING permet de générer directement dans BigQuery des embeddings en utilisant un modèle de VERTEX AI.

Guide d’utilisation :

Dans notre guide détaillé, nous allons utiliser la recherche vectorielle sur BigQuery pour trouver des titres d’articles similaires dans une base de données de bbc_news qui est disponible pour le public sur le dataset bigquery-public-data. L’objectif de cet exercice est de trouver les articles qui ont un titre similaire à un titre d’article qui nous intéresse dans la base de données.

                                        Table BigQuery de bbc_news sur le dataset bigquery-public-data
Table BigQuery de bbc_news sur le dataset bigquery-public-data

La génération des embeddings :

Comme mentionné précédemment, pour effectuer une recherche vectorielle, il est nécessaire d'utiliser des embeddings.

Pour en créer, nous vous détaillons les étapes à suivre :

La création d’un ensemble de données sur BigQuery

Il s'agit de créer un nouveau dataset sur BigQuery pour stocker le modèle que nous utiliserons pour générer les embeddings, ainsi que les différentes tables que nous créerons par la suite.

Pour en faire, il suffit d’exécuter la requête suivante :

CREATE SCHEMA `toolbox-starfox.vector_search_demo`
ℹ️ Pour en savoir plus rendez-vous sur la documentation de BigQuery.

La création d’une connexion des ressources Cloud.

📖 Pour pouvoir créer une connexion BigQuery avec les ressources Cloud, il faut :
- Activer l’API : BigQuery Connection API.
- Avoir les rôles de :
- roles/bigquery.connectionAdmin
- resourcemanager.projects.setIamPolicy
- roles/bigquery.dataEditor
- roles/bigquery.user
  • Créer la connexion avec le modèle de Vertex AI dans BigQuery :
Démo de création d’une connexion aux ressources cloud sur BigQuery
  • Attribuer le rôle Utilisateur VERTEX AI au compte de service de la connexion :

La création du modèle pour la génération des embeddings :

Pour créer le modèle, il suffit d'exécuter cette simple requête :

CREATE OR REPLACE MODEL `vector_search_demo.embeddings_model_demo`  REMOTE WITH CONNECTION `projects/toolbox-starfox/locations/us/connections/embeddings-test`  OPTIONS (ENDPOINT = 'text-embedding-004');
ℹ️ Il existe plusieurs modèles sur Vertex AI pour générer des embeddings, pour utiliser le modèle multilangue, on utilise textembedding-gecko-multilingual@001 ou text-multilingual-embedding-002. 👉 Pour plus de détails, rendez-vous sur la documentation de Google.

{{bloc-notion-5}}

Image without caption

La génération des embeddings :

{{bloc-notion-4}}

CREATE OR REPLACE TABLE `toolbox-starfox.vector_search_demo.bbc_news_embeddings` AS (
  SELECT *
  FROM ML.GENERATE_EMBEDDING(
    MODEL `toolbox-starfox.vector_search_demo.embeddings_model_demo`,
    (
      SELECT title AS content
      FROM `toolbox-starfox.vector_search_demo.bbc_news`
    ),
    STRUCT(
      TRUE AS flatten_json_output,
      'SEMANTIC_SIMILARITY' AS task_type
    )
  )
);
ℹ️ Pour plus de détails sur les options de cette requête consultez la documentation de Google.

La génération de l’indice de la recherche vectorielle

Un indice vectoriel est une structure de données spécialisée qui optimise la fonction VECTOR_SEARCH pour une recherche plus rapide parmi les embeddings. Son principe repose sur la technique ANN (Approximate Nearest Neighbor, ou "recherche approximative des plus proches voisins").

La méthode IVF est une approche spécifique pour créer un indice vectoriel. Voici comment elle fonctionne :

  1. Clustering avec k-means
    • Les données vectorielles sont d'abord regroupées en clusters à l'aide de l'algorithme k-means.
    • Chaque cluster représente un groupe de vecteurs similaires.
  1. Partitionnement
    • Les données vectorielles sont ensuite organisées en fonction de ces clusters.
    • Cela crée une structure "inversée" où chaque cluster pointe vers les vecteurs qu'il contient.
  1. Recherche optimisée
    • Lors d'une recherche avec VECTOR_SEARCH, l'algorithme peut rapidement identifier les clusters pertinents.
    • La recherche se concentre ensuite sur ces clusters spécifiques, réduisant considérablement l'espace de recherche.

Cette commande crée un indice vectoriel sur la colonne spécifiée, en utilisant la méthode IVF et la distance cosinus pour mesurer la similarité entre les vecteurs.

CREATE OR REPLACE VECTOR INDEX my_index_bbc
ON `toolbox-starfox.vector_search_demo.bbc_news_embeddings` (ml_generate_embedding_result)
OPTIONS(
  index_type = 'IVF',
  distance_type = 'COSINE'
);

{{bloc-notion-1}}

L’utilisation de la recherche vectorielle

La dernière étape consiste à utiliser la recherche vectorielle pour trouver des titres similaires à un titre dans la table, le rôle de cette requête est d’utiliser la table qu’on a créée auparavant qui contient les embeddings, pour chercher les titres ayant des embeddings proches de ceux de titre qu’on essaye d’analyser et qui est dans notre exemple : “PlayStation 3 chip to be unveiled” en utilisant la méthode de calcul de distance : COSINE.

SELECT 
  query.title, 
  base.content
FROM 
  VECTOR_SEARCH(
    TABLE `toolbox-starfox.vector_search_demo.bbc_news_embeddings`,
    'ml_generate_embedding_result',
    (
      SELECT 
        ml_generate_embedding_result, 
        content AS title
      FROM 
        ML.GENERATE_EMBEDDING(
          MODEL `toolbox-starfox.vector_search_demo.embeddings_model_demo`,
          (
            SELECT "PlayStation 3 chip to be unveiled" AS content
          ),
          STRUCT(
            TRUE AS flatten_json_output
          )
        )
    ),
    distance_type => 'COSINE'
  );
Image without caption

Le résultat est significatif, on voit que Sony PSP, XboX 2 et Sony sont identifiés comme des mots sémantiquement similaires à PlayStation, ce qui veut dire que la recherche vectorielle a bien fonctionné, évidemment on peut toujours améliorer le résultat en optimisant les options du modèle 👇.

{{bloc-notion-4}}

  • Si vos données sont réparties en nombreux petits groupes dans l'espace vectoriel :
    • Utilisez une valeur élevée pour num_lists
    • Utilisez une valeur basse pour fractions_list_to_search
  • Si vos données sont réparties en peu de grands groupes :
    • Utilisez une valeur basse pour num_lists
    • Utilisez une valeur élevée pour fractions_list_to_search

Si vous ne spécifiez pas de valeur pour num_lists, BigQuery en calculera une automatiquement.

L'intégration de la recherche vectorielle dans BigQuery constitue une avancée notable pour les entreprises. Cette fonctionnalité est particulièrement avantageuse pour les PME, leur permettant d'accéder à des capacités d'analyse avancées. Elle ne se limite pas à une simple amélioration technique ; elle représente un véritable levier de transformation pour les entreprises, leur permettant d'exploiter pleinement le potentiel de leurs données dans un monde de plus en plus numérique et compétitif.

Un besoin, une question ?

Écrivez-nous à hello@starfox-analytics.com.
Notre équipe vous répondra au plus vite.