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 qui souhaitent l'associer à des connaissances du monde entier, un large éventail des sujets ou des informations à jour sur Internet. L'ancrage avec la recherche Google prend en charge les créations dynamiques de récupération qui vous permet de générer des Résultats Recherche Google uniquement en cas de nécessité. Par conséquent, la récupération dynamique permet d'évaluer si une requête nécessite de connaître 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 en plusieurs parties de texte appelés fact text (texte de fait) qui sont fournies dans la demande. Il s'agit d'une déclaration fournie par l'utilisateur sont considérées comme factuelles pour une demande donnée. Le modèle ne vérifie pas l'authenticité du texte factuel.
  • Datastores Vertex AI Search: utiliser l'ancrage avec Vertex AI Search pour connecter le modèle Google Cloud depuis les 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 API Vertex AI pour créer des expériences de recherche et de RAG

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 liés à RAG

La génération augmentée de récupération (RAG) 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. Il y a deux étapes en RAG:

  1. Récupération: il est fréquent d'obtenir rapidement les informations les plus pertinentes. problème de recherche. Avec la RAG, vous pouvez récupérer rapidement les faits qui sont 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).

  • Texte: lorsque le rôle est user, le texte est une requête. Lorsque le rôle est model, le texte est une réponse fondée sur le principe. La manière dont vous spécifiez le rôle et texte d'une requête est déterminé 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 multitour, la requête contient la paire requête-réponse pour tous les changements de direction précédents et le texte d'invite de l'utilisateur pour tour actuel. 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 le 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é: ancrez la réponse dans un texte réel, fournies dans la demande. Il s'agit d'une déclaration fournie par l'utilisateur sont considérées comme factuelles pour une demande donnée. Le modèle ne vérifie pas l'authenticité du fait. 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.

    Dans une requête donnée, vous pouvez fournir à la fois une source de texte intégrée et une Source du 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 un maximum de 10 sources d'ancrage 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 jusqu'à 100 faits SMS
    • Six data stores Vertex AI Search
    • Quatre sources de texte intégrées, chacune pouvant contenir jusqu'à 100 faits SMS

    Un indice est attribué à chaque source 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 l'index source est attribué comme illustré dans l'exemple tableau:

    Source d'ancrage Index
    Texte intégré 1 0
    Texte intégré 2 1
    Data store Vertex AI Search n° 1 2
    Texte intégré n° 3 3
    Data store Vertex AI Search n° 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 configuration de modèle qui comporte les 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 pour obtenir des réponses basées sur le terrain, consultez la page 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. Ces paramètres sont: la langue, la 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.

  • Texte: réponse fondée sur le fond.

  • Score de justification : 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 d'ancrage: métadonnées sur la source d'ancrage. Les métadonnées de référence contiennent les informations suivantes :

    • Blocs de support: liste de fragments qui soutiennent la réponse. Chaque bloc d'assistance est associé à un index de bloc d'assistance qui est utile pour suivre la provenance. Chaque bloc d'assistance contient les éléments suivants :

      • Texte partiel: partie du texte cité textuellement de la source dont la réponse ou une partie de la réponse (appelée texte de la revendication) est extraites. 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.
      • Source metadata (Métadonnées sources) : métadonnées sur le fragment. Selon la source, les métadonnées de la source peuvent être l'un des éléments suivants:

        • 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 magasin de données 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 contient également le domaine de l'éditeur. Les URI fournis restent accessibles jusqu'à 30 jours après la génération du résultat basé sur des faits.
    • Support de fond: informations d'ancrage pour une affirmation dans la réponse. Le support d'ancrage contient les informations suivantes:

      • Texte de l'affirmation: réponse ou partie de la réponse qui est étayée avec le bloc de texte d'assistance.
      • 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 les suggestions de recherche Google avec une réponse, cette réponse est une "réponse Résultat" soumis aux conditions d'utilisation du service Ancrage avec la recherche Google. Pour en savoir plus, consultez Pour en savoir plus, consultez Conditions d'utilisation Le champ renderedContent du champ searchEntryPoint correspond au 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érez une réponse fondée en un seul tour

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

Basez la réponse dans du texte intégré et dans un 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. 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: un champ facultatif pour 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 Meta title pour le texte intégré.
    • URI_N: champ facultatif permettant de définir l'attribut Meta URI pour le texte intégré.
    • AUTHOR_N: Champ facultatif permettant de définir l'attribut Meta "author" 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. Ce que Google recommande une température de 0,0. Pour en savoir plus, consultez la page Modèle Gemini paramètres.
    • TOP_P: un champ facultatif permettant de définir la valeur "top-P" du modèle. Pour en savoir plus, consultez la section Paramètres du modèle Gemini.
    • TOP_K: un champ facultatif permettant de définir la valeur de top-K pour le modèle. Pour en savoir plus, consultez la page Modèle Gemini paramètres.

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éponses en un seul tour basées sur du texte intégré et sur Vertex AI Search

Dans l'exemple suivant, la requête spécifie les éléments suivants : Sources d'ancrage: un texte intégré et une vue Vertex AI Search dans le data store. Cet exemple utilise le generateGroundedContent . Cet exemple utilise également une instruction système pour terminer la réponse par un émoji 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 pertinente avec la recherche Google

Vous pouvez baser 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 avec la recherche Google. Cela est utile lorsque la requête n'exige pas une réponse basée sur la recherche Google et modèles compatibles peuvent fournir une réponse en fonction de leur connaissances sans ancrage. Vous pouvez ainsi gérer la latence, la qualité à moindre coût.

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 compris 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 leurs 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'ancrage
"Pouvez-vous me donner la recette d'un guacamole inspiré de l'Asie ?" 0.55 La recherche Google peut donner une réponse fondée sur la base, mais ce n'est pas obligatoire. la connaissance du modèle peut 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 complète
"Qui a remporté le dernier Grand Prix de F1 ?" 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éponse ancrée, vous pouvez spécifier une récupération dynamique configuration 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 zéro, la réponse est toujours ancrée dans la recherche Google. Pour toutes les autres valeurs de seuil, les conditions suivantes 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 bas implique que davantage de requêtes ont des réponses générées en utilisant l'ancrage avec la recherche Google.
  • Si le score de prédiction est inférieur au seuil, le modèle peut quand même générer la réponse, mais celle-ci n'est pas fondée sur la recherche Google.

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

Basez la réponse avec la recherche Google

L'exemple suivant montre comment générer une réponse ancrée à partir d'une requête en spécifiant la recherche Google comme source d'ancrage. Cet exemple utilise 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: un champ facultatif permettant de définir l'ID du modèle Gemini que vous souhaitez utiliser pour générer le concrète. 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 page Modèle Gemini paramètres.
    • TOP_P: un champ facultatif permettant de définir la valeur "top-P" du modèle. Pour en savoir plus, consultez la page Modèle Gemini paramètres.
    • TOP_K : champ facultatif permettant de définir la valeur top-K du modèle. Pour en savoir plus, consultez la page Modèle Gemini paramètres.
    • 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 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 comme source d'ancrage. Cet exemple utilise le generateGroundedContent . Cet exemple utilise également une instruction système pour terminer la réponse avec 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 maintient le contexte pour générer la réponse à la 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 basent le avec la recherche Google. Vous pouvez suivre des étapes similaires pour générer des réponses ancré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 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 page Modèle Gemini paramètres.
    • TOP_K: un champ facultatif permettant de définir la valeur de top-K pour le 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. Ajouter la première invite de l'utilisateur, suivie de la réponse correspondante du le 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 la 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 page Modèle Gemini paramètres.
    • TOP_P : champ facultatif permettant de définir la valeur de P supérieure pour le modèle. Pour en savoir plus, consultez la page Modèle Gemini paramètres.
    • TOP_K: un champ facultatif permettant de définir la valeur de top-K pour le modèle. Pour en savoir plus, consultez la page Modèle Gemini paramètres.
  3. Répétez ce processus pour obtenir d'autres réponses. À chaque tour, ajoutez tous Les invites précédentes de l'utilisateur, suivies des réponses correspondantes à partir du modèle.

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

Dans l'exemple suivant, la requête spécifie trois informations factuelles intégrées. comme source d'ancrage pour générer des réponses en 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 une seule fois 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 factuelle et concrète, procédez comme suit:

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 page Modèle Gemini paramètres.
    • 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: un champ facultatif permettant de définir la valeur de top-K pour le 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 diffusion de réponses ancrées en flux continu

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-pro Oui
gemini-1.5-pro-001 Non

É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.