Configura los atributos de seguridad

La API de Vertex AI Gemini bloquea el contenido no seguro en función de una lista de atributos de seguridad y sus límites de bloqueo configurados. En esta página, se describen conceptos clave de seguridad y se muestra cómo configurar los umbrales de bloqueo de cada atributo de seguridad para controlar la frecuencia con la que se bloquean las solicitudes y respuestas.

Puntuación de confianza del atributo de seguridad

El contenido procesado a través de la API de Vertex AI Gemini se evalúa en función de una lista de atributos de seguridad, que incluyen “categorías perjudiciales” y temas que pueden considerarse sensibles. Esos atributos de seguridad se denotan en la siguiente tabla:

Puntuación de atributos de seguridad

Atributo de seguridad Definición
Incitación al odio o a la violencia Comentarios negativos o dañinos que se orientan a la identidad o los atributos protegidos.
Acoso Comentarios maliciosos, intimidantes, de bullying o abusivos dirigidos a otra persona.
Sexualmente explícito Incluye referencias a actos sexual o a otro contenido obsceno.
Contenido peligroso Promueve o habilita el acceso a bienes, servicios y actividades perjudiciales.

Probabilidades de atributos de seguridad

Cada atributo de seguridad tiene asociado una puntuación de confianza entre 0.0 y 1.0, redondeada a un decimal. La puntuación de confianza refleja la probabilidad de que la entrada o respuesta pertenezca a una categoría determinada.

La puntuación de confianza en la siguiente tabla se muestra con un nivel de confianza de seguridad:

Probabilidad Descripción
NEGLIGIBLE El contenido tiene una probabilidad insignificante de no ser seguro.
LOW El contenido tiene una probabilidad baja de no ser seguro.
MEDIUM El contenido tiene una probabilidad media de no ser seguro.
HIGH El contenido tiene una probabilidad alta de no ser seguro.

Gravedad del atributo de seguridad

A cada uno de los cuatro atributos de seguridad se le asigna una calificación de seguridad (nivel de gravedad) y una puntuación de gravedad que varía de 0.0 a 1.0, redondeada a un decimal. Las calificaciones y puntuaciones de la siguiente tabla reflejan la gravedad prevista del contenido que pertenece a una categoría determinada:

Gravedad Descripción
NEGLIGIBLE La gravedad del contenido se predice como desestimable con respecto a la política de seguridad de Google.
LOW La gravedad del contenido se prevé como baja con respecto a la política de seguridad de Google.
MEDIUM La gravedad del contenido se predice como media con respecto a la política de seguridad de Google.
HIGH La gravedad del contenido se predice como alta con respecto a la política de seguridad de Google.

Puntuaciones de probabilidad comparadas con las puntuaciones de gravedad

Existen dos tipos de puntuaciones de seguridad:

  • Puntuaciones de seguridad basadas en la probabilidad de no ser segura
  • Puntuaciones de seguridad basadas en la gravedad del contenido dañino

El atributo de seguridad de probabilidad refleja la probabilidad de que una entrada o respuesta del modelo esté asociada con el atributo de seguridad correspondiente. El atributo de seguridad de gravedad refleja la magnitud de la gravedad de una entrada o respuesta del modelo.

El contenido puede tener una puntuación de probabilidad baja y una puntuación de gravedad alta, o una puntuación de probabilidad alta y una puntuación de gravedad baja. Por ejemplo, considera las siguientes dos oraciones:

  1. El robot me golpeó.
  2. El robot me acuchilló.

La primera oración puede tener una mayor probabilidad de que sea contenido no seguro, y la segunda puede tener una mayor gravedad en términos de violencia. Por este motivo, es importante probar y considerar con cuidado el nivel adecuado de bloqueo necesario para respaldar tus casos de uso clave y minimizar el daño a los usuarios finales.

Configuración de seguridad

La configuración de seguridad forma parte de la solicitud que envías al servicio de la API. Se puede ajustar para cada solicitud que realices a la API. En la siguiente tabla, se describe la configuración de bloqueo que puedes ajustar para cada categoría. Por ejemplo, si estableces la configuración de bloqueo en Bloquear poco para la categoría de contenido peligroso, se bloqueará todo lo que tenga una alta probabilidad de ser contenido peligroso. Pero se permite cualquier cosa con una probabilidad menor. Si no se establece, la configuración de bloqueo predeterminada es Bloquear algo.

Umbral (Studio) Umbral (API) Umbral (descripción)
BLOCK_NONE (restringido) Mostrar siempre sin importar la probabilidad de que sea contenido no seguro.
Bloquear poco BLOCK_ONLY_HIGH Bloquear cuando haya una alta probabilidad de que sea contenido no seguro.
Bloquear algo (opción predeterminada) BLOCK_MEDIUM_AND_ABOVE (predeterminada) Bloquear cuando haya una probabilidad media o alta de que sea contenido no seguro.
Bloquear la mayoría BLOCK_LOW_AND_ABOVE Bloquear cuando haya una baja probabilidad de que sea contenido no seguro.
HARM_BLOCK_THRESHOLD_UNSPECIFIED No se especifica el umbral; se bloquea con el umbral predeterminado.

Puedes cambiar esta configuración para cada solicitud que hagas al servicio de texto. Consulta la referencia de la API de HarmBlockThreshold para obtener más detalles.

Cómo quitar el bloqueo de respuestas automáticas para determinados atributos de seguridad

La configuración de seguridad BLOCK_NONE quita el bloqueo de respuestas automáticas (para los atributos de seguridad que se describen en Configuración de seguridad), y te permite configurar tus propios lineamientos de seguridad con las puntuaciones devueltas. Para acceder a la configuración BLOCK_NONE, puedes hacer lo siguiente:

  1. Postúlate a la lista de entidades permitidas mediante el formulario de la lista de entidades permitidas del filtro de seguridad de Gemini.

  2. Cambia el tipo de cuenta a una con facturación mensual con la referencia de facturación de Google Cloud.

Diferencias clave entre Gemini y otras familias de modelos

Si bien se aplican los mismos clasificadores de seguridad a Gemini y PaLM, la cantidad de atributos de seguridad que se muestran en la API puede variar entre distintas familias de modelos. La lógica de bloqueo (es decir, el umbral de confianza) se basa en una evaluación rigurosa de cada modelo. Por lo tanto, es posible que un parámetro de configuración de seguridad que se aplica a un modelo no coincida perfectamente con el comportamiento de un parámetro de configuración de seguridad aplicado a un modelo diferente. Si esto es una preocupación, te recomendamos que configures tu propia lógica de bloqueo con puntuaciones de gravedad sin procesar y puntuaciones de confianza sin procesar, mediante la aplicación de los mismos umbrales de puntuación en todos los modelos.

Configura los umbrales

Python

Si deseas obtener información para instalar o actualizar el SDK de Vertex AI para Python, consulta Instala el SDK de Vertex AI para Python. Si deseas obtener más información, consulta la documentación de referencia de la API de Python.

import vertexai

from vertexai import generative_models

# TODO(developer): Update and un-comment below line
# project_id = "PROJECT_ID"

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

model = generative_models.GenerativeModel(model_name="gemini-1.0-pro-vision-001")

# Generation config
generation_config = generative_models.GenerationConfig(
    max_output_tokens=2048, temperature=0.4, top_p=1, top_k=32
)

# Safety config
safety_config = [
    generative_models.SafetySetting(
        category=generative_models.HarmCategory.HARM_CATEGORY_DANGEROUS_CONTENT,
        threshold=generative_models.HarmBlockThreshold.BLOCK_LOW_AND_ABOVE,
    ),
    generative_models.SafetySetting(
        category=generative_models.HarmCategory.HARM_CATEGORY_HARASSMENT,
        threshold=generative_models.HarmBlockThreshold.BLOCK_LOW_AND_ABOVE,
    ),
]

image_file = Part.from_uri(
    "gs://cloud-samples-data/generative-ai/image/scones.jpg", "image/jpeg"
)

# Generate content
responses = model.generate_content(
    [image_file, "What is in this image?"],
    generation_config=generation_config,
    safety_settings=safety_config,
    stream=True,
)

text_responses = []
for response in responses:
    print(response.text)
    text_responses.append(response.text)

Node.js

Antes de probar este ejemplo, sigue las instrucciones de configuración para Node.js incluidas en la guía de inicio rápido de Vertex AI sobre cómo usar bibliotecas cliente. Para obtener más información, consulta la documentación de referencia de la API de Vertex AI Node.js.

Para autenticarte en Vertex AI, 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.

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

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

  // Instantiate the model
  const generativeModel = vertexAI.getGenerativeModel({
    model: model,
    // The following parameters are optional
    // They can also be passed to individual content generation requests
    safety_settings: [
      {
        category: HarmCategory.HARM_CATEGORY_DANGEROUS_CONTENT,
        threshold: HarmBlockThreshold.BLOCK_LOW_AND_ABOVE,
      },
    ],
    generation_config: {
      max_output_tokens: 256,
      temperature: 0.4,
      top_p: 1,
      top_k: 16,
    },
  });

  const request = {
    contents: [{role: 'user', parts: [{text: 'Tell me something dangerous.'}]}],
  };

  console.log('Prompt:');
  console.log(request.contents[0].parts[0].text);
  console.log('Streaming Response Text:');

  // Create the response stream
  const responseStream = await generativeModel.generateContentStream(request);

  // Log the text response as it streams
  for await (const item of responseStream.stream) {
    if (item.candidates[0].finishReason === 'SAFETY') {
      console.log('This response stream terminated due to safety concerns.');
      break;
    } else {
      process.stdout.write(item.candidates[0].content.parts[0].text);
    }
  }
  console.log('This response stream terminated due to safety concerns.');
}

Java

Antes de probar este ejemplo, sigue las instrucciones de configuración para Java incluidas en la guía de inicio rápido de Vertex AI sobre cómo usar bibliotecas cliente. Para obtener más información, consulta la documentación de referencia de la API de Vertex AI Java.

Para autenticarte en Vertex AI, 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.

import com.google.cloud.vertexai.VertexAI;
import com.google.cloud.vertexai.api.Candidate;
import com.google.cloud.vertexai.api.GenerateContentResponse;
import com.google.cloud.vertexai.api.GenerationConfig;
import com.google.cloud.vertexai.api.HarmCategory;
import com.google.cloud.vertexai.api.SafetySetting;
import com.google.cloud.vertexai.generativeai.GenerativeModel;
import java.util.Arrays;
import java.util.List;

public class WithSafetySettings {

  public static void main(String[] args) throws Exception {
    // TODO(developer): Replace these variables before running the sample.
    String projectId = "your-google-cloud-project-id";
    String location = "us-central1";
    String modelName = "gemini-1.0-pro-vision-001";
    String textPrompt = "your-text-here";

    String output = safetyCheck(projectId, location, modelName, textPrompt);
    System.out.println(output);
  }

  // Use safety settings to avoid harmful questions and content generation.
  public static String safetyCheck(String projectId, String location, String modelName,
      String textPrompt) throws Exception {
    // Initialize client that will be used to send requests. This client only needs
    // to be created once, and can be reused for multiple requests.
    try (VertexAI vertexAI = new VertexAI(projectId, location)) {
      StringBuilder output = new StringBuilder();

      GenerationConfig generationConfig =
          GenerationConfig.newBuilder()
              .setMaxOutputTokens(2048)
              .setTemperature(0.4F)
              .setTopK(32)
              .setTopP(1)
              .build();

      List<SafetySetting> safetySettings = Arrays.asList(
          SafetySetting.newBuilder()
              .setCategory(HarmCategory.HARM_CATEGORY_HATE_SPEECH)
              .setThreshold(SafetySetting.HarmBlockThreshold.BLOCK_LOW_AND_ABOVE)
              .build(),
          SafetySetting.newBuilder()
              .setCategory(HarmCategory.HARM_CATEGORY_DANGEROUS_CONTENT)
              .setThreshold(SafetySetting.HarmBlockThreshold.BLOCK_MEDIUM_AND_ABOVE)
              .build()
      );

      GenerativeModel model = new GenerativeModel(modelName, vertexAI)
          .withGenerationConfig(generationConfig)
          .withSafetySettings(safetySettings);

      GenerateContentResponse response = model.generateContent(textPrompt);
      output.append(response).append("\n");

      // Verifies if the above content has been blocked for safety reasons.
      boolean blockedForSafetyReason = response.getCandidatesList()
          .stream()
          .anyMatch(candidate -> candidate.getFinishReason() == Candidate.FinishReason.SAFETY);
      output.append("Blocked for safety reasons?: ").append(blockedForSafetyReason);

      return output.toString();
    }
  }
}

Go

Antes de probar este ejemplo, sigue las instrucciones de configuración para Go incluidas en la guía de inicio rápido de Vertex AI sobre cómo usar bibliotecas cliente. Para obtener más información, consulta la documentación de referencia de la API de Vertex AI Go.

Para autenticarte en Vertex AI, 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.

import (
	"context"
	"fmt"
	"io"
	"mime"
	"path/filepath"

	"cloud.go888ogle.com.fqhub.com/go/vertexai/genai"
)

// generateMultimodalContent generates a response into w, based upon the prompt
// and image provided.
func generateMultimodalContent(w io.Writer, prompt, image, projectID, location, modelName string) error {
	// prompt := "describe this image."
	// location := "us-central1"
	// model := "gemini-1.0-pro-vision-001"
	// image := "gs://cloud-samples-data/generative-ai/image/320px-Felis_catus-cat_on_snow.jpg"
	ctx := context.Background()

	client, err := genai.NewClient(ctx, projectID, location)
	if err != nil {
		return fmt.Errorf("unable to create client: %v", err)
	}
	defer client.Close()

	model := client.GenerativeModel(modelName)
	model.SetTemperature(0.4)
	// configure the safety settings thresholds
	model.SafetySettings = []*genai.SafetySetting{
		{
			Category:  genai.HarmCategoryHarassment,
			Threshold: genai.HarmBlockLowAndAbove,
		},
		{
			Category:  genai.HarmCategoryDangerousContent,
			Threshold: genai.HarmBlockLowAndAbove,
		},
	}

	// Given an image file URL, prepare image file as genai.Part
	img := genai.FileData{
		MIMEType: mime.TypeByExtension(filepath.Ext(image)),
		FileURI:  image,
	}

	res, err := model.GenerateContent(ctx, img, genai.Text(prompt))
	if err != nil {
		return fmt.Errorf("unable to generate contents: %w", err)
	}

	fmt.Fprintf(w, "generated response: %s\n", res.Candidates[0].Content.Parts[0])
	return nil
}

C#

Antes de probar este ejemplo, sigue las instrucciones de configuración para C# incluidas en la guía de inicio rápido de Vertex AI sobre cómo usar bibliotecas cliente. Para obtener más información, consulta la documentación de referencia de la API de Vertex AI C#.

Para autenticarte en Vertex AI, 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.


using Google.Api.Gax.Grpc;
using Google.Cloud.AIPlatform.V1;
using System.Text;
using System.Threading.Tasks;
using static Google.Cloud.AIPlatform.V1.SafetySetting.Types;

public class WithSafetySettings
{
    public async Task<string> GenerateContent(
        string projectId = "your-project-id",
        string location = "us-central1",
        string publisher = "google",
        string model = "gemini-1.0-pro-vision"
    )
    {
        var predictionServiceClient = new PredictionServiceClientBuilder
        {
            Endpoint = $"{location}-aiplatform.googleapis.com"
        }.Build();

        var generateContentRequest = new GenerateContentRequest
        {
            Model = $"projects/{projectId}/locations/{location}/publishers/{publisher}/models/{model}",
            Contents =
            {
                new Content
                {
                    Role = "USER",
                    Parts =
                    {
                        new Part { Text = "Hello!" }
                    }
                }
            },
            SafetySettings =
            {
                new SafetySetting
                {
                    Category = HarmCategory.HateSpeech,
                    Threshold = HarmBlockThreshold.BlockLowAndAbove
                },
                new SafetySetting
                {
                    Category = HarmCategory.DangerousContent,
                    Threshold = HarmBlockThreshold.BlockMediumAndAbove
                }
            }
        };

        using PredictionServiceClient.StreamGenerateContentStream response = predictionServiceClient.StreamGenerateContent(generateContentRequest);

        StringBuilder fullText = new();

        AsyncResponseStream<GenerateContentResponse> responseStream = response.GetResponseStream();
        await foreach (GenerateContentResponse responseItem in responseStream)
        {
            // Check if the content has been blocked for safety reasons.
            bool blockForSafetyReason = responseItem.Candidates[0].FinishReason == Candidate.Types.FinishReason.Safety;
            if (blockForSafetyReason)
            {
                fullText.Append("Blocked for safety reasons");
            }
            else
            {
                fullText.Append(responseItem.Candidates[0].Content.Parts[0].Text);
            }
        }

        return fullText.ToString();
    }
}

REST

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

  • LOCATION: la región para procesar la solicitud. Las opciones disponibles incluyen las siguientes:

    Haz clic para expandir las regiones disponibles.

    • us-central1
    • us-west4
    • northamerica-northeast1
    • us-east4
    • us-west1
    • asia-northeast3
    • asia-southeast1
    • asia-northeast1
  • PROJECT_ID: El ID del proyecto.
  • MODEL_ID: el ID del modelo multimodal que deseas usar. Las opciones son las siguientes:
    • gemini-1.0-pro
    • gemini-1.0-pro-vision
  • ROLE: el rol en una conversación asociada con el contenido. Especificar un rol es obligatorio incluso en casos de uso de un solo turno. Los valores aceptables son los siguientes:
    • USER: especifica el contenido que envías.
    • MODEL: especifica la respuesta del modelo.
  • TEXT: las instrucciones de texto que se incluirán en el mensaje.
  • SAFETY_CATEGORY: la categoría de seguridad para la que se configura un umbral. Los valores aceptables son los siguientes:

    Haz clic para expandir las categorías de seguridad

    • HARM_CATEGORY_SEXUALLY_EXPLICIT
    • HARM_CATEGORY_HATE_SPEECH
    • HARM_CATEGORY_HARASSMENT
    • HARM_CATEGORY_DANGEROUS_CONTENT
  • THRESHOLD: el umbral para bloquear respuestas que podrían pertenecer a la categoría de seguridad especificada según la probabilidad. Los valores aceptables son los siguientes:

    Haz clic para expandir los umbrales de bloqueo

    • BLOCK_NONE
    • BLOCK_ONLY_HIGH
    • BLOCK_MEDIUM_AND_ABOVE (predeterminada)
    • BLOCK_LOW_AND_ABOVE
    BLOCK_LOW_AND_ABOVE bloquea más, mientras que BLOCK_ONLY_HIGH bloquea menos.

HTTP method and URL:

POST http://LOCATION-aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/publishers/google/models/MODEL_ID:streamGenerateContent

Cuerpo JSON de la solicitud:

{
  "contents": {
    "role": "ROLE",
    "parts": { "text": "TEXT" }
  },
  "safety_settings": {
    "category": "SAFETY_CATEGORY",
    "threshold": "THRESHOLD"
  },
}

Para enviar tu solicitud, elige una de estas opciones:

curl

Guarda el cuerpo de la solicitud en un archivo llamado request.json y ejecuta el siguiente comando:

curl -X POST \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
-H "Content-Type: application/json; charset=utf-8" \
-d @request.json \
"http://LOCATION-aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/publishers/google/models/MODEL_ID:streamGenerateContent"

PowerShell

Guarda el cuerpo de la solicitud en un archivo llamado request.json y ejecuta el siguiente comando:

$cred = gcloud auth print-access-token
$headers = @{ "Authorization" = "Bearer $cred" }

Invoke-WebRequest `
-Method POST `
-Headers $headers `
-ContentType: "application/json; charset=utf-8" `
-InFile request.json `
-Uri "http://LOCATION-aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/publishers/google/models/MODEL_ID:streamGenerateContent" | Select-Object -Expand Content

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

Ejemplo del comando curl

LOCATION="us-central1"
MODEL_ID="gemini-1.0-pro"
PROJECT_ID="test-project"

curl \
-X POST \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
-H "Content-Type: application/json" \
http://${LOCATION}-aiplatform.googleapis.com/v1/projects/${PROJECT_ID}/locations/${LOCATION}/publishers/google/models/${MODEL_ID}:streamGenerateContent -d \
$'{
  "contents": {
    "role": "user",
    "parts": { "text": "Hello!" }
  },
  "safety_settings": [
    {
      "category": "HARM_CATEGORY_SEXUALLY_EXPLICIT",
      "threshold": "BLOCK_NONE"
    },
    {
      "category": "HARM_CATEGORY_HATE_SPEECH",
      "threshold": "BLOCK_LOW_AND_ABOVE"
    },
    {
      "category": "HARM_CATEGORY_HARASSMENT",
      "threshold": "BLOCK_MEDIUM_AND_ABOVE"
    },
    {
      "category": "HARM_CATEGORY_DANGEROUS_CONTENT",
      "threshold": "BLOCK_ONLY_HIGH"
    }
  ]
}'

Console

  1. En la sección Vertex AI de la consola de Google Cloud, ve a la página Vertex AI Studio.

    Ir a Vertex AI Studio

  2. En Crear un mensaje nuevo, haz clic en cualquiera de los botones para abrir la página de diseño de mensajes.

  3. Haz clic en Configuración de seguridad.

    Se abrirá la ventana de diálogo Configuración de seguridad.

  4. Para cada atributo de seguridad, configura el valor de umbral deseado.

  5. Haz clic en Guardar.

¿Qué sigue?