Cómo obtener respuestas y hacer un seguimiento

En esta página, se presenta la búsqueda con respuestas y preguntas de seguimiento para Vertex AI Search, y se muestra cómo implementarla en apps de búsqueda personalizadas con llamadas a métodos.

La búsqueda con respuestas y preguntas de seguimiento se basa en el método de respuesta. El método de respuesta reemplaza las funciones de resumen del método search anterior y todas las funciones del método converse obsoleto. El método de respuesta también tiene algunas funciones adicionales importantes, como la capacidad de controlar consultas complejas.

Funciones del método de respuesta

Estas son las características clave del método de respuesta:

  • La capacidad de generar respuestas a preguntas complejas Por ejemplo, el método de respuesta puede desglosar consultas compuestas, como las siguientes, en varias consultas más pequeñas para devolver mejores resultados que se usan para generar mejores respuestas:

    • "¿Cuáles son los ingresos respectivos de Google Cloud y Google Ads en 2024?"
    • "¿Cuántos años después de su fundación, Google alcanzó ingresos de USD 1,000 millones?"
  • La capacidad de combinar la búsqueda y la generación de respuestas en una conversación de varios turnos llamando al método de respuesta en cada turno.

  • La capacidad de combinarse con el método de búsqueda para reducir la latencia de la búsqueda Puedes llamar al método de búsqueda y al método de respuesta por separado, y renderizar los resultados de la búsqueda y las respuestas en diferentes elementos iframe en diferentes momentos. Esto significa que puedes mostrar a tus usuarios resultados de la búsqueda (los 10 vínculos azules) en milisegundos. No es necesario que esperes a que se generen las respuestas para mostrar los resultados de la búsqueda.

Las funciones de respuesta y seguimiento se pueden dividir en tres fases de la búsqueda, la respuesta y la consulta:

Cuándo usar la respuesta y cuándo usar la búsqueda

Vertex AI Search tiene dos métodos que se usan para consultar apps. Tienen características diferentes, pero que se superponen.

Usa el método answer en los siguientes casos:

  • Quieres una respuesta (o un resumen) generada por IA de los resultados de la búsqueda.

  • Quieres realizar búsquedas de varios turnos, es decir, búsquedas que conserven el contexto para permitir preguntas de seguimiento.

Usa el método de búsqueda en los siguientes casos:

  • Solo necesitas resultados de la búsqueda, no una respuesta generada.

  • Tienes alguno de los siguientes síntomas:

    • Datos de medios o de atención médica
    • Tus propios embeddings
    • Controles de sinónimos o redireccionamientos
    • Facetas
    • Códigos de país del usuario
  • Debes explorar los datos en tu almacén de datos genérico.

Usa los métodos de respuesta y búsqueda juntos en los siguientes casos:

  • Quieres devolver más de diez resultados de la búsqueda y quieres una respuesta generada.

  • Tienes problemas de latencia y quieres mostrar los resultados de la búsqueda rápidamente antes de que se muestre la respuesta generada.

Atributos de la fase de búsqueda

La función de respuestas y seguimiento admite el procesamiento de consultas en lenguaje natural.

En esta sección, se describen y se ilustran las diversas opciones para la reformulación y clasificación de búsquedas.

Reformulación de la búsqueda

La reformulación de la búsqueda está activada de forma predeterminada. Esta función elige automáticamente la mejor manera de reformular las búsquedas para mejorar los resultados. Esta función también puede controlar las búsquedas que no requieren reformulación.

  • Desglosa las consultas complejas en varias consultas y realiza subconsultas síncronas.

    Por ejemplo, una consulta compleja se divide en cuatro consultas más pequeñas y sencillas.

    Entrada del usuario Subconsultas creadas a partir de la consulta compleja
    ¿Qué trabajos y pasatiempos tienen en común Andie Ram y Arnaud Clément?
    • Ocupación de Andie Ram
    • Ocupación de Arnaud Clément
    • Pasatiempo de Andie Ram
    • Pasatiempo de Arnaud Clément
  • Sintetizar consultas de interacción múltiple para que las preguntas de seguimiento tengan en cuenta el contexto y el estado.

    Por ejemplo, las preguntas sintetizadas a partir de la entrada del usuario en cada turno podrían verse de la siguiente manera:

    Entrada del usuario Consulta sintetizada
    Turno 1: Laptops para la escuela laptops para la escuela
    Turn 2: not mac Laptops para la escuela que no sean Mac
    Turno 3: Necesito una pantalla más grande y también un teclado y un mouse inalámbricos. Laptops con pantalla más grande para la escuela, que no sean Mac, con teclado y mouse inalámbricos
    Turn 4: y una mochila para llevarlo Laptops con pantalla más grande para la escuela, que no sean Mac, con teclado y mouse inalámbricos, y una mochila para llevarla
  • Simplifica las búsquedas largas para mejorar la recuperación (requiere funciones avanzadas de LLM).

    Por ejemplo, una búsqueda larga se acorta a una búsqueda típica.

    Entrada del usuario Se simplificó la búsqueda
    Estoy tratando de averiguar por qué el botón \"Agregar al carrito\" de nuestro sitio web no funciona correctamente. Parece que, cuando un usuario hace clic en el botón, el elemento no se agrega al carrito y recibe un mensaje de error. Revisé el código y parece ser correcto, por lo que no sé cuál podría ser el problema. ¿Puedes ayudarme a solucionar este problema? El botón "Agregar al carrito" no funciona en el sitio web.
  • Realizar razonamientos de varios pasos

    El razonamiento de varios pasos se basa en el paradigma ReAct (razonar y actuar), que permite a los LLM resolver tareas complejas con razonamiento en lenguaje natural. De forma predeterminada, la cantidad máxima de pasos es cinco.

    Por ejemplo:

    Entrada del usuario Dos pasos para generar la respuesta
    ¿Cuántos años después de su fundación Google alcanzó los USD 1, 000 millones en ingresos? Paso 1:
    [Pensamiento]: Necesito saber cuándo se fundó Google para poder consultar sus ingresos desde entonces.
    [Act] Search: When was Google founded?[Observe Search Results]: "1998"

    Paso 2:
    [Pensamiento]: Ahora necesito buscar los ingresos anuales de Google desde 1998 y averiguar cuándo superaron los mil millones por primera vez.
    [Act] Search: Google revenue since 1998
    [Observe Search Results] Google revenue in 1998, Google revenue in 1999…..
    [Respuesta]: Google alcanzó ingresos superiores a USD 1,000 millones en 2003 [1], 5 años después de su fundación en 1998 [2].

    El razonamiento de varios pasos requiere funciones avanzadas de LLM.

Clasificación de búsquedas

Las opciones de clasificación de búsquedas sirven para identificar las búsquedas adversarias y las que no buscan respuestas. De forma predeterminada, las opciones de clasificación de consultas están desactivadas.

Para obtener más información sobre las búsquedas adversariales y las que no buscan respuestas, consulta Ignora las búsquedas adversariales y Ignora las búsquedas que no buscan resúmenes.

Funciones de la fase de búsqueda

Para la búsqueda, el método de respuesta tiene las mismas opciones que el método de búsqueda. Por ejemplo:

Funciones de la fase de respuesta

Durante la fase de respuesta, cuando se generan respuestas a partir de los resultados de la búsqueda, puedes habilitar las mismas funciones que en el método de búsqueda. Por ejemplo:

Las funciones adicionales de la fase de respuesta que no están disponibles en el método de búsqueda son las siguientes:

  • Obtener una puntuación de respaldo para cada afirmación (oración en la respuesta generada) Una puntuación de respaldo es un valor de punto flotante en el rango [0,1] que indica qué tan fundamentada está la afirmación en los datos del almacén de datos. Para obtener más información, consulta Cómo devolver las puntuaciones de fundamentación de devoluciones.

  • Obtener una puntuación de asistencia agregada para la respuesta La puntuación de asistencia indica qué tan bien se fundamenta la respuesta en los datos del almacén de datos. Para obtener más información, consulta Cómo devolver las puntuaciones de fundamentación del retorno.

  • Devuelve solo respuestas fundamentadas. Puedes optar por devolver solo las respuestas que cumplan con un determinado umbral de puntuación de asistencia. Para obtener más información, consulta Cómo mostrar solo respuestas fundamentadas.

  • Elige devolver preguntas relacionadas. Las preguntas relacionadas son sugerencias que tus usuarios pueden elegir en lugar de ingresar sus propias preguntas.

  • Agrega información de personalización a las búsquedas para que las respuestas se puedan personalizar para usuarios individuales. Para obtener más información, consulta Cómo personalizar las respuestas.

Para recibir respuestas multimodales que incluyan gráficos o imágenes además de texto, tienes las siguientes opciones:

  • Obtener respuestas que incluyen gráficos que representan los datos contenidos en las respuestas Para obtener más información, consulta Genera gráficos para las respuestas.

  • Se recuperan imágenes del almacén de datos. Si el almacén de datos contiene imágenes, el método de respuesta puede devolver una imagen en la respuesta. Las imágenes del almacén de datos también se pueden devolver en referencias si se solicitan citas. Para obtener más información, consulta Cómo recuperar imágenes existentes del almacén de datos.

Antes de comenzar

Según el tipo de app que tengas, cumple con los siguientes requisitos:

  • Si tienes una app de búsqueda estructurada, no estructurada o de sitios web, activa las siguientes opciones:

    • Funciones de la edición Enterprise: Esto te brinda acceso a las funciones principales de respuestas generativas. Esto incluye todas las funciones de generación de respuestas, excepto las funciones avanzadas de respuestas generativas, como las preguntas relacionadas, la simplificación de búsquedas, las búsquedas de varios turnos y las respuestas multimodales que muestran imágenes y gráficos.
    • Funciones avanzadas de LLM: Te brindan acceso a las funciones avanzadas de respuestas generativas que requieren razonamiento de varios pasos, simplificación de consultas, consultas de varios turnos, preguntas relacionadas y respuestas multimodales que muestran imágenes y gráficos.
  • Además, si tienes un almacén de datos de búsqueda en el sitio web, activa la indexación avanzada de sitios web.

Buscar y responder (básico)

El siguiente comando muestra cómo llamar al método answer y devolver una respuesta generada y una lista de resultados de la búsqueda, con vínculos a las fuentes.

Este comando solo muestra la entrada requerida. Las opciones se dejan con sus valores predeterminados.

REST

Para buscar y obtener resultados con una respuesta generada, haz lo siguiente:

  1. Ejecuta el siguiente comando de curl:

    curl -X POST -H "Authorization: Bearer $(gcloud auth print-access-token)" \
      -H "Content-Type: application/json" \
      "https://discoveryengine.googleapis.com/v1/projects/PROJECT_ID/locations/global/collections/default_collection/engines/APP_ID/servingConfigs/default_search:answer" \
      -d '{
            "query": { "text": "QUERY"}
          }'
    

    Reemplaza lo siguiente:

    • PROJECT_ID: Es el ID de tu proyecto de Google Cloud .
    • APP_ID: Es el ID de la app de Vertex AI Search que deseas consultar.
    • QUERY: Es una cadena de texto libre que contiene la pregunta o la búsqueda. Por ejemplo, "¿Cómo se comparan las bases de datos de BigQuery y Spanner?".

Python

Para obtener más información, consulta la documentación de referencia de la API de AI Applications Python.

Para autenticarte en AI Applications, configura las credenciales predeterminadas de la aplicación. Si deseas obtener más información, consulta Configura la autenticación para un entorno de desarrollo local.

from google.api_core.client_options import ClientOptions
from google.cloud import discoveryengine_v1 as discoveryengine

# TODO(developer): Uncomment these variables before running the sample.
# project_id = "YOUR_PROJECT_ID"
# location = "YOUR_LOCATION"                    # Values: "global", "us", "eu"
# engine_id = "YOUR_APP_ID"


def answer_query_sample(
    project_id: str,
    location: str,
    engine_id: str,
) -> discoveryengine.AnswerQueryResponse:
    #  For more information, refer to:
    # https://cloud.google.com/generative-ai-app-builder/docs/locations#specify_a_multi-region_for_your_data_store
    client_options = (
        ClientOptions(api_endpoint=f"{location}-discoveryengine.googleapis.com")
        if location != "global"
        else None
    )

    # Create a client
    client = discoveryengine.ConversationalSearchServiceClient(
        client_options=client_options
    )

    # The full resource name of the Search serving config
    serving_config = f"projects/{project_id}/locations/{location}/collections/default_collection/engines/{engine_id}/servingConfigs/default_serving_config"

    # Optional: Options for query phase
    # The `query_understanding_spec` below includes all available query phase options.
    # For more details, refer to https://cloud.google.com/generative-ai-app-builder/docs/reference/rest/v1/QueryUnderstandingSpec
    query_understanding_spec = discoveryengine.AnswerQueryRequest.QueryUnderstandingSpec(
        query_rephraser_spec=discoveryengine.AnswerQueryRequest.QueryUnderstandingSpec.QueryRephraserSpec(
            disable=False,  # Optional: Disable query rephraser
            max_rephrase_steps=1,  # Optional: Number of rephrase steps
        ),
        # Optional: Classify query types
        query_classification_spec=discoveryengine.AnswerQueryRequest.QueryUnderstandingSpec.QueryClassificationSpec(
            types=[
                discoveryengine.AnswerQueryRequest.QueryUnderstandingSpec.QueryClassificationSpec.Type.ADVERSARIAL_QUERY,
                discoveryengine.AnswerQueryRequest.QueryUnderstandingSpec.QueryClassificationSpec.Type.NON_ANSWER_SEEKING_QUERY,
            ]  # Options: ADVERSARIAL_QUERY, NON_ANSWER_SEEKING_QUERY or both
        ),
    )

    # Optional: Options for answer phase
    # The `answer_generation_spec` below includes all available query phase options.
    # For more details, refer to https://cloud.google.com/generative-ai-app-builder/docs/reference/rest/v1/AnswerGenerationSpec
    answer_generation_spec = discoveryengine.AnswerQueryRequest.AnswerGenerationSpec(
        ignore_adversarial_query=False,  # Optional: Ignore adversarial query
        ignore_non_answer_seeking_query=False,  # Optional: Ignore non-answer seeking query
        ignore_low_relevant_content=False,  # Optional: Return fallback answer when content is not relevant
        model_spec=discoveryengine.AnswerQueryRequest.AnswerGenerationSpec.ModelSpec(
            model_version="gemini-2.0-flash-001/answer_gen/v1",  # Optional: Model to use for answer generation
        ),
        prompt_spec=discoveryengine.AnswerQueryRequest.AnswerGenerationSpec.PromptSpec(
            preamble="Give a detailed answer.",  # Optional: Natural language instructions for customizing the answer.
        ),
        include_citations=True,  # Optional: Include citations in the response
        answer_language_code="en",  # Optional: Language code of the answer
    )

    # Initialize request argument(s)
    request = discoveryengine.AnswerQueryRequest(
        serving_config=serving_config,
        query=discoveryengine.Query(text="What is Vertex AI Search?"),
        session=None,  # Optional: include previous session ID to continue a conversation
        query_understanding_spec=query_understanding_spec,
        answer_generation_spec=answer_generation_spec,
        user_pseudo_id="user-pseudo-id",  # Optional: Add user pseudo-identifier for queries.
    )

    # Make the request
    response = client.answer_query(request)

    # Handle the response
    print(response)

    return response

Comandos de la fase de consulta

En esta sección, se muestra cómo especificar opciones para la fase de consulta de la llamada de método answer.

Buscar y responder (parafraseo inhabilitado)

En el siguiente comando, se muestra cómo llamar al método answer y devolver una respuesta generada y una lista de resultados de la búsqueda. La respuesta podría ser diferente de la anterior porque la opción de reformulación está inhabilitada.

REST

Para buscar y obtener resultados con una respuesta generada sin aplicar el parafraseo de la búsqueda, haz lo siguiente:

  1. Ejecuta el siguiente comando de curl:

    curl -X POST -H "Authorization: Bearer $(gcloud auth print-access-token)" \
      -H "Content-Type: application/json" \
      "https://discoveryengine.googleapis.com/v1/projects/PROJECT_ID/locations/global/collections/default_collection/engines/APP_ID/servingConfigs/default_search:answer" \
      -d '{
            "query": { "text": "QUERY"},
            "queryUnderstandingSpec": {
               "queryRephraserSpec": {
                  "disable": true
            }
        }
          }'
    
    

    Reemplaza lo siguiente:

    • PROJECT_ID: Es el ID de tu proyecto de Google Cloud .
    • APP_ID: Es el ID de la app de Vertex AI Search.
    • QUERY: Es una cadena de texto libre que contiene la pregunta o la búsqueda. Por ejemplo, "¿Cómo se comparan las bases de datos de BigQuery y Spanner?".

Python

Para obtener más información, consulta la documentación de referencia de la API de AI Applications Python.

Para autenticarte en AI Applications, configura las credenciales predeterminadas de la aplicación. Si deseas obtener más información, consulta Configura la autenticación para un entorno de desarrollo local.

from google.api_core.client_options import ClientOptions
from google.cloud import discoveryengine_v1 as discoveryengine

# TODO(developer): Uncomment these variables before running the sample.
# project_id = "YOUR_PROJECT_ID"
# location = "YOUR_LOCATION"                    # Values: "global", "us", "eu"
# engine_id = "YOUR_APP_ID"


def answer_query_sample(
    project_id: str,
    location: str,
    engine_id: str,
) -> discoveryengine.AnswerQueryResponse:
    #  For more information, refer to:
    # https://cloud.google.com/generative-ai-app-builder/docs/locations#specify_a_multi-region_for_your_data_store
    client_options = (
        ClientOptions(api_endpoint=f"{location}-discoveryengine.googleapis.com")
        if location != "global"
        else None
    )

    # Create a client
    client = discoveryengine.ConversationalSearchServiceClient(
        client_options=client_options
    )

    # The full resource name of the Search serving config
    serving_config = f"projects/{project_id}/locations/{location}/collections/default_collection/engines/{engine_id}/servingConfigs/default_serving_config"

    # Optional: Options for query phase
    # The `query_understanding_spec` below includes all available query phase options.
    # For more details, refer to https://cloud.google.com/generative-ai-app-builder/docs/reference/rest/v1/QueryUnderstandingSpec
    query_understanding_spec = discoveryengine.AnswerQueryRequest.QueryUnderstandingSpec(
        query_rephraser_spec=discoveryengine.AnswerQueryRequest.QueryUnderstandingSpec.QueryRephraserSpec(
            disable=False,  # Optional: Disable query rephraser
            max_rephrase_steps=1,  # Optional: Number of rephrase steps
        ),
        # Optional: Classify query types
        query_classification_spec=discoveryengine.AnswerQueryRequest.QueryUnderstandingSpec.QueryClassificationSpec(
            types=[
                discoveryengine.AnswerQueryRequest.QueryUnderstandingSpec.QueryClassificationSpec.Type.ADVERSARIAL_QUERY,
                discoveryengine.AnswerQueryRequest.QueryUnderstandingSpec.QueryClassificationSpec.Type.NON_ANSWER_SEEKING_QUERY,
            ]  # Options: ADVERSARIAL_QUERY, NON_ANSWER_SEEKING_QUERY or both
        ),
    )

    # Optional: Options for answer phase
    # The `answer_generation_spec` below includes all available query phase options.
    # For more details, refer to https://cloud.google.com/generative-ai-app-builder/docs/reference/rest/v1/AnswerGenerationSpec
    answer_generation_spec = discoveryengine.AnswerQueryRequest.AnswerGenerationSpec(
        ignore_adversarial_query=False,  # Optional: Ignore adversarial query
        ignore_non_answer_seeking_query=False,  # Optional: Ignore non-answer seeking query
        ignore_low_relevant_content=False,  # Optional: Return fallback answer when content is not relevant
        model_spec=discoveryengine.AnswerQueryRequest.AnswerGenerationSpec.ModelSpec(
            model_version="gemini-2.0-flash-001/answer_gen/v1",  # Optional: Model to use for answer generation
        ),
        prompt_spec=discoveryengine.AnswerQueryRequest.AnswerGenerationSpec.PromptSpec(
            preamble="Give a detailed answer.",  # Optional: Natural language instructions for customizing the answer.
        ),
        include_citations=True,  # Optional: Include citations in the response
        answer_language_code="en",  # Optional: Language code of the answer
    )

    # Initialize request argument(s)
    request = discoveryengine.AnswerQueryRequest(
        serving_config=serving_config,
        query=discoveryengine.Query(text="What is Vertex AI Search?"),
        session=None,  # Optional: include previous session ID to continue a conversation
        query_understanding_spec=query_understanding_spec,
        answer_generation_spec=answer_generation_spec,
        user_pseudo_id="user-pseudo-id",  # Optional: Add user pseudo-identifier for queries.
    )

    # Make the request
    response = client.answer_query(request)

    # Handle the response
    print(response)

    return response

Buscar y responder (especifica la cantidad máxima de pasos)

En el siguiente comando, se muestra cómo llamar al método answer y devolver una respuesta generada y una lista de resultados de la búsqueda. La respuesta es diferente de las anteriores porque se aumentó la cantidad de pasos de reformulación.

REST

Para buscar y obtener resultados con una respuesta generada que permita hasta cinco pasos de reformulación, haz lo siguiente:

  1. Ejecuta el siguiente comando de curl:

    curl -X POST -H "Authorization: Bearer $(gcloud auth print-access-token)" \
      -H "Content-Type: application/json" \
      "https://discoveryengine.googleapis.com/v1/projects/PROJECT_ID/locations/global/collections/default_collection/engines/APP_ID/servingConfigs/default_search:answer" \
      -d '{
            "query": { "text": "QUERY"},
            "queryUnderstandingSpec": {
                "queryRephraserSpec": {
                    "maxRephraseSteps": MAX_REPHRASE
                 }
             }
          }'
    

    Reemplaza lo siguiente:

    • PROJECT_ID: Es el ID de tu proyecto de Google Cloud .
    • APP_ID: Es el ID de la app de Vertex AI Search que deseas consultar.
    • QUERY: Es una cadena de texto libre que contiene la pregunta o la búsqueda. Por ejemplo, "¿Cómo se comparan las bases de datos de BigQuery y Spanner?".
    • MAX_REPHRASE: Es la cantidad máxima de pasos de reformulación. El valor más grande permitido es 5. Si no se establece o se establece en un valor inferior a 1, el valor es el predeterminado, 1.

Python

Para obtener más información, consulta la documentación de referencia de la API de AI Applications Python.

Para autenticarte en AI Applications, configura las credenciales predeterminadas de la aplicación. Si deseas obtener más información, consulta Configura la autenticación para un entorno de desarrollo local.

from google.api_core.client_options import ClientOptions
from google.cloud import discoveryengine_v1 as discoveryengine

# TODO(developer): Uncomment these variables before running the sample.
# project_id = "YOUR_PROJECT_ID"
# location = "YOUR_LOCATION"                    # Values: "global", "us", "eu"
# engine_id = "YOUR_APP_ID"


def answer_query_sample(
    project_id: str,
    location: str,
    engine_id: str,
) -> discoveryengine.AnswerQueryResponse:
    #  For more information, refer to:
    # https://cloud.google.com/generative-ai-app-builder/docs/locations#specify_a_multi-region_for_your_data_store
    client_options = (
        ClientOptions(api_endpoint=f"{location}-discoveryengine.googleapis.com")
        if location != "global"
        else None
    )

    # Create a client
    client = discoveryengine.ConversationalSearchServiceClient(
        client_options=client_options
    )

    # The full resource name of the Search serving config
    serving_config = f"projects/{project_id}/locations/{location}/collections/default_collection/engines/{engine_id}/servingConfigs/default_serving_config"

    # Optional: Options for query phase
    # The `query_understanding_spec` below includes all available query phase options.
    # For more details, refer to https://cloud.google.com/generative-ai-app-builder/docs/reference/rest/v1/QueryUnderstandingSpec
    query_understanding_spec = discoveryengine.AnswerQueryRequest.QueryUnderstandingSpec(
        query_rephraser_spec=discoveryengine.AnswerQueryRequest.QueryUnderstandingSpec.QueryRephraserSpec(
            disable=False,  # Optional: Disable query rephraser
            max_rephrase_steps=1,  # Optional: Number of rephrase steps
        ),
        # Optional: Classify query types
        query_classification_spec=discoveryengine.AnswerQueryRequest.QueryUnderstandingSpec.QueryClassificationSpec(
            types=[
                discoveryengine.AnswerQueryRequest.QueryUnderstandingSpec.QueryClassificationSpec.Type.ADVERSARIAL_QUERY,
                discoveryengine.AnswerQueryRequest.QueryUnderstandingSpec.QueryClassificationSpec.Type.NON_ANSWER_SEEKING_QUERY,
            ]  # Options: ADVERSARIAL_QUERY, NON_ANSWER_SEEKING_QUERY or both
        ),
    )

    # Optional: Options for answer phase
    # The `answer_generation_spec` below includes all available query phase options.
    # For more details, refer to https://cloud.google.com/generative-ai-app-builder/docs/reference/rest/v1/AnswerGenerationSpec
    answer_generation_spec = discoveryengine.AnswerQueryRequest.AnswerGenerationSpec(
        ignore_adversarial_query=False,  # Optional: Ignore adversarial query
        ignore_non_answer_seeking_query=False,  # Optional: Ignore non-answer seeking query
        ignore_low_relevant_content=False,  # Optional: Return fallback answer when content is not relevant
        model_spec=discoveryengine.AnswerQueryRequest.AnswerGenerationSpec.ModelSpec(
            model_version="gemini-2.0-flash-001/answer_gen/v1",  # Optional: Model to use for answer generation
        ),
        prompt_spec=discoveryengine.AnswerQueryRequest.AnswerGenerationSpec.PromptSpec(
            preamble="Give a detailed answer.",  # Optional: Natural language instructions for customizing the answer.
        ),
        include_citations=True,  # Optional: Include citations in the response
        answer_language_code="en",  # Optional: Language code of the answer
    )

    # Initialize request argument(s)
    request = discoveryengine.AnswerQueryRequest(
        serving_config=serving_config,
        query=discoveryengine.Query(text="What is Vertex AI Search?"),
        session=None,  # Optional: include previous session ID to continue a conversation
        query_understanding_spec=query_understanding_spec,
        answer_generation_spec=answer_generation_spec,
        user_pseudo_id="user-pseudo-id",  # Optional: Add user pseudo-identifier for queries.
    )

    # Make the request
    response = client.answer_query(request)

    # Handle the response
    print(response)

    return response

Búsqueda y respuesta con clasificación de consultas

En el siguiente comando, se muestra cómo llamar al método answer para consultar si una búsqueda es adversarial, no busca respuestas o ninguna de las dos.

La respuesta incluye el tipo de clasificación de la búsqueda, pero la clasificación no afecta la respuesta en sí. Si quieres cambiar el comportamiento de la respuesta según el tipo de búsqueda, puedes hacerlo en la fase de respuesta. Consulta Cómo ignorar las preguntas adversarias y Cómo ignorar las preguntas que no buscan un resumen.

REST

Para determinar si una búsqueda es adversarial o no busca una respuesta, haz lo siguiente:

  1. Ejecuta el siguiente comando de curl:

    curl -X POST -H "Authorization: Bearer $(gcloud auth print-access-token)" \
      -H "Content-Type: application/json" \
      "https://discoveryengine.googleapis.com/v1/projects/PROJECT_ID/locations/global/collections/default_collection/engines/APP_ID/servingConfigs/default_search:answer" \
      -d '{
            "query": { "text": "QUERY"},
            "queryUnderstandingSpec": {
                "queryClassificationSpec": {
                    "types": ["QUERY_CLASSIFICATION_TYPE"]
                 }
             }
          }'
    

    Reemplaza lo siguiente:

    • PROJECT_ID: Es el ID de tu proyecto de Google Cloud .
    • APP_ID: Es el ID de la app de Vertex AI Search que deseas consultar.
    • QUERY: Es una cadena de texto libre que contiene la pregunta o la búsqueda. Por ejemplo, "hola".
    • QUERY_CLASSIFICATION_TYPE: Los tipos de búsqueda que deseas identificar: ADVERSARIAL_QUERY, NON_ANSWER_SEEKING_QUERY o ambos.

Python

Para obtener más información, consulta la documentación de referencia de la API de AI Applications Python.

Para autenticarte en AI Applications, configura las credenciales predeterminadas de la aplicación. Si deseas obtener más información, consulta Configura la autenticación para un entorno de desarrollo local.

from google.api_core.client_options import ClientOptions
from google.cloud import discoveryengine_v1 as discoveryengine

# TODO(developer): Uncomment these variables before running the sample.
# project_id = "YOUR_PROJECT_ID"
# location = "YOUR_LOCATION"                    # Values: "global", "us", "eu"
# engine_id = "YOUR_APP_ID"


def answer_query_sample(
    project_id: str,
    location: str,
    engine_id: str,
) -> discoveryengine.AnswerQueryResponse:
    #  For more information, refer to:
    # https://cloud.google.com/generative-ai-app-builder/docs/locations#specify_a_multi-region_for_your_data_store
    client_options = (
        ClientOptions(api_endpoint=f"{location}-discoveryengine.googleapis.com")
        if location != "global"
        else None
    )

    # Create a client
    client = discoveryengine.ConversationalSearchServiceClient(
        client_options=client_options
    )

    # The full resource name of the Search serving config
    serving_config = f"projects/{project_id}/locations/{location}/collections/default_collection/engines/{engine_id}/servingConfigs/default_serving_config"

    # Optional: Options for query phase
    # The `query_understanding_spec` below includes all available query phase options.
    # For more details, refer to https://cloud.google.com/generative-ai-app-builder/docs/reference/rest/v1/QueryUnderstandingSpec
    query_understanding_spec = discoveryengine.AnswerQueryRequest.QueryUnderstandingSpec(
        query_rephraser_spec=discoveryengine.AnswerQueryRequest.QueryUnderstandingSpec.QueryRephraserSpec(
            disable=False,  # Optional: Disable query rephraser
            max_rephrase_steps=1,  # Optional: Number of rephrase steps
        ),
        # Optional: Classify query types
        query_classification_spec=discoveryengine.AnswerQueryRequest.QueryUnderstandingSpec.QueryClassificationSpec(
            types=[
                discoveryengine.AnswerQueryRequest.QueryUnderstandingSpec.QueryClassificationSpec.Type.ADVERSARIAL_QUERY,
                discoveryengine.AnswerQueryRequest.QueryUnderstandingSpec.QueryClassificationSpec.Type.NON_ANSWER_SEEKING_QUERY,
            ]  # Options: ADVERSARIAL_QUERY, NON_ANSWER_SEEKING_QUERY or both
        ),
    )

    # Optional: Options for answer phase
    # The `answer_generation_spec` below includes all available query phase options.
    # For more details, refer to https://cloud.google.com/generative-ai-app-builder/docs/reference/rest/v1/AnswerGenerationSpec
    answer_generation_spec = discoveryengine.AnswerQueryRequest.AnswerGenerationSpec(
        ignore_adversarial_query=False,  # Optional: Ignore adversarial query
        ignore_non_answer_seeking_query=False,  # Optional: Ignore non-answer seeking query
        ignore_low_relevant_content=False,  # Optional: Return fallback answer when content is not relevant
        model_spec=discoveryengine.AnswerQueryRequest.AnswerGenerationSpec.ModelSpec(
            model_version="gemini-2.0-flash-001/answer_gen/v1",  # Optional: Model to use for answer generation
        ),
        prompt_spec=discoveryengine.AnswerQueryRequest.AnswerGenerationSpec.PromptSpec(
            preamble="Give a detailed answer.",  # Optional: Natural language instructions for customizing the answer.
        ),
        include_citations=True,  # Optional: Include citations in the response
        answer_language_code="en",  # Optional: Language code of the answer
    )

    # Initialize request argument(s)
    request = discoveryengine.AnswerQueryRequest(
        serving_config=serving_config,
        query=discoveryengine.Query(text="What is Vertex AI Search?"),
        session=None,  # Optional: include previous session ID to continue a conversation
        query_understanding_spec=query_understanding_spec,
        answer_generation_spec=answer_generation_spec,
        user_pseudo_id="user-pseudo-id",  # Optional: Add user pseudo-identifier for queries.
    )

    # Make the request
    response = client.answer_query(request)

    # Handle the response
    print(response)

    return response

Comandos de la fase de búsqueda: Busca y responde con opciones de resultados de la búsqueda

En esta sección, se muestra cómo especificar opciones para la parte de la fase de búsqueda de la llamada de método answer, como establecer la cantidad máxima de documentos devueltos, potenciar y filtrar, y cómo obtener una respuesta cuando proporcionas tus propios resultados de búsqueda.

En el siguiente comando, se muestra cómo llamar al método answer y especificar varias opciones para la forma en que se devuelve el resultado de la búsqueda. (Los resultados de la búsqueda son independientes de la respuesta).

REST

Para establecer varias opciones relacionadas con qué resultados de la búsqueda se devuelven y cómo, haz lo siguiente:

  1. Ejecuta el siguiente comando de curl:

    curl -X POST -H "Authorization: Bearer $(gcloud auth print-access-token)" \
      -H "Content-Type: application/json" \
      "https://discoveryengine.googleapis.com/v1/projects/PROJECT_ID/locations/global/collections/default_collection/engines/APP_ID/servingConfigs/default_search:answer" \
      -d '{
            "query": { "text": "QUERY"},
              "searchSpec": {
              "searchParams": {
                "maxReturnResults": MAX_RETURN_RESULTS,
                "filter": "FILTER",
                "boostSpec": BOOST_SPEC,
                "orderBy": "ORDER_BY",
                "searchResultMode": SEARCH_RESULT_MODE
               }
             }
          }'
    

    Reemplaza lo siguiente:

    • PROJECT_ID: Es el ID de tu proyecto de Google Cloud .
    • APP_ID: Es el ID de la app de Vertex AI Search que deseas consultar.
    • QUERY: Es una cadena de texto libre que contiene la pregunta o la búsqueda. Por ejemplo, "¿Cómo se comparan las bases de datos de BigQuery y Spanner?".
    • MAX_RETURN_RESULTS: Es la cantidad de resultados de la búsqueda que se devolverán. El valor predeterminado es 10. El valor máximo es 25.
    • FILTER: El filtro especifica qué documentos se consultan. Si los metadatos de un documento cumplen con la especificación del filtro, se realizará una consulta sobre el documento. Para obtener más información, incluida la sintaxis de los filtros, consulta Cómo filtrar la búsqueda personalizada para datos estructurados o no estructurados.
    • BOOST_SPEC: La especificación de refuerzo te permite reforzar ciertos documentos en los resultados de la búsqueda, lo que puede afectar la respuesta. Para obtener más información, incluida la sintaxis de la especificación de refuerzo, consulta Cómo reforzar los resultados de la búsqueda.
    • ORDER_BY: Es el orden en el que se muestran los documentos. Los documentos se pueden ordenar por un campo en un objeto Document. La expresión orderBy distingue mayúsculas de minúsculas. Si este campo no se puede reconocer, se devuelve un INVALID_ARGUMENT.
    • SEARCH_RESULT_MODE: Especifica el modo de resultado de la búsqueda: DOCUMENTS o CHUNKS. Para obtener más información, consulta Cómo analizar y dividir documentos en fragmentos y ContentSearchSpec. Este campo solo está disponible en la versión v1alpha de la API.

Python

Para obtener más información, consulta la documentación de referencia de la API de AI Applications Python.

Para autenticarte en AI Applications, configura las credenciales predeterminadas de la aplicación. Si deseas obtener más información, consulta Configura la autenticación para un entorno de desarrollo local.

from google.api_core.client_options import ClientOptions
from google.cloud import discoveryengine_v1 as discoveryengine

# TODO(developer): Uncomment these variables before running the sample.
# project_id = "YOUR_PROJECT_ID"
# location = "YOUR_LOCATION"                    # Values: "global", "us", "eu"
# engine_id = "YOUR_APP_ID"


def answer_query_sample(
    project_id: str,
    location: str,
    engine_id: str,
) -> discoveryengine.AnswerQueryResponse:
    #  For more information, refer to:
    # https://cloud.google.com/generative-ai-app-builder/docs/locations#specify_a_multi-region_for_your_data_store
    client_options = (
        ClientOptions(api_endpoint=f"{location}-discoveryengine.googleapis.com")
        if location != "global"
        else None
    )

    # Create a client
    client = discoveryengine.ConversationalSearchServiceClient(
        client_options=client_options
    )

    # The full resource name of the Search serving config
    serving_config = f"projects/{project_id}/locations/{location}/collections/default_collection/engines/{engine_id}/servingConfigs/default_serving_config"

    # Optional: Options for query phase
    # The `query_understanding_spec` below includes all available query phase options.
    # For more details, refer to https://cloud.google.com/generative-ai-app-builder/docs/reference/rest/v1/QueryUnderstandingSpec
    query_understanding_spec = discoveryengine.AnswerQueryRequest.QueryUnderstandingSpec(
        query_rephraser_spec=discoveryengine.AnswerQueryRequest.QueryUnderstandingSpec.QueryRephraserSpec(
            disable=False,  # Optional: Disable query rephraser
            max_rephrase_steps=1,  # Optional: Number of rephrase steps
        ),
        # Optional: Classify query types
        query_classification_spec=discoveryengine.AnswerQueryRequest.QueryUnderstandingSpec.QueryClassificationSpec(
            types=[
                discoveryengine.AnswerQueryRequest.QueryUnderstandingSpec.QueryClassificationSpec.Type.ADVERSARIAL_QUERY,
                discoveryengine.AnswerQueryRequest.QueryUnderstandingSpec.QueryClassificationSpec.Type.NON_ANSWER_SEEKING_QUERY,
            ]  # Options: ADVERSARIAL_QUERY, NON_ANSWER_SEEKING_QUERY or both
        ),
    )

    # Optional: Options for answer phase
    # The `answer_generation_spec` below includes all available query phase options.
    # For more details, refer to https://cloud.google.com/generative-ai-app-builder/docs/reference/rest/v1/AnswerGenerationSpec
    answer_generation_spec = discoveryengine.AnswerQueryRequest.AnswerGenerationSpec(
        ignore_adversarial_query=False,  # Optional: Ignore adversarial query
        ignore_non_answer_seeking_query=False,  # Optional: Ignore non-answer seeking query
        ignore_low_relevant_content=False,  # Optional: Return fallback answer when content is not relevant
        model_spec=discoveryengine.AnswerQueryRequest.AnswerGenerationSpec.ModelSpec(
            model_version="gemini-2.0-flash-001/answer_gen/v1",  # Optional: Model to use for answer generation
        ),
        prompt_spec=discoveryengine.AnswerQueryRequest.AnswerGenerationSpec.PromptSpec(
            preamble="Give a detailed answer.",  # Optional: Natural language instructions for customizing the answer.
        ),
        include_citations=True,  # Optional: Include citations in the response
        answer_language_code="en",  # Optional: Language code of the answer
    )

    # Initialize request argument(s)
    request = discoveryengine.AnswerQueryRequest(
        serving_config=serving_config,
        query=discoveryengine.Query(text="What is Vertex AI Search?"),
        session=None,  # Optional: include previous session ID to continue a conversation
        query_understanding_spec=query_understanding_spec,
        answer_generation_spec=answer_generation_spec,
        user_pseudo_id="user-pseudo-id",  # Optional: Add user pseudo-identifier for queries.
    )

    # Make the request
    response = client.answer_query(request)

    # Handle the response
    print(response)

    return response

Comandos de la fase de respuesta

En esta sección, se muestra cómo personalizar la llamada de método answer. Puedes combinar las siguientes opciones según sea necesario.

Ignorar las búsquedas adversarias y las que no buscan respuestas

El siguiente comando muestra cómo evitar responder preguntas adversarias y preguntas que no buscan respuestas cuando se llama al método answer.

REST

Para omitir las respuestas a las preguntas que son adversarias o que no buscan respuestas, haz lo siguiente:

  1. Ejecuta el siguiente comando de curl:

    curl -X POST -H "Authorization: Bearer $(gcloud auth print-access-token)" \
      -H "Content-Type: application/json" \
      "https://discoveryengine.googleapis.com/v1/projects/PROJECT_ID/locations/global/collections/default_collection/engines/APP_ID/servingConfigs/default_search:answer" \
      -d '{
            "query": { "text": "QUERY"},
            "answerGenerationSpec": {
               "ignoreAdversarialQuery": true,
               "ignoreNonAnswerSeekingQuery": true
            }
          }'
    

    Reemplaza lo siguiente:

    • PROJECT_ID: Es el ID de tu proyecto de Google Cloud .
    • APP_ID: Es el ID de la app de Vertex AI Search que deseas consultar.
    • QUERY: Es una cadena de texto libre que contiene la pregunta o la búsqueda.

Python

Para obtener más información, consulta la documentación de referencia de la API de AI Applications Python.

Para autenticarte en AI Applications, configura las credenciales predeterminadas de la aplicación. Si deseas obtener más información, consulta Configura la autenticación para un entorno de desarrollo local.

from google.api_core.client_options import ClientOptions
from google.cloud import discoveryengine_v1 as discoveryengine

# TODO(developer): Uncomment these variables before running the sample.
# project_id = "YOUR_PROJECT_ID"
# location = "YOUR_LOCATION"                    # Values: "global", "us", "eu"
# engine_id = "YOUR_APP_ID"


def answer_query_sample(
    project_id: str,
    location: str,
    engine_id: str,
) -> discoveryengine.AnswerQueryResponse:
    #  For more information, refer to:
    # https://cloud.google.com/generative-ai-app-builder/docs/locations#specify_a_multi-region_for_your_data_store
    client_options = (
        ClientOptions(api_endpoint=f"{location}-discoveryengine.googleapis.com")
        if location != "global"
        else None
    )

    # Create a client
    client = discoveryengine.ConversationalSearchServiceClient(
        client_options=client_options
    )

    # The full resource name of the Search serving config
    serving_config = f"projects/{project_id}/locations/{location}/collections/default_collection/engines/{engine_id}/servingConfigs/default_serving_config"

    # Optional: Options for query phase
    # The `query_understanding_spec` below includes all available query phase options.
    # For more details, refer to https://cloud.google.com/generative-ai-app-builder/docs/reference/rest/v1/QueryUnderstandingSpec
    query_understanding_spec = discoveryengine.AnswerQueryRequest.QueryUnderstandingSpec(
        query_rephraser_spec=discoveryengine.AnswerQueryRequest.QueryUnderstandingSpec.QueryRephraserSpec(
            disable=False,  # Optional: Disable query rephraser
            max_rephrase_steps=1,  # Optional: Number of rephrase steps
        ),
        # Optional: Classify query types
        query_classification_spec=discoveryengine.AnswerQueryRequest.QueryUnderstandingSpec.QueryClassificationSpec(
            types=[
                discoveryengine.AnswerQueryRequest.QueryUnderstandingSpec.QueryClassificationSpec.Type.ADVERSARIAL_QUERY,
                discoveryengine.AnswerQueryRequest.QueryUnderstandingSpec.QueryClassificationSpec.Type.NON_ANSWER_SEEKING_QUERY,
            ]  # Options: ADVERSARIAL_QUERY, NON_ANSWER_SEEKING_QUERY or both
        ),
    )

    # Optional: Options for answer phase
    # The `answer_generation_spec` below includes all available query phase options.
    # For more details, refer to https://cloud.google.com/generative-ai-app-builder/docs/reference/rest/v1/AnswerGenerationSpec
    answer_generation_spec = discoveryengine.AnswerQueryRequest.AnswerGenerationSpec(
        ignore_adversarial_query=False,  # Optional: Ignore adversarial query
        ignore_non_answer_seeking_query=False,  # Optional: Ignore non-answer seeking query
        ignore_low_relevant_content=False,  # Optional: Return fallback answer when content is not relevant
        model_spec=discoveryengine.AnswerQueryRequest.AnswerGenerationSpec.ModelSpec(
            model_version="gemini-2.0-flash-001/answer_gen/v1",  # Optional: Model to use for answer generation
        ),
        prompt_spec=discoveryengine.AnswerQueryRequest.AnswerGenerationSpec.PromptSpec(
            preamble="Give a detailed answer.",  # Optional: Natural language instructions for customizing the answer.
        ),
        include_citations=True,  # Optional: Include citations in the response
        answer_language_code="en",  # Optional: Language code of the answer
    )

    # Initialize request argument(s)
    request = discoveryengine.AnswerQueryRequest(
        serving_config=serving_config,
        query=discoveryengine.Query(text="What is Vertex AI Search?"),
        session=None,  # Optional: include previous session ID to continue a conversation
        query_understanding_spec=query_understanding_spec,
        answer_generation_spec=answer_generation_spec,
        user_pseudo_id="user-pseudo-id",  # Optional: Add user pseudo-identifier for queries.
    )

    # Make the request
    response = client.answer_query(request)

    # Handle the response
    print(response)

    return response

Mostrar solo las respuestas pertinentes

Vertex AI Search puede evaluar la relevancia de los resultados para una búsqueda. Si no se determina que ningún resultado sea lo suficientemente pertinente, en lugar de generar una respuesta a partir de resultados no pertinentes o mínimamente pertinentes, puedes optar por devolver una respuesta alternativa: "We do not have a summary for your query.".

En el siguiente comando, se muestra cómo devolver la respuesta alternativa en el caso de resultados irrelevantes cuando se llama al método answer.

REST

Para devolver una respuesta de resguardo si no se encuentran resultados relevantes, haz lo siguiente:

  1. Ejecuta el siguiente comando de curl:

    curl -X POST -H "Authorization: Bearer $(gcloud auth print-access-token)" \
      -H "Content-Type: application/json" \
      "https://discoveryengine.googleapis.com/v1/projects/PROJECT_ID/locations/global/collections/default_collection/engines/APP_ID/servingConfigs/default_search:answer" \
      -d '{
            "query": { "text": "QUERY"},
            "answerGenerationSpec": {
               "ignoreLowRelevantContent": true
            }
          }'
    

    Reemplaza lo siguiente:

    • PROJECT_ID: Es el ID de tu proyecto de Google Cloud .
    • APP_ID: Es el ID de la app de Vertex AI Search que deseas consultar.
    • QUERY: Es una cadena de texto libre que contiene la pregunta o la búsqueda.

Python

Para obtener más información, consulta la documentación de referencia de la API de AI Applications Python.

Para autenticarte en AI Applications, configura las credenciales predeterminadas de la aplicación. Si deseas obtener más información, consulta Configura la autenticación para un entorno de desarrollo local.

from google.api_core.client_options import ClientOptions
from google.cloud import discoveryengine_v1 as discoveryengine

# TODO(developer): Uncomment these variables before running the sample.
# project_id = "YOUR_PROJECT_ID"
# location = "YOUR_LOCATION"                    # Values: "global", "us", "eu"
# engine_id = "YOUR_APP_ID"


def answer_query_sample(
    project_id: str,
    location: str,
    engine_id: str,
) -> discoveryengine.AnswerQueryResponse:
    #  For more information, refer to:
    # https://cloud.google.com/generative-ai-app-builder/docs/locations#specify_a_multi-region_for_your_data_store
    client_options = (
        ClientOptions(api_endpoint=f"{location}-discoveryengine.googleapis.com")
        if location != "global"
        else None
    )

    # Create a client
    client = discoveryengine.ConversationalSearchServiceClient(
        client_options=client_options
    )

    # The full resource name of the Search serving config
    serving_config = f"projects/{project_id}/locations/{location}/collections/default_collection/engines/{engine_id}/servingConfigs/default_serving_config"

    # Optional: Options for query phase
    # The `query_understanding_spec` below includes all available query phase options.
    # For more details, refer to https://cloud.google.com/generative-ai-app-builder/docs/reference/rest/v1/QueryUnderstandingSpec
    query_understanding_spec = discoveryengine.AnswerQueryRequest.QueryUnderstandingSpec(
        query_rephraser_spec=discoveryengine.AnswerQueryRequest.QueryUnderstandingSpec.QueryRephraserSpec(
            disable=False,  # Optional: Disable query rephraser
            max_rephrase_steps=1,  # Optional: Number of rephrase steps
        ),
        # Optional: Classify query types
        query_classification_spec=discoveryengine.AnswerQueryRequest.QueryUnderstandingSpec.QueryClassificationSpec(
            types=[
                discoveryengine.AnswerQueryRequest.QueryUnderstandingSpec.QueryClassificationSpec.Type.ADVERSARIAL_QUERY,
                discoveryengine.AnswerQueryRequest.QueryUnderstandingSpec.QueryClassificationSpec.Type.NON_ANSWER_SEEKING_QUERY,
            ]  # Options: ADVERSARIAL_QUERY, NON_ANSWER_SEEKING_QUERY or both
        ),
    )

    # Optional: Options for answer phase
    # The `answer_generation_spec` below includes all available query phase options.
    # For more details, refer to https://cloud.google.com/generative-ai-app-builder/docs/reference/rest/v1/AnswerGenerationSpec
    answer_generation_spec = discoveryengine.AnswerQueryRequest.AnswerGenerationSpec(
        ignore_adversarial_query=False,  # Optional: Ignore adversarial query
        ignore_non_answer_seeking_query=False,  # Optional: Ignore non-answer seeking query
        ignore_low_relevant_content=False,  # Optional: Return fallback answer when content is not relevant
        model_spec=discoveryengine.AnswerQueryRequest.AnswerGenerationSpec.ModelSpec(
            model_version="gemini-2.0-flash-001/answer_gen/v1",  # Optional: Model to use for answer generation
        ),
        prompt_spec=discoveryengine.AnswerQueryRequest.AnswerGenerationSpec.PromptSpec(
            preamble="Give a detailed answer.",  # Optional: Natural language instructions for customizing the answer.
        ),
        include_citations=True,  # Optional: Include citations in the response
        answer_language_code="en",  # Optional: Language code of the answer
    )

    # Initialize request argument(s)
    request = discoveryengine.AnswerQueryRequest(
        serving_config=serving_config,
        query=discoveryengine.Query(text="What is Vertex AI Search?"),
        session=None,  # Optional: include previous session ID to continue a conversation
        query_understanding_spec=query_understanding_spec,
        answer_generation_spec=answer_generation_spec,
        user_pseudo_id="user-pseudo-id",  # Optional: Add user pseudo-identifier for queries.
    )

    # Make the request
    response = client.answer_query(request)

    # Handle the response
    print(response)

    return response

Devuelve las puntuaciones de compatibilidad de la fundamentación

En el siguiente comando, se muestra cómo devolver las puntuaciones de compatibilidad de fundamentación para las respuestas y las afirmaciones.

Para obtener información general sobre la fundamentación en Vertex AI, consulta Cómo verificar la fundamentación con RAG. El método groundingConfigs.check se llama desde el método answer.

REST

Para devolver una puntuación de respaldo para cada afirmación (oración en la respuesta) y una puntuación de respaldo agregada para la respuesta, haz lo siguiente:

  1. Ejecuta el siguiente comando de curl:

    curl -X POST -H "Authorization: Bearer $(gcloud auth print-access-token)" \
      -H "Content-Type: application/json" \
      "https://discoveryengine.googleapis.com/v1/projects/PROJECT_ID/locations/global/collections/default_collection/engines/APP_ID/servingConfigs/default_search:answer" \
      -d '{
            "query": { "text": "QUERY"},
            "groundingSpec": {
               "includeGroundingSupports": true,
            }
          }'
    

    Reemplaza lo siguiente:

    • PROJECT_ID: Es el ID de tu proyecto de Google Cloud .
    • APP_ID: Es el ID de la app de Vertex AI Search que deseas consultar.
    • QUERY: Es una cadena de texto libre que contiene la pregunta o la búsqueda.

Mostrar solo respuestas fundamentadas

El siguiente comando muestra cómo devolver solo aquellas respuestas que se consideran bien fundamentadas en el corpus, la información del almacén de datos. Se filtran las respuestas poco fundamentadas.

Elige un umbral de nivel bajo o alto para la puntuación de asistencia de fundamentación. Luego, la respuesta solo se muestra si alcanza o supera ese nivel. Puedes experimentar con los dos umbrales de filtro y sin umbral para determinar qué nivel de filtro es probable que proporcione los mejores resultados para tus usuarios.

Para obtener información general sobre la fundamentación en Vertex AI, consulta Cómo verificar la fundamentación con RAG. El método groundingConfigs.check se llama desde el método answer.

REST

Para devolver una respuesta solo si cumple con un umbral de puntuación de asistencia, haz lo siguiente:

  1. Ejecuta el siguiente comando de curl:

    curl -X POST -H "Authorization: Bearer $(gcloud auth print-access-token)" \
      -H "Content-Type: application/json" \
      "https://discoveryengine.googleapis.com/v1/projects/PROJECT_ID/locations/global/collections/default_collection/engines/APP_ID/servingConfigs/default_search:answer" \
      -d '{
            "query": { "text": "QUERY"},
            "groundingSpec": {
               "filteringLevel": "FILTER_LEVEL"
            }
          }'
    

    Reemplaza lo siguiente:

    • PROJECT_ID: Es el ID de tu proyecto de Google Cloud .
    • APP_ID: Es el ID de la app de Vertex AI Search que deseas consultar.
    • QUERY: Es una cadena de texto libre que contiene la pregunta o la búsqueda.
    • FILTER_LEVEL: Es una enumeración para filtrar respuestas según la puntuación de asistencia de fundamentación. Las opciones son: FILTERING_LEVEL_LOW y FILTERING_LEVEL_HIGH. Si no se incluye filteringLevel, no se aplica ningún filtro de puntuación de asistencia a la respuesta.

Especifica el modelo de respuesta

El siguiente comando muestra cómo cambiar la versión del modelo que se usa para generar respuestas.

Para obtener información sobre los modelos compatibles, consulta Versiones y ciclo de vida de los modelos de generación de respuestas.

REST

Para generar una respuesta con un modelo diferente del predeterminado, haz lo siguiente:

  1. Ejecuta el siguiente comando de curl:

    curl -X POST -H "Authorization: Bearer $(gcloud auth print-access-token)" \
      -H "Content-Type: application/json" \
      "https://discoveryengine.googleapis.com/v1/projects/PROJECT_ID/locations/global/collections/default_collection/engines/APP_ID/servingConfigs/default_search:answer" \
      -d '{
            "query": { "text": "QUERY"},
            "answerGenerationSpec": {
               "modelSpec": {
                  "modelVersion": "MODEL_VERSION",
               }
             }
          }'
    

    Reemplaza lo siguiente:

    • PROJECT_ID: Es el ID de tu proyecto de Google Cloud .
    • APP_ID: Es el ID de la app de Vertex AI Search que deseas consultar.
    • QUERY: Es una cadena de texto libre que contiene la pregunta o la búsqueda.
    • MODEL_VERSION: Es la versión del modelo que deseas usar para generar la respuesta. Para obtener más información, consulta Versiones de modelos de generación de respuestas y ciclo de vida.

Python

Para obtener más información, consulta la documentación de referencia de la API de AI Applications Python.

Para autenticarte en AI Applications, configura las credenciales predeterminadas de la aplicación. Si deseas obtener más información, consulta Configura la autenticación para un entorno de desarrollo local.

from google.api_core.client_options import ClientOptions
from google.cloud import discoveryengine_v1 as discoveryengine

# TODO(developer): Uncomment these variables before running the sample.
# project_id = "YOUR_PROJECT_ID"
# location = "YOUR_LOCATION"                    # Values: "global", "us", "eu"
# engine_id = "YOUR_APP_ID"


def answer_query_sample(
    project_id: str,
    location: str,
    engine_id: str,
) -> discoveryengine.AnswerQueryResponse:
    #  For more information, refer to:
    # https://cloud.google.com/generative-ai-app-builder/docs/locations#specify_a_multi-region_for_your_data_store
    client_options = (
        ClientOptions(api_endpoint=f"{location}-discoveryengine.googleapis.com")
        if location != "global"
        else None
    )

    # Create a client
    client = discoveryengine.ConversationalSearchServiceClient(
        client_options=client_options
    )

    # The full resource name of the Search serving config
    serving_config = f"projects/{project_id}/locations/{location}/collections/default_collection/engines/{engine_id}/servingConfigs/default_serving_config"

    # Optional: Options for query phase
    # The `query_understanding_spec` below includes all available query phase options.
    # For more details, refer to https://cloud.google.com/generative-ai-app-builder/docs/reference/rest/v1/QueryUnderstandingSpec
    query_understanding_spec = discoveryengine.AnswerQueryRequest.QueryUnderstandingSpec(
        query_rephraser_spec=discoveryengine.AnswerQueryRequest.QueryUnderstandingSpec.QueryRephraserSpec(
            disable=False,  # Optional: Disable query rephraser
            max_rephrase_steps=1,  # Optional: Number of rephrase steps
        ),
        # Optional: Classify query types
        query_classification_spec=discoveryengine.AnswerQueryRequest.QueryUnderstandingSpec.QueryClassificationSpec(
            types=[
                discoveryengine.AnswerQueryRequest.QueryUnderstandingSpec.QueryClassificationSpec.Type.ADVERSARIAL_QUERY,
                discoveryengine.AnswerQueryRequest.QueryUnderstandingSpec.QueryClassificationSpec.Type.NON_ANSWER_SEEKING_QUERY,
            ]  # Options: ADVERSARIAL_QUERY, NON_ANSWER_SEEKING_QUERY or both
        ),
    )

    # Optional: Options for answer phase
    # The `answer_generation_spec` below includes all available query phase options.
    # For more details, refer to https://cloud.google.com/generative-ai-app-builder/docs/reference/rest/v1/AnswerGenerationSpec
    answer_generation_spec = discoveryengine.AnswerQueryRequest.AnswerGenerationSpec(
        ignore_adversarial_query=False,  # Optional: Ignore adversarial query
        ignore_non_answer_seeking_query=False,  # Optional: Ignore non-answer seeking query
        ignore_low_relevant_content=False,  # Optional: Return fallback answer when content is not relevant
        model_spec=discoveryengine.AnswerQueryRequest.AnswerGenerationSpec.ModelSpec(
            model_version="gemini-2.0-flash-001/answer_gen/v1",  # Optional: Model to use for answer generation
        ),
        prompt_spec=discoveryengine.AnswerQueryRequest.AnswerGenerationSpec.PromptSpec(
            preamble="Give a detailed answer.",  # Optional: Natural language instructions for customizing the answer.
        ),
        include_citations=True,  # Optional: Include citations in the response
        answer_language_code="en",  # Optional: Language code of the answer
    )

    # Initialize request argument(s)
    request = discoveryengine.AnswerQueryRequest(
        serving_config=serving_config,
        query=discoveryengine.Query(text="What is Vertex AI Search?"),
        session=None,  # Optional: include previous session ID to continue a conversation
        query_understanding_spec=query_understanding_spec,
        answer_generation_spec=answer_generation_spec,
        user_pseudo_id="user-pseudo-id",  # Optional: Add user pseudo-identifier for queries.
    )

    # Make the request
    response = client.answer_query(request)

    # Handle the response
    print(response)

    return response

Cómo especificar un preámbulo personalizado

En el siguiente comando, se muestra cómo establecer un preámbulo para la respuesta generada. Un preámbulo contiene instrucciones en lenguaje natural para personalizar la respuesta. Puedes solicitar personalizaciones como la longitud, el nivel de detalle, el estilo de la respuesta (por ejemplo, "simple"), el idioma de la respuesta, el enfoque de la respuesta y el formato (por ejemplo, tablas, viñetas y XML). Por ejemplo, un preámbulo podría ser "Explica como si fueras un niño de diez años".

El preámbulo puede tener un efecto significativo en la calidad de la respuesta generada. Para obtener información sobre qué escribir en los preámbulos y ejemplos de buenos preámbulos, consulta Acerca de los preámbulos personalizados.

REST

Para generar una respuesta con un modelo diferente del predeterminado, haz lo siguiente:

  1. Ejecuta el siguiente comando de curl:

    curl -X POST -H "Authorization: Bearer $(gcloud auth print-access-token)" \
      -H "Content-Type: application/json" \
      "https://discoveryengine.googleapis.com/v1/projects/PROJECT_ID/locations/global/collections/default_collection/engines/APP_ID/servingConfigs/default_search:answer" \
      -d '{
            "query": { "text": "QUERY"},
            "answerGenerationSpec": {
               "promptSpec": {
                   "preamble": "PREAMBLE",
               }
            }
          }'
    

    Reemplaza lo siguiente:

    • PROJECT_ID: Es el ID de tu proyecto de Google Cloud .
    • APP_ID: Es el ID de la app de Vertex AI Search que deseas consultar.
    • QUERY: Es una cadena de texto libre que contiene la pregunta o la búsqueda.
    • PREAMBLE: Es una instrucción en lenguaje natural para personalizar la respuesta. Por ejemplo, prueba show the answer format in an ordered list o give a very detailed answer.

Python

Para obtener más información, consulta la documentación de referencia de la API de AI Applications Python.

Para autenticarte en AI Applications, configura las credenciales predeterminadas de la aplicación. Si deseas obtener más información, consulta Configura la autenticación para un entorno de desarrollo local.

from google.api_core.client_options import ClientOptions
from google.cloud import discoveryengine_v1 as discoveryengine

# TODO(developer): Uncomment these variables before running the sample.
# project_id = "YOUR_PROJECT_ID"
# location = "YOUR_LOCATION"                    # Values: "global", "us", "eu"
# engine_id = "YOUR_APP_ID"


def answer_query_sample(
    project_id: str,
    location: str,
    engine_id: str,
) -> discoveryengine.AnswerQueryResponse:
    #  For more information, refer to:
    # https://cloud.google.com/generative-ai-app-builder/docs/locations#specify_a_multi-region_for_your_data_store
    client_options = (
        ClientOptions(api_endpoint=f"{location}-discoveryengine.googleapis.com")
        if location != "global"
        else None
    )

    # Create a client
    client = discoveryengine.ConversationalSearchServiceClient(
        client_options=client_options
    )

    # The full resource name of the Search serving config
    serving_config = f"projects/{project_id}/locations/{location}/collections/default_collection/engines/{engine_id}/servingConfigs/default_serving_config"

    # Optional: Options for query phase
    # The `query_understanding_spec` below includes all available query phase options.
    # For more details, refer to https://cloud.google.com/generative-ai-app-builder/docs/reference/rest/v1/QueryUnderstandingSpec
    query_understanding_spec = discoveryengine.AnswerQueryRequest.QueryUnderstandingSpec(
        query_rephraser_spec=discoveryengine.AnswerQueryRequest.QueryUnderstandingSpec.QueryRephraserSpec(
            disable=False,  # Optional: Disable query rephraser
            max_rephrase_steps=1,  # Optional: Number of rephrase steps
        ),
        # Optional: Classify query types
        query_classification_spec=discoveryengine.AnswerQueryRequest.QueryUnderstandingSpec.QueryClassificationSpec(
            types=[
                discoveryengine.AnswerQueryRequest.QueryUnderstandingSpec.QueryClassificationSpec.Type.ADVERSARIAL_QUERY,
                discoveryengine.AnswerQueryRequest.QueryUnderstandingSpec.QueryClassificationSpec.Type.NON_ANSWER_SEEKING_QUERY,
            ]  # Options: ADVERSARIAL_QUERY, NON_ANSWER_SEEKING_QUERY or both
        ),
    )

    # Optional: Options for answer phase
    # The `answer_generation_spec` below includes all available query phase options.
    # For more details, refer to https://cloud.google.com/generative-ai-app-builder/docs/reference/rest/v1/AnswerGenerationSpec
    answer_generation_spec = discoveryengine.AnswerQueryRequest.AnswerGenerationSpec(
        ignore_adversarial_query=False,  # Optional: Ignore adversarial query
        ignore_non_answer_seeking_query=False,  # Optional: Ignore non-answer seeking query
        ignore_low_relevant_content=False,  # Optional: Return fallback answer when content is not relevant
        model_spec=discoveryengine.AnswerQueryRequest.AnswerGenerationSpec.ModelSpec(
            model_version="gemini-2.0-flash-001/answer_gen/v1",  # Optional: Model to use for answer generation
        ),
        prompt_spec=discoveryengine.AnswerQueryRequest.AnswerGenerationSpec.PromptSpec(
            preamble="Give a detailed answer.",  # Optional: Natural language instructions for customizing the answer.
        ),
        include_citations=True,  # Optional: Include citations in the response
        answer_language_code="en",  # Optional: Language code of the answer
    )

    # Initialize request argument(s)
    request = discoveryengine.AnswerQueryRequest(
        serving_config=serving_config,
        query=discoveryengine.Query(text="What is Vertex AI Search?"),
        session=None,  # Optional: include previous session ID to continue a conversation
        query_understanding_spec=query_understanding_spec,
        answer_generation_spec=answer_generation_spec,
        user_pseudo_id="user-pseudo-id",  # Optional: Add user pseudo-identifier for queries.
    )

    # Make the request
    response = client.answer_query(request)

    # Handle the response
    print(response)

    return response

El método de respuesta puede sugerir preguntas relacionadas que los usuarios pueden elegir en lugar de ingresar sus propias preguntas. Por ejemplo, cuando preguntas "¿Cuál es la mejor época del año para ir de vacaciones a México?", además de responder tu pregunta, el método de respuesta puede sugerir otras preguntas que podrías hacer, como "¿Cuál es el mes más barato para ir de vacaciones a México?" y "¿Cuáles son los meses turísticos en México?".

Para recibir preguntas relacionadas, debes especificar su inclusión en cada búsqueda, y se muestran como un array de cadenas en la respuesta.

Antes de comenzar

Asegúrate de haber activado las funciones avanzadas de LLM para la app.

Procedimiento

El siguiente comando muestra cómo solicitar que se incluyan preguntas relacionadas con la respuesta.

REST

Para obtener preguntas relacionadas con una respuesta generada, haz lo siguiente:

  1. Ejecuta el siguiente comando de curl:

    curl -X POST -H "Authorization: Bearer $(gcloud auth print-access-token)" \
      -H "Content-Type: application/json" \
      "https://discoveryengine.googleapis.com/v1/projects/PROJECT_ID/locations/global/collections/default_collection/engines/APP_ID/servingConfigs/default_search:answer" \
      -d '{
            "query": { "text": "QUERY"},
            "relatedQuestionsSpec": { "enable": true }
          }'
    

    Reemplaza lo siguiente:

    • PROJECT_ID: Es el ID de tu proyecto de Google Cloud .
    • APP_ID: Es el ID de la app de Vertex AI Search que deseas consultar.
    • QUERY: Es una cadena de texto libre que contiene la pregunta o la búsqueda. Por ejemplo, "¿qué tipos de datos puedo importar a Vertex AI Search?".

Incluir citas

En el siguiente comando, se muestra cómo solicitar que se incluyan citas con la respuesta.

REST

Para generar una respuesta con un modelo diferente del predeterminado, haz lo siguiente:

  1. Ejecuta el siguiente comando de curl:

    curl -X POST -H "Authorization: Bearer $(gcloud auth print-access-token)" \
      -H "Content-Type: application/json" \
      "https://discoveryengine.googleapis.com/v1/projects/PROJECT_ID/locations/global/collections/default_collection/engines/APP_ID/servingConfigs/default_search:answer" \
      -d '{
            "query": { "text": "QUERY"},
            "answerGenerationSpec": {
               "includeCitations": INCLUDE_CITATIONS
            }
          }'
    

    Reemplaza lo siguiente:

    • PROJECT_ID: Es el ID de tu proyecto de Google Cloud .
    • APP_ID: Es el ID de la app de Vertex AI Search que deseas consultar.
    • QUERY: Es una cadena de texto libre que contiene la pregunta o la búsqueda.
    • INCLUDE_CITATIONS: Especifica si se deben incluir metadatos de citas en la respuesta. El valor predeterminado es false.

Python

Para obtener más información, consulta la documentación de referencia de la API de AI Applications Python.

Para autenticarte en AI Applications, configura las credenciales predeterminadas de la aplicación. Si deseas obtener más información, consulta Configura la autenticación para un entorno de desarrollo local.

from google.api_core.client_options import ClientOptions
from google.cloud import discoveryengine_v1 as discoveryengine

# TODO(developer): Uncomment these variables before running the sample.
# project_id = "YOUR_PROJECT_ID"
# location = "YOUR_LOCATION"                    # Values: "global", "us", "eu"
# engine_id = "YOUR_APP_ID"


def answer_query_sample(
    project_id: str,
    location: str,
    engine_id: str,
) -> discoveryengine.AnswerQueryResponse:
    #  For more information, refer to:
    # https://cloud.google.com/generative-ai-app-builder/docs/locations#specify_a_multi-region_for_your_data_store
    client_options = (
        ClientOptions(api_endpoint=f"{location}-discoveryengine.googleapis.com")
        if location != "global"
        else None
    )

    # Create a client
    client = discoveryengine.ConversationalSearchServiceClient(
        client_options=client_options
    )

    # The full resource name of the Search serving config
    serving_config = f"projects/{project_id}/locations/{location}/collections/default_collection/engines/{engine_id}/servingConfigs/default_serving_config"

    # Optional: Options for query phase
    # The `query_understanding_spec` below includes all available query phase options.
    # For more details, refer to https://cloud.google.com/generative-ai-app-builder/docs/reference/rest/v1/QueryUnderstandingSpec
    query_understanding_spec = discoveryengine.AnswerQueryRequest.QueryUnderstandingSpec(
        query_rephraser_spec=discoveryengine.AnswerQueryRequest.QueryUnderstandingSpec.QueryRephraserSpec(
            disable=False,  # Optional: Disable query rephraser
            max_rephrase_steps=1,  # Optional: Number of rephrase steps
        ),
        # Optional: Classify query types
        query_classification_spec=discoveryengine.AnswerQueryRequest.QueryUnderstandingSpec.QueryClassificationSpec(
            types=[
                discoveryengine.AnswerQueryRequest.QueryUnderstandingSpec.QueryClassificationSpec.Type.ADVERSARIAL_QUERY,
                discoveryengine.AnswerQueryRequest.QueryUnderstandingSpec.QueryClassificationSpec.Type.NON_ANSWER_SEEKING_QUERY,
            ]  # Options: ADVERSARIAL_QUERY, NON_ANSWER_SEEKING_QUERY or both
        ),
    )

    # Optional: Options for answer phase
    # The `answer_generation_spec` below includes all available query phase options.
    # For more details, refer to https://cloud.google.com/generative-ai-app-builder/docs/reference/rest/v1/AnswerGenerationSpec
    answer_generation_spec = discoveryengine.AnswerQueryRequest.AnswerGenerationSpec(
        ignore_adversarial_query=False,  # Optional: Ignore adversarial query
        ignore_non_answer_seeking_query=False,  # Optional: Ignore non-answer seeking query
        ignore_low_relevant_content=False,  # Optional: Return fallback answer when content is not relevant
        model_spec=discoveryengine.AnswerQueryRequest.AnswerGenerationSpec.ModelSpec(
            model_version="gemini-2.0-flash-001/answer_gen/v1",  # Optional: Model to use for answer generation
        ),
        prompt_spec=discoveryengine.AnswerQueryRequest.AnswerGenerationSpec.PromptSpec(
            preamble="Give a detailed answer.",  # Optional: Natural language instructions for customizing the answer.
        ),
        include_citations=True,  # Optional: Include citations in the response
        answer_language_code="en",  # Optional: Language code of the answer
    )

    # Initialize request argument(s)
    request = discoveryengine.AnswerQueryRequest(
        serving_config=serving_config,
        query=discoveryengine.Query(text="What is Vertex AI Search?"),
        session=None,  # Optional: include previous session ID to continue a conversation
        query_understanding_spec=query_understanding_spec,
        answer_generation_spec=answer_generation_spec,
        user_pseudo_id="user-pseudo-id",  # Optional: Add user pseudo-identifier for queries.
    )

    # Make the request
    response = client.answer_query(request)

    # Handle the response
    print(response)

    return response

Cómo establecer el código de idioma de la respuesta

En el siguiente comando, se muestra cómo establecer el código de idioma para las respuestas.

REST

Para generar una respuesta con un modelo diferente del predeterminado, haz lo siguiente:

  1. Ejecuta el siguiente comando de curl:

    curl -X POST -H "Authorization: Bearer $(gcloud auth print-access-token)" \
      -H "Content-Type: application/json" \
      "https://discoveryengine.googleapis.com/v1/projects/PROJECT_ID/locations/global/collections/default_collection/engines/APP_ID/servingConfigs/default_search:answer" \
      -d '{
            "query": { "text": "QUERY"},
            "answerGenerationSpec": {
               "answerLanguageCode": "ANSWER_LANGUAGE_CODE"
               }
          }'
    

    Reemplaza lo siguiente:

    • PROJECT_ID: Es el ID de tu proyecto de Google Cloud .
    • APP_ID: Es el ID de la app de Vertex AI Search que deseas consultar.
    • QUERY: Es una cadena de texto libre que contiene la pregunta o la búsqueda.
    • ANSWER_LANGUAGE_CODE: Es un código de idioma para la respuesta. Usa las etiquetas de idioma definidas por BCP47: Tags for Identifying Languages.

Python

Para obtener más información, consulta la documentación de referencia de la API de AI Applications Python.

Para autenticarte en AI Applications, configura las credenciales predeterminadas de la aplicación. Si deseas obtener más información, consulta Configura la autenticación para un entorno de desarrollo local.

from google.api_core.client_options import ClientOptions
from google.cloud import discoveryengine_v1 as discoveryengine

# TODO(developer): Uncomment these variables before running the sample.
# project_id = "YOUR_PROJECT_ID"
# location = "YOUR_LOCATION"                    # Values: "global", "us", "eu"
# engine_id = "YOUR_APP_ID"


def answer_query_sample(
    project_id: str,
    location: str,
    engine_id: str,
) -> discoveryengine.AnswerQueryResponse:
    #  For more information, refer to:
    # https://cloud.google.com/generative-ai-app-builder/docs/locations#specify_a_multi-region_for_your_data_store
    client_options = (
        ClientOptions(api_endpoint=f"{location}-discoveryengine.googleapis.com")
        if location != "global"
        else None
    )

    # Create a client
    client = discoveryengine.ConversationalSearchServiceClient(
        client_options=client_options
    )

    # The full resource name of the Search serving config
    serving_config = f"projects/{project_id}/locations/{location}/collections/default_collection/engines/{engine_id}/servingConfigs/default_serving_config"

    # Optional: Options for query phase
    # The `query_understanding_spec` below includes all available query phase options.
    # For more details, refer to https://cloud.google.com/generative-ai-app-builder/docs/reference/rest/v1/QueryUnderstandingSpec
    query_understanding_spec = discoveryengine.AnswerQueryRequest.QueryUnderstandingSpec(
        query_rephraser_spec=discoveryengine.AnswerQueryRequest.QueryUnderstandingSpec.QueryRephraserSpec(
            disable=False,  # Optional: Disable query rephraser
            max_rephrase_steps=1,  # Optional: Number of rephrase steps
        ),
        # Optional: Classify query types
        query_classification_spec=discoveryengine.AnswerQueryRequest.QueryUnderstandingSpec.QueryClassificationSpec(
            types=[
                discoveryengine.AnswerQueryRequest.QueryUnderstandingSpec.QueryClassificationSpec.Type.ADVERSARIAL_QUERY,
                discoveryengine.AnswerQueryRequest.QueryUnderstandingSpec.QueryClassificationSpec.Type.NON_ANSWER_SEEKING_QUERY,
            ]  # Options: ADVERSARIAL_QUERY, NON_ANSWER_SEEKING_QUERY or both
        ),
    )

    # Optional: Options for answer phase
    # The `answer_generation_spec` below includes all available query phase options.
    # For more details, refer to https://cloud.google.com/generative-ai-app-builder/docs/reference/rest/v1/AnswerGenerationSpec
    answer_generation_spec = discoveryengine.AnswerQueryRequest.AnswerGenerationSpec(
        ignore_adversarial_query=False,  # Optional: Ignore adversarial query
        ignore_non_answer_seeking_query=False,  # Optional: Ignore non-answer seeking query
        ignore_low_relevant_content=False,  # Optional: Return fallback answer when content is not relevant
        model_spec=discoveryengine.AnswerQueryRequest.AnswerGenerationSpec.ModelSpec(
            model_version="gemini-2.0-flash-001/answer_gen/v1",  # Optional: Model to use for answer generation
        ),
        prompt_spec=discoveryengine.AnswerQueryRequest.AnswerGenerationSpec.PromptSpec(
            preamble="Give a detailed answer.",  # Optional: Natural language instructions for customizing the answer.
        ),
        include_citations=True,  # Optional: Include citations in the response
        answer_language_code="en",  # Optional: Language code of the answer
    )

    # Initialize request argument(s)
    request = discoveryengine.AnswerQueryRequest(
        serving_config=serving_config,
        query=discoveryengine.Query(text="What is Vertex AI Search?"),
        session=None,  # Optional: include previous session ID to continue a conversation
        query_understanding_spec=query_understanding_spec,
        answer_generation_spec=answer_generation_spec,
        user_pseudo_id="user-pseudo-id",  # Optional: Add user pseudo-identifier for queries.
    )

    # Make the request
    response = client.answer_query(request)

    # Handle the response
    print(response)

    return response

Personaliza las respuestas

Si hay información específica sobre el usuario disponible (por ejemplo, datos en un perfil), puedes especificar esa información en el objeto endUserMetadata para que los resultados de la búsqueda se puedan personalizar para el usuario.

Por ejemplo, si un usuario que accedió a su cuenta busca información para actualizar un teléfono celular, la información de su perfil, como el modelo de teléfono actual y el plan celular, proporciona información que puede personalizar la respuesta generada.

Para agregar información personal sobre el usuario que realiza una búsqueda y generar una respuesta que tenga en cuenta esa información, haz lo siguiente:

  1. Ejecuta el siguiente comando de curl:

    curl -X POST -H "Authorization: Bearer $(gcloud auth print-access-token)" \
      -H "Content-Type: application/json" \
      "https://discoveryengine.googleapis.com/v1/projects/PROJECT_ID/locations/global/collections/default_collection/engines/APP_ID/servingConfigs/default_search:answer" \
    -d '{
        "query": { "text": "QUERY"},
        "endUserSpec": {
           "endUserMetadata": [
             {
               "chunkInfo": {
                  "content": "PERSONALIZED_INFO",
                  "documentMetadata":  { "title": "INFO_DESCRIPTION"}
               }
             }
           ]
        }
      }'
    

    Reemplaza lo siguiente:

    • PROJECT_ID: Es el ID de tu proyecto de Google Cloud .
    • APP_ID: Es el ID de la app de Vertex AI Search que deseas consultar.
    • QUERY: Es una cadena de texto libre que contiene la pregunta o la búsqueda.
    • PERSONALIZATION_INFO: Es una cadena que contiene información específica del usuario que realiza la búsqueda. Por ejemplo, This customer has a Pixel 6 Pro purchased over a period of 24-months starting 2023-01-15. This customer is on the Business Plus International plan. No payment is due at this time. El límite de longitud para esta cadena es de 8,000 caracteres.
    • INFO_DESCRIPTION: Es una cadena que describe brevemente la información de personalización; por ejemplo, Customer profile data, including model, plan, and billing status. El modelo utiliza tanto esta descripción como la información de personalización cuando genera una respuesta personalizada a la búsqueda.

Genera gráficos para las respuestas

El método answer puede generar gráficos y devolverlos como parte de la respuesta a una búsqueda.

Puedes solicitar específicamente que una respuesta incluya un gráfico, por ejemplo, "Grafica la tasa de crecimiento interanual de los pagos de pequeñas empresas a lo largo de los años con datos disponibles". Si el sistema determina que hay suficientes datos, se mostrará un gráfico. Por lo general, se devuelve texto de respuesta junto con el gráfico.

Además, si hay suficientes datos para crear un gráfico, el método de respuesta puede devolver un gráfico incluso si la búsqueda no solicitó explícitamente uno. Por ejemplo, "¿Cuál fue la mejora en los índices de IDH asociada a un mayor acceso al agua potable en la década entre 2010 y 2020?".

Solo se genera un gráfico por respuesta. Sin embargo, el gráfico puede ser un gráfico compuesto que contenga otros gráficos más pequeños. Ejemplo de un gráfico compuesto:

El gráfico compuesto contiene cuatro gráficos más pequeños.

Limitación

Las preguntas deben estar en inglés.

Situaciones de falla comunes

No siempre recibirás una imagen con tu respuesta. Si no hay datos suficientes, no se puede generar una cifra.

Otros casos de falla incluyen errores de ejecución de código y tiempos de espera agotados. Si ocurre alguna de estas situaciones, reformula tu búsqueda y vuelve a intentarlo.

Antes de comenzar

Antes de ejecutar una consulta que solicite gráficos generados, haz lo siguiente:

Procedimiento

REST

Llama al método answer de la siguiente manera para devolver una respuesta que puede incluir un gráfico generado a partir de los datos del almacén de datos:

  1. Ejecuta el siguiente comando de curl:

    curl -X POST -H "Authorization: Bearer $(gcloud auth print-access-token)" \
      -H "Content-Type: application/json" \
      "https://discoveryengine.googleapis.com/v1beta/projects/PROJECT_ID/locations/global/collections/default_collection/engines/APP_ID/servingConfigs/default_search:answer" \
      -d '{
            "query": { "text": "QUERY"},
            "answerGenerationSpec": {
              "model_spec": {
                 "model_version": "MODEL_VERSION"
             },
              "multimodalSpec": {
                 "imageSource": "IMAGE_SOURCE"
                 }
            }
          }'
    

    Reemplaza lo siguiente:

    • PROJECT_ID: Es el ID de tu proyecto de Google Cloud .
    • APP_ID: Es el ID de la app de Vertex AI Search que deseas consultar.
    • QUERY: Es una cadena de texto libre en inglés que contiene la pregunta o la búsqueda.
    • MODEL_VERSION: La versión del modelo debe ser gemini-2.0-flash-001/answer_gen/v1 o posterior. Para obtener más información, consulta Versiones de modelos de generación de respuestas y ciclo de vida.
    • IMAGE_SOURCE: Es una enumeración para solicitar que la respuesta incluya un gráfico generado, FIGURE_GENERATION_ONLY, o que la respuesta pueda incluir un gráfico generado o una imagen existente de los almacenes de datos, ALL_AVAILABLE_SOURCES.

Recupera imágenes existentes del almacén de datos

Puedes elegir que las imágenes del almacén de datos se devuelvan con la respuesta y en las referencias de citas. El almacén de datos debe ser un almacén de datos no estructurados con el analizador de diseño activado.

Para obtener gráficos en las respuestas que se muestran, debes activar las funciones avanzadas de LLM.

Cuando imageSource es CORPUS_IMAGE_ONLY o ALL_AVAILABLE_SOURCES, el método answer puede recuperar imágenes del almacén de datos según corresponda. Sin embargo, activar esta opción no significa que siempre se devolverán imágenes.

Obtendrás una imagen (como máximo) por respuesta. Las citas pueden contener varias imágenes.

Limitaciones

  • La app que usas debe estar conectada a un almacén de datos no estructurados. Las imágenes no se pueden devolver desde sitios web ni desde almacenes de datos estructurados.

  • Las preguntas deben estar en inglés.

  • La anotación de imágenes a través del analizador de diseño se debe aplicar al almacén de datos. Para obtener información sobre el analizador de diseño, consulta Cómo analizar y dividir documentos en fragmentos.

Procedimiento

REST

Llama al método answer de la siguiente manera para devolver una respuesta que puede incluir una imagen del almacén de datos:

  1. Ejecuta el siguiente comando de curl:

    curl -X POST -H "Authorization: Bearer $(gcloud auth print-access-token)" \
      -H "Content-Type: application/json" \
      "https://discoveryengine.googleapis.com/v1beta/projects/PROJECT_ID/locations/global/collections/default_collection/engines/APP_ID/servingConfigs/default_search:answer" \
      -d '{
            "query": { "text": "QUERY"},
            "answerGenerationSpec": {
              "model_spec": {
                 "model_version": "MODEL_VERSION"
              },
              includeCitations: true,
              "multimodalSpec": {
                 "imageSource": "IMAGE_SOURCE"
                 }
            }
          }'
    

    Reemplaza lo siguiente:

    • PROJECT_ID: Es el ID de tu proyecto de Google Cloud .
    • APP_ID: Es el ID de la app de Vertex AI Search que deseas consultar.
    • QUERY: Es una cadena de texto libre en inglés que contiene la pregunta o la búsqueda.
    • MODEL_VERSION: La versión del modelo debe ser gemini-2.0-flash-001/answer_gen/v1 o posterior. Para obtener más información, consulta Versiones de modelos de generación de respuestas y ciclo de vida.
    • IMAGE_SOURCE: Es una enumeración para solicitar que la respuesta incluya una imagen del almacén de datos, CORPUS_IMAGE_ONLY, o que la respuesta pueda incluir una imagen del almacén de datos o un gráfico generado, ALL_AVAILABLE_SOURCES.

Comandos para preguntas de seguimiento

Las preguntas adicionales son consultas de varios turnos. Después de la primera búsqueda en una sesión de seguimiento, los "turnos" posteriores tienen en cuenta las interacciones anteriores. Con los seguimientos, el método de respuesta también puede sugerir preguntas relacionadas, que los usuarios pueden elegir en lugar de ingresar sus propias preguntas de seguimiento. Para obtener sugerencias de preguntas relacionadas, debes activar las funciones avanzadas de LLM.

Todas las funciones de respuestas y seguimiento descritas en las secciones anteriores, como las citas, los filtros, la Búsqueda segura, la omisión de ciertos tipos de preguntas y el uso de un preámbulo para personalizar las respuestas, se pueden aplicar junto con el seguimiento.

Ejemplo de una sesión de seguimiento

A continuación, se muestra un ejemplo de una sesión con preguntas de seguimiento. Supongamos que quieres saber sobre las vacaciones en México:

  • Turn 1:

    • Tú: ¿Cuál es la mejor época del año para ir de vacaciones a México?

    • Responde con preguntas de seguimiento: La mejor época para ir de vacaciones a México es durante la temporada seca, que va de noviembre a abril.

  • Turn 2:

    • Tú: ¿Cuál es el tipo de cambio?

    • Respuesta con seguimiento: 1 USD equivale a aproximadamente 17.65 pesos mexicanos.

  • Turn 3:

    • Tú: ¿Cuál es la temperatura promedio en diciembre?

    • Respuesta con seguimiento: La temperatura promedio varía entre 21 y 26 °C. El promedio de Cancún es de aproximadamente 25 °C.

Sin preguntas de seguimiento, tu pregunta "¿Cuál es el tipo de cambio?" no tendría respuesta, ya que la Búsqueda normal no sabría que querías el tipo de cambio mexicano. Del mismo modo, sin seguimientos, no habría el contexto necesario para proporcionarte temperaturas específicas para México.

Acerca de las sesiones

Para comprender cómo funcionan los seguimientos en Vertex AI Search, debes saber qué son las sesiones.

Una sesión se compone de las búsquedas de texto que proporciona un usuario y las respuestas que proporciona Vertex AI Search.

Estos pares de preguntas y respuestas a veces se denominan interacciones. En el ejemplo anterior, el segundo turno se compone de "¿Cuál es el tipo de cambio?" y "1 USD equivale a aproximadamente 17.65 pesos mexicanos".

Las sesiones se almacenan con la app. En la app, una sesión se representa con el recurso de sesión.

Además de contener los mensajes de consulta y respuesta, el recurso de sesión tiene lo siguiente:

  • Un nombre único (el ID de sesión)

  • Un estado (en curso o completado).

  • Es un seudo-ID del usuario, que es un ID de visitante que rastrea al usuario. Se puede asignar de forma programática. Cuando se asigna al ID de seudónimo del usuario en los eventos del usuario de tu aplicación, el modelo puede ayudarte a mostrar resultados personalizados para el usuario.

  • Una hora de inicio y una hora de finalización

  • Un turno, que es un par de pregunta y respuesta.

Antes de comenzar

Antes de ejecutar una búsqueda que solicite preguntas de seguimiento, asegúrate de haber activado las funciones avanzadas de LLM para la app.

Almacenar información de la sesión y obtener respuestas

Puedes usar la línea de comandos para generar respuestas y resultados de búsqueda, y para almacenar estos datos, junto con cada búsqueda en una sesión.

REST

Para usar la línea de comandos para crear una sesión y generar respuestas a partir de la entrada del usuario, sigue estos pasos:

  1. Especifica la app en la que quieres almacenar la sesión:

    curl -X POST \
      -H "Authorization: Bearer $(gcloud auth print-access-token)" \
      -H "Content-Type: application/json" \
      "https://discoveryengine.googleapis.com/v1/projects/PROJECT_ID/locations/global/collections/default_collection/engines/APP_ID/sessions" \
      -d '{
            "userPseudoId": "USER_PSEUDO_ID"
          }'
    

    Reemplaza lo siguiente:

    • PROJECT_ID: Es el ID de tu proyecto de Google Cloud .

    • APP_ID: Es el ID de la app de Vertex AI Search.

    • USER_PSEUDO_ID: Es una cadena codificada en UTF-8 que actúa como un identificador seudonimizado único que hace un seguimiento de los usuarios. Puede tener una longitud máxima de 128 caracteres. Google recomienda usar este campo porque mejora el rendimiento del modelo y la calidad de la personalización. Puedes usar una cookie HTTP para este campo, que identifica de forma única a un visitante en un solo dispositivo. Estas son algunas consideraciones importantes:

      • Este identificador no cambia cuando el visitante accede a un sitio web o sale de él.
      • Este campo no debe establecerse con el mismo identificador para varios usuarios. De lo contrario, el mismo ID de usuario puede combinar los historiales de eventos de diferentes usuarios y degradar la calidad del modelo.
      • Este campo no debe incluir información de identificación personal (PII).
      • Para una solicitud de búsqueda o exploración determinada, este campo debe correlacionarse con el campo userPseudoId correspondiente en los eventos del usuario.

      Para obtener más información, consulta userPseudoId

    Ejemplo de comando y resultado

    curl -X POST -H "Authorization: Bearer $(gcloud auth print-access-token)"
    -H "Content-Type: application/json"
    "https://discoveryengine.googleapis.com/v1/projects/my-project-123/locations/global/collections/default_collection/engines/my-app/sessions"
    -d '{
    "userPseudoId": "test_user"
    }'
    
    { "name": "projects/123456/locations/global/collections/default_collection/engines/my-app/sessions/16002628354770206943", "state": "IN_PROGRESS", "userPseudoId": "test_user", "startTime": "2024-09-13T18:47:10.465311Z", "endTime": "2024-09-13T18:47:10.465311Z" }
  2. Anota el ID de sesión, los números al final del campo name: en la respuesta JSON. En el resultado de ejemplo, el ID es 5386462384953257772. Necesitarás este ID en el siguiente paso.

  3. Genera una respuesta y agrégala a una sesión en tu app:

    curl -X POST \
      -H "Authorization: Bearer $(gcloud auth print-access-token)" \
      -H "Content-Type: application/json" \
      "https://discoveryengine.googleapis.com/v1/projects/PROJECT_ID/locations/global/collections/default_collection/engines/APP_ID/servingConfigs/default_search:answer" \
      -d '{
            "query": { "text": "QUERY"},
            "session": "projects/PROJECT_ID/locations/global/collections/default_collection/engines/APP_ID/sessions/SESSION_ID",
              "searchSpec":{ "searchParams": {"filter": "FILTER"} }
    }'
    

    Reemplaza lo siguiente:

    • PROJECT_ID: Es el ID de tu proyecto de Google Cloud .
    • APP_ID: Es el ID de la app de Vertex AI Search.
    • QUERY: Es una cadena de texto libre que contiene la pregunta o la búsqueda.
    • SESSION_ID: Es el ID de la sesión que creaste en el paso 1. Estos son los dígitos al final del campo name:, que anotaste en el paso 2. Para una sesión, usa el mismo ID de sesión en cada turno.
    • FILTER: Es un campo de texto para filtrar la búsqueda con una expresión de filtro. El valor predeterminado es una string vacía. La forma en que construyes tu filtro varía según si tienes datos no estructurados con metadatos, datos estructurados o datos del sitio web. Para obtener más información, consulta Filtra la búsqueda personalizada para datos estructurados o no estructurados y Filtra la búsqueda en el sitio web.

    Ejemplo de comando y resultado

    curl -X POST -H "Authorization: Bearer $(gcloud auth print-access-token)"
    -H "Content-Type: application/json"
    "https://discoveryengine.googleapis.com/v1/projects/my-project-123/locations/global/collections/default_collection/engines/my-app/servingConfigs/default_search:answer"
    -d '{
    "query": { "text": "Compare bigquery with spanner database?"},
    "session":  "projects/123456/locations/global/collections/default_collection/engines/my-app/sessions/16002628354770206943",
    }'
        
    { "answer": { "name": "projects/123456/locations/global/collections/default_collection/engines/my-app/sessions/16002628354770206943/answers/4861507376861383072", "state": "SUCCEEDED", "answerText": "BigQuery and Spanner are both powerful tools that can be used together to handle transactional and analytical workloads. Spanner is a fully managed relational database optimized for transactional workloads, while BigQuery is a serverless data warehouse designed for business agility. Spanner provides seamless replication across regions in Google Cloud and processes over 1 billion requests per second at peak. BigQuery analyzes over 110 terabytes of data per second. Users can leverage federated queries to read data from Spanner and write to a native BigQuery table. \n", "steps": [ { "state": "SUCCEEDED", "description": "Rephrase the query and search.", "actions": [ { "searchAction": { "query": "Compare bigquery with spanner database?" }, "observation": { "searchResults": [ { "document": "projects/123456/locations/global/collections/default_collection/dataStores/my-data-store/branches/0/documents/ecc0e7547253f4ca3ff3328ce89995af", "uri": "https://cloud.google.com/blog/topics/developers-practitioners/how-spanner-and-bigquery-work-together-handle-transactional-and-analytical-workloads", "title": "How Spanner and BigQuery work together to handle transactional and analytical workloads | Google Cloud Blog", "snippetInfo": [ { "snippet": "Using Cloud \u003cb\u003eSpanner\u003c/b\u003e and \u003cb\u003eBigQuery\u003c/b\u003e also allows customers to build their \u003cb\u003edata\u003c/b\u003e clouds using Google Cloud, a unified, open approach to \u003cb\u003edata\u003c/b\u003e-driven transformation ...", "snippetStatus": "SUCCESS" } ] }, { "document": "projects/123456/locations/global/collections/default_collection/dataStores/my-data-store/branches/0/documents/d7e238f73608a860e00b752ef80e2941", "uri": "https://cloud.google.com/blog/products/databases/cloud-spanner-gets-stronger-with-bigquery-federated-queries", "title": "Cloud Spanner gets stronger with BigQuery-federated queries | Google Cloud Blog", "snippetInfo": [ { "snippet": "As enterprises compete for market share, their need for real-time insights has given rise to increased demand for transactional \u003cb\u003edatabases\u003c/b\u003e to support \u003cb\u003edata\u003c/b\u003e ...", "snippetStatus": "SUCCESS" } ] }, { "document": "projects/123456/locations/global/collections/default_collection/dataStores/my-data-store/branches/0/documents/e10a5a3c267dc61579e7c00fefe656eb", "uri": "https://cloud.google.com/blog/topics/developers-practitioners/replicating-cloud-spanner-bigquery-scale", "title": "Replicating from Cloud Spanner to BigQuery at scale | Google Cloud Blog", "snippetInfo": [ { "snippet": "... \u003cb\u003eSpanner data\u003c/b\u003e into \u003cb\u003eBigQuery\u003c/b\u003e for analytics. In this post, you will learn how to efficiently use this feature to replicate large tables with high throughput ...", "snippetStatus": "SUCCESS" } ] }, ... { "document": "projects/123456/locations/global/collections/default_collection/dataStores/my-data-store/branches/0/documents/8100ad36e1cac149eb9fc180a41d8f25", "uri": "https://cloud.google.com/blog/products/gcp/from-nosql-to-new-sql-how-spanner-became-a-global-mission-critical-database", "title": "How Spanner became a global, mission-critical database | Google Cloud Blog", "snippetInfo": [ { "snippet": "... SQL \u003cb\u003evs\u003c/b\u003e. NoSQL dichotomy may no longer be relevant." The \u003cb\u003eSpanner\u003c/b\u003e SQL query processor, while recognizable as a standard implementation, has unique ...", "snippetStatus": "SUCCESS" } ] } ] } } ] } ] }, "session": { "name": "projects/123456/locations/global/collections/default_collection/engines/my-app/sessions/16002628354770206943", "state": "IN_PROGRESS", "userPseudoId": "test_user", "turns": [ { "query": { "queryId": "projects/123456/locations/global/questions/741830", "text": "Compare bigquery with spanner database?" }, "answer": "projects/123456/locations/global/collections/default_collection/engines/my-app/sessions/16002628354770206943/answers/4861507376861383072" } ], "startTime": "2024-09-13T18:47:10.465311Z", "endTime": "2024-09-13T18:47:10.465311Z" }, "answerQueryToken": "NMwKDAjFkpK3BhDU24uZAhIkNjZlNDIyZWYtMDAwMC0yMjVmLWIxMmQtZjQwMzA0M2FkYmNj" }
  4. Repite el paso 3 para cada búsqueda nueva en la sesión.

Python

Para obtener más información, consulta la documentación de referencia de la API de AI Applications Python.

Para autenticarte en AI Applications, configura las credenciales predeterminadas de la aplicación. Si deseas obtener más información, consulta Configura la autenticación para un entorno de desarrollo local.

from google.cloud import discoveryengine_v1 as discoveryengine


def create_session(
    project_id: str,
    location: str,
    engine_id: str,
    user_pseudo_id: str,
) -> discoveryengine.Session:
    """Creates a session.

    Args:
        project_id: The ID of your Google Cloud project.
        location: The location of the app.
        engine_id: The ID of the app.
        user_pseudo_id: A unique identifier for tracking visitors. For example, this
          could be implemented with an HTTP cookie, which should be able to
          uniquely identify a visitor on a single device.
    Returns:
        discoveryengine.Session: The newly created Session.
    """

    client = discoveryengine.ConversationalSearchServiceClient()

    session = client.create_session(
        # The full resource name of the engine
        parent=f"projects/{project_id}/locations/{location}/collections/default_collection/engines/{engine_id}",
        session=discoveryengine.Session(user_pseudo_id=user_pseudo_id),
    )

    # Send Session name in `answer_query()`
    print(f"Session: {session.name}")
    return session

Obtén una sesión del almacén de datos

En el siguiente comando, se muestra cómo llamar al método get y obtener una sesión del almacén de datos.

REST

Para obtener una sesión de un almacén de datos, haz lo siguiente:

  1. Ejecuta el siguiente comando de curl:

    curl -X GET -H "Authorization: Bearer $(gcloud auth print-access-token)" \
      -H "Content-Type: application/json" \
      "https://discoveryengine.googleapis.com/v1/projects/PROJECT_ID/locations/global/collections/default_collection/engines/APP_ID/sessions/SESSION_ID"
    

    Reemplaza lo siguiente:

    • PROJECT_ID: Es el ID de tu proyecto de Google Cloud .
    • APP_ID: Es el ID de la app de Vertex AI Search.
    • SESSION_ID: Es el ID de la sesión que deseas obtener.

Python

Para obtener más información, consulta la documentación de referencia de la API de AI Applications Python.

Para autenticarte en AI Applications, configura las credenciales predeterminadas de la aplicación. Si deseas obtener más información, consulta Configura la autenticación para un entorno de desarrollo local.

from google.cloud import discoveryengine_v1 as discoveryengine


def get_session(
    project_id: str,
    location: str,
    engine_id: str,
    session_id: str,
) -> discoveryengine.Session:
    """Retrieves a session.

    Args:
        project_id: The ID of your Google Cloud project.
        location: The location of the app.
        engine_id: The ID of the app.
        session_id: The ID of the session.
    """

    client = discoveryengine.ConversationalSearchServiceClient()

    # The full resource name of the session
    name = f"projects/{project_id}/locations/{location}/collections/default_collection/engines/{engine_id}/sessions/{session_id}"

    session = client.get_session(name=name)

    print(f"Session details: {session}")
    return session

Cómo borrar una sesión de la app

En el siguiente comando, se muestra cómo llamar al método delete y borrar una sesión del almacén de datos.

De forma predeterminada, las sesiones con más de 60 días de antigüedad se borran automáticamente. Sin embargo, si deseas borrar una sesión en particular (por ejemplo, si contiene contenido sensible), usa esta llamada a la API para borrarla.

REST

Para borrar una sesión de una app, haz lo siguiente:

  1. Ejecuta el siguiente comando de curl:

    curl -X DELETE -H "Authorization: Bearer $(gcloud auth print-access-token)" \
      -H "Content-Type: application/json" \
      "https://discoveryengine.googleapis.com/v1/projects/PROJECT_ID/locations/global/collections/default_collection/engines/APP_ID/sessions/SESSION_ID"
    

    Reemplaza lo siguiente:

    • PROJECT_ID: Es el ID de tu proyecto de Google Cloud .
    • APP_ID: Es el ID de la app de Vertex AI Search.
    • SESSION_ID: Es el ID de la sesión que deseas borrar.

Python

Para obtener más información, consulta la documentación de referencia de la API de AI Applications Python.

Para autenticarte en AI Applications, configura las credenciales predeterminadas de la aplicación. Si deseas obtener más información, consulta Configura la autenticación para un entorno de desarrollo local.

from google.cloud import discoveryengine_v1 as discoveryengine


def delete_session(
    project_id: str,
    location: str,
    engine_id: str,
    session_id: str,
) -> None:
    """Deletes a session.

    Args:
        project_id: The ID of your Google Cloud project.
        location: The location of the app.
        engine_id: The ID of the app.
        session_id: The ID of the session.
    """

    client = discoveryengine.ConversationalSearchServiceClient()

    # The full resource name of the session
    name = f"projects/{project_id}/locations/{location}/collections/default_collection/engines/{engine_id}/sessions/{session_id}"

    client.delete_session(name=name)

    print(f"Session {name} deleted.")

Actualiza una sesión

Existen varios motivos por los que podrías querer actualizar una sesión. Por ejemplo, para realizar una de las siguientes acciones:

  • Cómo marcar una sesión como completada
  • Combinar los mensajes de una sesión en otra
  • Cómo cambiar el seudo ID de un usuario

En el siguiente comando, se muestra cómo llamar al método patch y actualizar una sesión en el almacén de datos.

REST

Para actualizar una sesión desde una app, haz lo siguiente:

  1. Ejecuta el siguiente comando de curl:

    curl -X PATCH \
      -H "Authorization: Bearer $(gcloud auth print-access-token)" \
      -H "Content-Type: application/json" \
      "https://discoveryengine.googleapis.com/v1/projects/PROJECT_ID/locations/global/collections/default_collection/engines/APP_ID/sessions/SESSION_ID?updateMask=state" \
      -d '{
            "state": "NEW_STATE"
          }'
    

    Reemplaza lo siguiente:

    • PROJECT_ID: Es el ID de tu proyecto de Google Cloud .
    • APP_ID: Es el ID de la app de Vertex AI Search.
    • SESSION_ID: Es el ID de la sesión que deseas actualizar.
    • NEW_STATE: Es el nuevo valor del estado, por ejemplo, IN_PROGRESS.

Python

Para obtener más información, consulta la documentación de referencia de la API de AI Applications Python.

Para autenticarte en AI Applications, configura las credenciales predeterminadas de la aplicación. Si deseas obtener más información, consulta Configura la autenticación para un entorno de desarrollo local.

from google.cloud import discoveryengine_v1 as discoveryengine
from google.protobuf import field_mask_pb2


def update_session(
    project_id: str,
    location: str,
    engine_id: str,
    session_id: str,
) -> discoveryengine.Session:
    """Updates a session.

    Args:
        project_id: The ID of your Google Cloud project.
        location: The location of the app.
        engine_id: The ID of the app.
        session_id: The ID of the session.
    Returns:
        discoveryengine.Session: The updated Session.
    """
    client = discoveryengine.ConversationalSearchServiceClient()

    # The full resource name of the session
    name = f"projects/{project_id}/locations/{location}/collections/default_collection/engines/{engine_id}/sessions/{session_id}"

    session = discoveryengine.Session(
        name=name,
        state=discoveryengine.Session.State.IN_PROGRESS,  # Options: IN_PROGRESS, STATE_UNSPECIFIED
    )

    # Fields to Update
    update_mask = field_mask_pb2.FieldMask(paths=["state"])

    session = client.update_session(session=session, update_mask=update_mask)
    print(f"Updated session: {session.name}")
    return session

Enumera todas las sesiones

En el siguiente comando, se muestra cómo llamar al método list y enumerar las sesiones en el almacén de datos.

REST

Para enumerar las sesiones de una app, haz lo siguiente:

  1. Ejecuta el siguiente comando de curl:

    curl -X GET \
      -H "Authorization: Bearer $(gcloud auth print-access-token)" \
      -H "Content-Type: application/json" \
      "https://discoveryengine.googleapis.com/v1/projects/PROJECT_ID/locations/global/collections/default_collection/engines/APP_ID/sessions"
    

    Reemplaza lo siguiente:

    • PROJECT_ID: Es el ID de tu proyecto de Google Cloud .
    • APP_ID: Es el ID de la app de Vertex AI Search.

Python

Para obtener más información, consulta la documentación de referencia de la API de AI Applications Python.

Para autenticarte en AI Applications, configura las credenciales predeterminadas de la aplicación. Si deseas obtener más información, consulta Configura la autenticación para un entorno de desarrollo local.

from google.cloud import discoveryengine_v1 as discoveryengine


def list_sessions(
    project_id: str,
    location: str,
    engine_id: str,
) -> discoveryengine.ListSessionsResponse:
    """Lists all sessions associated with a data store.

    Args:
        project_id: The ID of your Google Cloud project.
        location: The location of the app.
        engine_id: The ID of the app.
    Returns:
        discoveryengine.ListSessionsResponse: The list of sessions.
    """

    client = discoveryengine.ConversationalSearchServiceClient()

    # The full resource name of the engine
    parent = f"projects/{project_id}/locations/{location}/collections/default_collection/engines/{engine_id}"

    response = client.list_sessions(
        request=discoveryengine.ListSessionsRequest(
            parent=parent,
            filter='state="IN_PROGRESS"',  # Optional: Filter requests by userPseudoId or state
            order_by="update_time",  # Optional: Sort results
        )
    )

    print("Sessions:")
    for session in response.sessions:
        print(session)

    return response

Enumera las sesiones de un usuario

En el siguiente comando, se muestra cómo llamar al método list para enumerar las sesiones asociadas con un usuario o visitante.

REST

Para enumerar las sesiones asociadas con un usuario o visitante, haz lo siguiente:

  1. Ejecuta el siguiente comando de curl:

    curl -X GET \
      -H "Authorization: Bearer $(gcloud auth print-access-token)" \
      -H "Content-Type: application/json" \
      "https://discoveryengine.googleapis.com/v1/projects/PROJECT_ID/locations/global/collections/default_collection/engines/APP_ID/sessions?filter=userPseudoId=USER_PSEUDO_ID"
    

    Reemplaza lo siguiente:

    • PROJECT_ID: Es el ID de tu proyecto de Google Cloud .
    • APP_ID: Es el ID de la app de Vertex AI Search.
    • USER_PSEUDO_ID: Es el ID pseudo del usuario cuyas sesiones deseas enumerar.

Python

Para obtener más información, consulta la documentación de referencia de la API de AI Applications Python.

Para autenticarte en AI Applications, configura las credenciales predeterminadas de la aplicación. Si deseas obtener más información, consulta Configura la autenticación para un entorno de desarrollo local.

from google.cloud import discoveryengine_v1 as discoveryengine


def list_sessions(
    project_id: str,
    location: str,
    engine_id: str,
) -> discoveryengine.ListSessionsResponse:
    """Lists all sessions associated with a data store.

    Args:
        project_id: The ID of your Google Cloud project.
        location: The location of the app.
        engine_id: The ID of the app.
    Returns:
        discoveryengine.ListSessionsResponse: The list of sessions.
    """

    client = discoveryengine.ConversationalSearchServiceClient()

    # The full resource name of the engine
    parent = f"projects/{project_id}/locations/{location}/collections/default_collection/engines/{engine_id}"

    response = client.list_sessions(
        request=discoveryengine.ListSessionsRequest(
            parent=parent,
            filter='state="IN_PROGRESS"',  # Optional: Filter requests by userPseudoId or state
            order_by="update_time",  # Optional: Sort results
        )
    )

    print("Sessions:")
    for session in response.sessions:
        print(session)

    return response

Enumera las sesiones de un usuario y su estado

En el siguiente comando, se muestra cómo llamar al método list para enumerar las sesiones en un estado determinado para un usuario en particular.

REST

Para enumerar las sesiones de un usuario que están abiertas o cerradas y asociadas con un usuario o visitante determinado, haz lo siguiente:

  1. Ejecuta el siguiente comando de curl:

    curl -X GET -H "Authorization: Bearer $(gcloud auth print-access-token)" \
      -H "Content-Type: application/json" \
      "https://discoveryengine.googleapis.com/v1/projects/PROJECT_ID/locations/global/collections/default_collection/engines/APP_ID/sessions?filter=userPseudoId=USER_PSEUDO_ID%20AND%20state=STATE"
    

    Reemplaza lo siguiente:

    • PROJECT_ID: Es el ID de tu proyecto de Google Cloud .
    • APP_ID: Es el ID de la app de Vertex AI Search.
    • USER_PSEUDO_ID: Es el ID pseudo del usuario cuyas sesiones deseas enumerar.
    • STATE: Es el estado de la sesión: STATE_UNSPECIFIED (cerrada o desconocida) o IN_PROGRESS (abierta).

Python

Para obtener más información, consulta la documentación de referencia de la API de AI Applications Python.

Para autenticarte en AI Applications, configura las credenciales predeterminadas de la aplicación. Si deseas obtener más información, consulta Configura la autenticación para un entorno de desarrollo local.

from google.cloud import discoveryengine_v1 as discoveryengine


def list_sessions(
    project_id: str,
    location: str,
    engine_id: str,
) -> discoveryengine.ListSessionsResponse:
    """Lists all sessions associated with a data store.

    Args:
        project_id: The ID of your Google Cloud project.
        location: The location of the app.
        engine_id: The ID of the app.
    Returns:
        discoveryengine.ListSessionsResponse: The list of sessions.
    """

    client = discoveryengine.ConversationalSearchServiceClient()

    # The full resource name of the engine
    parent = f"projects/{project_id}/locations/{location}/collections/default_collection/engines/{engine_id}"

    response = client.list_sessions(
        request=discoveryengine.ListSessionsRequest(
            parent=parent,
            filter='state="IN_PROGRESS"',  # Optional: Filter requests by userPseudoId or state
            order_by="update_time",  # Optional: Sort results
        )
    )

    print("Sessions:")
    for session in response.sessions:
        print(session)

    return response