Mengonfigurasi atribut keamanan

Vertex AI Gemini API memblokir konten yang tidak aman berdasarkan daftar atribut keamanan dan nilai minimum pemblokirannya yang dikonfigurasi. Halaman ini menguraikan konsep keamanan utama dan menunjukkan cara mengonfigurasi nilai minimum pemblokiran setiap atribut keamanan untuk mengontrol seberapa sering perintah dan respons diblokir.

Skor keyakinan atribut keamanan

Konten yang diproses melalui Vertex AI Gemini API dinilai berdasarkan daftar atribut keamanan, yang mencakup "kategori berbahaya" dan topik yang dapat dianggap sensitif. Atribut keamanan tersebut dilambangkan dalam tabel berikut:

Definisi atribut keamanan

Atribut Keamanan Definisi
Ujaran Kebencian Komentar negatif atau berbahaya yang menargetkan atribut identitas dan/atau dilindungi.
Pelecehan Komentar jahat, mengintimidasi, menindas, atau kasar yang menargetkan individu lain.
Seksual Vulgar Berisi referensi ke tindakan seksual atau konten cabul lainnya.
Konten Berbahaya Mempromosikan atau memungkinkan akses ke barang, layanan, dan aktivitas berbahaya.

Probabilitas atribut keamanan

Setiap atribut keamanan memiliki skor keyakinan terkait antara 0,0 dan 1,0, yang dibulatkan ke satu desimal, yang mencerminkan kemungkinan input atau respons termasuk dalam kategori tertentu.

Skor keyakinan dalam tabel berikut ditampilkan dengan tingkat keyakinan keamanan:

Kemungkinan Deskripsi
DAPAT DIDASARKAN Konten sangat berisiko dianggap tidak aman.
RENDAH Konten memiliki kemungkinan tidak aman yang rendah.
SEDANG Konten memiliki kemungkinan sedang tidak aman.
TINGGI Konten sangat berpotensi tidak aman.

Tingkat keparahan atribut keamanan

Masing-masing dari empat atribut keamanan diberi peringkat keamanan (tingkat keparahan) dan skor keparahan mulai dari 0,0 hingga 1,0 yang dibulatkan ke satu desimal. Rating dan skor dalam tabel berikut mencerminkan prediksi tingkat keparahan konten yang termasuk dalam kategori tertentu:

Tingkat keparahan Deskripsi
DAPAT DIDASARKAN Tingkat keparahan konten diperkirakan dapat diabaikan dalam kaitannya dengan kebijakan keamanan Google.
RENDAH Tingkat keseriusan konten diperkirakan rendah sehubungan dengan kebijakan keamanan Google.
SEDANG Tingkat keseriusan konten diprediksi sebagai sedang dalam kaitannya dengan kebijakan keamanan Google.
TINGGI Tingkat keseriusan konten diperkirakan tinggi sehubungan dengan kebijakan keamanan Google.

Setelan keamanan

Setelan keamanan adalah bagian dari permintaan yang Anda kirim ke layanan API. Nilai ini dapat disesuaikan untuk setiap permintaan yang Anda buat ke API. Tabel berikut menjelaskan setelan pemblokiran yang dapat Anda sesuaikan untuk setiap kategori. Misalnya, jika Anda menetapkan setelan blokir ke Blokir beberapa untuk kategori Konten Berbahaya, semua hal yang memiliki kemungkinan tinggi sebagai konten berbahaya akan diblokir. Tetapi apa pun dengan probabilitas lebih rendah diperbolehkan. Jika tidak disetel, setelan pemblokiran default-nya adalah Blokir beberapa.

Batas (Studio) Ambang batas (API) Ambang batas (Deskripsi)
BLOCK_NONE (Dibatasi) Selalu tampilkan terlepas dari kemungkinan adanya konten yang tidak aman.
Blokir beberapa BLOCK_ONLY_HIGH Blokir jika berpotensi tinggi berisi konten yang tidak aman.
Blokir beberapa (Default) BLOCK_MEDIUM_AND_ABOVE (Default) Blokir jika memiliki kemungkinan sedang atau tinggi berisi konten yang tidak aman.
Blokir sebagian besar BLOCK_LOW_AND_ABOVE Blokir jika memiliki kemungkinan sedang atau tinggi berisi konten yang tidak aman.
HARM_BLOCK_THRESHOLD_UNSPECIFIED Nilai minimum tidak ditentukan, blokir menggunakan nilai minimum default.

Anda dapat mengubah setelan ini untuk setiap permintaan yang Anda buat ke layanan teks. Lihat Referensi HarBlockThreshold API untuk mengetahui detailnya.

Cara menghapus pemblokiran respons otomatis untuk atribut keamanan tertentu

Setelan keamanan "BLOCK_NONE" akan menghapus pemblokiran respons otomatis (untuk atribut keamanan yang dijelaskan di Setelan Keamanan) dan memungkinkan Anda mengonfigurasi panduan keamanan Anda sendiri dengan skor yang ditampilkan. Untuk mengakses setelan "BLOCK_NONE", Anda memiliki dua opsi:

(1) Anda dapat mengajukan permohonan untuk mendapatkan daftar yang diizinkan melalui formulir daftar yang diizinkan filter keamanan Gemini, atau

(2) Anda dapat mengganti jenis akun ke penagihan dengan invoice bulanan dengan referensi penagihan dengan invoice GCP.

Perbedaan utama antara Gemini dan kelompok model lainnya

Meskipun pengklasifikasi keamanan yang sama diterapkan pada Gemini dan PaLM, jumlah atribut keamanan yang ditampilkan di API dapat bervariasi di berbagai kelompok model. Logika pemblokiran (yaitu nilai minimum keyakinan) didasarkan pada evaluasi yang ketat terhadap setiap model. Oleh karena itu, setelan keamanan yang diterapkan ke satu model mungkin tidak sepenuhnya cocok dengan perilaku setelan keamanan yang diterapkan pada model lain. Jika hal ini menjadi masalah, sebaiknya Anda mengonfigurasi logika pemblokiran Anda sendiri dengan skor tingkat keseriusan mentah dan skor keyakinan mentah, dengan menerapkan nilai minimum penskoran yang sama di seluruh model.

Konfigurasi ambang batas

Python

Untuk mempelajari cara menginstal atau mengupdate Vertex AI SDK untuk Python, lihat Menginstal Vertex AI SDK untuk Python. Untuk mengetahui informasi selengkapnya, lihat dokumentasi referensi Python API.

from vertexai import generative_models

def generate_text(project_id: str, location: str, image: str) -> str:
    # Initialize Vertex AI
    vertexai.init(project=project_id, location=location)

    # Load the model
    model = generative_models.GenerativeModel("gemini-1.0-pro-vision")

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

    # Safety config
    safety_config = {
        generative_models.HarmCategory.HARM_CATEGORY_DANGEROUS_CONTENT: generative_models.HarmBlockThreshold.BLOCK_LOW_AND_ABOVE,
        generative_models.HarmCategory.HARM_CATEGORY_HARASSMENT: generative_models.HarmBlockThreshold.BLOCK_LOW_AND_ABOVE,
    }

    # Generate content
    responses = model.generate_content(
        [image, "Add your prompt here"],
        generation_config=config,
        stream=True,
        safety_settings=safety_config,
    )

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

Node.js

Sebelum mencoba contoh ini, ikuti petunjuk penyiapan Node.js di Panduan memulai Vertex AI menggunakan library klien. Untuk mengetahui informasi selengkapnya, lihat Dokumentasi referensi API Node.js Vertex AI.

Untuk melakukan autentikasi ke Vertex AI, siapkan Kredensial Default Aplikasi. Untuk mengetahui informasi selengkapnya, baca Menyiapkan autentikasi untuk lingkungan pengembangan lokal.

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'
) {
  // 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},
  });

  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);
    }
  }
}

Java

Sebelum mencoba contoh ini, ikuti petunjuk penyiapan Java di Panduan memulai Vertex AI menggunakan library klien. Untuk mengetahui informasi selengkapnya, lihat Dokumentasi referensi API Java Vertex AI.

Untuk melakukan autentikasi ke Vertex AI, siapkan Kredensial Default Aplikasi. Untuk mengetahui informasi selengkapnya, baca Menyiapkan autentikasi untuk lingkungan pengembangan lokal.

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";
    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();

      GenerativeModel model = new GenerativeModel(modelName, generationConfig, vertexAI);

      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()
      );

      GenerateContentResponse response = model.generateContent(
          textPrompt,
          safetySettings
      );
      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

Sebelum mencoba contoh ini, ikuti petunjuk penyiapan Go di Panduan memulai Vertex AI menggunakan library klien. Untuk mengetahui informasi selengkapnya, lihat Dokumentasi referensi API Go Vertex AI.

Untuk melakukan autentikasi ke Vertex AI, siapkan Kredensial Default Aplikasi. Untuk mengetahui informasi selengkapnya, baca Menyiapkan autentikasi untuk lingkungan pengembangan lokal.

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

	"cloud.google.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"
	// 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#

Sebelum mencoba contoh ini, ikuti petunjuk penyiapan C# di Panduan memulai Vertex AI menggunakan library klien. Untuk mengetahui informasi selengkapnya, lihat Dokumentasi referensi API C# Vertex AI.

Untuk melakukan autentikasi ke Vertex AI, siapkan Kredensial Default Aplikasi. Untuk mengetahui informasi selengkapnya, baca Menyiapkan autentikasi untuk lingkungan pengembangan lokal.


using Google.Api.Gax.Grpc;
using Google.Cloud.AIPlatform.V1;
using System.Collections.Generic;
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"
    )
    {
        // Create client
        var predictionServiceClient = new PredictionServiceClientBuilder
        {
            Endpoint = $"{location}-aiplatform.googleapis.com"
        }.Build();

        // Prompt
        string prompt = "Hello!";

        // Initialize request argument(s)
        var content = new Content
        {
            Role = "USER"
        };
        content.Parts.AddRange(new List<Part>()
        {
            new()
            {
                Text = prompt
            }
        });

        var safetySettings = new List<SafetySetting>()
        {
            new()
            {
                Category = HarmCategory.HateSpeech,
                Threshold = HarmBlockThreshold.BlockLowAndAbove
            },
            new()
            {
                Category = HarmCategory.DangerousContent,
                Threshold = HarmBlockThreshold.BlockMediumAndAbove
            }
        };

        var generateContentRequest = new GenerateContentRequest
        {
            Model = $"projects/{projectId}/locations/{location}/publishers/{publisher}/models/{model}",
            GenerationConfig = new GenerationConfig
            {
                Temperature = 0.4f,
                TopP = 1,
                TopK = 32,
                MaxOutputTokens = 2048
            },
        };
        generateContentRequest.Contents.Add(content);
        generateContentRequest.SafetySettings.AddRange(safetySettings);

        // Make the request, returning a streaming response
        using PredictionServiceClient.StreamGenerateContentStream response = predictionServiceClient.StreamGenerateContent(generateContentRequest);

        StringBuilder fullText = new();

        // Read streaming responses from server until complete
        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

Sebelum menggunakan salah satu data permintaan, lakukan penggantian berikut:

  • LOCATION: Region untuk memproses permintaan. Opsi yang tersedia mencakup hal berikut:

    Klik untuk meluaskan wilayah yang tersedia

    • us-central1
    • us-west4
    • northamerica-northeast1
    • us-east4
    • us-west1
    • asia-northeast3
    • asia-southeast1
    • asia-northeast1
  • PROJECT_ID: Project ID Anda.
  • MODEL_ID: ID model dari model multimodal yang ingin Anda gunakan. Opsinya adalah:
    • gemini-1.0-pro
    • gemini-1.0-pro-vision
  • ROLE: Peran dalam percakapan yang terkait dengan konten. Penentuan peran diperlukan bahkan dalam kasus penggunaan satu giliran. Nilai yang dapat diterima mencakup:
    • USER: Menentukan konten yang Anda kirimkan.
    • MODEL: Menentukan respons model.
  • TEXT: Teks petunjuk yang akan disertakan dalam perintah.
  • SAFETY_CATEGORY: Kategori keamanan yang batasnya akan dikonfigurasi. Nilai yang dapat diterima mencakup:

    Klik untuk memperluas kategori keamanan

    • HARM_CATEGORY_SEXUALLY_EXPLICIT
    • HARM_CATEGORY_HATE_SPEECH
    • HARM_CATEGORY_HARASSMENT
    • HARM_CATEGORY_DANGEROUS_CONTENT
  • THRESHOLD: Nilai minimum untuk respons pemblokiran yang dapat termasuk dalam kategori keamanan yang ditentukan berdasarkan probabilitas. Nilai yang dapat diterima mencakup:

    Klik untuk memperluas nilai minimum pemblokiran

    • BLOCK_NONE
    • BLOCK_ONLY_HIGH
    • BLOCK_MEDIUM_AND_ABOVE (default)
    • BLOCK_LOW_AND_ABOVE
    BLOCK_LOW_AND_ABOVE memblokir paling banyak, sedangkan BLOCK_ONLY_HIGH memblokir paling sedikit.

Metode HTTP dan URL:

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

Isi JSON permintaan:

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

Untuk mengirim permintaan Anda, pilih salah satu opsi berikut:

curl

Simpan isi permintaan dalam file bernama request.json, dan jalankan perintah berikut:

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

PowerShell

Simpan isi permintaan dalam file bernama request.json, dan jalankan perintah berikut:

$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 "https://LOCATION-aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/publishers/google/models/MODEL_ID:streamGenerateContent" | Select-Object -Expand Content

Anda akan melihat respons JSON yang mirip seperti berikut:

Contoh perintah 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" \
https://${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"
    }
  ]
}'

Konsol

  1. Di bagian Vertex AI pada Konsol Google Cloud, buka halaman Vertex AI Studio.

    Buka Vertex AI Studio

  2. Di bagian Create a new prompt, klik salah satu tombol untuk membuka halaman desain prompt.

  3. Klik Setelan keamanan.

    Jendela dialog Safety settings akan terbuka.

  4. Untuk setiap atribut keamanan, konfigurasikan nilai minimum yang diinginkan.

  5. Klik Save.

Langkah selanjutnya