Classer et reclasser des documents avec la génération augmentée par récupération

Dans le cadre de votre expérience de génération augmentée par récupération (RAG) dans Vertex AI Agent Builder, vous pouvez classer un ensemble de documents en fonction d'une requête.

L'API de classement prend une liste de documents et les classe à nouveau en fonction de leur pertinence par rapport à une requête. Contrairement aux représentations vectorielles continues, qui ne tiennent compte que de la similarité sémantique d'un document et d'une requête, l'API de classement peut vous fournir des scores précis sur la qualité de la réponse d'un document à une requête donnée. L'API de classement peut être utilisée pour améliorer la qualité des résultats de recherche après avoir récupéré un ensemble initial de documents candidats.

L'API de classement est sans état. Il n'est donc pas nécessaire d'indexer les documents avant d'appeler l'API. Il vous suffit de transmettre la requête et les documents. L'API est donc particulièrement adaptée pour reclasser les documents de Vector Search et d'autres solutions de recherche.

Cette page explique comment utiliser l'API de classement pour classer un ensemble de documents en fonction d'une requête.

Cas d'utilisation

Le principal cas d'utilisation de l'API de classement est d'améliorer la qualité des résultats de recherche.

Toutefois, l'API de classement peut être utile dans tous les cas où vous devez trouver les contenus les plus pertinents par rapport à la requête d'un utilisateur. Par exemple, l'API de classement peut vous aider à:

  • Trouver le bon contenu à transmettre à un LLM pour l'ancrage

  • Améliorer la pertinence d'une expérience de recherche existante

  • Identifier les sections pertinentes d'un document

Le flux suivant décrit comment utiliser l'API de classement pour améliorer la qualité des résultats pour les documents segmentés:

  1. Utilisez l'API Document AI Layout Parser pour diviser un ensemble de documents en fragments.

  2. Utilisez une API d'embeddings pour créer des embeddings pour chacun des segments.

  3. Chargez les embeddings dans Vector Search ou dans une autre solution de recherche.

  4. Interrogez votre index de recherche et récupérez les segments les plus pertinents.

  5. Reclassez les segments pertinents à l'aide de l'API de classement.

Données d'entrée

L'API de classement nécessite les entrées suivantes:

  • Requête pour laquelle vous classez les enregistrements.

    Exemple :

    "query": "Why is the sky blue?"
    
  • Ensemble d'enregistrements pertinents pour la requête. Les enregistrements sont fournis sous la forme d'un tableau d'objets. Chaque enregistrement peut inclure un identifiant unique, un titre et le contenu du document. Pour chaque enregistrement, incluez un titre, un contenu ou les deux. Si la longueur du titre et du contenu dépasse 512 jetons, le contenu supplémentaire est tronqué. Vous pouvez inclure jusqu'à 200 enregistrements par requête.

    Par exemple, un tableau d'enregistrements se présente comme suit : En réalité, de nombreux autres enregistrements seraient inclus dans le tableau et le contenu serait beaucoup plus long:

    "records": [
       {
           "id": "1",
           "title": "The Color of the Sky: A Poem",
           "content": "A canvas stretched across the day,\nWhere sunlight learns to dance and play.\nBlue, a hue of scattered light,\nA gentle whisper, soft and bright."
       },
       {
           "id": "2",
           "title": "The Science of a Blue Sky",
           "content": "The sky appears blue due to a phenomenon called Rayleigh scattering. Sunlight is comprised of all the colors of the rainbow. Blue light has shorter wavelengths than other colors, and is thus scattered more easily."
       }
    ]
    
  • Facultatif: Nombre maximal d'enregistrements que vous souhaitez que l'API de classement renvoie. Par défaut, tous les enregistrements sont renvoyés. Toutefois, vous pouvez utiliser le champ topN pour renvoyer moins d'enregistrements. Tous les enregistrements sont classés, quelle que soit la valeur définie.

    Par exemple, la requête suivante renvoie les 10 meilleurs enregistrements:

    "topN": 10,
    
  • Facultatif: paramètre qui spécifie si vous souhaitez uniquement que l'ID de l'enregistrement soit renvoyé par l'API ou si vous souhaitez également que le titre et le contenu de l'enregistrement soient renvoyés. Par défaut, l'enregistrement complet est renvoyé. La raison principale de définir cette valeur est que vous souhaitez réduire la taille de la charge utile de la réponse.

    Par exemple, la valeur true ne renvoie que l'ID d'enregistrement, et non le titre ni le contenu:

    "ignoreRecordDetailsInResponse": true,
    
  • Facultatif: nom du modèle. Ce paramètre spécifie le modèle à utiliser pour classer les documents. Si aucun modèle n'est spécifié, semantic-ranker-512@latest est utilisé, ce qui pointe automatiquement vers le dernier modèle disponible. Pour faire référence à un modèle spécifique, spécifiez l'un des noms de modèle listés dans Modèles compatibles, par exemple semantic-ranker-512-002.

    Dans l'exemple suivant, model est défini sur semantic-ranker-512@latest. Cela signifie que l'API de classement utilisera toujours le dernier modèle disponible.

    "model": "semantic-ranker-512@latest"
    

Données de sortie

L'API de classement renvoie une liste d'enregistrements classés avec les résultats suivants:

  • Score: valeur flottante comprise entre 0 et 1 qui indique la pertinence de l'enregistrement.

  • ID: identifiant unique de l'enregistrement.

  • Si nécessaire, l'objet complet: l'ID, le titre et le contenu.

    Exemple :

{
    "records": [
        {
            "id": "2",
            "score": 0.98,
            "title": "The Science of a Blue Sky",
            "content": "The sky appears blue due to a phenomenon called Rayleigh scattering. Sunlight is comprised of all the colors of the rainbow. Blue light has shorter wavelengths than other colors, and is thus scattered more easily."
        },
        {
            "id": "1",
            "score": 0.64,
            "title": "The Color of the Sky: A Poem",
            "content": "A canvas stretched across the day,\nWhere sunlight learns to dance and play.\nBlue, a hue of scattered light,\nA gentle whisper, soft and bright."
        }
    ]
}

Classer (ou reclasser) un ensemble d'enregistrements en fonction d'une requête

En règle générale, vous fournissez à l'API de classement une requête et un ensemble d'enregistrements pertinents pour cette requête et qui ont déjà été classés par une autre méthode, telle qu'une recherche par mot clé ou une recherche vectorielle. Vous utilisez ensuite l'API de classement pour améliorer la qualité du classement et déterminer un score qui indique la pertinence de chaque enregistrement par rapport à la requête.

  1. Obtenez la requête et les enregistrements qui en résultent. Assurez-vous que chaque enregistrement comporte un ID et un titre, un contenu ou les deux.

    Le modèle accepte jusqu'à 512 jetons par enregistrement. Si la longueur combinée du titre et du contenu dépasse 512 jetons, le contenu supplémentaire est tronqué.

  2. Appelez la méthode rankingConfigs.rank à l'aide du code suivant:

REST

curl -X POST \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
-H "Content-Type: application/json" \
-H "X-Goog-User-Project: PROJECT_ID" \
"https://discoveryengine.googleapis.com/v1/projects/PROJECT_ID/locations/global/rankingConfigs/default_ranking_config:rank" \
-d '{
"model": "semantic-ranker-512@latest",
"query": "QUERY",
"records": [
    {
        "id": "RECORD_ID_1",
        "title": "TITLE_1",
        "content": "CONTENT_1"
    },
    {
        "id": "RECORD_ID_2",
        "title": "TITLE_2",
        "content": "CONTENT_2"
    },
    {
        "id": "RECORD_ID_3",
        "title": "TITLE_3",
        "content": "CONTENT_3"
    }
]
}'

Remplacez les éléments suivants :

  • PROJECT_ID: ID de votre projet Google Cloud.
  • QUERY: requête sur laquelle les enregistrements sont classés et évalués.
  • RECORD_ID_n: chaîne unique qui identifie l'enregistrement.
  • TITLE_n: titre de l'enregistrement.
  • CONTENT_n: contenu de l'enregistrement.

Pour en savoir plus sur cette méthode, consultez rankingConfigs.rank.

Cliquez ici pour voir un exemple de commande curl et de réponse.

    curl -X POST \
    -H "Authorization: Bearer $(gcloud auth print-access-token)" \
    -H "Content-Type: application/json" \
    -H "X-Goog-User-Project: my-project-123" \
    "https://discoveryengine.googleapis.com/v1/projects/my-project-123/locations/global/rankingConfigs/default_ranking_config:rank" \
    -d '{
        "model": "semantic-ranker-512@latest",
        "query": "what is Google gemini?",
        "records": [
            {
                "id": "1",
                "title": "Gemini",
                "content": "The Gemini zodiac symbol often depicts two figures standing side-by-side."
            },
            {
                "id": "2",
                "title": "Gemini",
                "content": "Gemini is a cutting edge large language model created by Google."
            },
            {
                "id": "3",
                "title": "Gemini Constellation",
                "content": "Gemini is a constellation that can be seen in the night sky."
            }
        ]
    }'
    
{
    "records": [
        {
            "id": "2",
            "title": "Gemini",
            "content": "Gemini is a cutting edge large language model created by Google.",
            "score": 0.97
        },
        {
            "id": "3",
            "title": "Gemini Constellation",
            "content": "Gemini is a constellation that can be seen in the night sky.",
            "score": 0.18
        },
        {
            "id": "1",
            "title": "Gemini",
            "content": "The Gemini zodiac symbol often depicts two figures standing side-by-side.",
            "score": 0.05
        }
    ]
}

Python

Pour en savoir plus, consultez la documentation de référence de l'API Python de Vertex AI Agent Builder.

Pour vous authentifier auprès de Vertex AI Agent Builder, configurez les Identifiants par défaut de l'application. Pour en savoir plus, consultez Configurer l'authentification pour un environnement de développement local.

from google.cloud import discoveryengine_v1 as discoveryengine

# TODO(developer): Uncomment these variables before running the sample.
# project_id = "YOUR_PROJECT_ID"

client = discoveryengine.RankServiceClient()

# The full resource name of the ranking config.
# Format: projects/{project_id}/locations/{location}/rankingConfigs/default_ranking_config
ranking_config = client.ranking_config_path(
    project=project_id,
    location="global",
    ranking_config="default_ranking_config",
)
request = discoveryengine.RankRequest(
    ranking_config=ranking_config,
    model="semantic-ranker-512@latest",
    top_n=10,
    query="What is Google Gemini?",
    records=[
        discoveryengine.RankingRecord(
            id="1",
            title="Gemini",
            content="The Gemini zodiac symbol often depicts two figures standing side-by-side.",
        ),
        discoveryengine.RankingRecord(
            id="2",
            title="Gemini",
            content="Gemini is a cutting edge large language model created by Google.",
        ),
        discoveryengine.RankingRecord(
            id="3",
            title="Gemini Constellation",
            content="Gemini is a constellation that can be seen in the night sky.",
        ),
    ],
)

response = client.rank(request=request)

# Handle the response
print(response)

Modèles compatibles

Les modèles suivants sont disponibles.

Nom du modèle Dernier modèle (semantic-ranker-512@latest) Entrée Fenêtre de contexte Date de disponibilité Date d'arrêt
semantic-ranker-512-003 Oui Texte (25 langues) 512 10 septembre 2024 À déterminer
semantic-ranker-512-002 Non Texte (en uniquement) 512 3 juin 2024 À déterminer

Étape suivante

Découvrez comment utiliser la méthode de classement avec d'autres API de RAG pour générer des réponses étayées à partir de données non structurées.