Fundamentos

En la IA generativa, los fundamentos son la capacidad de conectar el resultado del modelo con fuentes de información verificables. Si proporcionas modelos con acceso a fuentes de datos específicas, los fundamentos conectan su resultado a estos datos y reducen las posibilidades de inventar contenido.

Con Vertex AI, puedes fundamentar los resultados del modelo de las siguientes maneras:

  • Fundamentación con la Búsqueda de Google: Fundamenta un modelo con datos web disponibles públicamente.
  • Fundamenta en tus propios datos: Fundamenta un modelo con tus propios datos de Vertex AI Search como almacén de datos (versión preliminar).

Para obtener más información sobre la puesta a tierra, consulta Descripción general de la puesta a tierra.

Modelos compatibles

Modelo Versión
Gemini 1.5 Pro solo con entrada de texto gemini-1.5-pro-002
gemini-1.5-pro-001
Gemini 1.5 Flash solo con entrada de texto gemini-1.5-flash-002
gemini-1.5-flash-001
Gemini 1.0 Pro solo con entrada de texto gemini-1.0-pro-001
gemini-1.0-pro-002

Limitaciones

La conexión a tierra solo está disponible para las solicitudes de texto.

Ejemplo de sintaxis

En este ejemplo, se muestra la sintaxis para conectar a tierra un modelo y especificar el idioma compatible. Para conocer los idiomas admitidos, consulta Idiomas.


Especifica valores para las siguientes variables:
  • PROMPT_TEXT: Es la solicitud de texto que envías a un modelo de lenguaje para recibir una respuesta.
  • SYSTEM_INSTRUCTION: Un conjunto de instrucciones que le indica al modelo cómo comportarse y responder a las instrucciones.
  • FACT_TEXT_1: Es la información verificada que usa el modelo para generar una respuesta.
  • TITLE_1: Es el nombre de tu fuente de información verificada.
  • URI_1: Es una cadena que identifica de forma única una ubicación de tu fuente de información verificada.
  • AUTHOR_1: Es el proveedor de la información verificada que usa el modelo para generar una respuesta.
  • FACT_TEXT_2: Es la información verificada que usa el modelo para generar una respuesta.
  • TITLE_2: Es el nombre de tu fuente de información verificada.
  • URI_2: Es una cadena que identifica de forma única una ubicación de tu fuente de información verificada.
  • FACT_TEXT_3: Es la información verificada que usa el modelo para generar una respuesta.
  • TITLE_3: Es el nombre de tu fuente de información verificada.
  • URI_3: Es una cadena que identifica de forma única una ubicación de tu fuente de información verificada.
  • PROJECT_NUMBER: Identifica de forma exclusiva tu Google Cloud proyecto, que contiene tus recursos.
  • APP_ID_1: Es una aplicación que interactúa con el modelo.
  • APP_ID_2: Es una aplicación que interactúa con el modelo.
  • MODEL_ID: Identifica el modelo con el que interactúa tu aplicación.
  • LANGUAGE_CODE: Identifica el lenguaje que se usa para generar una respuesta fundamentada.

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

Lista de parámetros

Consulta ejemplos para obtener detalles sobre la implementación.

GoogleSearchRetrieval

Basar la respuesta en datos públicos

Parámetros

google_search_retrieval

Obligatorio: Object

Basarse en datos web disponibles públicamente

Retrieval

Fundamenta la respuesta con datos privados de Vertex AI Search como almacén de datos. Define una herramienta de recuperación a la que el modelo puede llamar para acceder al conocimiento externo.

Parámetros

source

Obligatorio: VertexAISearch

Fundamenta con fuentes de datos de Vertex AI Search.

VertexAISearch

Parámetros

datastore

Obligatorio: string

ID de recurso de almacén de datos completamente calificado de Vertex AI Search, en el siguiente formato: projects/{project}/locations/{location}/collections/default_collection/dataStores/{datastore}

Ejemplos

Fundamenta la respuesta en datos web públicos con la Búsqueda de Google

Fundamenta la respuesta con datos públicos de la Búsqueda de Google. Incluye la herramienta google_search_retrieval en la solicitud. No se requieren parámetros adicionales.

REST

Antes de usar cualquiera de los datos de solicitud a continuación, realiza los siguientes reemplazos:

  • LOCATION: La región para procesar la solicitud.
  • PROJECT_ID: El ID del proyecto.
  • MODEL_ID: El ID del modelo multimodal. Solo los modelos Gemini 1.0 y Gemini 1.5 admiten la recuperación dinámica. Los modelos de Gemini 2.0 no admiten la recuperación dinámica.
  • TEXT: Las instrucciones de texto que se incluirán en el mensaje.
  • DYNAMIC_THRESHOLD: Es un campo opcional para establecer el umbral para invocar la configuración de recuperación dinámica. Es un valor de punto flotante en el rango [0,1]. Si no estableces el campo dynamicThreshold, el valor del umbral predeterminado es 0.7.

Método HTTP y URL:

POST https://LOCATION-aiplatform.googleapis.com/v1beta1/projects/PROJECT_ID/locations/LOCATION/publishers/google/models/MODEL_ID:generateContent

Cuerpo JSON de la solicitud:

{
  "contents": [{
    "role": "user",
    "parts": [{
      "text": "TEXT"
    }]
  }],
  "tools": [{
    "googleSearchRetrieval": {
      "dynamicRetrievalConfig": {
        "mode": "MODE_DYNAMIC",
        "dynamicThreshold": DYNAMIC_THRESHOLD
      }
    }
  }],
  "model": "projects/PROJECT_ID/locations/LOCATION/publishers/google/models/MODEL_ID"
}

Para enviar tu solicitud, expande una de estas opciones:

Deberías recibir una respuesta JSON similar a la que se muestra a continuación:

{
   "candidates": [
     {
       "content": {
         "role": "model",
         "parts": [
           {
             "text": "Chicago weather changes rapidly, so layers let you adjust easily. Consider a base layer, a warm mid-layer (sweater-fleece), and a weatherproof outer layer."
           }
         ]
       },
       "finishReason": "STOP",
       "safetyRatings":[
       "..."
    ],
       "groundingMetadata": {
         "webSearchQueries": [
           "What's the weather in Chicago this weekend?"
         ],
         "searchEntryPoint": {
            "renderedContent": "....................."
         }
         "groundingSupports": [
            {
              "segment": {
                "startIndex": 0,
                "endIndex": 65,
                "text": "Chicago weather changes rapidly, so layers let you adjust easily."
              },
              "groundingChunkIndices": [
                0
              ],
              "confidenceScores": [
                0.99
              ]
            },
          ]
          "retrievalMetadata": {
              "webDynamicRetrievalScore": 0.96879
            }
       }
     }
   ],
   "usageMetadata": { "..."
   }
 }

Python

import vertexai

from vertexai.generative_models import (
    GenerationConfig,
    GenerativeModel,
    Tool,
    grounding,
)

# TODO(developer): Update and un-comment below line
# PROJECT_ID = "your-project-id"
vertexai.init(project=PROJECT_ID, location="us-central1")

model = GenerativeModel("gemini-1.5-flash-001")

# Use Google Search for grounding
tool = Tool.from_google_search_retrieval(
    grounding.GoogleSearchRetrieval(
        # Optional: For Dynamic Retrieval
        dynamic_retrieval_config=grounding.DynamicRetrievalConfig(
            dynamic_threshold=0.7,
        )
    )
)

prompt = "When is the next total solar eclipse in US?"
response = model.generate_content(
    prompt,
    tools=[tool],
    generation_config=GenerationConfig(
        temperature=0.0,
    ),
)

print(response.text)
# Example response:
# The next total solar eclipse visible from the contiguous United States will be on **August 23, 2044**.

NodeJS

const {VertexAI} = require('@google-cloud/vertexai');

/**
 * TODO(developer): Update these variables before running the sample.
 */
async function generateContentWithGoogleSearchGrounding(
  projectId = 'PROJECT_ID',
  location = 'us-central1',
  model = 'gemini-1.5-flash-001'
) {
  // Initialize Vertex with your Cloud project and location
  const vertexAI = new VertexAI({project: projectId, location: location});

  const generativeModelPreview = vertexAI.preview.getGenerativeModel({
    model: model,
    generationConfig: {maxOutputTokens: 256},
  });

  const googleSearchRetrievalTool = {
    googleSearchRetrieval: {},
  };

  const request = {
    contents: [{role: 'user', parts: [{text: 'Why is the sky blue?'}]}],
    tools: [googleSearchRetrievalTool],
  };

  const result = await generativeModelPreview.generateContent(request);
  const response = await result.response;
  const groundingMetadata = response.candidates[0].groundingMetadata;
  console.log(
    'Response: ',
    JSON.stringify(response.candidates[0].content.parts[0].text)
  );
  console.log('GroundingMetadata is: ', JSON.stringify(groundingMetadata));
}

Java

import com.google.cloud.vertexai.VertexAI;
import com.google.cloud.vertexai.api.GenerateContentResponse;
import com.google.cloud.vertexai.api.GoogleSearchRetrieval;
import com.google.cloud.vertexai.api.GroundingMetadata;
import com.google.cloud.vertexai.api.Tool;
import com.google.cloud.vertexai.generativeai.GenerativeModel;
import com.google.cloud.vertexai.generativeai.ResponseHandler;
import java.io.IOException;
import java.util.Collections;

public class GroundingWithPublicData {
  public static void main(String[] args) throws IOException {
    // TODO(developer): Replace these variables before running the sample.
    String projectId = "your-google-cloud-project-id";
    String location = "us-central1";
    String modelName = "gemini-1.5-flash-001";

    groundWithPublicData(projectId, location, modelName);
  }

  // A request whose response will be "grounded" with information found in Google Search.
  public static String groundWithPublicData(String projectId, String location, String modelName)
      throws IOException {
    // Initialize client that will be used to send requests.
    // This client only needs to be created once, and can be reused for multiple requests.
    try (VertexAI vertexAI = new VertexAI(projectId, location)) {
      Tool googleSearchTool =
          Tool.newBuilder()
              .setGoogleSearchRetrieval(
                  // Enable using the result from this tool in detecting grounding
                  GoogleSearchRetrieval.newBuilder())
              .build();

      GenerativeModel model =
          new GenerativeModel(modelName, vertexAI)
              .withTools(Collections.singletonList(googleSearchTool));

      GenerateContentResponse response = model.generateContent("Why is the sky blue?");

      GroundingMetadata groundingMetadata = response.getCandidates(0).getGroundingMetadata();
      String answer = ResponseHandler.getText(response);

      System.out.println("Answer: " + answer);
      System.out.println("Grounding metadata: " + groundingMetadata);

      return answer;
    }
  }
}

Fundamenta la respuesta en datos privados con Vertex AI Search

Fundamenta la respuesta con datos de un almacén de datos de Vertex AI Search. Para obtener más información, consulta Compilador de agentes de Vertex AI.

Antes de fundamentar una respuesta con datos privados, crea un almacén de datos y una app de búsqueda.

ADVERTENCIA: Por el momento, esta interfaz de "puesta a tierra" no admite el "modo de fragmento" de Vertex AI Search.

REST

Antes de usar cualquiera de los datos de solicitud a continuación, realiza los siguientes reemplazos:

  • LOCATION: La región para procesar la solicitud.
  • PROJECT_ID: El ID del proyecto.
  • MODEL_ID: El ID del modelo multimodal.
  • TEXT: las instrucciones de texto que se incluirán en el mensaje.

Método HTTP y URL:

POST https://LOCATION-aiplatform.googleapis.com/v1beta1/projects/PROJECT_ID/locations/LOCATION/publishers/google/models/MODEL_ID:generateContent

Cuerpo JSON de la solicitud:

{
  "contents": [{
    "role": "user",
    "parts": [{
      "text": "TEXT"
    }]
  }],
  "tools": [{
    "retrieval": {
      "vertexAiSearch": {
        "datastore": projects/PROJECT_ID/locations/global/collections/default_collection/dataStores/DATA_STORE_ID
      }
    }
  }],
  "model": "projects/PROJECT_ID/locations/LOCATION/publishers/google/models/MODEL_ID"
}

Para enviar tu solicitud, expande una de estas opciones:

Deberías recibir una respuesta JSON similar a la que se muestra a continuación:

{
  "candidates": [
    {
      "content": {
        "role": "model",
        "parts": [
          {
            "text": "You can make an appointment on the website https://dmv.gov/"
          }
        ]
      },
      "finishReason": "STOP",
      "safetyRatings": [
        "..."
      ],
      "groundingMetadata": {
        "retrievalQueries": [
          "How to make appointment to renew driving license?"
        ],
        "groundingChunks": [
          {
            "retrievedContext": {
              "uri": "https://vertexaisearch.cloud.google.com/grounding-api-redirect/AXiHM.....QTN92V5ePQ==",
              "title": "dmv"
            }
          }
        ],
        "groundingSupport": [
          {
            "segment": {
              "startIndex": 25,
              "endIndex": 147
            },
            "segment_text": "ipsum lorem ...",
            "supportChunkIndices": [1, 2],
            "confidenceScore": [0.9541752, 0.97726375]
          },
          {
            "segment": {
              "startIndex": 294,
              "endIndex": 439
            },
            "segment_text": "ipsum lorem ...",
            "supportChunkIndices": [1],
            "confidenceScore": [0.9541752, 0.9325467]
          }
        ]
      }
    }
  ],
  "usageMetadata": {
    "..."
  }
}

Python

import vertexai

from vertexai.preview.generative_models import (
    GenerationConfig,
    GenerativeModel,
    Tool,
    grounding,
)

# TODO(developer): Update and un-comment below lines
# PROJECT_ID = "your-project-id"
# data_store_id = "your-data-store-id"

vertexai.init(project=PROJECT_ID, location="us-central1")

model = GenerativeModel("gemini-1.5-flash-001")

tool = Tool.from_retrieval(
    grounding.Retrieval(
        grounding.VertexAISearch(
            datastore=data_store_id,
            project=PROJECT_ID,
            location="global",
        )
    )
)

prompt = "How do I make an appointment to renew my driver's license?"
response = model.generate_content(
    prompt,
    tools=[tool],
    generation_config=GenerationConfig(
        temperature=0.0,
    ),
)

print(response.text)

NodeJS

const {
  VertexAI,
  HarmCategory,
  HarmBlockThreshold,
} = require('@google-cloud/vertexai');

/**
 * TODO(developer): Update these variables before running the sample.
 */
async function generateContentWithVertexAISearchGrounding(
  projectId = 'PROJECT_ID',
  location = 'us-central1',
  model = 'gemini-1.5-flash-001',
  dataStoreId = 'DATASTORE_ID'
) {
  // Initialize Vertex with your Cloud project and location
  const vertexAI = new VertexAI({project: projectId, location: location});

  const generativeModelPreview = vertexAI.preview.getGenerativeModel({
    model: model,
    // The following parameters are optional
    // They can also be passed to individual content generation requests
    safetySettings: [
      {
        category: HarmCategory.HARM_CATEGORY_DANGEROUS_CONTENT,
        threshold: HarmBlockThreshold.BLOCK_MEDIUM_AND_ABOVE,
      },
    ],
    generationConfig: {maxOutputTokens: 256},
  });

  const vertexAIRetrievalTool = {
    retrieval: {
      vertexAiSearch: {
        datastore: `projects/${projectId}/locations/global/collections/default_collection/dataStores/${dataStoreId}`,
      },
      disableAttribution: false,
    },
  };

  const request = {
    contents: [{role: 'user', parts: [{text: 'Why is the sky blue?'}]}],
    tools: [vertexAIRetrievalTool],
  };

  const result = await generativeModelPreview.generateContent(request);
  const response = result.response;
  const groundingMetadata = response.candidates[0];
  console.log('Response: ', JSON.stringify(response.candidates[0]));
  console.log('GroundingMetadata is: ', JSON.stringify(groundingMetadata));
}

Java

import com.google.cloud.vertexai.VertexAI;
import com.google.cloud.vertexai.api.GenerateContentResponse;
import com.google.cloud.vertexai.api.GroundingMetadata;
import com.google.cloud.vertexai.api.Retrieval;
import com.google.cloud.vertexai.api.Tool;
import com.google.cloud.vertexai.api.VertexAISearch;
import com.google.cloud.vertexai.generativeai.GenerativeModel;
import com.google.cloud.vertexai.generativeai.ResponseHandler;
import java.io.IOException;
import java.util.Collections;

public class GroundingWithPrivateData {
  public static void main(String[] args) throws IOException {
    // TODO(developer): Replace these variables before running the sample.
    String projectId = "your-google-cloud-project-id";
    String location = "us-central1";
    String modelName = "gemini-1.5-flash-001";
    String datastore = String.format(
        "projects/%s/locations/global/collections/default_collection/dataStores/%s",
        projectId, "datastore_id");

    groundWithPrivateData(projectId, location, modelName, datastore);
  }

  // A request whose response will be "grounded"
  // with information found in Vertex AI Search datastores.
  public static String groundWithPrivateData(String projectId, String location, String modelName,
                                             String datastoreId)
      throws IOException {
    // Initialize client that will be used to send requests.
    // This client only needs to be created once, and can be reused for multiple requests.
    try (VertexAI vertexAI = new VertexAI(projectId, location)) {
      Tool datastoreTool = Tool.newBuilder()
          .setRetrieval(
              Retrieval.newBuilder()
                  .setVertexAiSearch(VertexAISearch.newBuilder().setDatastore(datastoreId))
                  .setDisableAttribution(false))
          .build();

      GenerativeModel model = new GenerativeModel(modelName, vertexAI).withTools(
          Collections.singletonList(datastoreTool)
      );

      GenerateContentResponse response = model.generateContent(
          "How do I make an appointment to renew my driver's license?");

      GroundingMetadata groundingMetadata = response.getCandidates(0).getGroundingMetadata();
      String answer = ResponseHandler.getText(response);

      System.out.println("Answer: " + answer);
      System.out.println("Grounding metadata: " + groundingMetadata);

      return answer;
    }
  }
}

¿Qué sigue?

Para obtener documentación detallada, consulta lo siguiente: