RAG contrôlé par la qualité avec les dernières fonctionnalités de recherche vectorielle d'AlloyDB

1. Présentation

Dans différents secteurs, la recherche contextuelle est une fonctionnalité essentielle qui constitue le cœur de leurs applications. La génération augmentée de récupération est un moteur clé de cette évolution technologique cruciale depuis un certain temps déjà, grâce à ses mécanismes de récupération optimisés par l'IA générative. Les modèles génératifs, avec leurs grandes fenêtres de contexte et leur impressionnante qualité de sortie, transforment l'IA. Le RAG permet d'injecter systématiquement du contexte dans les applications et agents d'IA, en les ancrant dans des bases de données structurées ou des informations provenant de différents médias. Ces données contextuelles sont essentielles pour la clarté et la précision des résultats, mais quelle est la précision de ces résultats ? Votre activité dépend-elle en grande partie de la précision et de la pertinence de ces correspondances contextuelles ? Alors, ce projet va vous plaire !

Le secret bien gardé de la recherche vectorielle n'est pas seulement de la créer, mais aussi de savoir si vos correspondances vectorielles sont réellement bonnes. Cela nous est tous arrivé : nous fixons une liste de résultats sans rien comprendre et nous nous demandons si elle fonctionne vraiment. Voyons comment évaluer la qualité des correspondances vectorielles. Vous vous demandez peut-être ce qui a changé dans le RAG. Tout ! Pendant des années, la génération augmentée par récupération (RAG) a semblé être un objectif prometteur, mais insaisissable. Nous disposons enfin des outils nécessaires pour créer des applications RAG avec les performances et la fiabilité requises pour les tâches critiques.

Nous avons déjà les bases de trois éléments :

  1. Ce que signifie la recherche contextuelle pour votre agent et comment l'effectuer à l'aide de Vector Search.
  2. Nous avons également étudié en détail la recherche vectorielle dans le champ de vos données, c'est-à-dire dans votre base de données elle-même (toutes les bases de données Google Cloud sont compatibles avec cette fonctionnalité, si vous ne le saviez pas déjà).
  3. Nous sommes allés plus loin que le reste du monde en vous expliquant comment obtenir une fonctionnalité RAG de recherche vectorielle aussi légère, mais aussi performante et de qualité, grâce à la fonctionnalité de recherche vectorielle AlloyDB basée sur l'index ScaNN.

Si vous n'avez pas encore effectué ces expériences RAG de base, intermédiaires et légèrement avancées, je vous encourage à lire les trois articles suivants : ici, ici et ici, dans l'ordre indiqué.

La recherche de brevets aide l'utilisateur à trouver des brevets contextuellement pertinents par rapport à son texte de recherche. Nous en avons déjà créé une version par le passé. Nous allons maintenant le créer avec de nouvelles fonctionnalités RAG avancées qui permettent une recherche contextuelle de qualité contrôlée pour cette application. C'est parti !

L'image ci-dessous montre le flux global de ce qui se passe dans cette application.~ 1c871099f1fde825.png

Objectif

Permettre à un utilisateur de rechercher des brevets à partir d'une description textuelle avec des performances améliorées et une meilleure qualité, tout en étant capable d'évaluer la qualité des correspondances générées à l'aide des dernières fonctionnalités RAG d'AlloyDB.

Ce que vous allez faire

Au cours de cet atelier, vous allez :

  1. Créer une instance AlloyDB et charger l'ensemble de données public sur les brevets
  2. Créer un index de métadonnées et un index ScaNN
  3. Implémenter la recherche vectorielle avancée dans AlloyDB à l'aide de la méthode de filtrage intégré de ScaNN
  4. Implémenter la fonctionnalité d'évaluation du rappel
  5. Évaluer la réponse à une requête

Conditions requises

  • Un navigateur tel que Chrome ou Firefox
  • Un projet Google Cloud avec facturation activée.

2. Avant de commencer

Créer un projet

  1. Dans la console Google Cloud, sur la page du sélecteur de projet, sélectionnez ou créez un projet Google Cloud.
  2. Assurez-vous que la facturation est activée pour votre projet Cloud. Découvrez comment vérifier si la facturation est activée sur un projet .
  3. Vous allez utiliser Cloud Shell, un environnement de ligne de commande exécuté dans Google Cloud. Cliquez sur "Activer Cloud Shell" en haut de la console Google Cloud.

Image du bouton "Activer Cloud Shell"

  1. Une fois connecté à Cloud Shell, vérifiez que vous êtes déjà authentifié et que le projet est défini sur votre ID de projet à l'aide de la commande suivante :
gcloud auth list
  1. Exécutez la commande suivante dans Cloud Shell pour vérifier que la commande gcloud connaît votre projet.
gcloud config list project
  1. Si votre projet n'est pas défini, utilisez la commande suivante pour le définir :
gcloud config set project <YOUR_PROJECT_ID>
  1. Activez les API requises. Vous pouvez utiliser une commande gcloud dans le terminal Cloud Shell :
gcloud services enable alloydb.googleapis.com compute.googleapis.com cloudresourcemanager.googleapis.com servicenetworking.googleapis.com run.googleapis.com cloudbuild.googleapis.com cloudfunctions.googleapis.com aiplatform.googleapis.com

Vous pouvez également accéder à la console en recherchant chaque produit ou en utilisant ce lien.

Consultez la documentation pour connaître les commandes gcloud ainsi que leur utilisation.

3. Configuration de la base de données

Dans cet atelier, nous utiliserons AlloyDB comme base de données pour les données sur les brevets. Il utilise des clusters pour stocker toutes les ressources, telles que les bases de données et les journaux. Chaque cluster possède une instance principale qui fournit un point d'accès aux données. Les tables contiennent les données réelles.

Commençons par créer un cluster, une instance et une table AlloyDB dans lesquels l'ensemble de données sur les brevets sera chargé.

Créer un cluster et une instance

  1. Accédez à la page AlloyDB de la console Cloud. Pour trouver la plupart des pages de la console Cloud, le plus simple est de les rechercher à l'aide de la barre de recherche de la console.
  2. Sélectionnez CRÉER UN CLUSTER sur cette page :

f76ff480c8c889aa.png

  1. Un écran semblable à celui ci-dessous s'affiche. Créez un cluster et une instance avec les valeurs suivantes (assurez-vous que les valeurs correspondent si vous clonez le code de l'application à partir du dépôt) :
  • ID du cluster : "vector-cluster"
  • password : "alloydb"
  • PostgreSQL 15 / dernière version recommandée
  • Région : "us-central1"
  • Networking : "default"

538dba58908162fb.png

  1. Lorsque vous sélectionnez le réseau par défaut, un écran semblable à celui ci-dessous s'affiche.

Sélectionnez CONFIGURER LA CONNEXION.

7939bbb6802a91bf.png

  1. Sélectionnez ensuite Utiliser une plage d'adresses IP automatiquement allouée, puis cliquez sur "Continuer". Après avoir vérifié les informations, sélectionnez CRÉER UNE CONNEXION. 768ff5210e79676f.png
  2. Une fois votre réseau configuré, vous pouvez continuer à créer votre cluster. Cliquez sur CRÉER UN CLUSTER pour terminer la configuration du cluster, comme indiqué ci-dessous :

e06623e55195e16e.png

Veillez à modifier l'ID de l'instance (que vous trouverez lors de la configuration du cluster / de l'instance) par

vector-instance. Si vous ne pouvez pas le modifier, n'oubliez pas d'utiliser l'ID de votre instance dans toutes les références à venir.

Notez que la création du cluster prendra environ 10 minutes. Une fois l'opération terminée, un écran présentant le cluster que vous venez de créer devrait s'afficher.

4. Ingestion de données

Il est maintenant temps d'ajouter un tableau contenant les données sur le magasin. Accédez à AlloyDB, sélectionnez le cluster principal, puis AlloyDB Studio :

847e35f1bf8a8bd8.png

Vous devrez peut-être attendre que votre instance soit créée. Une fois le cluster créé, connectez-vous à AlloyDB à l'aide des identifiants que vous avez créés. Utilisez les données suivantes pour vous authentifier auprès de PostgreSQL :

  • Nom d'utilisateur : "postgres"
  • Base de données : "postgres"
  • Mot de passe : "alloydb"

Une fois l'authentification réussie dans AlloyDB Studio, les commandes SQL sont saisies dans l'éditeur. Vous pouvez ajouter plusieurs fenêtres de l'éditeur en cliquant sur le signe plus à droite de la dernière fenêtre.

91a86d9469d499c4.png

Vous saisirez des commandes pour AlloyDB dans des fenêtres d'éditeur, en utilisant les options "Exécuter", "Mettre en forme" et "Effacer" selon les besoins.

Activer les extensions

Pour créer cette application, nous allons utiliser les extensions pgvector et google_ml_integration. L'extension pgvector vous permet de stocker et de rechercher des embeddings vectoriels. L'extension google_ml_integration fournit les fonctions que vous utilisez pour accéder aux points de terminaison de prédiction Vertex AI afin d'obtenir des prédictions en SQL. Activez ces extensions en exécutant les LDD suivants :

CREATE EXTENSION IF NOT EXISTS google_ml_integration CASCADE;
CREATE EXTENSION IF NOT EXISTS vector;

Si vous souhaitez vérifier les extensions qui ont été activées dans votre base de données, exécutez la commande SQL suivante :

select extname, extversion from pg_extension;

Créer une table

Vous pouvez créer une table à l'aide de l'instruction LDD ci-dessous dans AlloyDB Studio :

CREATE TABLE patents_data ( id VARCHAR(25), type VARCHAR(25), number VARCHAR(20), country VARCHAR(2), date VARCHAR(20), abstract VARCHAR(300000), title VARCHAR(100000), kind VARCHAR(5), num_claims BIGINT, filename VARCHAR(100), withdrawn BIGINT, abstract_embeddings vector(768)) ;

La colonne "abstract_embeddings" permettra de stocker les valeurs vectorielles du texte.

Accorder l'autorisation

Exécutez l'instruction ci-dessous pour accorder l'exécution de la fonction "embedding" :

GRANT EXECUTE ON FUNCTION embedding TO postgres;

Attribuer le RÔLE Utilisateur Vertex AI au compte de service AlloyDB

Dans la console Google Cloud IAM, accordez au compte de service AlloyDB (qui ressemble à ceci : service-<<PROJECT_NUMBER>>@gcp-sa-alloydb.iam.gserviceaccount.com) l'accès au rôle "Utilisateur Vertex AI". PROJECT_NUMBER correspondra au numéro de votre projet.

Vous pouvez également exécuter la commande ci-dessous à partir du terminal Cloud Shell :

PROJECT_ID=$(gcloud config get-value project)


gcloud projects add-iam-policy-binding $PROJECT_ID \
  --member="serviceAccount:service-$(gcloud projects describe $PROJECT_ID --format="value(projectNumber)")@gcp-sa-alloydb.iam.gserviceaccount.com" \
--role="roles/aiplatform.user"

Charger les données de brevets dans la base de données

Nous utiliserons les ensembles de données publics Google Patents sur BigQuery comme ensemble de données. Nous utiliserons AlloyDB Studio pour exécuter nos requêtes. Les données sont extraites de ce fichier insert_scripts.sql, que nous exécuterons pour charger les données sur les brevets.

  1. Dans la console Google Cloud, ouvrez la page AlloyDB.
  2. Sélectionnez le cluster que vous venez de créer, puis cliquez sur l'instance.
  3. Dans le menu de navigation AlloyDB, cliquez sur AlloyDB Studio. Connectez-vous avec vos identifiants.
  4. Ouvrez un nouvel onglet en cliquant sur l'icône Nouvel onglet à droite.
  5. Copiez l'instruction de requête insert du script insert_scripts.sql mentionné ci-dessus dans l'éditeur. Vous pouvez copier entre 10 et 50 instructions d'insertion pour une démonstration rapide de ce cas d'utilisation.
  6. Cliquez sur Exécuter. Les résultats de votre requête s'affichent dans la table Résultats.

Remarque : Vous remarquerez peut-être que le script d'insertion contient beaucoup de données. En effet, nous avons inclus des embeddings dans les scripts d'insertion. Si vous ne parvenez pas à charger le fichier dans GitHub, cliquez sur "Afficher le fichier brut". Cela vous évitera (dans les étapes à venir) de générer plus de quelques embeddings (20 à 25 maximum, par exemple) si vous utilisez un compte de facturation avec crédit d'essai pour Google Cloud.

5. Créer des embeddings pour les données de brevets

Commençons par tester la fonction d'embedding en exécutant l'exemple de requête suivant :

SELECT embedding('text-embedding-005', 'AlloyDB is a managed, cloud-hosted SQL database service.');

Cela devrait renvoyer le vecteur d'embedding, qui ressemble à un tableau de valeurs flottantes, pour l'exemple de texte dans la requête. Voici à quoi il ressemble :

25a1d7ef0e49e91e.png

Mettre à jour le champ vectoriel "abstract_embeddings"

Exécutez le LMD ci-dessous pour mettre à jour les résumés de brevets dans le tableau avec les embeddings correspondants uniquement si vous n'avez pas inséré les données abstract_embeddings dans le script d'insertion :

UPDATE patents_data set abstract_embeddings = embedding( 'text-embedding-005', abstract);

Si vous utilisez un compte de facturation avec crédit d'essai pour Google Cloud, vous risquez de rencontrer des difficultés pour générer plus d'une vingtaine d'embeddings. C'est pourquoi j'ai déjà inclus les embeddings dans les scripts d'insertion. Vous devriez les trouver dans votre table si vous avez suivi l'étape "Charger les données de brevets dans la base de données".

6. Effectuer un RAG avancé avec les nouvelles fonctionnalités d'AlloyDB

Maintenant que la table, les données et les embeddings sont prêts, effectuons la recherche vectorielle en temps réel pour le texte de recherche de l'utilisateur. Pour tester cela, exécutez la requête ci-dessous :

SELECT id || ' - ' || title as title FROM patents_data ORDER BY abstract_embeddings <=> embedding('text-embedding-005', 'Sentiment Analysis')::vector LIMIT 10;

Dans cette requête,

  1. Le texte recherché par l'utilisateur est "Analyse des sentiments".
  2. Nous le convertissons en embeddings dans la méthode embedding() à l'aide du modèle text-embedding-005.
  3. "<=>" représente l'utilisation de la méthode de distance COSINE SIMILARITY.
  4. Nous convertissons le résultat de la méthode d'embedding en type vectoriel pour le rendre compatible avec les vecteurs stockés dans la base de données.
  5. LIMIT 10 signifie que nous sélectionnons les 10 correspondances les plus proches du texte de recherche.

AlloyDB booste le RAG de recherche vectorielle :

De nombreuses nouveautés ont été introduites. Voici deux d'entre elles, axées sur les développeurs :

  1. Filtrage intégré
  2. Évaluateur de rappel

Filtrage intégré

Auparavant, en tant que développeur, vous deviez effectuer la requête Vector Search et gérer le filtrage et le rappel. L'optimiseur de requêtes AlloyDB choisit la manière d'exécuter une requête avec des filtres. Le filtrage intégré est une nouvelle technique d'optimisation des requêtes qui permet à l'optimiseur de requêtes AlloyDB d'évaluer à la fois les conditions de filtrage des métadonnées et la recherche vectorielle, en tirant parti des index vectoriels et des index sur les colonnes de métadonnées. Cela a permis d'améliorer les performances de rappel, ce qui permet aux développeurs de profiter des avantages d'AlloyDB dès le départ.

Le filtrage intégré est idéal pour les cas de sélectivité moyenne. Lorsqu'AlloyDB effectue une recherche dans l'index vectoriel, il ne calcule les distances que pour les vecteurs qui correspondent aux conditions de filtrage des métadonnées (vos filtres fonctionnels dans une requête généralement gérée dans la clause WHERE). Cela améliore considérablement les performances de ces requêtes, en complément des avantages du filtrage après ou avant.

  1. Installer ou mettre à jour l'extension pgvector
CREATE EXTENSION IF NOT EXISTS vector WITH VERSION '0.8.0.google-3';

Si l'extension pgvector est déjà installée, mettez-la à niveau vers la version 0.8.0.google-3 ou ultérieure pour bénéficier des fonctionnalités d'évaluation du rappel.

ALTER EXTENSION vector UPDATE TO '0.8.0.google-3';

Cette étape ne doit être exécutée que si votre extension vectorielle est <0.8.0.google-3>.

Important : Si votre nombre de lignes est inférieur à 100, vous n'avez pas besoin de créer l'index ScaNN, car il ne s'appliquera pas à un nombre de lignes aussi faible. Dans ce cas, veuillez ignorer les étapes suivantes.

  1. Pour créer des index ScaNN, installez l'extension alloydb_scann.
CREATE EXTENSION IF NOT EXISTS alloydb_scann;
  1. Exécutez d'abord la requête Vector Search sans l'index et sans le filtre intégré activé :
SELECT id || ' - ' || title as title FROM patents_data 
WHERE num_claims >= 15 
ORDER BY abstract_embeddings <=> embedding('text-embedding-005', 'Sentiment Analysis')::vector LIMIT 10;

Le résultat doit être semblable à ceci :

6989de0fc3f0f753.png

  1. Exécutez Explain Analyze dessus (sans index ni filtrage intégré) :

908dcf87c7f00ed4.png

Le temps d'exécution est de 2,4 ms.

  1. Créons un index standard sur le champ "num_claims" afin de pouvoir le filtrer :
CREATE INDEX idx_patents_data_num_claims ON patents_data (num_claims);
  1. Créons l'index ScaNN pour notre application de recherche de brevets. Exécutez les commandes suivantes depuis AlloyDB Studio :
CREATE INDEX patent_index ON patents_data 
USING scann (abstract_embeddings cosine)
WITH (num_leaves=32);

Remarque importante  : (num_leaves=32) s'applique à l'ensemble de données complet comportant plus de 1 000 lignes. Si votre nombre de lignes est inférieur à 100, vous n'avez pas besoin de créer d'index, car il ne s'appliquera pas à un nombre de lignes aussi faible.

  1. Définissez le filtrage intégré activé sur l'index ScaNN :
SET scann.enable_inline_filtering = on
  1. Exécutons maintenant la même requête avec un filtre et Vector Search :
SELECT id || ' - ' || title as title FROM patents_data 
WHERE num_claims >= 15 
ORDER BY abstract_embeddings <=> embedding('text-embedding-005', 'Sentiment Analysis')::vector LIMIT 10;

aa54cba2b2ada2cb.png

Comme vous pouvez le constater, le temps d'exécution est considérablement réduit pour la même recherche vectorielle. L'index ScaNN avec filtrage intégré dans Vector Search a rendu cela possible !!!

Ensuite, évaluons le rappel pour cette recherche vectorielle compatible avec ScaNN.

Évaluateur de rappel

Dans la recherche par similarité, le rappel correspond au pourcentage d'instances pertinentes récupérées à partir d'une recherche, c'est-à-dire le nombre de vrais positifs. Il s'agit de la métrique la plus courante pour mesurer la qualité de la recherche. Une source de perte de rappel provient de la différence entre la recherche approximative des voisins les plus proches (aNN) et la recherche des k (exacts) plus proches voisins (kNN). Les index vectoriels tels que ScaNN d'AlloyDB implémentent des algorithmes aNN, ce qui vous permet d'accélérer la recherche vectorielle sur de grands ensembles de données en échange d'un léger compromis en termes de rappel. AlloyDB vous permet désormais de mesurer ce compromis directement dans la base de données pour les requêtes individuelles et de vous assurer qu'il reste stable au fil du temps. Vous pouvez mettre à jour les paramètres de requête et d'index en fonction de ces informations pour obtenir de meilleurs résultats et performances.

Quelle est la logique derrière le rappel des résultats de recherche ?

Dans le contexte de la recherche vectorielle, le rappel fait référence au pourcentage de vecteurs renvoyés par l'index qui sont de vrais voisins les plus proches. Par exemple, si une requête de 20 voisins les plus proches renvoie un résultat de 19 voisins les plus proches de "vérité terrain", le rappel est de 19/20 x 100 = 95 %. Le rappel est la métrique utilisée pour la qualité de la recherche. Il est défini comme le pourcentage de résultats renvoyés qui sont objectivement les plus proches des vecteurs de requête.

Vous pouvez trouver le rappel d'une requête vectorielle sur un index vectoriel pour une configuration donnée à l'aide de la fonction evaluate_query_recall. Cette fonction vous permet d'ajuster vos paramètres pour obtenir les résultats de rappel de requête vectorielle souhaités.

Remarque importante :

Si vous rencontrez une erreur d'autorisation refusée sur l'index HNSW lors des étapes suivantes, ignorez pour l'instant toute la section Évaluation du rappel. Il peut s'agir de restrictions d'accès à ce stade, car il vient d'être publié au moment où cet atelier de programmation est documenté.

  1. Définissez l'indicateur "Enable Index Scan" (Activer l'analyse d'index) sur l'index ScaNN et l'index HNSW :
SET scann.enable_indexscan = on
SET hnsw.enable_index_scan = on
  1. Exécutez la requête suivante dans AlloyDB Studio :
SELECT
  *
FROM
  evaluate_query_recall($$
  SELECT
    id || ' - ' || title AS title,
    abstract
  FROM
    patents_data
    where num_claims >= 15
  ORDER BY
    abstract_embeddings <=> embedding('text-embedding-005',
      'sentiment analysis')::vector
  LIMIT 25 $$,
    '{"scann.num_leaves_to_search":1, "scann.pre_reordering_num_neighbors":10}',
    ARRAY['scann']);

La fonction evaluate_query_recall prend la requête comme paramètre et renvoie son rappel. J'utilise la même requête que celle que j'ai utilisée pour vérifier les performances comme requête d'entrée de la fonction. J'ai ajouté SCaNN comme méthode d'index. Pour plus d'options de paramètres, consultez la documentation.

Voici le rappel pour cette requête de recherche vectorielle que nous avons utilisée :

c98f38fbe6a0b6c5.png

Je vois que le RECALL est de 70 %. Je peux maintenant utiliser ces informations pour modifier les paramètres, les méthodes et les paramètres de requête de l'index, et améliorer le rappel de cette recherche vectorielle.

7. Testez-le avec des paramètres de requête et d'index modifiés.

Testons maintenant la requête en modifiant les paramètres de requête en fonction du rappel reçu.

  1. J'ai modifié le nombre de lignes dans l'ensemble de résultats pour le faire passer de 25 à 7. J'ai constaté une amélioration du rappel, qui est désormais de 86 %.

c12f7b92b8481ceb.png

Cela signifie que je peux faire varier en temps réel le nombre de correspondances que mes utilisateurs voient pour améliorer la pertinence des correspondances en fonction du contexte de recherche des utilisateurs.

  1. Réessayons en modifiant les paramètres d'index :

Pour ce test, je vais utiliser la distance L2 au lieu de la fonction de distance de similarité cosinus. Je vais également modifier la limite de la requête à 10 pour montrer si la qualité des résultats de recherche s'améliore même avec un nombre de résultats de recherche plus élevé.

[AVANT] Requête qui utilise la fonction de distance de similarité cosinus :

SELECT
  *
FROM
  evaluate_query_recall($$
  SELECT
    id || ' - ' || title AS title,
    abstract
  FROM
    patents_data
    where num_claims >= 15
  ORDER BY
    abstract_embeddings <=> embedding('text-embedding-005',
      'sentiment analysis')::vector
  LIMIT 10 $$,
    '{"scann.num_leaves_to_search":1, "scann.pre_reordering_num_neighbors":10}',
    ARRAY['scann']);

Remarque très importante : Vous vous demandez peut-être comment nous savons que cette requête utilise la similarité COSINE. Vous pouvez identifier la fonction de distance en utilisant "<=>" pour représenter la distance cosinus.

Lien vers la documentation sur les fonctions de distance Vector Search.

Le résultat de la requête ci-dessus est le suivant :

c62ef8922d6bf0b2.png

Comme vous pouvez le voir, le RECALL est de 70 % sans aucune modification de notre logique d'index. Vous vous souvenez de l'index ScaNN que nous avons créé à l'étape 6 de la section sur le filtrage intégré, "patent_index" ? Le même index est toujours efficace lorsque nous exécutons la requête ci-dessus.

Créons maintenant un index avec une autre requête de fonction de distance : Distance L2 : <->

drop index patent_index;

CREATE INDEX patent_index_L2 ON patents_data 
USING scann (abstract_embeddings L2)
WITH (num_leaves=32);

L'instruction de suppression d'index sert uniquement à s'assurer qu'il n'y a pas d'index inutile sur la table.

Je peux maintenant exécuter la requête suivante pour évaluer le RECALL après avoir modifié la fonction de distance de ma fonctionnalité Vector Search.

[APRÈS] : requête qui utilise la fonction de distance de similarité cosinus :

SELECT
  *
FROM
  evaluate_query_recall($$
  SELECT
    id || ' - ' || title AS title,
    abstract
  FROM
    patents_data
    where num_claims >= 15
  ORDER BY
    abstract_embeddings <-> embedding('text-embedding-005',
      'sentiment analysis')::vector
  LIMIT 10 $$,
    '{"scann.num_leaves_to_search":1, "scann.pre_reordering_num_neighbors":10}',
    ARRAY['scann']);

Le résultat de la requête ci-dessus est le suivant :

6c163dd08cf4d693.png

Quelle transformation de la valeur de rappel : 90 % !!!

Vous pouvez modifier d'autres paramètres dans l'index, comme num_leaves, en fonction de la valeur de rappel souhaitée et de l'ensemble de données utilisé par votre application.

8. Effectuer un nettoyage

Pour éviter que les ressources utilisées dans cet article soient facturées sur votre compte Google Cloud, procédez comme suit :

  1. Dans la console Google Cloud, accédez à la page Gestionnaire de ressources.
  2. Dans la liste des projets, sélectionnez le projet que vous souhaitez supprimer, puis cliquez sur Supprimer.
  3. Dans la boîte de dialogue, saisissez l'ID du projet, puis cliquez sur Arrêter pour supprimer le projet.
  4. Vous pouvez également supprimer le cluster AlloyDB que nous venons de créer pour ce projet en cliquant sur le bouton "SUPPRIMER LE CLUSTER". (Si vous n'avez pas choisi us-central1 pour le cluster lors de la configuration, modifiez l'emplacement dans cet hyperlien.)

9. Félicitations

Félicitations ! Vous avez créé une requête de recherche de brevets contextuelle avec la recherche vectorielle avancée d'AlloyDB pour obtenir des performances élevées et une véritable pertinence sémantique. J'ai créé une application agentique multi-outils contrôlée en termes de qualité qui utilise ADK et tout ce que nous avons vu ici pour créer un agent d'analyse et de recherche vectorielle de brevets performant et de qualité. Vous pouvez le consulter ici : https://youtu.be/Y9fvVY0yZTY

Si vous souhaitez apprendre à créer cet agent, veuillez consulter cet atelier de programmation.

Lancez-vous dès aujourd'hui !