Classer les résultats de recherche

Sélectionnez une version de la documentation :

Découvrez comment classer et reclasser vos résultats de recherche pour les applications à l'aide de modèles de classement Vertex AI tels que semantic-ranker-default-003. Vous pouvez utiliser la fonction ai.rank() pour attribuer un score aux documents en fonction de leur pertinence par rapport à une requête et améliorer les résultats de la recherche vectorielle en les reclassant pour un meilleur ordre de requête.

L'API Vertex AI Ranking prend une liste de documents et les classe en fonction de leur pertinence par rapport à une requête donnée (une chaîne de recherche). Lorsque vous utilisez la fonction ai.rank(), elle renvoie des scores indiquant dans quelle mesure un document répond à une requête donnée.

Pour utiliser les instructions de cette page, vous devez comprendre AlloyDB Omni et connaître les concepts de l'IA générative.

AlloyDB Omni réserve et crée le schéma ai.

Avant de commencer

Avant de classer les résultats de recherche, procédez comme suit :

  1. Configurez l'accès des utilisateurs aux modèles Vertex AI.
  2. Vérifiez que la dernière version de google_ml_integration est installée.
    1. Pour vérifier la version installée, exécutez la commande suivante :

      SELECT extversion FROM pg_extension WHERE extname = 'google_ml_integration';
      extversion
      ------------
      1.5.2
      (1 row)
    2. Si l'extension n'est pas installée ou si la version installée est antérieure à la version 1.5.2, mettez-la à jour.

      CREATE EXTENSION IF NOT EXISTS google_ml_integration;
      ALTER EXTENSION google_ml_integration UPDATE;

      Si vous rencontrez des problèmes lors de l'exécution des commandes précédentes ou si l' extension n'est pas mise à jour vers la version 1.5.2 après l'exécution des commandes précédentes, contactez l'assistance Google Cloud.

  3. Pour utiliser la fonctionnalité du moteur de requêtes AlloyDB AI, définissez le google_ml_integration.enable_ai_query_engine flag sur on.

    1. Utilisez un éditeur de texte pour définir le flag suivant dans le fichier de configuration postgresql.conf pour votre installation d'AlloyDB Omni :
      google_ml_integration.enable_ai_query_engine = on
    2. Après avoir enregistré le fichier postgresql.conf, redémarrez le service AlloyDB Omni pour que les modifications prennent effet.
      sudo systemctl restart alloydbomni18
  4. Activez l'API Discovery Engine.

  5. Obtenez les rôles requis pour utiliser les modèles de classement.

Activer l'API Discovery Engine

<p>To use ranking models, you must enable the Discovery Engine API.<br>
    Replace <code><var>PROJECT_ID</var></code> with your
    Google Cloud project ID and <code><var>PROJECT_NUMBER</var></code>
    with your corresponding project number.</p>

<pre class="prettyprint lang-terminal">
    # Enable Discovery Engine API
    gcloud services enable discoveryengine.googleapis.com --project=<var>PROJECT_ID</var>
    gcloud projects add-iam-policy-binding <var>PROJECT_ID</var> \
    --member="serviceAccount:service-<var>PROJECT_NUMBER</var>@iam.gserviceaccount.com" \
    --role="roles/discoveryengine.viewer"
</pre>

<p>Model registration for ranking isn't required for Vertex AI models.
    You can use the Vertex AI model name as the
    <code>model_id</code>, which is shown in the following example.
</p>

<pre class="prettyprint lang-sh">
    SELECT index, score
    FROM
      ai.rank(
        model_id => 'semantic-ranker-default-003',
        search_string => 'Affordable family-friendly vacation spots in Southeast Asia?',
        documents =>
    ARRAY[
      'Luxury resorts in South Korea',
      'Family vacation packages for Vietnam: Ha Long Bay and Hoi An',
      'Budget-friendly beaches in Thailand perfect for families',
      'A backpacker guide to solo travel in India'])
</pre>

<p>A common use case for the semantic ranker is to rerank the results returned
    by vector search for better query ordering. The following example shows how to
    use the semantic ranking model for this use case. The example retrieves an
    initial result set for the query <code>personal fitness
    equipment</code> using vector search. These results are then re-ranked to
    return the top five results.
</p>

<pre class="prettyprint lang-sh">
    WITH initial_ranking AS (
      SELECT id, description, ROW_NUMBER() OVER () AS ref_number
      FROM product
      ORDER BY
        embedding <=> google_ml.embedding(
          'gemini-embedding-001', 'personal fitness equipment')::vector
      LIMIT 10
    ), reranked_results AS (
      SELECT index, score
      FROM ai.rank(
          model_id => 'semantic-ranker-default-003',
          search_string => 'personal fitness equipment',
          documents => (SELECT ARRAY_AGG(description ORDER BY ref_number) FROM initial_ranking),
          top_n => 5)
    )
    SELECT id, description
    FROM initial_ranking, reranked_results
    WHERE initial_ranking.ref_number = reranked_results.index
    ORDER BY reranked_results.score DESC;
  </pre>

  <p>For a list of available models and use cases, see <a href="/generative-ai-app-builder/docs/ranking#models">Supported models</a>.</p>

Intégrer Vertex AI et installer l'extension

Pour en savoir plus, consultez Configurer votre installation AlloyDB Omni pour interroger des modèles basés sur le cloud.

Rôles requis

Pour obtenir les autorisations nécessaires pour utiliser les modèles de classement de Discovery Engine, demandez à votre administrateur d'accorder au compte de service AlloyDB Omni le rôle de Identity and Access Management (IAM) Lecteur Discovery Engine (roles/discoveryengine.viewer) sur your project. Pour en savoir plus sur l'attribution de rôles, consultez Gérer l'accès aux projets, aux dossiers et aux organisations.

Vous pouvez également obtenir les autorisations requises via des rôles personnalisés ou d'autres rôles prédéfinis.

Classer vos résultats de recherche

La requête SQL suivante montre comment classer vos résultats de recherche :

SELECT
  ai.rank(
    model_id => 'MODEL_ID',
    search_string => 'SEARCH_STRING',
    documents => ARRAY['DOCUMENT_1', 'DOCUMENT_2', 'DOCUMENT_3']);

Remplacez les éléments suivants :

Paramètre Description
MODEL_ID ID unique du point de terminaison de modèle que vous définissez.
SEARCH_STRING Chaîne de recherche par rapport à laquelle les enregistrements sont classés.
DOCUMENTS Tableau de chaînes de texte uniques que vous souhaitez classer.

Pour obtenir la liste des modèles de classement Vertex AI compatibles, consultez Modèles compatibles.

Exemples

Pour classer les résultats de recherche à l'aide d'un modèle de classement Vertex AI, exécutez la requête suivante :

SELECT index, score
FROM
  ai.rank(
    model_id => 'semantic-ranker-default-003',
    search_string => 'AlloyDB is a PostgreSQL compatible AI database that is ready for production.',
    documents =>
      ARRAY[
        'Alloys are made from combination of metals',
        'The best enterprise-ready PostgreSQL database.',
        'You can feel the heat in Alloy apartments.']);

La réponse est un tableau qui affiche chaque document et le score en fonction de sa pertinence par rapport à la requête de recherche. Voici un exemple de réponse :

 index | score
-------+------------
     2 |  0.33
     1 |  0.28
     3 |  0.16
(3 rows)

Prenons l'exemple d'une base de données AlloyDB Omni contenant une liste de descriptions d'avis converties en embeddings. L'exemple de code suivant montre comment utiliser le modèle de classement pour récupérer le nom des produits les mieux classés en fonction de la similarité sémantique de leurs descriptions d'avis avec une requête.

WITH initial_ranking AS (
    SELECT product_id, name, review, review_id, ROW_NUMBER() OVER () AS ref_number
    FROM user_reviews
    ORDER BY
      review_desc_embedding <=> google_ml.embedding(
        'gemini-embedding-001', 'good desserts')::vector
    LIMIT 10
  ), reranked_results AS (
    SELECT index, score
    FROM
      ai.rank(
        model_id => 'semantic-ranker-512',
        search_string => 'good desserts',
        documents => (SELECT ARRAY_AGG(review ORDER BY ref_number) FROM initial_ranking),
        top_n => 5)
  )
SELECT product_id, name
FROM initial_ranking, reranked_results
WHERE initial_ranking.ref_number = reranked_results.index
ORDER BY reranked_results.score DESC;

Étape suivante