Générer des réponses ancrées avec le RAG

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 générer des réponses ancrées aux requêtes en fonction des sources d'ancrage suivantes:

  • Recherche Google: utilisez l'ancrage avec la recherche Google si vous souhaitez associer le modèle à des connaissances du monde entier, à un large éventail de sujets ou à des informations à jour sur Internet. L'ancrage dans la recherche Google est compatible avec la récupération dynamique, qui vous permet de générer des résultats ancrés avec la recherche Google uniquement lorsque cela est nécessaire. Par conséquent, la configuration de la récupération dynamique évalue si une invite nécessite des connaissances sur les événements récents et active l'ancrage avec la recherche Google. Pour en savoir plus, consultez la section Récupération dynamique.
  • Texte intégré: utilisez l'ancrage avec du texte intégré pour ancrer la réponse dans des éléments de texte appelés texte factuel fournis dans la requête. Un texte factuel est une déclaration fournie par l'utilisateur qui est considérée comme factuelle pour une requête donnée. Le modèle ne vérifie pas l'authenticité du texte factuel.
  • Data stores Vertex AI Search: utilisez l'ancrage avec Vertex AI Search si vous souhaitez connecter le modèle à vos documents d'entreprise à partir de data stores Vertex AI Search.

Cette page explique comment générer des réponses étayées sur ces sources d'ancrage à l'aide des approches suivantes:

Vous pouvez également choisir de lire les réponses du modèle en streaming. La génération d'une réponse fondée en streaming est une fonctionnalité expérimentale.

Vous pouvez utiliser d'autres méthodes pour générer des réponses fondées, en fonction de votre application. Pour en savoir plus, consultez les API Vertex AI pour créer des expériences de recherche et de classification des risques.

Terminologie

Avant d'utiliser la méthode de génération de réponses fondées, il est utile de comprendre les entrées et les sorties, comment structurer votre requête et la terminologie liée à la RAG.

Termes RAG

La génération augmentée par récupération est une méthodologie qui permet aux grands modèles de langage (LLM) de générer des réponses basées sur votre source de données de choix. La classification RAG comporte deux étapes:

  1. Récupération: il peut être courant de rencontrer des problèmes de recherche pour obtenir rapidement les faits les plus pertinents. Avec le RAG, vous pouvez rapidement récupérer les faits importants pour générer une réponse.
  2. Génération:le LLM utilise les faits récupérés pour générer une réponse fondée.

Par conséquent, la méthode de génération de réponses ancrées récupère les faits à partir de la source d'ancrage et génère une réponse ancrée.

Données d'entrée

La méthode de génération de réponses ancrées nécessite les entrées suivantes dans la requête:

  • Rôle: expéditeur d'un texte donné, qui peut être un utilisateur (user) ou un modèle (model).

  • Text (Texte) : lorsque le rôle est user, le texte est une invite. Lorsque le rôle est model, le texte est une réponse étayée. La manière dont vous spécifiez le rôle et le texte dans une requête est déterminée comme suit:

    • Pour une génération de réponse en une seule étape, l'utilisateur envoie le texte de la requête dans la requête et le modèle envoie le texte de la réponse dans la réponse.
    • Pour une génération de réponse multi-tours, la requête contient la paire d'invite-réponse pour tous les tours précédents et le texte de l'invite de l'utilisateur pour le tour en cours. Par conséquent, dans une telle requête, le rôle est user pour un texte d'invite et model pour le texte de réponse.
  • Instruction système: préambule de votre requête qui régit le comportement du modèle et modifie la sortie en conséquence. Par exemple, vous pouvez ajouter un persona à la réponse générée ou demander au modèle de mettre en forme le texte de sortie d'une certaine manière. Pour générer des réponses multi-tours, vous devez fournir des instructions au système à chaque tour. Pour en savoir plus, consultez la section Utiliser les instructions système.

  • Source d'ancrage: source sur laquelle la réponse est fondée. Elle peut être une ou plusieurs des sources suivantes:

    • Recherche Google: ancrez les réponses avec les résultats de recherche Google. Lorsque la source de référence est la recherche Google, vous pouvez spécifier une configuration de récupération dynamique avec un seuil de récupération dynamique. Pour en savoir plus, consultez la section Récupération dynamique.

    • Texte intégré: basez la réponse sur le texte factuel fourni dans la requête. Un texte factuel est une déclaration fournie par l'utilisateur qui est considérée comme factuelle pour une requête donnée. Le modèle ne vérifie pas l'authenticité du texte factuel. Vous pouvez fournir jusqu'à 100 textes factuels dans chaque source de texte intégrée. Les textes factuels peuvent être acceptés à l'aide d'attributs méta, tels que le titre, l'auteur et l'URI. Ces attributs méta sont renvoyés dans la réponse lorsque vous citez les segments qui étayent la réponse.

    • Data stores Vertex AI Search: ancrez la réponse dans les documents provenant des data stores Vertex AI Search. Vous ne pouvez pas spécifier un data store de recherche de site Web comme source d'ancrage.

    Dans une requête donnée, vous pouvez fournir à la fois une source de texte intégrée et une source de data store Vertex AI Search. Vous ne pouvez pas combiner la recherche Google avec ces deux sources. Par conséquent, si vous souhaitez ancrer vos réponses avec les résultats de recherche Google, vous devez envoyer une requête distincte spécifiant la recherche Google comme seule source d'ancrage.

    Vous pouvez fournir jusqu'à 10 sources de terre dans n'importe quel ordre. Par exemple, supposons que vous fournissiez les sources de mise à la terre avec le nombre suivant, dans l'ordre suivant pour obtenir un total de 10 sources de mise à la terre:

    • Trois sources de texte intégrées, chacune pouvant contenir au maximum 100 textes factuels
    • Six data stores Vertex AI Search
    • Une source de texte intégrée, contenant un maximum de 100 textes factuels

    Chaque source se voit attribuer un indice dans l'ordre dans lequel elle est spécifiée dans la requête. Par exemple, si vous avez spécifié une combinaison de sources dans votre requête, l'index de la source est attribué comme illustré dans le tableau suivant:

    Source d'ancrage Index
    Texte intégré 1 0
    Texte intégré 2 1
    Data store Vertex AI Search 1 2
    Texte intégré 3 3
    Data store Vertex AI Search 2 4

    Cet indice est cité dans la réponse et est utile pour suivre la provenance.

  • Spécifications de génération: spécifications de la configuration du modèle, qui se composent des informations suivantes:

    • ID du modèle: spécifie le modèle Vertex AI Gemini à utiliser pour générer des réponses. Pour obtenir la liste des modèles que vous pouvez utiliser pour générer des réponses fondées, consultez la section Modèles compatibles.
    • Paramètres du modèle: spécifiez les paramètres que vous pouvez définir pour le modèle que vous choisissez d'utiliser. Voici les paramètres en question: langue, température, top-P et top-K. Pour en savoir plus sur ces paramètres, consultez la section Paramètres du modèle Gemini.

Données de sortie

La réponse générée par le modèle est appelée candidat et contient les données suivantes. Il est possible que tous les champs ne soient pas présents dans la sortie.

  • Rôle: expéditeur de la réponse étayée. La réponse contient toujours le texte de la réponse étayée. Par conséquent, le rôle dans une réponse est toujours un modèle.

  • Text: Réponse étayée.

  • Score d'ancrage: valeur flottante comprise dans la plage [0, 1] qui indique dans quelle mesure une réponse est fondée sur les sources données.

  • Métadonnées de mise à la terre: métadonnées sur la source de mise à la terre. Les métadonnées de référence contiennent les informations suivantes:

    • Blocs de justification: liste des blocs qui justifient la réponse. Un indice de bloc d'assistance est attribué à chaque bloc d'assistance, ce qui est utile pour suivre la provenance. Chaque bloc d'assistance contient les éléments suivants:

      • Texte de bloc: partie du texte citée textuellement à partir de la source à partir de laquelle la réponse ou une partie de la réponse (appelée texte de la revendication) est extraite. Il est possible que cet élément ne soit pas toujours présent dans la réponse.
      • Source: index attribué à la source dans la requête.
      • Métadonnées source: métadonnées sur le segment. Selon la source, les métadonnées de la source peuvent être l'une des suivantes:

        • Pour une source intégrée, les métadonnées peuvent être les informations supplémentaires spécifiées dans la requête, telles que le titre, l'auteur ou l'URI.
        • Pour le data store Vertex AI Search, les métadonnées peuvent être l'ID du document, le titre du document, l'URI (emplacement Cloud Storage) ou le numéro de page.
        • Pour l'ancrage avec la recherche Google, lorsqu'un résultat ancré est généré, les métadonnées contiennent un URI qui redirige vers l'éditeur du contenu utilisé pour générer le résultat ancré. Les métadonnées contiennent également le domaine de l'éditeur. Les URI fournis restent accessibles jusqu'à 30 jours après la génération du résultat.
    • Ancrage: informations d'ancrage pour une affirmation dans la réponse. Le support de mise à la terre contient les informations suivantes:

      • Texte de la revendication: réponse ou partie de la réponse étayée par le texte du bloc d'informations.
      • Indice de bloc d'assistance: indice attribué au bloc d'assistance dans l'ordre dans lequel le bloc apparaît dans la liste des blocs d'assistance.
      • Requêtes de recherche Web: requêtes de recherche suggérées pour les suggestions de recherche Google.
      • Suggestions de recherche: si vous recevez des suggestions de recherche Google avec une réponse, cette réponse est un "Résultat ancré" soumis aux conditions d'utilisation du service d'ancrage dans la recherche Google. Pour en savoir plus, consultez les Conditions d'utilisation du service . Le champ renderedContent dans le champ searchEntryPoint est le code fourni pour implémenter les suggestions de recherche Google. Pour utiliser les suggestions de recherche Google, consultez Utiliser les suggestions de recherche Google.

Générer une réponse pertinente en un seul tour

Cette section explique comment générer des réponses basées sur les sources suivantes:

Ancrer la réponse dans le texte intégré et le data store Vertex AI Search

L'exemple suivant montre comment envoyer du texte d'invite en spécifiant un texte intégré et un data store Vertex AI Search comme source d'ancrage. Vous ne pouvez pas spécifier un data store de recherche sur un site Web comme source de référence. Cet exemple utilise la méthode generateGroundedContent.

REST

  1. Envoyez l'invite dans la requête curl suivante.

    curl -X POST \
    -H "Authorization: Bearer $(gcloud auth print-access-token)" \
    -H "Content-Type: application/json" \
    "https://discoveryengine.googleapis.com/v1/projects/PROJECT_NUMBER/locations/global:generateGroundedContent" \
    -d '
    {
    "contents": [
     {
       "role": "user",
       "parts": [
         {
           "text": "PROMPT_TEXT"
         }
       ]
     }
    ],
    "systemInstruction": {
       "parts": {
           "text": "SYSTEM_INSTRUCTION"
       }
    },
    "groundingSpec": {
     "groundingSources": [
       {
         "inlineSource": {
           "groundingFacts": [
             {
               "factText": "FACT_TEXT_1",
               "attributes": {
                 "title": "TITLE_1",
                 "uri": "URI_1",
                 "author": "AUTHOR_1"
               }
             }
           ]
         }
       },
       {
         "inlineSource": {
           "groundingFacts": [
             {
               "factText": "FACT_TEXT_2",
               "attributes": {
                 "title": "TITLE_2",
                 "uri": "URI_2"
               }
             },
             {
               "factText": "FACT_TEXT_3",
               "attributes": {
                 "title": "TITLE_3",
                 "uri": "URI_3"
               }
             }
           ]
         }
       },
       {
         "searchSource": {
           "servingConfig": "projects/PROJECT_NUMBER/locations/global/collections/default_collection/engines/APP_ID_1/servingConfigs/default_search"
         }
       },
       {
         "searchSource": {
           "servingConfig": "projects/PROJECT_NUMBER/locations/global/collections/default_collection/engines/APP_ID_2/servingConfigs/default_search"
         }
       }
      ]
    },
    "generationSpec": {
      "modelId": "MODEL_ID",
      "temperature": TEMPERATURE,
      "topP": TOP_P,
      "topK": TOP_K
    }
    }'
    

    Remplacez les éléments suivants :

    • PROJECT_NUMBER: numéro de votre projet Google Cloud.
    • PROMPT_TEXT : invite de l'utilisateur.
    • SYSTEM_INSTRUCTION : champ facultatif permettant de fournir un préambule ou un contexte supplémentaire.
    • FACT_TEXT_N : texte intégré pour étayer la réponse. Vous pouvez fournir un maximum de 100 textes factuels.
    • TITLE_N : champ facultatif permettant de définir l'attribut de métadonnées "title" pour le texte intégré.
    • URI_N : champ facultatif permettant de définir l'attribut méta URI pour le texte intégré.
    • AUTHOR_N : champ facultatif permettant de définir l'attribut méta auteur pour le texte intégré.
    • APP_ID_N: ID de l'application Vertex AI Search.
    • MODEL_ID : champ facultatif permettant de définir l'ID du modèle Gemini que vous souhaitez utiliser pour générer la réponse étayée. Pour obtenir la liste des ID de modèle disponibles, consultez la section Modèles compatibles.
    • TEMPERATURE : champ facultatif permettant de définir la température utilisée pour l'échantillonnage. Google recommande une température de 0,0. Pour en savoir plus, consultez la section Paramètres du modèle Gemini.
    • TOP_P : champ facultatif permettant de définir la valeur de P supérieure pour le modèle. Pour en savoir plus, consultez la section Paramètres du modèle Gemini.
    • TOP_K : champ facultatif permettant de définir la valeur top-K du modèle. Pour en savoir plus, consultez la section Paramètres du modèle Gemini.

Python

from google.cloud import discoveryengine_v1 as discoveryengine

# TODO(developer): Uncomment these variables before running the sample.
# project_number = "YOUR_PROJECT_NUMBER"
# engine_id = "YOUR_ENGINE_ID"

client = discoveryengine.GroundedGenerationServiceClient()

request = discoveryengine.GenerateGroundedContentRequest(
    # The full resource name of the location.
    # Format: projects/{project_number}/locations/{location}
    location=client.common_location_path(project=project_number, location="global"),
    generation_spec=discoveryengine.GenerateGroundedContentRequest.GenerationSpec(
        model_id="gemini-1.5-flash",
    ),
    # Conversation between user and model
    contents=[
        discoveryengine.GroundedGenerationContent(
            role="user",
            parts=[
                discoveryengine.GroundedGenerationContent.Part(
                    text="How did Google do in 2020? Where can I find BigQuery docs?"
                )
            ],
        )
    ],
    system_instruction=discoveryengine.GroundedGenerationContent(
        parts=[
            discoveryengine.GroundedGenerationContent.Part(
                text="Add a smiley emoji after the answer."
            )
        ],
    ),
    # What to ground on.
    grounding_spec=discoveryengine.GenerateGroundedContentRequest.GroundingSpec(
        grounding_sources=[
            discoveryengine.GenerateGroundedContentRequest.GroundingSource(
                inline_source=discoveryengine.GenerateGroundedContentRequest.GroundingSource.InlineSource(
                    grounding_facts=[
                        discoveryengine.GroundingFact(
                            fact_text=(
                                "The BigQuery documentation can be found at https://cloud.google.com/bigquery/docs/introduction"
                            ),
                            attributes={
                                "title": "BigQuery Overview",
                                "uri": "https://cloud.google.com/bigquery/docs/introduction",
                            },
                        ),
                    ]
                ),
            ),
            discoveryengine.GenerateGroundedContentRequest.GroundingSource(
                search_source=discoveryengine.GenerateGroundedContentRequest.GroundingSource.SearchSource(
                    # The full resource name of the serving config for a Vertex AI Search App
                    serving_config=f"projects/{project_number}/locations/global/collections/default_collection/engines/{engine_id}/servingConfigs/default_search",
                ),
            ),
        ]
    ),
)
response = client.generate_grounded_content(request)

# Handle the response
print(response)

Exemple de génération de réponse en une seule étape basée sur le texte intégré et Vertex AI Search

Dans l'exemple suivant, la requête spécifie les sources d'ancrage suivantes: un fait textuel intégré et un data store Vertex AI Search. Cet exemple utilise la méthode generateGroundedContent. Cet exemple utilise également une instruction système pour terminer la réponse par un emoji souriant.

REST

curl -X POST \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
-H "Content-Type: application/json" \
"https://discoveryengine.googleapis.com/v1/projects/123456/locations/global:generateGroundedContent" \
-d '
{
  "contents": [
    {
      "role": "user",
      "parts": [
        {
          "text": "How did google do in 2020? Where can I find Bigquery docs?"
        }
      ]
    }
  ],
  "systemInstruction": {
      "parts": {
          "text": "Add a smiley emoji after the answer."
      }
  },
  "groundingSpec": {
    "groundingSources": [
      {
        "inline_source": {
          "grounding_facts": [
            {
              "fact_text": "The BigQuery documentation can be found at https://cloud.google.com/bigquery/docs/introduction",
              "attributes": {
                "title": "BigQuery Overview",
                "uri": "https://cloud.google.com/bigquery/docs/introduction"
              }
            }
          ]
        }
      },
      {
        "searchSource": {
          "servingConfig": "projects/123456/locations/global/collections/default_collection/engines/app_id_example/servingConfigs/default_search"
        }
      }
    ]
  },
  "generationSpec": {
    "modelId": "gemini-1.5-flash"
  }
}'

Générer une réponse ancrée avec la recherche Google

Vous pouvez ancrer les réponses générées avec des données Web accessibles au public.

Récupération dynamique

Vous pouvez utiliser la récupération dynamique dans votre requête pour choisir quand désactiver l'ancrage dans la recherche Google. Cette option est utile lorsque la requête n'exige pas de réponse basée sur la recherche Google et que les modèles compatibles peuvent fournir une réponse basée sur leurs connaissances sans ancrage. Cela vous permet de gérer plus efficacement la latence, la qualité et les coûts.

Score et seuil de prédiction de la récupération dynamique

Lorsque vous envoyez une requête pour générer une réponse fondée, Vertex AI Agent Builder attribue un score de prédiction à la requête. Le score de prédiction est une valeur à virgule flottante comprise dans la plage [0,1]. Sa valeur dépend de la possibilité d'ancrer la réponse avec les informations les plus récentes de la recherche Google. Par conséquent, une requête qui nécessite une réponse basée sur les faits les plus récents sur le Web a un score de prédiction plus élevé, et une requête pour laquelle une réponse générée par un modèle est suffisante a un score de prédiction plus faible.

Voici quelques exemples de requêtes et de scores de prédiction.

Requête Score de prédiction Commentaire
"Écris un poème sur les pivoines" 0,13 Le modèle peut s'appuyer sur ses connaissances, et la réponse n'a pas besoin d'être ancrée.
"Suggérez un jouet pour un enfant de 2 ans" 0,36 Le modèle peut s'appuyer sur ses connaissances, et la réponse n'a pas besoin d'être ancrée.
"Pouvez-vous me donner la recette d'un guacamole inspiré de l'Asie ?" 0.55 La recherche Google peut fournir une réponse justifiée, mais l'ancrage n'est pas strictement nécessaire : les connaissances du modèle peuvent suffire.
"Qu'est-ce qu'Agent Builder ? Comment la mise à la terre est-elle facturée dans Agent Builder ?" 0.72 Nécessite la recherche Google pour générer une réponse pertinente
"Qui a remporté le dernier Grand Prix de Formule 1 ?" 0,97 Nécessite la recherche Google pour générer une réponse pertinente

Dans votre requête de génération de réponses étayées, vous pouvez spécifier une configuration de récupération dynamique avec un seuil. Le seuil est une valeur à virgule flottante comprise dans la plage [0,1] et sa valeur par défaut est 0,7. Si la valeur du seuil est nulle, la réponse est toujours ancrée dans la recherche Google. Pour toutes les autres valeurs de seuil, les éléments suivants s'appliquent:

  • Si le score de prédiction est supérieur ou égal au seuil, la réponse est basée sur la recherche Google. Un seuil inférieur implique que davantage de requêtes génèrent des réponses à l'aide de l'ancrage avec la recherche Google.
  • Si le score de prédiction est inférieur au seuil, le modèle peut toujours générer la réponse, mais elle n'est pas ancrée dans la recherche Google.

Pour trouver un bon seuil adapté aux besoins de votre entreprise, vous pouvez créer un ensemble représentatif des requêtes que vous êtes susceptible de rencontrer. Vous pouvez ensuite trier les requêtes en fonction du score de prédiction dans la réponse et sélectionner un bon seuil pour votre cas d'utilisation.

Ancrer la réponse avec la recherche Google

L'exemple suivant montre comment générer une réponse étayée à partir d'une invite en spécifiant la recherche Google comme source d'ancrage. Cet exemple utilise la méthode generateGroundedContent.

REST

  1. Envoyez l'invite dans la requête curl suivante.

    curl -X POST \
    -H "Authorization: Bearer $(gcloud auth print-access-token)" \
    -H "Content-Type: application/json" \
    "https://discoveryengine.googleapis.com/v1/projects/PROJECT_NUMBER/locations/global:generateGroundedContent" \
    -d '
    {
    "contents": [
     {
       "role": "user",
       "parts": [
         {
           "text": "PROMPT_TEXT"
         }
       ]
     }
    ],
    "systemInstruction": {
       "parts": {
           "text": "SYSTEM_INSTRUCTION"
       }
    },
    "groundingSpec": {
     "groundingSources": [
     {
         "googleSearchSource": {
              "dynamicRetrievalConfig": {
                  "predictor":{
                      "threshold": DYNAMIC_RETRIEVAL_THRESHOLD
                  }
              }
         }
     }
    ]
    },
    "generationSpec": {
     "modelId": "MODEL_ID",
     "temperature": TEMPERATURE,
     "topP": TOP_P,
     "topK": TOP_K
    }
    }'
    

    Remplacez les éléments suivants :

    • PROJECT_NUMBER: numéro de votre projet Google Cloud.
    • PROMPT_TEXT : invite de l'utilisateur.
    • SYSTEM_INSTRUCTION : champ facultatif permettant de fournir un préambule ou un contexte supplémentaire.
    • MODEL_ID : champ facultatif permettant de définir l'ID du modèle Gemini que vous souhaitez utiliser pour générer la réponse étayée. Pour obtenir la liste des ID de modèle disponibles, consultez la section Modèles compatibles.
    • TEMPERATURE : champ facultatif permettant de définir la température utilisée pour l'échantillonnage. Google recommande une température de 0,0. Pour en savoir plus, consultez la section Paramètres du modèle Gemini.
    • TOP_P : champ facultatif permettant de définir la valeur de P supérieure pour le modèle. Pour en savoir plus, consultez la section Paramètres du modèle Gemini.
    • TOP_K : champ facultatif permettant de définir la valeur top-K du modèle. Pour en savoir plus, consultez la section Paramètres du modèle Gemini.
    • DYNAMIC_RETRIEVAL_THRESHOLD: champ facultatif permettant de définir le seuil pour appeler la configuration de récupération dynamique. Il s'agit d'une valeur à virgule flottante comprise dans la plage [0,1]. Si vous ajoutez le champ dynamicRetrievalConfig, mais que vous ne définissez pas le champ predictor ou threshold, la valeur du seuil est définie par défaut sur 0,7. Si vous ne définissez pas le champ dynamicRetrievalConfig, la réponse est toujours basée sur la terre.

Python

from google.cloud import discoveryengine_v1 as discoveryengine

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

client = discoveryengine.GroundedGenerationServiceClient()

request = discoveryengine.GenerateGroundedContentRequest(
    # The full resource name of the location.
    # Format: projects/{project_number}/locations/{location}
    location=client.common_location_path(project=project_number, location="global"),
    generation_spec=discoveryengine.GenerateGroundedContentRequest.GenerationSpec(
        model_id="gemini-1.5-flash",
    ),
    # Conversation between user and model
    contents=[
        discoveryengine.GroundedGenerationContent(
            role="user",
            parts=[
                discoveryengine.GroundedGenerationContent.Part(
                    text="How much is Google stock?"
                )
            ],
        )
    ],
    system_instruction=discoveryengine.GroundedGenerationContent(
        parts=[
            discoveryengine.GroundedGenerationContent.Part(text="Be comprehensive.")
        ],
    ),
    # What to ground on.
    grounding_spec=discoveryengine.GenerateGroundedContentRequest.GroundingSpec(
        grounding_sources=[
            discoveryengine.GenerateGroundedContentRequest.GroundingSource(
                google_search_source=discoveryengine.GenerateGroundedContentRequest.GroundingSource.GoogleSearchSource(
                    # Optional: For Dynamic Retrieval
                    dynamic_retrieval_config=discoveryengine.GenerateGroundedContentRequest.DynamicRetrievalConfiguration(
                        predictor=discoveryengine.GenerateGroundedContentRequest.DynamicRetrievalConfiguration.DynamicRetrievalPredictor(
                            threshold=0.7
                        )
                    )
                )
            ),
        ]
    ),
)
response = client.generate_grounded_content(request)

# Handle the response
print(response)

Dans l'exemple suivant, la requête spécifie la recherche Google comme source d'ancrage. Cet exemple utilise la méthode generateGroundedContent. Cet exemple utilise également une instruction système pour terminer la réponse par un emoji souriant.

REST

curl -X POST \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
-H "Content-Type: application/json" \
"https://discoveryengine.googleapis.com/v1/projects/123456/locations/global:generateGroundedContent" \
-d '
{
"contents": [{
  "role": "user",
  "parts": [{
    "text": "What is vertex ai agent builder?"
}]
}],
"systemInstruction": {
   "parts": {
      "text": "Add a smiley emoji after the answer."
   }
},
"groundingSpec": {
  "groundingSources": [
  {
      "googleSearchSource": {
        "dynamicRetrievalConfig": {
               "predictor":{
                   "threshold": 0.6
               }
           }
      }
  }
 ]
},
"generationSpec": {
  "modelId": "gemini-1.5-flash"
}
}
'

Générer une réponse fondée en plusieurs tours

Dans la génération de réponses multi-tours, vous devez envoyer dans chaque requête tout le texte échangé entre l'utilisateur et le modèle dans tous les tours précédents. Cela garantit la continuité et conserve le contexte pour générer la réponse à la dernière requête.

Pour obtenir une réponse fondée en générant plusieurs réponses, procédez comme suit:

REST

Les exemples suivants montrent comment envoyer un texte d'invite de suivi sur plusieurs tours. Ces exemples utilisent la méthode generateGroundedContent et ancrent les réponses avec la recherche Google. Vous pouvez suivre une procédure similaire pour générer des réponses étayées à l'aide d'autres sources d'ancrage.

  1. Envoyez la première invite dans la requête curl suivante.

    curl -X POST \
    -H "Authorization: Bearer $(gcloud auth print-access-token)" \
    -H "Content-Type: application/json" \
    "https://discoveryengine.googleapis.com/v1/projects/PROJECT_NUMBER/locations/global:generateGroundedContent" \
    -d '
    {
    "contents": [
     {
       "role": "user",
       "parts": [
         {
           "text": "PROMPT_TEXT_TURN_1"
         }
       ]
     }
    ],
    "systemInstruction": {
       "parts": {
           "text": "SYSTEM_INSTRUCTION_TURN_1"
       }
    },
    "groundingSpec": {
     "groundingSources": [
       {
         "googleSearchSource": {}
       }
     ]
    },
    "generationSpec": {
     "modelId": "MODEL_ID",
     "temperature": TEMPERATURE,
     "topP": TOP_P,
     "topK": TOP_K
    }
    }'
    

    Remplacez les éléments suivants :

    • PROJECT_NUMBER: numéro de votre projet Google Cloud.
    • PROMPT_TEXT_TURN_1: texte de la requête de l'utilisateur au premier tour.
    • SYSTEM_INSTRUCTION_TURN_1 : champ facultatif permettant de fournir un préambule ou un contexte supplémentaire. Pour générer des réponses à plusieurs tours, vous devez fournir les instructions système pour chaque tour.
    • MODEL_ID : champ facultatif permettant de définir l'ID du modèle Gemini que vous souhaitez utiliser pour générer la réponse étayée. Pour obtenir la liste des ID de modèle disponibles, consultez la section Modèles compatibles.
    • TEMPERATURE : champ facultatif permettant de définir la température utilisée pour l'échantillonnage. Google recommande une température de 0,0. Pour en savoir plus, consultez la section Paramètres du modèle Gemini.
    • TOP_P : champ facultatif permettant de définir la valeur de P supérieure pour le modèle. Pour en savoir plus, consultez la section Paramètres du modèle Gemini.
    • TOP_K : champ facultatif permettant de définir la valeur top-K du modèle. Pour en savoir plus, consultez la section Paramètres du modèle Gemini.
  2. Envoyez la deuxième invite en guise de suivi. Ajoutez la première invite de l'utilisateur, suivie de la réponse correspondante du modèle pour le contexte.

    curl -X POST \
    -H "Authorization: Bearer $(gcloud auth print-access-token)" \
    -H "Content-Type: application/json" \
    "https://discoveryengine.googleapis.com/v1/projects/PROJECT_NUMBER/locations/global:generateGroundedContent" \
    -d '
    {
    "contents": [
     {
       "role": "user",
       "parts": [
         {
           "text": "PROMPT_TEXT_TURN_1"
         }
       ]
     },
     {
       "role": "model",
       "parts": [
         {
           "text": "ANSWER_TEXT_TURN_1"
         }
       ]
     },
     {
       "role": "user",
       "parts": [
         {
           "text": "PROMPT_TEXT_TURN_2"
         }
       ]
     }
    ],
    "systemInstruction": {
       "parts": {
           "text": "SYSTEM_INSTRUCTION_TURN_2"
       }
    },
    "groundingSpec": {
     "groundingSources": [
       {
         "googleSearchSource": {}
       }
     ]
    },
    "generationSpec": {
     "modelId": "MODEL_ID",
     "temperature": TEMPERATURE,
     "topP": TOP_P,
     "topK": TOP_K
    }
    }'
    

    Remplacez les éléments suivants :

    • PROJECT_NUMBER: numéro de votre projet Google Cloud.
    • PROMPT_TEXT_TURN_1: texte de la requête de l'utilisateur au premier tour.
    • ANSWER_TEXT_TURN_1: texte de réponse du modèle au premier tour.
    • PROMPT_TEXT_TURN_2: texte de la requête de l'utilisateur au cours du deuxième tour.
    • SYSTEM_INSTRUCTION_TURN_2 : champ facultatif permettant de fournir un préambule ou un contexte supplémentaire. Pour générer des réponses à plusieurs tours, vous devez fournir les instructions système pour chaque tour.
    • MODEL_ID : champ facultatif permettant de définir l'ID du modèle Gemini que vous souhaitez utiliser pour générer la réponse étayée. Pour obtenir la liste des ID de modèle disponibles, consultez la section Modèles compatibles.
    • TEMPERATURE : champ facultatif permettant de définir la température utilisée pour l'échantillonnage. Google recommande une température de 0,0. Pour en savoir plus, consultez la section Paramètres du modèle Gemini.
    • TOP_P : champ facultatif permettant de définir la valeur de P supérieure pour le modèle. Pour en savoir plus, consultez la section Paramètres du modèle Gemini.
    • TOP_K : champ facultatif permettant de définir la valeur top-K du modèle. Pour en savoir plus, consultez la section Paramètres du modèle Gemini.
  3. Répétez cette procédure pour obtenir d'autres réponses complémentaires. À chaque tour, ajoutez toutes les invites précédentes de l'utilisateur, suivies des réponses correspondantes du modèle.

Exemple de génération de réponses multitours

Dans l'exemple suivant, la requête spécifie trois textes factuels intégrés comme source d'ancrage pour générer des réponses sur deux tours. Cet exemple utilise la méthode generateGroundedContent. Cet exemple utilise également une instruction système pour terminer la réponse au premier tour avec un emoji souriant.

REST

  1. Envoyez la première invite dans la requête curl suivante.

    curl -X POST \
    -H "Authorization: Bearer $(gcloud auth print-access-token)" \
    -H "Content-Type: application/json" \
    "https://discoveryengine.googleapis.com/v1/projects/123456/locations/global:generateGroundedContent" \
    -d '
    {
    "contents": [
     {
       "role": "user",
       "parts": [
         {
           "text": "Summarize what happened in 2023 in one paragraph."
         }
       ]
     }
    ],
    "systemInstruction": {
      "parts": {
          "text": "Add a smiley emoji after the answer."
      }
    },
    "grounding_spec": {
     "grounding_sources": [
       {
         "inline_source": {
           "grounding_facts": [
             {
               "fact_text": "In 2023, the world population surpassed 8 billion. This milestone marked a significant moment in human history, highlighting both the rapid growth of our species and the challenges of resource management and sustainability in the years to come.",
               "attributes": {
                 "title": "title_1",
                 "uri": "some-uri-1"
               }
             }
           ]
         }
       },
       {
         "inline_source": {
           "grounding_facts": [
             {
               "fact_text": "In 2023, global e-commerce sales reached an estimated $5.7 trillion. The continued rise of online shopping solidified its position as a dominant force in retail, with major implications for traditional brick-and-mortar stores and the logistics networks supporting worldwide deliveries.",
               "attributes": {
                 "title": "title_2",
                 "uri": "some-uri-2"
               }
             }
           ]
         }
       },
       {
         "inline_source": {
           "grounding_facts": [
             {
               "fact_text": "In 2023, the global average surface temperature was approximately 0.2 degrees Celsius higher than the 20th-century average. This continued the worrying trend of global warming, underscoring the urgency of worldwide climate initiatives, carbon reduction efforts, and investment in renewable energy sources.",
               "attributes": {
                 "title": "title_3",
                 "uri": "some-uri-3"
               }
             }
           ]
         }
       }
     ]
    },
    "generationSpec": {
     "modelId": "gemini-1.5-flash"
    }
    }'
    
  2. Envoyez la deuxième invite en guise de suivi. Ajoutez la première invite de l'utilisateur, suivie de la réponse correspondante du modèle pour le contexte.

    curl -X POST \
    -H "Authorization: Bearer $(gcloud auth print-access-token)" \
    -H "Content-Type: application/json" \
    "https://discoveryengine.googleapis.com/v1/projects/123456/locations/global:generateGroundedContent" \
    -d '
    {
    "contents": [
     {
       "role": "user",
       "parts": [
         {
           "text": "Summarize what happened in 2023 in one paragraph."
         }
       ]
     },
     {
       "role": "model",
       "parts": [
         {
           "text": "In 2023, the global average surface temperature increased, the world population surpassed 8 billion, and global e-commerce sales reached an estimated $5.7 trillion.  😊 \n"
         }
       ]
     },
     {
       "role": "user",
       "parts": [
         {
           "text": "Rephrase the answer in an abstracted list."
         }
       ]
     }
    ],
    "grounding_spec": {
     "grounding_sources": [
       {
         "inline_source": {
           "grounding_facts": [
             {
               "fact_text": "In 2023, the world population surpassed 8 billion. This milestone marked a significant moment in human history, highlighting both the rapid growth of our species and the challenges of resource management and sustainability in the years to come.",
               "attributes": {
                 "title": "title_1",
                 "uri": "some-uri-1"
               }
             }
           ]
         }
       },
       {
         "inline_source": {
           "grounding_facts": [
             {
               "fact_text": "In 2023, global e-commerce sales reached an estimated $5.7 trillion. The continued rise of online shopping solidified its position as a dominant force in retail, with major implications for traditional brick-and-mortar stores and the logistics networks supporting worldwide deliveries.",
               "attributes": {
                 "title": "title_2",
                 "uri": "some-uri-2"
               }
             }
           ]
         }
       },
       {
         "inline_source": {
           "grounding_facts": [
             {
               "fact_text": "In 2023, the global average surface temperature was approximately 0.2 degrees Celsius higher than the 20th-century average. This continued the worrying trend of global warming, underscoring the urgency of worldwide climate initiatives, carbon reduction efforts, and investment in renewable energy sources.",
               "attributes": {
                 "title": "title_3",
                 "uri": "some-uri-3"
               }
             }
           ]
         }
       }
     ]
    },
    "generationSpec": {
     "modelId": "gemini-1.5-flash"
    }
    }'
    

Diffuser des réponses basées sur des données

Vous pouvez choisir de diffuser les réponses du modèle. Cela est utile dans les cas d'utilisation où la réponse est particulièrement longue et que l'envoi de l'intégralité de la réponse en même temps entraîne un retard important. Le streaming de la réponse décompose la réponse en un tableau de plusieurs candidats contenant des parties séquentielles du texte de la réponse.

Pour obtenir une réponse en streaming et étayée:

REST

L'exemple suivant montre comment diffuser une réponse justifiée. Cet exemple utilise la méthode streamGenerateGroundedContent et étaye la réponse avec la recherche Google sans la configuration de récupération dynamique. Vous pouvez suivre une procédure similaire pour générer des réponses étayées à l'aide d'autres sources d'ancrage.

  1. Envoyez l'invite dans la requête curl suivante.

    curl -X POST \
    -H "Authorization: Bearer $(gcloud auth print-access-token)" \
    -H "Content-Type: application/json" \
    "https://discoveryengine.googleapis.com/v1alpha/projects/PROJECT_NUMBER/locations/global:streamGenerateGroundedContent" \
    -d '
    [
    {
     "contents": [
       {
         "role": "user",
         "parts": [
           {
             "text": "PROMPT_TEXT"
           }
         ]
       }
     ],
     "systemInstruction": {
         "parts": {
             "text": "SYSTEM_INSTRUCTION"
         }
     },
     "groundingSpec": {
       "groundingSources": [
         {
           "googleSearchSource": {}
         }
       ]
     },
    "generationSpec": {
     "modelId": "MODEL_ID",
     "temperature": TEMPERATURE,
     "topP": TOP_P,
     "topK": TOP_K
    }
    }
    ]'
    

    Remplacez les éléments suivants :

    • PROJECT_NUMBER: numéro de votre projet Google Cloud.
    • PROMPT_TEXT : invite de l'utilisateur.
    • SYSTEM_INSTRUCTION : champ facultatif permettant de fournir un préambule ou un contexte supplémentaire.
    • MODEL_ID : champ facultatif permettant de définir l'ID du modèle Gemini que vous souhaitez utiliser pour générer la réponse étayée. Pour obtenir la liste des ID de modèle disponibles, consultez la section Modèles compatibles.
    • TEMPERATURE : champ facultatif permettant de définir la température utilisée pour l'échantillonnage. Google recommande une température de 0,0. Pour en savoir plus, consultez la section Paramètres du modèle Gemini.
    • TOP_P : champ facultatif permettant de définir la valeur de P supérieure pour le modèle. Pour en savoir plus, consultez la section Paramètres du modèle Gemini.
    • TOP_K : champ facultatif permettant de définir la valeur top-K du modèle. Pour en savoir plus, consultez la section Paramètres du modèle Gemini.

Python

from google.cloud import discoveryengine_v1 as discoveryengine

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

client = discoveryengine.GroundedGenerationServiceClient()

request = discoveryengine.GenerateGroundedContentRequest(
    # The full resource name of the location.
    # Format: projects/{project_number}/locations/{location}
    location=client.common_location_path(project=project_number, location="global"),
    generation_spec=discoveryengine.GenerateGroundedContentRequest.GenerationSpec(
        model_id="gemini-1.5-flash",
    ),
    # Conversation between user and model
    contents=[
        discoveryengine.GroundedGenerationContent(
            role="user",
            parts=[
                discoveryengine.GroundedGenerationContent.Part(
                    text="Summarize how to delete a data store in Vertex AI Agent Builder?"
                )
            ],
        )
    ],
    grounding_spec=discoveryengine.GenerateGroundedContentRequest.GroundingSpec(
        grounding_sources=[
            discoveryengine.GenerateGroundedContentRequest.GroundingSource(
                google_search_source=discoveryengine.GenerateGroundedContentRequest.GroundingSource.GoogleSearchSource()
            ),
        ]
    ),
)
responses = client.stream_generate_grounded_content(iter([request]))

for response in responses:
    # Handle the response
    print(response)

Exemple de streaming de réponses avec ancrage

Dans l'exemple suivant, la requête spécifie la recherche Google comme source d'ancrage pour diffuser une réponse sans la configuration de récupération dynamique. La réponse lue en streaming est répartie sur plusieurs réponses candidates. Cet exemple utilise la méthode streamGenerateGroundedContent.

REST

curl -X POST \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
-H "Content-Type: application/json" \
"https://discoveryengine.googleapis.com/v1alpha/projects/123456/locations/global:streamGenerateGroundedContent" \
-d '
[
{
  "contents": [
    {
      "role": "user",
      "parts": [
        {
          "text": "Summarize How to delete a data store in Vertex AI Agent Builder?"
        }
      ]
    }
  ],
  "groundingSpec": {
    "groundingSources": [
      {
        "googleSearchSource": {}
      }
    ]
  },
  "generationSpec": {
    "modelId": "gemini-1.5-flash"
  }
}
]'

Modèles compatibles

Les modèles suivants sont compatibles avec l'ancrage :

  • Gemini 1.5 Pro avec saisie de texte uniquement
  • Gemini 1.5 Flash avec saisie de texte uniquement
  • Gemini 1.0 Pro avec saisie de texte uniquement

Pour en savoir plus sur ces modèles Gemini, consultez la page Versions et cycle de vie des modèles Gemini.

Lorsque vous appelez la méthode generateGroundedContent, vous pouvez utiliser les ID de modèle suivants:

ID du modèle Mise à jour automatique
default Oui
gemini-1.0-pro Oui
gemini-1.0-pro-001 Non
gemini-1.0-pro-002 Non
gemini-1.5-flash Oui
gemini-1.5-flash-001 Non
gemini-1.5-flash-002 Non
gemini-1.5-pro Oui
gemini-1.5-pro-001 Non
gemini-1.5-pro-002 Non

Modèles haute fidélité

Pour les cas d'utilisation généraux, tels que l'assistance de voyage, la méthode de génération de réponses fondées peut générer de bons résultats en fusionnant le contexte fourni, comme le texte intégré ou les données d'entreprise, avec l'entraînement du modèle. Toutefois, les secteurs spécialisés, tels que les services financiers, les soins de santé et les assurances, exigent souvent que les résultats générés proviennent exclusivement du contexte fourni. Pour prendre en charge ces cas d'utilisation d'ancrage, le modèle haute fidélité suivant est disponible pour être utilisé avec la méthode de génération de réponses ancrées:

Nom du modèle ID du modèle Basée sur Fenêtre de contexte Description
Haute fidélité Gemini 1.5 Flash gemini-1.5-flash-002-high-fidelity Modèle Gemini 1.5 Flash 32 K Accepte les requêtes textuelles en entrée et génère des réponses textuelles basées sur le contexte. Elle se concentre sur l'exactitude, la fiabilité et la sécurité.

Étape suivante

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