Generare risposte fondate con RAG

Nell'ambito della tua esperienza di Retrieval Augmented Generation (RAG) in Vertex AI Agent Builder, puoi generare risposte basate su fatti ai prompt in base alle seguenti fonti di grounding:

  • Ricerca Google: utilizza il grounding con la Ricerca Google se vuoi collegare il modello alle conoscenze del mondo, a un'ampia gamma di argomenti o a informazioni aggiornate su internet. La funzionalità di grounding con la Ricerca Google supporta il recupero dinamico che ti consente di generare Risultati fondati con la Ricerca Google solo quando necessario. Pertanto, la configurazione del recupero dinamico valuta se un prompt richiede la conoscenza di eventi recenti e attiva il grounding con la Ricerca Google. Per ulteriori informazioni, consulta la sezione Ricerca dinamica.
  • Testo in linea: utilizza la definizione del contesto con il testo in linea per basare la risposta su frammenti di testo chiamati testo di fatto forniti nella richiesta. Un testo fattuale è un'affermazione fornita dall'utente che è considerata fattuale per una determinata richiesta. Il modello non verifica l'autenticità del testo del fatto.
  • Data store Vertex AI Search: utilizza il grounding con Vertex AI Search se vuoi collegare il modello ai documenti aziendali dai datastore Vertex AI Search.

Questa pagina descrive come generare risposte basate su queste fonti di riferimento utilizzando i seguenti approcci:

Inoltre, puoi scegliere di riprodurre in streaming le risposte del modello. La generazione di una risposta basata su dati attendibili tramite streaming è una funzionalità sperimentale.

Puoi utilizzare altri metodi per generare risposte fondate, in base alle tue esigenze. Per saperne di più, consulta API Vertex AI per la creazione di esperienze di ricerca e RAG.

Terminologia

Prima di utilizzare il metodo di generazione di risposte basate su dati, è utile comprendere gli input e gli output, come strutturare la richiesta e la terminologia relativa alla RAG.

Termini RAG

La RAG è una metodologia che consente ai modelli linguistici di grandi dimensioni (LLM) di generare risposte basate sull'origine dati che preferisci. Il RAG prevede due fasi:

  1. Rievocazione: trovare rapidamente i fatti più pertinenti può essere un problema comune della ricerca. Con la RAG, puoi recuperare rapidamente i fatti importanti per generare una risposta.
  2. Generare:i fatti recuperati vengono utilizzati dall'LLM per generare una risposta fondata.

Pertanto, il metodo di generazione di risposte fondate recupera i fatti dalla fonte di grounding e genera una risposta fondata.

Dati di input

Il metodo di generazione di risposte basate sui dati richiede i seguenti input nella richiesta:

  • Ruolo: il mittente di un determinato testo che può essere un utente (user) o un modello (model).

  • Testo: quando il ruolo è user, il testo è un prompt e quando il ruolo è model, il testo è una risposta basata su dati. La modalità di specifica del ruolo e del testo in una richiesta è determinata come segue:

    • Per la generazione di una risposta con un solo turno, l'utente invia il testo del prompt nella richiesta e il modello invia il testo della risposta nella risposta.
    • Per la generazione di una risposta con più turni, la richiesta contiene la coppia prompt-risposta per tutti i turni precedenti e il testo del prompt dell'utente per il turno corrente. Pertanto, in una richiesta di questo tipo, il ruolo è user per il testo del prompt ed è model per il testo della risposta.
  • Istruzioni di sistema: un preambolo al prompt che regola il comportamento del modello e modifica di conseguenza l'output. Ad esempio, puoi aggiungere una persona alla risposta generata o chiedere al modello di formattare il testo di output in un determinato modo. Per la generazione di risposte con più turni, devi fornire al sistema le istruzioni per ogni turno. Per ulteriori informazioni, consulta Utilizzare le istruzioni di sistema.

  • Origine di grounding: la fonte su cui si basa la risposta e che può essere una o più delle seguenti:

    • Ricerca Google: fonda le risposte sui risultati della Ricerca Google. Quando l'origine di ancoraggio è la Ricerca Google, puoi specificare una configurazione di recupero dinamico con una soglia di recupero dinamico. Per ulteriori informazioni, consulta la sezione Ricerca dinamica.

    • Testo in linea: basa la risposta sul testo fattuale fornito nella richiesta. Un testo fattuale è un'affermazione fornita dall'utente che viene considerata fattuale per una determinata richiesta. Il modello non verifica l'autenticità del testo del fatto. Puoi fornire un massimo di 100 testi di fatti in ogni fonte di testo in linea. I testi dei fatti possono essere supportati utilizzando attributi meta, come titolo, autore e URI. Questi attributi meta vengono restituiti nella risposta quando vengono citati i chunk che supportano la risposta.

    • Data store di Vertex AI Search: basa la risposta sui documenti nei datastore di Vertex AI Search. Non puoi specificare un datastore di ricerca sul sito web come origine di riferimento.

    In una determinata richiesta, puoi fornire sia un'origine di testo in linea sia un'origine del datastore di Vertex AI Search. Non puoi combinare la Ricerca Google con nessuna di queste origini. Pertanto, se vuoi basare le tue risposte sui risultati della Ricerca Google, devi inviare una richiesta distinta specificando la Ricerca Google come unica fonte di riferimento.

    Puoi fornire un massimo di 10 origini di messa a terra in qualsiasi ordine. Ad esempio, supponi di fornire le sorgenti di messa a terra con il seguente conteggio, nell'ordine seguente per ottenere un totale di 10 sorgenti di messa a terra:

    • Tre origini di testo in linea, ciascuna delle quali può contenere un massimo di 100 testi informativi
    • Sei datastore di Vertex AI Search
    • Quattro origini di testo in linea, ciascuna delle quali può contenere un massimo di 100 testi di fatti

    A ogni origine viene assegnato un indice nell'ordine in cui è specificato nella richiesta. Ad esempio, se hai specificato una combinazione di origini nella richiesta, l'indice di origine viene assegnato come illustrato nella tabella seguente:

    Origine di grounding Indice
    Testo in linea 1 0
    Testo in linea 2 1
    Vertex AI Search datastore 1 2
    Testo in linea 3 3
    Datastore Vertex AI Search 2 4

    Questo indice è riportato nella risposta ed è utile per risalire alla provenienza.

  • Specifiche di generazione: le specifiche per la configurazione del modello che consiste nelle seguenti informazioni:

    • ID modello: specifica il modello Vertex AI Gemini da utilizzare per la generazione di risposte. Per un elenco dei modelli che puoi utilizzare per generare risposte basate su dati, consulta Modelli supportati.
    • Parametri del modello: specifica i parametri che puoi impostare per il modello scelto. Questi parametri sono: lingua, temperatura, top-P e top-K. Per informazioni dettagliate su questi parametri, consulta Parametri del modello Gemini.

Dati di output

La risposta generata dal modello è chiamata candidato e contiene i seguenti dati. Non tutti i campi potrebbero essere presenti nell'output.

  • Ruolo: il mittente della risposta basata su fatti. La risposta contiene sempre il testo della risposta basata su fatti. Pertanto, il ruolo in una risposta è sempre un modello.

  • Testo: una risposta basata su dati.

  • Punteggio di fondamento: un valore float nell'intervallo [0, 1] che indica l'attendibilità di una risposta nelle fonti indicate.

  • Metadati di messa a terra: metadati relativi all'origine di messa a terra. I metadati di ancoraggio contengono le seguenti informazioni:

    • Chunk di supporto: un elenco di chunk che supportano la risposta. A ogni frammento di supporto viene assegnato un indice utile per risalire alla provenienza. Ogni chunk di supporto contiene quanto segue:

      • Testo del blocco: una parte di testo citata testualmente dalla fonte da cui viene estratta la risposta o una parte della risposta (chiamata testo della rivendicazione). Questo valore potrebbe non essere sempre presente nella risposta.
      • Origine: un indice assegnato all'origine nella richiesta.
      • Metadati di origine: metadati relativi al chunk. A seconda dell'origine, i metadati dell'origine possono essere uno dei seguenti:

        • Per un'origine in linea, i metadati possono essere i dettagli aggiuntivi specificati nella richiesta, come titolo, autore o URI.
        • Per l'datastore di Vertex AI Search, i metadati possono essere l'ID del documento, il titolo del documento, l'URI (posizione Cloud Storage) o il numero di pagina.
        • Per il grounding con la Ricerca Google, quando viene generato un risultato basato su dati, i metadati contengono un URI che reindirizza al publisher dei contenuti utilizzati per generare il risultato basato su dati. I metadati contengono anche il dominio dell'editore. Gli URI forniti rimangono accessibili per un massimo di 30 giorni dopo la generazione del risultato basato su dati.
    • Assistenza per l'approfondimento: informazioni di approfondimento per una rivendicazione nella risposta. Il supporto di messa a terra contiene le seguenti informazioni:

      • Testo della rivendicazione: la risposta o una parte della risposta supportata con il testo del chunk di supporto.
      • Indici dei chunk di supporto: un indice assegnato al chunk di supporto nell'ordine in cui il chunk viene visualizzato nell'elenco dei chunk di supporto.
      • Query di ricerca web: le query di ricerca suggerite per i suggerimenti della Ricerca Google.
      • Suggerimenti di ricerca: se ricevi i suggerimenti di ricerca di Google con una risposta, questa risposta è un "Risultato fondato" soggetto ai termini di servizio per il grounding con la Ricerca Google. Per ulteriori informazioni, consulta i Termini di servizio . Il campo renderedContent all'interno del campo searchEntryPoint è il codice fornito per l'implementazione dei suggerimenti della Ricerca Google. Per usare i suggerimenti della Ricerca Google, consulta l'articolo Utilizzare i suggerimenti della Ricerca Google.

Generare una risposta basata su dati in un solo turno

Questa sezione descrive come generare risposte basate sulle seguenti fonti:

Basati sulla risposta nel testo in linea e nel datastore di Vertex AI Search

L'esempio seguente mostra come inviare il testo del prompt specificando un testo in linea e un datastore di Vertex AI Search come origine del grounding. Non puoi specificare un datastore di ricerca del sito web come origine di riferimento. Questo esempio utilizza il metodo generateGroundedContent.

REST

  1. Invia il prompt nella seguente richiesta curl.

    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
    }
    }'
    

    Sostituisci quanto segue:

    • PROJECT_NUMBER: il numero del tuo progetto Google Cloud.
    • PROMPT_TEXT: il prompt dell'utente.
    • SYSTEM_INSTRUCTION: un campo facoltativo per fornire un preambolo o un contesto aggiuntivo.
    • FACT_TEXT_N: il testo in linea che fornisce le basi della risposta. Puoi fornire un massimo di 100 testi informativi.
    • TITLE_N: un campo facoltativo per impostare l'attributo meta title per il testo in linea.
    • URI_N: un campo facoltativo per impostare l'attributo meta URI per il testo in linea.
    • AUTHOR_N: un campo facoltativo per impostare l'attributo meta autore per il testo in linea.
    • APP_ID_N: l'ID dell'app Vertex AI Search.
    • MODEL_ID: un campo facoltativo per impostare l'ID del modello Gemini che vuoi utilizzare per generare la risposta basata su dati. Per un elenco degli ID modello disponibili, consulta Modelli supportati.
    • TEMPERATURE: un campo facoltativo per impostare la temperatura utilizzata per il campionamento. Google consiglia una temperatura di 0,0 °C. Per ulteriori informazioni, consulta i parametri del modello Gemini.
    • TOP_P: un campo facoltativo per impostare il valore P superiore per il modello. Per ulteriori informazioni, consulta i parametri del modello Gemini.
    • TOP_K: un campo facoltativo per impostare il valore top-K per il modello. Per ulteriori informazioni, consulta i parametri del modello Gemini.

Python

from google.cloud import discoveryengine_v1 as discoveryengine

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

client = discoveryengine.GroundedGenerationServiceClient()

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

# Handle the response
print(response)

Esempio di generazione di risposte a un solo turno basata sul testo in linea e su Vertex AI Search

Nell'esempio seguente, la richiesta specifica le seguenti fonti di grounding: un fatto di testo in linea e un datastore di Vertex AI Search. Questo esempio utilizza il metodo generateGroundedContent. Questo esempio utilizza anche un'istruzione di sistema per terminare la risposta con un'emoji smiley.

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"
  }
}'

Generare una risposta basata su fatti con la Ricerca Google

Puoi basare le risposte generate sui dati web disponibili pubblicamente.

Recupero dinamico

Puoi utilizzare il recupero dinamico nella tua richiesta per scegliere quando disattivare il grounding con la Ricerca Google. Questa opzione è utile quando il prompt non richiede una risposta basata sulla Ricerca Google e i modelli supportati possono fornire una risposta in base alle loro conoscenze senza alcuna base. In questo modo puoi gestire la latenza, la qualità e il costo in modo più efficace.

Punteggio e soglia di previsione del recupero dinamico

Quando invii una richiesta per generare una risposta basata su dati, Vertex AI Agent Builder assegna un punteggio di previsione al prompt. Il punteggio di previsione è un valore con virgola mobile nell'intervallo [0,1]. Il suo valore dipende dal fatto che il prompt possa trarre vantaggio dalla fondazione della risposta con le informazioni più aggiornate della Ricerca Google. Pertanto, un prompt che richiede una risposta basata sui fatti più recenti sul web ha un punteggio di previsione più alto, mentre un prompt per il quale è sufficiente una risposta generata da un modello ha un punteggio di previsione più basso.

Ecco alcuni esempi di prompt e i relativi punteggi di previsione.

Prompt Punteggio di previsione Commento
"Scrivi una poesia sulle peonie" 0,13 Il modello può fare affidamento sulle sue conoscenze e la risposta non richiede grounding
"Consigliami un giocattolo per un bambino di 2 anni" 0,36 Il modello può fare affidamento sulle sue conoscenze e la risposta non richiede grounding
"Puoi darmi la ricetta di un guacamole di ispirazione asiatica?" 0,55 La Ricerca Google può dare una risposta basata su dati, ma questa operazione non è strettamente necessaria; le conoscenze del modello potrebbero essere sufficienti
"Che cos'è Agent Builder? Come viene addebitato il grounding in Agent Builder?" 0,72 Richiede che la Ricerca Google generi una risposta ben fondata
"Chi ha vinto l'ultimo Gran Premio di Formula 1?" 0,97 Richiede che la Ricerca Google generi una risposta ben fondata

Nella richiesta di generazione di risposte basate su fatti, puoi specificare una configurazione di recupero dinamico con una soglia. La soglia è un valore a virgola mobile nell'intervallo [0,1] e il valore predefinito è 0,7. Se il valore della soglia è zero, la risposta si basa sempre sulla Ricerca Google. Per tutti gli altri valori di soglia, si applica quanto segue:

  • Se il punteggio di previsione è maggiore o uguale alla soglia, la risposta si basa sulla Ricerca Google. Una soglia più bassa implica che più prompt hanno risposte generate utilizzando il Grounding con la Ricerca Google.
  • Se il punteggio di previsione è inferiore alla soglia, il modello potrebbe comunque generare la risposta, ma non è basato sulla Ricerca Google.

Per trovare una soglia adatta alle esigenze della tua attività, puoi creare un insieme rappresentativo di query che prevedi di trovare. Poi, puoi ordinare le query in base al punteggio di previsione nella risposta e selezionare una soglia adatta al tuo caso d'uso.

Basarla sulla Ricerca Google

L'esempio seguente mostra come generare una risposta basata su dati da un prompt specificando la Ricerca Google come origine di ancoraggio. Questo esempio utilizza il metodo generateGroundedContent.

REST

  1. Invia il prompt nella seguente richiesta curl.

    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
    }
    }'
    

    Sostituisci quanto segue:

    • PROJECT_NUMBER: il numero del tuo progetto Google Cloud.
    • PROMPT_TEXT: il prompt dell'utente.
    • SYSTEM_INSTRUCTION: un campo facoltativo per fornire un preambolo o un contesto aggiuntivo.
    • MODEL_ID: un campo facoltativo per impostare l'ID del modello Gemini che vuoi utilizzare per generare la risposta basata su dati. Per un elenco degli ID modello disponibili, consulta Modelli supportati.
    • TEMPERATURE: un campo facoltativo per impostare la temperatura utilizzata per il campionamento. Google consiglia una temperatura di 0,0. Per ulteriori informazioni, consulta i parametri del modello Gemini.
    • TOP_P: un campo facoltativo per impostare il valore P superiore per il modello. Per ulteriori informazioni, consulta i parametri del modello Gemini.
    • TOP_K: un campo facoltativo per impostare il valore top-K per il modello. Per ulteriori informazioni, consulta i parametri del modello Gemini.
    • DYNAMIC_RETRIEVAL_THRESHOLD: un campo facoltativo per impostare la soglia per richiamare la configurazione del recupero dinamico. È un valore in virgola mobile compreso nell'intervallo [0,1]. Se aggiungi il campo dynamicRetrievalConfig, ma non imposti il campo predictor o threshold, il valore della soglia predefinito è 0,7. Se non imposti il campo dynamicRetrievalConfig, la risposta è sempre basata su dati.

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)

Nell'esempio seguente, la richiesta specifica la Ricerca Google come fonte di riferimento. Questo esempio utilizza il metodo generateGroundedContent. Questo esempio utilizza anche un'istruzione di sistema per terminare la risposta con un'emoji sorridente.

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"
}
}
'

Generare una risposta fondata in più turni

Nella generazione di risposte con più turni, in ogni richiesta devi inviare tutto il testo scambiato tra l'utente e il modello in tutti i turni precedenti. In questo modo viene garantita la continuità e viene mantenuto il contesto per generare la risposta all'ultimo prompt.

Per ottenere una risposta fondata mediante la generazione di risposte con più turni:

REST

Gli esempi riportati di seguito mostrano come inviare il testo del prompt di follow-up su più turni. Questi esempi utilizzano il metodo generateGroundedContent e basano le risposte sulla Ricerca Google. Puoi utilizzare passaggi simili per generare risposte fondate utilizzando altre fonti di fondamento.

  1. Invia il primo prompt nella seguente richiesta curl.

    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
    }
    }'
    

    Sostituisci quanto segue:

    • PROJECT_NUMBER: il numero del tuo progetto Google Cloud.
    • PROMPT_TEXT_TURN_1: il testo del prompt dell'utente nel primo turno.
    • SYSTEM_INSTRUCTION_TURN_1: un campo facoltativo per fornire un preambolo o un contesto aggiuntivo. Per la generazione di risposte con più turni, devi fornire le istruzioni di sistema per ogni turno.
    • MODEL_ID: un campo facoltativo per impostare l'ID del modello Gemini che vuoi utilizzare per generare la risposta basata su dati. Per un elenco degli ID modello disponibili, consulta Modelli supportati.
    • TEMPERATURE: un campo facoltativo per impostare la temperatura utilizzata per il campionamento. Google consiglia una temperatura di 0,0. Per ulteriori informazioni, consulta i parametri del modello Gemini.
    • TOP_P: un campo facoltativo per impostare il valore P superiore per il modello. Per ulteriori informazioni, consulta i parametri del modello Gemini.
    • TOP_K: un campo facoltativo per impostare il valore top-K per il modello. Per ulteriori informazioni, consulta i parametri del modello Gemini.
  2. Invia il secondo prompt come follow-up. Aggiungi il primo prompt dell'utente seguito dalla risposta corrispondente del modello per il contesto.

    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
    }
    }'
    

    Sostituisci quanto segue:

    • PROJECT_NUMBER: il numero del tuo progetto Google Cloud.
    • PROMPT_TEXT_TURN_1: il testo del prompt dell'utente nel primo turno.
    • ANSWER_TEXT_TURN_1: il testo della risposta del modello nel primo turno.
    • PROMPT_TEXT_TURN_2: il testo del prompt dell'utente nel secondo turno.
    • SYSTEM_INSTRUCTION_TURN_2: un campo facoltativo per fornire un preambolo o un contesto aggiuntivo. Per la generazione di risposte con più turni, devi fornire le istruzioni di sistema per ogni turno.
    • MODEL_ID: un campo facoltativo per impostare l'ID del modello Gemini che vuoi utilizzare per generare la risposta basata su dati. Per un elenco degli ID modello disponibili, consulta Modelli supportati.
    • TEMPERATURE: un campo facoltativo per impostare la temperatura utilizzata per il campionamento. Google consiglia una temperatura di 0,0 °C. Per ulteriori informazioni, consulta i parametri del modello Gemini.
    • TOP_P: un campo facoltativo per impostare il valore P superiore per il modello. Per ulteriori informazioni, consulta i parametri del modello Gemini.
    • TOP_K: un campo facoltativo per impostare il valore top-K per il modello. Per ulteriori informazioni, consulta i parametri del modello Gemini.
  3. Ripeti questa procedura per ricevere ulteriori risposte. In ogni turno, aggiungi tutti i prompt precedenti dell'utente seguiti dalle relative risposte del modello.

Esempio di generazione di risposte con più turni

Nel seguente esempio, la richiesta specifica tre testi di fatti in linea come fonte di fondamento per generare risposte in due turni. Questo esempio utilizza il metodo generateGroundedContent. Questo esempio utilizza anche un'istruzione di sistema per terminare la risposta nel primo turno con un'emoji sorridente.

REST

  1. Invia il primo prompt nella seguente richiesta curl.

    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. Invia il secondo prompt come follow-up. Aggiungi il primo prompt dell'utente seguito dalla risposta corrispondente del modello per il contesto.

    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"
    }
    }'
    

Mostrare gradualmente le risposte fondate

Puoi scegliere di riprodurre in streaming le risposte del modello. Questa funzionalità è utile nei casi d'uso in cui la risposta è particolarmente lunga e l'invio dell'intera risposta contemporaneamente causa un ritardo significativo. Lo streaming della risposta suddivide la risposta in un array di diversi candidati che contengono parti sequenziali del testo della risposta.

Per ottenere una risposta basata su dati e in streaming:

REST

L'esempio seguente mostra come trasmettere in streaming una risposta basata su dati. Questo esempio utilizza il metodo streamGenerateGroundedContent e basa la risposta sulla Ricerca Google senza la configurazione del recupero dinamico. Puoi utilizzare passaggi simili per generare risposte fondate utilizzando altre fonti di fondamento.

  1. Invia il prompt nella seguente richiesta curl.

    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
    }
    }
    ]'
    

    Sostituisci quanto segue:

    • PROJECT_NUMBER: il numero del tuo progetto Google Cloud.
    • PROMPT_TEXT: il prompt dell'utente.
    • SYSTEM_INSTRUCTION: un campo facoltativo per fornire un preambolo o un contesto aggiuntivo.
    • MODEL_ID: un campo facoltativo per impostare l'ID del modello Gemini che vuoi utilizzare per generare la risposta basata su dati. Per un elenco degli ID modello disponibili, consulta Modelli supportati.
    • TEMPERATURE: un campo facoltativo per impostare la temperatura utilizzata per il campionamento. Google consiglia una temperatura di 0,0 °C. Per ulteriori informazioni, consulta i parametri del modello Gemini.
    • TOP_P: un campo facoltativo per impostare il valore P massimo per il modello. Per ulteriori informazioni, consulta i parametri del modello Gemini.
    • TOP_K: un campo facoltativo per impostare il valore top-K per il modello. Per ulteriori informazioni, consulta i parametri del modello 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)

Esempio di streaming di risposte fondate

Nell'esempio seguente, la richiesta specifica la Ricerca Google come origine di riferimento per trasmettere una risposta senza la configurazione del recupero dinamico. La risposta in streaming viene distribuita su più candidati per la risposta. Questo esempio utilizza il metodo 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"
  }
}
]'

Modelli supportati

I seguenti modelli supportano la messa a terra:

  • Gemini 1.5 Pro solo con input di testo
  • Gemini 1.5 Flash con solo input di testo
  • Gemini 1.0 Pro solo con input di testo

Per scoprire di più su questi modelli Gemini, consulta Versioni e ciclo di vita dei modelli Gemini.

Quando chiami il metodo generateGroundedContent, puoi utilizzare i seguenti ID modello:

ID modello Aggiornato automaticamente
default
gemini-1.0-pro
gemini-1.0-pro-001 No
gemini-1.0-pro-002 No
gemini-1.5-flash
gemini-1.5-flash-001 No
gemini-1.5-pro
gemini-1.5-pro-001 No

Passaggi successivi

Scopri come utilizzare il metodo di generazione con grounding con altre API RAG per generare risposte basate su dati non strutturati.