Générer des réponses ancrées avec la 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 avec 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 récupération dynamique évalue si une requête nécessite des connaissances sur les événements récents et active la fonctionnalité Grounding 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 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 génération augmentée de récupération.

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 requête, et lorsque le rôle est model, le texte est une réponse fondé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 à plusieurs 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 d'ancrage 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 mise à la 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 jusqu'à 100 textes factuels
    • Six datastores 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
    Vertex AI Search data store #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 Gemini Vertex AI à 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.

  • Code de langue: la langue de la réponse générée est généralement définie pour correspondre à celle de l'invite. Si aucune langue n'est spécifiée dans la requête (par exemple, si elle est très courte et peut être valide dans plusieurs langues), le champ de code de langue détermine la langue de la réponse.

    Pour obtenir la liste des codes de langue, consultez la section Langues.

  • Latitude et longitude: spécifie la latitude et la longitude de l'utilisateur. Si la requête contient des questions spécifiques à une zone géographique, comme "Trouver un café à proximité", ces champs sont utilisés. Si la langue de la requête ne peut pas être déterminée et que le code de langue n'est pas défini, la latitude et la longitude sont utilisées pour déterminer la langue de la réponse.

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 de justification: valeur à virgule flottante comprise entre 0 et 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 l'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 complémentaires.
      • 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 pour l'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 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
    },
    "user_context": {
      "languageCode: "LANGUAGE_CODE",
      "latLng": {
        "latitude": LATITUDE,
        "longitude": LONGITUDE
     },
    }
    }'
    

    Remplacez les éléments suivants :

    • PROJECT_NUMBER: numéro de votre projet Google Cloud .
    • PROMPT_TEXT : requête 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.
    • LANGUAGE_CODE : champ facultatif qui peut être utilisé pour définir la langue de la réponse générée et du texte de bloc renvoyé. Si la langue ne peut pas être déterminée à partir de la requête, ce champ est utilisé. La valeur par défaut est en. Pour obtenir la liste des codes de langue, consultez la page Langues.
    • LATITUDE : champ facultatif permettant de définir la latitude. Saisissez la valeur en degrés décimaux (par exemple, -25.34).
    • LONGITUDE : champ facultatif permettant de définir la longitude. Saisissez la valeur en degrés décimaux (par exemple, 131.04).

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 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": "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"
  },
  "user_context": {
    "languageCode: "en",
    "latLng": {
       "latitude": 37.422131,
       "longitude": -122.084801
    }
  }
}'

Générer une réponse pertinente avec la recherche Google

Vous pouvez ancrer les réponses générées sur 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. Cela est utile lorsque la requête ne nécessite 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 entre 0 et 1. Sa valeur dépend de la possibilité de l'ancrer 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 le modèle est suffisante a un score de prédiction plus faible.

Voici des exemples de suggestions 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
"Propose 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
"Peux-tu me donner la recette d'un guacamole d'inspiration asiatique ?" 0.55 La recherche Google peut fournir une réponse fondée, mais la justification n'est pas strictement nécessaire. Les connaissances du modèle peuvent suffire.
"Qu'est-ce qu'Agent Builder ? Comment est facturé l'ancrage 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 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é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 entre 0 et 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 règles 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 plus faible implique que davantage de requêtes ont des réponses générées à l'aide de l'ancrage avec la recherche Google.
  • Si le score de prédiction est inférieur au seuil, le modèle peut générer la réponse, mais elle n'est pas ancrée dans la recherche Google.

Pour trouver un seuil adapté à vos besoins commerciaux, vous pouvez créer un ensemble représentatif de 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 seuil adapté à votre cas d'utilisation.

Ancrer 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 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
    },
    "user_context": {
     "languageCode: "LANGUAGE_CODE",
     "latLng": {
       "latitude": LATITUDE,
       "longitude": LONGITUDE
     },
    }
    }'
    

    Remplacez les éléments suivants :

    • PROJECT_NUMBER: numéro de votre projet Google Cloud .
    • PROMPT_TEXT : requête de l'utilisateur.
    • SYSTEM_INSTRUCTION : champ facultatif permettant de fournir un préambule ou un contexte supplémentaire.
    • 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 entre 0 et 1. Si vous ajoutez le champ dynamicRetrievalConfig, mais que vous ne définissez pas les champs 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 justifiée.
    • 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.
    • LANGUAGE_CODE : champ facultatif qui peut être utilisé pour définir la langue de la réponse générée et du texte de bloc renvoyé. Si la langue ne peut pas être déterminée à partir de la requête, ce champ est utilisé. La valeur par défaut est en. Pour obtenir la liste des codes de langue, consultez la page Langues.
    • LATITUDE : champ facultatif permettant de définir la latitude. Saisissez la valeur en degrés décimaux (par exemple, -25.34).
    • LONGITUDE : champ facultatif permettant de définir la longitude. Saisissez la valeur en degrés décimaux (par exemple, 131.04).

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 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 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 une réponse multi-tours, 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
    },
    "user_context": {
     "languageCode: "LANGUAGE_CODE",
     "latLng": {
       "latitude": LATITUDE,
       "longitude": LONGITUDE
     },
    }
    }'
    

    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.
    • LANGUAGE_CODE : champ facultatif qui peut être utilisé pour définir la langue de la réponse générée et du texte de bloc renvoyé. Si la langue ne peut pas être déterminée à partir de la requête, ce champ est utilisé. La valeur par défaut est en. Pour obtenir la liste des codes de langue, consultez la page Langues.
    • LATITUDE : champ facultatif permettant de définir la latitude. Saisissez la valeur en degrés décimaux (par exemple, -25.34).
    • LONGITUDE : champ facultatif permettant de définir la longitude. Saisissez la valeur en degrés décimaux (par exemple, 131.04).
  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
    },
    "user_context": {
     "languageCode: "LANGUAGE_CODE",
     "latLng": {
       "latitude": LATITUDE,
       "longitude": LONGITUDE
     },
    }
    }'
    

    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.
    • LANGUAGE_CODE : champ facultatif qui peut être utilisé pour définir la langue de la réponse générée et du texte de bloc renvoyé. Si la langue ne peut pas être déterminée à partir de la requête, ce champ est utilisé. La valeur par défaut est en. Pour obtenir la liste des codes de langue, consultez la page Langues.
    • LATITUDE : champ facultatif permettant de définir la latitude. Saisissez la valeur en degrés décimaux (par exemple, -25.34).
    • LONGITUDE : champ facultatif permettant de définir la longitude. Saisissez la valeur en degrés décimaux (par exemple, 131.04).
  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"
    }
    }'
    

Afficher progressivement 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'ensemble 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 en streaming et fondée, procédez comme suit:

REST

L'exemple suivant montre comment diffuser une réponse justifiée. Cet exemple utilise la méthode streamGenerateGroundedContent et établit 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
    },
    "user_context": {
     "languageCode: "LANGUAGE_CODE",
     "latLng": {
       "latitude": LATITUDE,
       "longitude": LONGITUDE
     },
    }
    }
    ]'
    

    Remplacez les éléments suivants :

    • PROJECT_NUMBER: numéro de votre projet Google Cloud .
    • PROMPT_TEXT : requête 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.
    • LANGUAGE_CODE : champ facultatif qui peut être utilisé pour définir la langue de la réponse générée et du texte de bloc renvoyé. Si la langue ne peut pas être déterminée à partir de la requête, ce champ est utilisé. La valeur par défaut est en. Pour obtenir la liste des codes de langue, consultez la page Langues.
    • LATITUDE : champ facultatif permettant de définir la latitude. Saisissez la valeur en degrés décimaux (par exemple, -25.34).
    • LONGITUDE : champ facultatif permettant de définir la longitude. Saisissez la valeur en degrés décimaux (par exemple, 131.04).

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