안전 및 콘텐츠 필터

Gemini 1.5 Flash 및 Gemini 1.5 Pro와 같은 Google의 생성형 AI 모델은 안전을 우선시하도록 설계되었습니다. 하지만 특히 명시적으로 프롬프트가 표시되는 경우 유해한 대답을 생성할 수 있습니다. 안전을 강화하고 오용을 최소화하려면 콘텐츠 필터를 구성하여 잠재적으로 유해한 응답을 차단할 수 있습니다.

이 페이지에서는 각 안전 및 콘텐츠 필터 유형을 설명하고 주요 안전 개념을 간략하게 설명합니다. 구성 가능한 콘텐츠 필터의 경우 프롬프트와 응답이 차단되는 빈도를 제어하기 위해 각 유해 카테고리의 차단 기준을 구성하는 방법을 보여줍니다.

안전 및 콘텐츠 필터는 유해한 출력을 방지하는 장벽 역할을 하지만 모델의 동작에 직접적인 영향을 미치지는 않습니다. 모델 조종성에 관한 자세한 내용은 안전을 위한 시스템 안내를 참고하세요.

안전하지 않은 프롬프트

Vertex AI Gemini API는 프롬프트가 거부된 이유를 설명하는 다음 enum 코드 중 하나를 제공합니다.

Enum 필터 유형 설명
PROHIBITED_CONTENT 구성 불가능한 안전 필터 금지된 콘텐츠(일반적으로 아동 성적 학대 콘텐츠)가 포함되어 신고되었으므로 프롬프트가 차단되었습니다.
BLOCKED_REASON_UNSPECIFIED 해당 사항 없음 메시지 차단 이유가 지정되지 않았습니다.
OTHER 해당 사항 없음 이 enum은 프롬프트를 차단하는 다른 모든 이유를 나타냅니다. Vertex AI Gemini API는 일부 언어만 지원합니다. 지원되는 언어 목록은 Gemini 언어 지원을 참고하세요.

자세한 내용은 BlockedReason을 참고하세요.

다음은 PROHIBITED_CONTENT가 포함되어 프롬프트가 차단된 경우의 Vertex AI Gemini API 출력 예입니다.

{
  "promptFeedback": {
    "blockReason": "PROHIBITED_CONTENT"
  },
  "usageMetadata": {
    "promptTokenCount": 7,
    "totalTokenCount": 7
  }
}

안전하지 않은 응답

다음 필터를 사용하면 잠재적으로 안전하지 않은 응답을 감지하고 차단할 수 있습니다.

  • 아동 성적 학대 콘텐츠(CSAM) 및 개인 식별 정보 (PII)를 차단하는 구성 불가능한 안전 필터
  • 유해 카테고리 목록과 사용자가 구성한 차단 기준을 기반으로 안전하지 않은 콘텐츠를 차단하는 구성 가능한 콘텐츠 필터 사용 사례와 비즈니스에 적합한 기준에 따라 이러한 각 유형의 유해에 대한 차단 기준을 구성할 수 있습니다. 자세한 내용은 구성 가능한 콘텐츠 필터를 참고하세요.
  • 출처 자료의 인용을 제공하는 인용 필터 자세한 내용은 인용 필터를 참고하세요.

LLM은 토큰이라는 텍스트 단위로 응답을 생성합니다. 모델이 자연스러운 중지 지점에 도달하거나 필터 중 하나가 응답을 차단하여 토큰 생성을 중지합니다. Vertex AI Gemini API는 토큰 생성이 중지된 이유를 설명하는 다음 enum 코드 중 하나를 제공합니다.

Enum 필터 유형 설명
STOP 해당 사항 없음 이 enum은 모델이 자연 중단 지점 또는 제공된 중지 시퀀스에 도달했음을 나타냅니다.
MAX_TOKENS 해당 사항 없음 모델이 요청에 지정된 최대 토큰 수에 도달하여 토큰 생성이 중지되었습니다.
SAFETY 구성 가능한 콘텐츠 필터 응답이 유해 콘텐츠로 신고되어 토큰 생성이 중지되었습니다.
RECITATION 인용 필터 인용 가능성이 있어 토큰 생성이 중지되었습니다.
SPII 구성 불가능한 안전 필터 민감한 개인 식별 정보 (SPII) 콘텐츠로 인해 응답이 신고되어 토큰 생성이 중지되었습니다.
PROHIBITED_CONTENT 구성 불가능한 안전 필터 응답에 금지된 콘텐츠(일반적으로 아동 성적 학대 콘텐츠)가 포함되어 신고되어 토큰 생성이 중지되었습니다.
FINISH_REASON_UNSPECIFIED 해당 사항 없음 종료 이유가 지정되지 않았습니다.
OTHER 해당 사항 없음 이 enum은 토큰 생성을 중지하는 다른 모든 이유를 나타냅니다. 일부 언어에서는 토큰 생성이 지원되지 않습니다. 지원되는 언어 목록은 Gemini 언어 지원을 참고하세요.

자세한 내용은 FinishReason을 참고하세요.

필터가 응답을 차단하면 응답의 Candidate.content 필드가 무효화됩니다. 모델에 피드백을 제공하지 않습니다.

구성 가능한 콘텐츠 필터

콘텐츠 필터는 유해 목록을 기준으로 콘텐츠를 평가합니다. 콘텐츠 필터는 각 유해 카테고리에 대해 콘텐츠가 유해할 확률에 따라 한 점수를, 유해 콘텐츠의 심각도에 따라 다른 점수를 할당합니다.

구성 가능한 콘텐츠 필터에는 모델 버전과 별도의 버전 관리가 없습니다. Google은 이전에 출시된 모델 버전의 구성 가능한 콘텐츠 필터를 업데이트하지 않습니다. 하지만 향후 버전의 모델에 맞게 구성 가능한 콘텐츠 필터를 업데이트할 수 있습니다.

피해 카테고리

콘텐츠 필터는 다음과 같은 유해 카테고리를 기준으로 콘텐츠를 평가합니다.

유해 카테고리 정의
증오심 표현 ID 또는 보호 속성을 대상으로 하는 부정적이거나 유해한 댓글
괴롭힘 다른 사람을 대상으로 위협하거나 괴롭히거나 모욕하는 댓글
선정적 성행위 또는 기타 외설적인 콘텐츠에 대한 참조가 포함
위험한 콘텐츠 유해한 상품, 서비스, 활동 홍보 및 이에 대한 액세스 지원

가능성 점수와 심각도 점수 비교

가능성 안전 점수는 모델 대답이 해당 피해와 관련이 있을 가능성을 반영합니다. 0.01.0 사이의 신뢰도 점수가 있으며 소수점 1자리까지 반올림됩니다. 신뢰도 점수는 NEGLIGIBLE, LOW, MEDIUM, HIGH의 4가지 신뢰도 수준으로 분류됩니다.

심각도 점수는 모델 응답이 얼마나 유해할 수 있는지 그 정도를 반영합니다. 0.0~1.0 사이의 심각도 점수(소수점 이하 1자리로 반올림)가 연결되어 있습니다. 심각도 점수는 NEGLIGIBLE, LOW, MEDIUM, HIGH의 4가지 수준으로 분류됩니다.

콘텐츠의 가능성 점수는 낮고 심각도 점수는 높을 수 있고, 가능성 점수는 높고 심각도 점수는 낮을 수도 있습니다.

콘텐츠 필터를 구성하는 방법

Vertex AI Gemini API 또는 Google Cloud 콘솔을 사용하여 콘텐츠 필터를 구성할 수 있습니다.

Vertex AI Gemini API

Vertex AI Gemini API는 두 가지 '유해 차단' 메서드를 제공합니다.

  • SEVERITY: 이 방법은 확률 점수와 심각도 점수를 모두 사용합니다.
  • PROBABILITY: 이 메서드는 확률 점수만 사용합니다.

기본 메서드는 SEVERITY입니다. gemini-1.5-flashgemini-1.5-pro보다 오래된 모델의 경우 기본 메서드는 PROBABILITY입니다. 자세한 내용은 HarmBlockMethod API 참조를 확인하세요.

Vertex AI Gemini API는 다음과 같은 '유해 차단' 기준을 제공합니다.

  • BLOCK_LOW_AND_ABOVE: 확률 점수 또는 심각도 점수가 LOW, MEDIUM 또는 HIGH인 경우 차단합니다.
  • BLOCK_MEDIUM_AND_ABOVE: 확률 점수 또는 심각도 점수가 MEDIUM 또는 HIGH인 경우 차단합니다. gemini-1.5-flash-001gemini-1.5-pro-001의 경우 BLOCK_MEDIUM_AND_ABOVE가 기본값입니다.
  • BLOCK_ONLY_HIGH: 확률 점수 또는 심각도 점수가 HIGH인 경우 차단합니다.
  • HARM_BLOCK_THRESHOLD_UNSPECIFIED: 기본 기준점을 사용하여 차단합니다.
  • OFF: 자동 응답 차단이 없으며 메타데이터가 반환되지 않습니다. gemini-1.5-flash-002gemini-1.5-pro-002의 기본값은 OFF입니다.
  • BLOCK_NONE: BLOCK_NONE 설정은 자동 응답 차단을 삭제합니다. 대신 반환된 점수로 자체 콘텐츠 가이드라인을 구성할 수 있습니다. 이 필드는 GA 모델 버전의 일부 사용자에게만 제공되는 제한된 필드입니다.

예를 들어 다음 Python 코드는 위험한 콘텐츠 카테고리의 유해 차단 기준점을 BLOCK_ONLY_HIGH로 설정하는 방법을 보여줍니다.

generative_models.SafetySetting(
  category=generative_models.HarmCategory.HARM_CATEGORY_DANGEROUS_CONTENT,
  threshold=generative_models.HarmBlockThreshold.BLOCK_ONLY_HIGH,
),

이렇게 하면 위험한 콘텐츠로 분류된 대부분의 콘텐츠가 차단됩니다. 자세한 내용은 HarmBlockThreshold API 참조를 참고하세요.

Python, Node.js, Java, Go, C#, REST의 엔드 투 엔드 예시는 콘텐츠 필터 구성 예시를 참고하세요.

Google Cloud 콘솔

Google Cloud 콘솔을 사용하면 각 콘텐츠 속성의 임곗값을 구성할 수 있습니다. 콘텐츠 필터는 확률 점수만 사용합니다. 심각도 점수를 사용할 수 있는 옵션이 없습니다.

Google Cloud 콘솔은 다음과 같은 임곗값을 제공합니다.

  • 사용 안함 (기본값): 자동 응답 차단이 적용되지 않습니다.
  • 소수 차단: 확률 점수가 HIGH인 경우 차단합니다.
  • 일부 차단: 확률 점수가 MEDIUM 또는 HIGH인 경우 차단합니다.
  • 대부분 차단: 확률 점수가 LOW, MEDIUM 또는 HIGH인 경우 차단합니다.

예를 들어 위험한 콘텐츠 카테고리에 대해 차단 설정을 소수 차단으로 설정하면 위험한 콘텐츠일 가능성이 높은 모든 항목이 차단됩니다. 가능성이 낮은 모든 항목이 허용됩니다. 기본 임곗값은 Block some입니다.

임곗값을 설정하려면 다음 단계를 참고하세요.

  1. Google Cloud 콘솔의 Vertex AI 섹션에서 Vertex AI 스튜디오 페이지로 이동합니다.

    Vertex AI Studio로 이동

  2. 새 프롬프트 만들기에서 버튼 중 하나를 클릭하여 프롬프트 디자인 페이지를 엽니다.

  3. 안전 설정을 클릭합니다.

    안전 설정 대화상자 창이 열립니다.

  4. 각 유해 카테고리에 대해 원하는 기준값을 구성합니다.

  5. 저장을 클릭합니다.

구성 가능한 콘텐츠 필터에 의해 응답이 차단된 경우의 출력 예

다음은 위험한 콘텐츠가 포함되어 구성 가능한 콘텐츠 필터에 의해 응답이 차단된 경우의 Vertex AI Gemini API 출력 예입니다.

{
  "candidates": [{
    "finishReason": "SAFETY",
    "safetyRatings": [{
      "category": "HARM_CATEGORY_HATE_SPEECH",
      "probability": "NEGLIGIBLE",
      "probabilityScore": 0.11027937,
      "severity": "HARM_SEVERITY_LOW",
      "severityScore": 0.28487435
    }, {
      "category": "HARM_CATEGORY_DANGEROUS_CONTENT",
      "probability": "HIGH",
      "blocked": true,
      "probabilityScore": 0.95422274,
      "severity": "HARM_SEVERITY_MEDIUM",
      "severityScore": 0.43398145
    }, {
      "category": "HARM_CATEGORY_HARASSMENT",
      "probability": "NEGLIGIBLE",
      "probabilityScore": 0.11085559,
      "severity": "HARM_SEVERITY_NEGLIGIBLE",
      "severityScore": 0.19027223
    }, {
      "category": "HARM_CATEGORY_SEXUALLY_EXPLICIT",
      "probability": "NEGLIGIBLE",
      "probabilityScore": 0.22901751,
      "severity": "HARM_SEVERITY_NEGLIGIBLE",
      "severityScore": 0.09089675
    }]
  }],
  "usageMetadata": {
    "promptTokenCount": 38,
    "totalTokenCount": 38
  }
}

콘텐츠 필터 구성의 예

다음 예에서는 Vertex AI Gemini API를 사용하여 콘텐츠 필터를 구성하는 방법을 보여줍니다.

Gen AI SDK for Python

Gen AI SDK for Python를 설치하거나 업데이트하는 방법을 알아보세요.

자세한 내용은 SDK 참조 문서를 참고하세요.

Vertex AI에서 Gen AI SDK를 사용하도록 환경 변수를 설정합니다.

# Replace the `GOOGLE_CLOUD_PROJECT` and `GOOGLE_CLOUD_LOCATION` values
# with appropriate values for your project.
export GOOGLE_CLOUD_PROJECT=GOOGLE_CLOUD_PROJECT
export GOOGLE_CLOUD_LOCATION=us-central1
export GOOGLE_GENAI_USE_VERTEXAI=True

from google import genai
from google.genai.types import (
    GenerateContentConfig,
    HarmCategory,
    HarmBlockThreshold,
    HttpOptions,
    SafetySetting,
)

client = genai.Client(http_options=HttpOptions(api_version="v1"))

system_instruction = "Be as mean as possible."

prompt = """
    Write a list of 5 disrespectful things that I might say to the universe after stubbing my toe in the dark.
"""

safety_settings = [
    SafetySetting(
        category=HarmCategory.HARM_CATEGORY_DANGEROUS_CONTENT,
        threshold=HarmBlockThreshold.BLOCK_LOW_AND_ABOVE,
    ),
    SafetySetting(
        category=HarmCategory.HARM_CATEGORY_HARASSMENT,
        threshold=HarmBlockThreshold.BLOCK_LOW_AND_ABOVE,
    ),
    SafetySetting(
        category=HarmCategory.HARM_CATEGORY_HATE_SPEECH,
        threshold=HarmBlockThreshold.BLOCK_LOW_AND_ABOVE,
    ),
    SafetySetting(
        category=HarmCategory.HARM_CATEGORY_SEXUALLY_EXPLICIT,
        threshold=HarmBlockThreshold.BLOCK_LOW_AND_ABOVE,
    ),
]

response = client.models.generate_content(
    model="gemini-2.0-flash-001",
    contents=prompt,
    config=GenerateContentConfig(
        system_instruction=system_instruction,
        safety_settings=safety_settings,
    ),
)

# Response will be `None` if it is blocked.
print(response.text)
# Finish Reason will be `SAFETY` if it is blocked.
print(response.candidates[0].finish_reason)
# Safety Ratings show the levels for each filter.
for safety_rating in response.candidates[0].safety_ratings:
    print(safety_rating)

# Example response:
# None
# FinishReason.SAFETY
# blocked=None category=<HarmCategory.HARM_CATEGORY_HATE_SPEECH: 'HARM_CATEGORY_HATE_SPEECH'> probability=<HarmProbability.NEGLIGIBLE: 'NEGLIGIBLE'> probability_score=1.767152e-05 severity=<HarmSeverity.HARM_SEVERITY_NEGLIGIBLE: 'HARM_SEVERITY_NEGLIGIBLE'> severity_score=None
# blocked=None category=<HarmCategory.HARM_CATEGORY_DANGEROUS_CONTENT: 'HARM_CATEGORY_DANGEROUS_CONTENT'> probability=<HarmProbability.NEGLIGIBLE: 'NEGLIGIBLE'> probability_score=2.399503e-06 severity=<HarmSeverity.HARM_SEVERITY_NEGLIGIBLE: 'HARM_SEVERITY_NEGLIGIBLE'> severity_score=0.061250776
# blocked=True category=<HarmCategory.HARM_CATEGORY_HARASSMENT: 'HARM_CATEGORY_HARASSMENT'> probability=<HarmProbability.MEDIUM: 'MEDIUM'> probability_score=0.64129734 severity=<HarmSeverity.HARM_SEVERITY_MEDIUM: 'HARM_SEVERITY_MEDIUM'> severity_score=0.2686556
# blocked=None category=<HarmCategory.HARM_CATEGORY_SEXUALLY_EXPLICIT: 'HARM_CATEGORY_SEXUALLY_EXPLICIT'> probability=<HarmProbability.NEGLIGIBLE: 'NEGLIGIBLE'> probability_score=5.2786977e-06 severity=<HarmSeverity.HARM_SEVERITY_NEGLIGIBLE: 'HARM_SEVERITY_NEGLIGIBLE'> severity_score=0.043162167

Python용 Vertex AI SDK

Python용 Vertex AI SDK를 설치하거나 업데이트하는 방법은 Python용 Vertex AI SDK 설치를 참조하세요. 자세한 내용은 Python용 Vertex AI SDK API 참조 문서를 확인하세요.

import vertexai

from vertexai.generative_models import (
    GenerativeModel,
    HarmCategory,
    HarmBlockThreshold,
    Part,
    SafetySetting,
)

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

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

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

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

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

print(response.text)
print(response.candidates[0].safety_ratings)
# Example response:
# The image contains a beautiful arrangement of blueberry scones, flowers, coffee, and blueberries.
# The scene is set on a rustic blue background. The image evokes a sense of comfort and indulgence.
# ...

Go

이 샘플을 사용해 보기 전에 Vertex AI 빠른 시작: 클라이언트 라이브러리 사용Go 설정 안내를 따르세요. 자세한 내용은 Vertex AI Go API 참고 문서를 참조하세요.

Vertex AI에 인증하려면 애플리케이션 기본 사용자 인증 정보를 설정합니다. 자세한 내용은 로컬 개발 환경의 인증 설정을 참조하세요.

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

	"cloud.google.com/go/vertexai/genai"
)

// generateMultimodalContent generates a response into w, based upon the  provided image.
func generateMultimodalContent(w io.Writer, projectID, location, modelName string) error {
	// location := "us-central1"
	// model := "gemini-1.5-flash-001"
	ctx := context.Background()

	client, err := genai.NewClient(ctx, projectID, location)
	if err != nil {
		return fmt.Errorf("unable to create client: %w", 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("320px-Felis_catus-cat_on_snow.jpg")),
		FileURI:  "gs://cloud-samples-data/generative-ai/image/320px-Felis_catus-cat_on_snow.jpg",
	}

	res, err := model.GenerateContent(ctx, img, genai.Text("describe this image."))
	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
}

Node.js

이 샘플을 사용해 보기 전에 Vertex AI 빠른 시작: 클라이언트 라이브러리 사용Node.js 설정 안내를 따르세요. 자세한 내용은 Vertex AI Node.js API 참고 문서를 참조하세요.

Vertex AI에 인증하려면 애플리케이션 기본 사용자 인증 정보를 설정합니다. 자세한 내용은 로컬 개발 환경의 인증 설정을 참조하세요.

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

/**
 * TODO(developer): Update these variables before running the sample.
 */
const PROJECT_ID = process.env.CAIP_PROJECT_ID;
const LOCATION = 'us-central1';
const MODEL = 'gemini-1.5-flash-001';

async function setSafetySettings() {
  // Initialize Vertex with your Cloud project and location
  const vertexAI = new VertexAI({project: PROJECT_ID, 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
    safetySettings: [
      {
        category: HarmCategory.HARM_CATEGORY_DANGEROUS_CONTENT,
        threshold: HarmBlockThreshold.BLOCK_LOW_AND_ABOVE,
      },
      {
        category: HarmCategory.HARM_CATEGORY_HARASSMENT,
        threshold: HarmBlockThreshold.BLOCK_LOW_AND_ABOVE,
      },
    ],
  });

  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

이 샘플을 사용해 보기 전에 Vertex AI 빠른 시작: 클라이언트 라이브러리 사용Java 설정 안내를 따르세요. 자세한 내용은 Vertex AI Java API 참고 문서를 참조하세요.

Vertex AI에 인증하려면 애플리케이션 기본 사용자 인증 정보를 설정합니다. 자세한 내용은 로컬 개발 환경의 인증 설정을 참조하세요.

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.5-flash-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)
              .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_LOW_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();
    }
  }
}

C#

이 샘플을 사용해 보기 전에 Vertex AI 빠른 시작: 클라이언트 라이브러리 사용C# 설정 안내를 따르세요. 자세한 내용은 Vertex AI C# API 참고 문서를 참조하세요.

Vertex AI에 인증하려면 애플리케이션 기본 사용자 인증 정보를 설정합니다. 자세한 내용은 로컬 개발 환경의 인증 설정을 참조하세요.


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.5-flash-001"
    )
    {
        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

환경을 설정하면 REST를 사용하여 텍스트 프롬프트를 테스트할 수 있습니다. 다음 샘플은 요청을 게시자 모델 엔드포인트에 전송합니다.

요청 데이터를 사용하기 전에 다음을 바꿉니다.

  • LOCATION: 요청을 처리하는 리전입니다. 사용 가능한 옵션은 다음과 같습니다.

    클릭하여 사용 가능한 리전의 일부 목록 펼치기

    • us-central1
    • us-west4
    • northamerica-northeast1
    • us-east4
    • us-west1
    • asia-northeast3
    • asia-southeast1
    • asia-northeast1
  • PROJECT_ID: 프로젝트 ID
  • MODEL_ID: 사용할 멀티모달 모델의 모델 ID입니다. 옵션은 다음과 같습니다.
    • gemini-1.0-pro
    • gemini-1.0-pro-vision
  • ROLE: 콘텐츠와 연결된 대화의 역할입니다. 싱글턴 사용 사례에서도 역할을 지정해야 합니다. 허용되는 값은 다음과 같습니다.
    • USER: 전송한 콘텐츠를 지정합니다.
    • MODEL: 모델의 응답을 지정합니다.
  • TEXT: 프롬프트에 포함할 텍스트 안내입니다.
  • SAFETY_CATEGORY: 기준점을 구성할 안전 카테고리입니다. 허용되는 값은 다음과 같습니다.

    클릭하여 안전 카테고리 펼치기

    • HARM_CATEGORY_SEXUALLY_EXPLICIT
    • HARM_CATEGORY_HATE_SPEECH
    • HARM_CATEGORY_HARASSMENT
    • HARM_CATEGORY_DANGEROUS_CONTENT
  • THRESHOLD: 확률에 따라 지정된 안전 카테고리에 속할 수 있는 응답 차단의 기준점입니다. 허용되는 값은 다음과 같습니다.

    클릭하여 차단 기준점 펼치기

    • BLOCK_NONE
    • BLOCK_ONLY_HIGH
    • BLOCK_MEDIUM_AND_ABOVE(기본)
    • BLOCK_LOW_AND_ABOVE
    BLOCK_LOW_AND_ABOVE는 가장 많이 차단하며 BLOCK_ONLY_HIGH는 가장 적게 차단합니다.

HTTP 메서드 및 URL:

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

JSON 요청 본문:

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

요청을 보내려면 다음 옵션 중 하나를 선택합니다.

curl

요청 본문을 request.json 파일에 저장하고 다음 명령어를 실행합니다.

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

요청 본문을 request.json 파일에 저장하고 다음 명령어를 실행합니다.

$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

다음과 비슷한 JSON 응답이 수신됩니다.

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": "OFF"
    },
    {
      "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"
    }
  ]
}'

인용 필터

Vertex AI의 생성형 코드 기능은 오리지널 콘텐츠를 만들기 위한 것입니다. Gemini는 설계상 기존 콘텐츠가 길게 복제될 가능성을 제한합니다. Gemini 기능이 웹페이지에서 상당 부분을 인용하는 경우 해당 페이지를 인용으로 표시합니다.

동일한 콘텐츠가 여러 웹페이지에서 발견될 수 있습니다. Gemini는 인기 있는 출처를 표시하려고 시도합니다. 코드 저장소에 대한 인용의 경우 관련 오픈소스 라이선스를 언급할 수도 있습니다. 라이선스 요구사항 준수는 사용자 책임입니다.

인용 필터의 메타데이터에 대해 알아보려면 인용 API 참조를 참조하세요.

시민 윤리의식 필터

시민의식 필터는 정치 선거 및 후보자를 언급하거나 관련된 프롬프트를 감지하고 차단합니다. 이 필터는 기본적으로 사용 중지되어 있습니다. 사용 설정하려면 CIVIC_INTEGRITY의 차단 기준점을 다음 값 중 하나로 설정하세요. 지정하는 값은 중요하지 않습니다.

  • BLOCK_LOW_AND_ABOVE
  • BLOCK_MEDIUM_AND_ABOVE
  • BLOCK_ONLY_HIGH

다음 Python 코드는 시민적 무결성 필터를 사용 설정하는 방법을 보여줍니다.

  generative_models.SafetySetting(
      category=generative_models.HarmCategory.CIVIC_INTEGRITY,
      threshold=generative_models.HarmBlockThreshold.BLOCK_LOW_AND_ABOVE,
  ),

시민적 무결성 필터에 대한 자세한 내용은 Google Cloud 담당자에게 문의하세요.

권장사항

콘텐츠 필터는 안전하지 않은 콘텐츠를 차단하는 데 도움이 되지만, 가끔은 무해한 콘텐츠를 차단하거나 유해한 콘텐츠를 놓칠 수 있습니다. Gemini 1.5 Flash 및 Gemini 1.5 Pro와 같은 고급 모델은 필터 없이도 안전한 대답을 생성하도록 설계되었습니다. 다양한 필터 설정을 테스트하여 안전성과 적절한 콘텐츠 허용 간의 적절한 균형을 찾아보세요.

다음 단계