이 페이지에서는 프롬프트와 응답을 정리하는 방법을 자세히 설명합니다. Model Armor는 AI 애플리케이션을 보호하기 위한 필터를 제공합니다. Model Armor는 구성된 검사 신뢰도 수준에 따라 프롬프트와 대답을 확인합니다.
시작하기 전에
템플릿 만들기의 안내에 따라 템플릿을 만듭니다.
필수 권한 얻기
프롬프트와 대답을 삭제하는 데 필요한 권한을 얻으려면 관리자에게 Model Armor에 대한 다음 IAM 역할을 부여해 달라고 요청하세요.
- Model Armor 사용자 (
roles/modelarmor.user) - Model Armor 뷰어 (
roles/modelarmor.viewer)
역할 부여에 대한 자세한 내용은 프로젝트, 폴더, 조직에 대한 액세스 관리를 참조하세요.
커스텀 역할이나 다른 사전 정의된 역할을 통해 필요한 권한을 얻을 수도 있습니다.
Sensitive Data Protection 템플릿이 포함된 프로젝트에서 템플릿 만들기의 고급 Sensitive Data Protection 단계의 일부로 생성된 서비스 에이전트에 DLP 사용자 역할 (roles/dlp.user) 및 DLP 리더 역할 (roles/dlp.reader)을 부여합니다.
Sensitive Data Protection 템플릿이 Model Armor 템플릿과 동일한 프로젝트에 있는 경우 이 단계를 건너뛰세요.
gcloud projects add-iam-policy-binding SDP_PROJECT_ID \ --member=serviceAccount:service-PROJECT_NUMBER@gcp-sa-modelarmor.iam.gserviceaccount.com --role=roles/dlp.user gcloud projects add-iam-policy-binding SDP_PROJECT_ID \ --member=serviceAccount:service-PROJECT_NUMBER@gcp-sa-modelarmor.iam.gserviceaccount.com --role=roles/dlp.reader
다음을 바꿉니다.
SDP_PROJECT_ID: 고급 Sensitive Data Protection 템플릿이 속한 프로젝트의 IDPROJECT_NUMBER: 템플릿이 속한 프로젝트의 번호입니다.
API 사용 설정
Model Armor를 사용하려면 먼저 Model Armor API를 사용 설정해야 합니다.
콘솔
Model Armor API를 사용 설정합니다.
API 사용 설정에 필요한 역할
API를 사용 설정하려면
serviceusage.services.enable권한이 포함된 서비스 사용량 관리자 IAM 역할(roles/serviceusage.serviceUsageAdmin)이 필요합니다. 역할 부여 방법 알아보기Model Armor를 활성화할 프로젝트를 선택합니다.
gcloud
시작하기 전에 Model Armor API와 함께 Google Cloud CLI를 사용하여 다음 단계를 따르세요.
Google Cloud 콘솔에서 Cloud Shell을 활성화합니다.
Google Cloud 콘솔 하단에 Cloud Shell 세션이 시작되고 명령줄 프롬프트가 표시됩니다. Cloud Shell은 Google Cloud CLI가 사전 설치된 셸 환경으로, 현재 프로젝트의 값이 이미 설정되어 있습니다. 세션이 초기화되는 데 몇 초 정도 걸릴 수 있습니다.
gcloud CLI를 사용하여 API 엔드포인트 재정의 설정
이 단계는 gcloud CLI를 사용하여 Model Armor API를 사용 설정하는 경우에만 필요합니다. gcloud CLI가 Model Armor 서비스로 요청을 올바르게 라우팅하도록 API 엔드포인트 재정의를 수동으로 설정해야 합니다.
다음 명령어를 실행하여 Model Armor 서비스의 API 엔드포인트를 설정합니다.
gcloud config set api_endpoint_overrides/modelarmor "https://modelarmor.LOCATION.rep.googleapis.com/"
LOCATION을 Model Armor를 사용하려는 리전으로 바꿉니다.
프롬프트 정리
악성 입력이 방지되고 안전하고 적절한 프롬프트가 LLM에 전송되도록 프롬프트를 정리합니다.
텍스트 프롬프트
Model Armor는 텍스트를 분석하고 다양한 필터를 적용하여 잠재적인 위협을 식별하고 완화함으로써 텍스트 프롬프트를 정리합니다.
REST
다음 명령어를 사용하여 Model Armor에서 텍스트 프롬프트를 정리합니다.
curl -X POST \
-d '{"userPromptData":{"text":"[UNSAFE TEXT]"}}' \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
"https://modelarmor.LOCATION.rep.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/templates/TEMPLATE_ID:sanitizeUserPrompt"
다음을 바꿉니다.
PROJECT_ID: 템플릿의 프로젝트 IDLOCATION: 템플릿의 위치TEMPLATE_ID: 템플릿의 ID
그러면 다음과 같은 응답이 반환됩니다. MATCH_FOUND는 위험 카테고리에 있습니다.
{ "sanitizationResult": { "filterMatchState": "MATCH_FOUND", "invocationResult": "SUCCESS", "filterResults": { "csam": { "csamFilterFilterResult": { "executionState": "EXECUTION_SUCCESS", "matchState": "NO_MATCH_FOUND" } }, "malicious_uris": { "maliciousUriFilterResult": { "executionState": "EXECUTION_SUCCESS", "matchState": "NO_MATCH_FOUND" } }, "rai": { "raiFilterResult": { "executionState": "EXECUTION_SUCCESS", "matchState": "MATCH_FOUND", "raiFilterTypeResults": { "sexually_explicit": { "matchState": "NO_MATCH_FOUND" }, "hate_speech": { "matchState": "NO_MATCH_FOUND" }, "harassment": { "matchState": "NO_MATCH_FOUND" }, "dangerous": { "matchState": "MATCH_FOUND" } } } }, "pi_and_jailbreak": { "piAndJailbreakFilterResult": { "executionState": "EXECUTION_SUCCESS", "matchState": "MATCH_FOUND" } }, "sdp": { "sdpFilterResult": { "inspectResult": { "executionState": "EXECUTION_SUCCESS", "matchState": "NO_MATCH_FOUND" } } } } } }
Go
이 코드를 실행하려면 먼저 Go 개발 환경을 설정하고 Model Armor Go SDK를 설치합니다.
C#
이 코드를 실행하려면 먼저 C# 개발 환경을 설정하고 Model Armor C# SDK를 설치합니다.
자바
이 코드를 실행하려면 먼저 Java 개발 환경을 설정하고 Model Armor Java SDK를 설치합니다.
Node.js
이 코드를 실행하려면 먼저 Node.js 개발 환경을 설정하고 Model Armor Node.js SDK를 설치합니다.
PHP
이 코드를 실행하려면 먼저 PHP 개발 환경을 설정하고 Model Armor PHP SDK를 설치합니다.
Python
이 코드를 실행하려면 Python 개발 환경을 설정하고 Model Armor Python SDK를 설치합니다.
그러면 다음과 같은 응답이 반환됩니다.
sanitization_result { filter_match_state: MATCH_FOUND filter_results { key: "rai" value { rai_filter_result { execution_state: EXECUTION_SUCCESS match_state: MATCH_FOUND rai_filter_type_results { key: "dangerous" value { confidence_level: HIGH match_state: MATCH_FOUND } } } } } filter_results { key: "pi_and_jailbreak" value { pi_and_jailbreak_filter_result { execution_state: EXECUTION_SUCCESS match_state: MATCH_FOUND confidence_level: HIGH } } } filter_results { key: "malicious_uris" value { malicious_uri_filter_result { execution_state: EXECUTION_SUCCESS match_state: NO_MATCH_FOUND } } } filter_results { key: "csam" value { csam_filter_filter_result { execution_state: EXECUTION_SUCCESS match_state: NO_MATCH_FOUND } } } invocation_result: SUCCESS }
대화형 AI에서 프롬프트를 정리하기 위한 권장사항
Model Armor를 사용하여 대화형 AI 애플리케이션에서 입력을 정리할 때는 SanitizeUserPrompt 메서드의 userPromptData 필드에 무엇을 포함해야 하는지 이해하는 것이 중요합니다.
각 사용자 입력을 별도로 정리: 사용자로부터 수신한 각 새 메시지에 대해
SanitizeUserPromptAPI를 호출합니다. 이렇게 하면 모든 사용자 입력이 LLM에 의해 처리되기 전에 잠재적인 위협이 있는지 분석됩니다.userPromptData필드에는 현재 대화에서 사용자의 최신 메시지 콘텐츠만 포함되어야 합니다.대화 기록을 포함하지 마세요: 전체 채팅 기록을
userPromptData필드에 연결하지 마세요.시스템 프롬프트는 포함하지 않음: 시스템 프롬프트는
userPromptData필드에 포함하면 안 됩니다. Model Armor는 사용자 제공 입력에서만 위협을 감지하는 데 중점을 둡니다.
다국어 감지가 사용 설정된 텍스트 프롬프트 정리
개별 요청마다 enableMultiLanguageDetection 플래그를 true로 설정하여 요청별로 다국어 감지를 사용 설정합니다.
원하는 경우 출발어를 지정하여 더 정확한 결과를 얻을 수 있습니다.
- 출발어를 지정하지 않으면 Model Armor에서 다국어 지원을 위해 언어를 자동으로 감지합니다.
- 소스 언어를 지정하면 Model Armor가 해당 언어를 사용하여 텍스트 프롬프트를 평가하고 자동 언어 감지를 실행하지 않습니다.
다음 명령어를 사용하여 요청 수준에서 다국어 감지가 사용 설정된 Model Armor의 텍스트 프롬프트를 정리합니다.
curl -X POST \ -d '{"userPromptData":{"text":"[UNSAFE TEXT]"}, "multiLanguageDetectionMetadata": { "enableMultiLanguageDetection": true , "sourceLanguage": "jp"}}' \ -H "Content-Type: application/json" \ -H "Authorization: Bearer $(gcloud auth print-access-token)" \ "https://modelarmor.LOCATION.rep.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/templates/TEMPLATE_ID:sanitizeUserPrompt"
다음을 바꿉니다.
PROJECT_ID: 템플릿의 프로젝트 IDLOCATION: 템플릿의 위치TEMPLATE_ID: 템플릿의 ID
이미지가 포함된 프롬프트
이미지 검열을 사용 설정하려면 템플릿 메타데이터에서 모달리티를 설정합니다.
신규 및 기존 템플릿 모두에서 모달리티를 구성할 수 있습니다.
단일 모달리티 (IMAGE 또는 TEXT)를 지정하면 Model Armor는 다른 모달리티를 건너뛰고 EXECUTION_SKIPPED를 반환합니다. byteDataType 필드를 IMAGE로 명시적으로 설정하고 byteData 필드에 지원되는 형식의 Base64로 인코딩된 이미지를 제공해야 합니다.
다음 명령어를 사용하여 이미지가 포함된 프롬프트를 정리합니다.
curl -X POST \ -d "$(jq -n \ --arg data "$(base64 -w 0 -i IMAGE)" \ '{userPromptData: {byteItem: {byteDataType: "IMAGE", byteData: $data}}}')" \ -H "Content-Type: application/json" \ -H "Authorization: Bearer $(gcloud auth print-access-token)" \ "https://modelarmor.LOCATION.rep.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/templates/TEMPLATE_ID:sanitizeUserPrompt"
다음을 바꿉니다.
PROJECT_ID: 템플릿이 포함된 프로젝트의 IDLOCATION: 템플릿의 위치TEMPLATE_ID: 템플릿의 IDIMAGE: 지원되는 형식의 이미지입니다.
응답은 다음 예시와 유사합니다.
{ "sanitizationResult": { "filterMatchState": "MATCH_FOUND", "invocationResult": "SUCCESS", "filterResults": { "csam": { "csamFilterFilterResult": { "executionState": "EXECUTION_SUCCESS", "matchState": "NO_MATCH_FOUND" } }, "sdp": { "sdpFilterResult": { "inspectResult": { "executionState": "EXECUTION_SUCCESS", "matchState": "MATCH_FOUND" } } } }, } }
이미지 수정
Sensitive Data Protection 고급 모드의 경우 Sensitive Data Protection 검사 템플릿과 Sensitive Data Protection 익명화 템플릿으로 Model Armor 필터를 구성한 경우에만 Model Armor가 이미지를 수정합니다. 자세한 내용은 Sensitive Data Protection 설정하기를 참고하세요. 익명화 템플릿에서 이미지 수정을 구성해야 합니다.
Sensitive Data Protection 고급 모드를 사용하는 경우 구성된 검사 템플릿에 명시적으로 포함되지 않은 경우에도 BASIC_AUTH_HEADER infoType이 감지 결과에 보고될 수 있습니다.
다음 예시에서는 Sensitive Data Protection 수정이 사용 설정된 필터 구성을 보여줍니다.
{ "filterConfig": { "sdpSettings": { "advancedConfig": { "inspectTemplate": "projects/PROJECT_ID/locations/LOCATION/inspectTemplates/TEMPLATE_ID", "deidentifyTemplate": "projects/PROJECT_ID/locations/LOCATION/deidentifyTemplates/TEMPLATE_ID" } } } }
다음을 바꿉니다.
PROJECT_ID: 템플릿이 포함된 프로젝트의 IDLOCATION: 템플릿의 위치TEMPLATE_ID: 템플릿의 ID
그러면 다음과 같은 응답이 반환됩니다.
{ "sanitizationResult": { "filterMatchState": "MATCH_FOUND", "invocationResult": "SUCCESS", "filterResults": { "csam": { "csamFilterFilterResult": { "executionState": "EXECUTION_SUCCESS", "matchState": "NO_MATCH_FOUND" } }, "sdp": { "sdpFilterResult": { "redactResult": { "executionState": "EXECUTION_SUCCESS", "matchState": "MATCH_FOUND", "redactedImage": "[REDACTED_IMAGE]", "findings": [ { "infoType": "EMAIL_ADDRESS", "likelihood": "LIKELY", "location": { "contentLocations": [ { "imageFindingLocation": { "boundingBox": { "top": 16, "left": 121, "width": 620, "height": 90 } } } ] } } ] } } } } } }
스트리밍 텍스트 프롬프트 정리
Model Armor의 스트리밍 메서드는 전체 콘텐츠가 제공될 때까지 기다리지 않고 텍스트 스트림으로 프롬프트와 대답을 실시간으로 정리합니다. 이 기능은 특히 대규모 텍스트 페이로드를 처리하거나 LLM과의 지연 시간이 짧은 상호작용이 필요한 애플리케이션에 유용합니다.
다음 방법을 사용하여 스트리밍을 사용 설정하세요.
- StreamSanitizeUserPrompt: 사용자가 제공한 텍스트를 스트리밍하고 정리합니다.
- StreamSanitizeModelResponse: LLM에서 생성된 텍스트를 스트리밍하고 정리합니다.
Model Armor는 다음과 같은 스트리밍 모드를 제공합니다.
- 버퍼링 모드: 스트리밍된 모든 청크를 수집하고 단일 단위로 함께 처리합니다.
- 실시간 모드: 수신된 각 청크를 개별적으로 처리하여 지속적인 피드백을 제공합니다.
Model Armor는 실시간 스트리밍 모드를 사용할 때 무제한 토큰을 지원하는 반면, 버퍼링 모드는 토큰 한도가 적용됩니다.
스트리밍은 다음과 같이 작동합니다.
- 청크 입력: 애플리케이션이 전체 텍스트 본문을 한 번에 전송하는 대신 더 작은 조각 (청크)으로 텍스트를 Model Armor에 전송합니다.
- 실시간 처리: Model Armor는 이러한 청크가 도착하면 처리하고 템플릿에 구성된 보안 및 안전 필터를 적용합니다.
- 지속적인 피드백: 모드 (실시간 모드 또는 버퍼링 모드)에 따라 Model Armor는 처리된 청크별로 또는 모든 청크가 수신된 후에 결과를 반환합니다.
다음 명령어를 사용하여 스트리밍 텍스트 프롬프트를 정리합니다.
Go
이 코드를 실행하려면 먼저 Go 개발 환경을 설정하고 Model Armor Go SDK를 설치합니다.
package main
import (
"context"
"fmt"
"io"
"log"
modelarmor "cloud.google.com/go/modelarmor/apiv1beta"
modelarmorpb "cloud.google.com/go/modelarmor/apiv1beta/modelarmorpb"
"google.golang.org/api/option"
"google.golang.org/protobuf/encoding/protojson"
)
func main() {
ctx := context.Background()
// Define variables for project, location, and template ID
projectID := "YOUR_PROJECT_ID"
location := "LOCATION_ID"
templateID := "YOUR_TEMPLATE_ID"
// 1. Create the client with the custom regional endpoint.
opts := option.WithEndpoint("modelarmor.us-central1.rep.googleapis.com:443")
c, err := modelarmor.NewClient(ctx, opts)
if err != nil {
log.Fatalf("failed to create client: %v", err)
}
defer c.Close()
// 2. Start the StreamSanitizeUserPrompt bidirectional stream.
stream, err := c.StreamSanitizeUserPrompt(ctx)
if err != nil {
log.Fatalf("failed to initialize stream: %v", err)
}
// 3. Use a goroutine to send the requests.
go func() {
// Define the user prompt data
userPromptData := &modelarmorpb.DataItem{
DataItem: &modelarmorpb.DataItem_Text{
// Specify the user prompt.
Text: "This is a sample user prompt",
},
}
// Create the request object
req := &modelarmorpb.SanitizeUserPromptRequest{ // Use fmt.Sprintf to construct the resource name
Name: fmt.Sprintf("projects/%s/locations/%s/templates/%s", projectID, location, templateID),
UserPromptData: userPromptData,
}
reqs := []*modelarmorpb.SanitizeUserPromptRequest{req}
for _, r := range reqs {
if err := stream.Send(r); err != nil {
log.Printf("Failed to send request: %v", err)
return
}
}
stream.CloseSend()
}()
// 4. Iterate over the responses from the stream.
for {
resp, err := stream.Recv()
if err == io.EOF {
break
}
if err != nil {
log.Fatalf("failed to receive response: %v", err)
}
// Marshal the proto message to a formatted JSON string
b, _ := protojson.MarshalOptions{
Multiline: true,
Indent: " ",
}.Marshal(resp)
// Results can be consumed or assigned here in production workflows
}
}
C#
이 코드를 실행하려면 먼저 C# 개발 환경을 설정하고 Model Armor C# SDK를 설치합니다.
using Google.Api.Gax.Grpc;
using Google.Cloud.ModelArmor.V1Beta;
using Grpc.Core;
using System;
using System.Collections.Generic;
using System.Threading.Tasks;
public class StreamSanitizeUserPromptExample
{
public static async Task Main(string[] args)
{
try
{
await RunStreamSanitizeUserPromptExample();
}
catch (Exception e)
{
Console.WriteLine($"An error occurred: {e}");
}
}
public static async Task RunStreamSanitizeUserPromptExample()
{
string projectId = "YOUR_PROJECT_ID";
string location = "LOCATION_ID";
string templateId = "YOUR_TEMPLATE_ID";
var promptChunks = new List<string>
{
"This is the first part of the user prompt. ",
"This is the second part. ",
"And this is the final part."
};
// Construct the regional REP endpoint (without port)
string regionalEndpoint = $"modelarmor.{location}.rep.googleapis.com";
Console.WriteLine($"Using endpoint: {regionalEndpoint}");
// Initialize the Model Armor client using Application Default Credentials.
var client = new ModelArmorClientBuilder
{
Endpoint = regionalEndpoint
}.Build();
// Construct the resource name.
var resourceName = TemplateName.FromProjectLocationTemplate(projectId, location, templateId);
// Get the bi-directional streaming call object
using var stream = client.StreamSanitizeUserPrompt();
Console.WriteLine("Sending requests...");
// --- Send First Request ---
var firstRequest = new SanitizeUserPromptRequest
{
Name = resourceName.ToString(),
UserPromptData = new DataItem { Text = promptChunks[0] },
StreamingMode = StreamingMode.Buffered // Or StreamingMode.Realtime
};
await stream.WriteAsync(firstRequest);
Console.WriteLine($"Sent chunk 1: \"{promptChunks[0]}\"");
// --- Send Subsequent Requests ---
for (int i = 1; i < promptChunks.Count; i++)
{
var subsequentRequest = new SanitizeUserPromptRequest
{
Name = resourceName.ToString(),
UserPromptData = new DataItem { Text = promptChunks[i] }
};
await stream.WriteAsync(subsequentRequest);
Console.WriteLine($"Sent chunk {i + 1}: \"{promptChunks[i]}\"");
}
// Signal that the client has finished sending requests.
await stream.WriteCompleteAsync();
Console.WriteLine("Client finished sending.");
// --- Receive Responses ---
Console.WriteLine("Receiving responses...");
// This loop waits for responses until the server closes the stream.
while (await stream.GetResponseStream().MoveNextAsync())
{
SanitizeUserPromptResponse response = stream.GetResponseStream().Current;
if (response.SanitizationResult != null)
{
var result = response.SanitizationResult;
Console.WriteLine("Received response:");
Console.WriteLine($" Match State: {result.FilterMatchState}");
Console.WriteLine($" Invocation Result: {result.InvocationResult}");
}
else
{
Console.WriteLine("Received empty response.");
}
}
Console.WriteLine("Stream finished and closed.");
}
}
자바
이 코드를 실행하려면 먼저 Java 개발 환경을 설정하고 Model Armor Java SDK를 설치합니다.
package com.example.armor;
import com.google.api.gax.rpc.BidiStream;
import com.google.cloud.modelarmor.v1beta.DataItem;
import com.google.cloud.modelarmor.v1beta.ModelArmorClient;
import com.google.cloud.modelarmor.v1beta.ModelArmorSettings;
import com.google.cloud.modelarmor.v1beta.SanitizationResult;
import com.google.cloud.modelarmor.v1beta.SanitizeUserPromptRequest;
import com.google.cloud.modelarmor.v1beta.SanitizeUserPromptResponse;
import com.google.cloud.modelarmor.v1beta.StreamingMode;
import com.google.cloud.modelarmor.v1beta.TemplateName;
import java.io.IOException;
import java.util.Arrays;
import java.util.List;
import java.util.concurrent.ExecutionException;
public class StreamSanitizeUserPrompt {
public static void main(String[] args) {
try {
streamSanitizeUserPromptExample();
} catch (Exception e) {
e.printStackTrace();
}
}
public static void streamSanitizeUserPromptExample()
throws IOException, InterruptedException, ExecutionException {
// Specify the Google Project ID.
String projectId = "YOUR_PROJECT_ID";
// Specify the location ID. For example, us-central1.
String locationId = "LOCATION_ID";
// Specify the template ID.
String templateId = "YOUR_TEMPLATE_ID";
String customApiEndpoint = "modelarmor.us-central1.rep.googleapis.com:443";
List<String> promptChunks = Arrays.asList(
"This is the first part of the user prompt. ",
"This is the second part. ",
"And this is the final part."
);
// ModelArmorSettings is now properly imported and recognized here
try (
ModelArmorClient modelArmorClient = ModelArmorClient.create(
ModelArmorSettings.newBuilder()
.setEndpoint(customApiEndpoint)
.build()
)
) {
BidiStream<SanitizeUserPromptRequest, SanitizeUserPromptResponse> stream =
modelArmorClient.streamSanitizeUserPromptCallable().call();
String resourceName = TemplateName.of(projectId, locationId, templateId).toString();
// --- Send First Request ---
SanitizeUserPromptRequest firstRequest = SanitizeUserPromptRequest.newBuilder()
.setName(resourceName)
.setUserPromptData(DataItem.newBuilder().setText(promptChunks.get(0)))
.setStreamingMode(StreamingMode.STREAMING_MODE_BUFFERED)
.build();
stream.send(firstRequest);
// --- Send Subsequent Requests ---
for (int i = 1; i < promptChunks.size(); i++) {
SanitizeUserPromptRequest subsequentRequest = SanitizeUserPromptRequest.newBuilder()
.setName(resourceName)
.setUserPromptData(DataItem.newBuilder().setText(promptChunks.get(i)))
.build();
stream.send(subsequentRequest);
}
stream.closeSend();
// --- Receive Responses ---
for (SanitizeUserPromptResponse response : stream) {
if (response.hasSanitizationResult()) {
SanitizationResult result = response.getSanitizationResult();
// Results can be consumed or assigned here in production workflows
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
Node.js
이 코드를 실행하려면 먼저 Node.js 개발 환경을 설정하고 Model Armor Node.js SDK를 설치합니다.
const { ModelArmorClient } = require('@google-cloud/modelarmor').v1beta;
async function streamSanitizeUserPromptExample() {
const projectId = 'YOUR_PROJECT_ID';
const location = 'LOCATION_ID';
const templateId = 'YOUR_TEMPLATE_ID';
const promptChunks = [
'This is the first part of the user prompt. ',
'This is the second part. ',
'And this is the final part.'
];
// Construct the regional REP endpoint
const regionalEndpoint = `modelarmor.${location}.rep.googleapis.com`;
console.log(`Using endpoint: ${regionalEndpoint}`);
// Initialize the Model Armor client with options
const modelArmorClient = new ModelArmorClient({
apiEndpoint: regionalEndpoint,
});
const resourceName = `projects/${projectId}/locations/${location}/templates/${templateId}`;
try {
// Obtain the bidirectional stream object
const stream = modelArmorClient.streamSanitizeUserPrompt();
// Setup events for receiving responses
stream.on('data', (response) => {
if (response.sanitizationResult) {
const result = response.sanitizationResult;
console.log('Received response:');
console.log(` Match State: ${result.filterMatchState}`);
console.log(` Invocation Result: ${result.invocationResult}`);
} else {
console.log('Received empty response.');
}
});
stream.on('error', (err) => {
console.error('Stream error occurred:', err);
});
stream.on('end', () => {
console.log('Stream finished and closed.');
});
console.log('Sending requests...');
// --- Send First Request ---
const firstRequest = {
name: resourceName,
userPromptData: {
text: promptChunks[0]
},
streamingMode: 'STREAMING_MODE_BUFFERED' // Or 'STREAMING_MODE_REALTIME'
};
stream.write(firstRequest);
console.log(`Sent chunk 1: "${promptChunks[0]}"`);
// --- Send Subsequent Requests ---
for (let i = 1; i < promptChunks.length; i++) {
const subsequentRequest = {
name: resourceName,
userPromptData: {
text: promptChunks[i]
}
};
stream.write(subsequentRequest);
console.log(`Sent chunk ${i + 1}: "${promptChunks[i]}"`);
}
// Signals gRPC end-of-writing from client
stream.end();
console.log('Client finished sending.');
} catch (e) {
console.error('Error during stream initialization:', e);
}
}
// Execute logic
streamSanitizeUserPromptExample();
```
PHP
이 코드를 실행하려면 먼저 PHP 개발 환경을 설정하고 Model Armor PHP SDK를 설치합니다.
use Google\ApiCore\ApiException;
use Google\ApiCore\BidiStream;
use Google\Cloud\ModelArmor\V1beta\Client\ModelArmorClient;
use Google\Cloud\ModelArmor\V1beta\DataItem;
use Google\Cloud\ModelArmor\V1beta\SanitizeUserPromptRequest;
use Google\Cloud\ModelArmor\V1beta\SanitizeUserPromptResponse;
use Google\Cloud\ModelArmor\V1beta\StreamingMode;
use Google\Cloud\ModelArmor\V1beta\FilterMatchState;
use Google\Cloud\ModelArmor\V1beta\InvocationResult;
function stream_sanitize_user_prompt_example()
{
$projectId = 'YOUR_PROJECT_ID';
$location = 'LOCATION_ID';
$templateId = 'YOUR_TEMPLATE_ID';
$promptChunks = [
"This is the first part of the user prompt. ",
"This is the second part. ",
"And this is the final part."
];
// Construct the regional REP endpoint (without port)
$regionalEndpoint = sprintf('modelarmor.%s.rep.googleapis.com', $location);
echo "Using endpoint: " . $regionalEndpoint . PHP_EOL;
try {
// Initialize the Model Armor client
$modelArmorClient = new ModelArmorClient([
'apiEndpoint' => $regionalEndpoint,
]);
// Construct the resource name.
$resourceName = sprintf('projects/%s/locations/%s/templates/%s', $projectId, $location, $templateId);
// Get a stream object for the StreamSanitizeUserPrompt API method.
$stream = $modelArmorClient->streamSanitizeUserPrompt();
echo "Sending requests..." . PHP_EOL;
// --- Send First Request ---
$firstRequest = (new SanitizeUserPromptRequest())
->setName($resourceName)
->setUserPromptData((new DataItem())->setText($promptChunks[0]))
->setStreamingMode(StreamingMode::STREAMING_MODE_BUFFERED); // Or STREAMING_MODE_REALTIME
$stream->write($firstRequest);
echo "Sent chunk 1: \"" . $promptChunks[0] . "\"" . PHP_EOL;
// --- Send Subsequent Requests ---
for ($i = 1; $i < count($promptChunks); $i++) {
$subsequentRequest = (new SanitizeUserPromptRequest())
->setName($resourceName)
->setUserPromptData((new DataItem())->setText($promptChunks[$i]));
$stream->write($subsequentRequest);
echo "Sent chunk " . ($i + 1) . ": \"" . $promptChunks[$i] . "\"" . PHP_EOL;
}
// Signal that the client has finished sending requests.
$stream->closeWrite();
echo "Client finished sending." . PHP_EOL;
// --- Receive Responses ---
echo "Receiving responses..." . PHP_EOL;
/** @var SanitizeUserPromptResponse $response */
foreach ($stream->closeWriteAndReadAll() as $response) {
if ($response->hasSanitizationResult()) {
$result = $response->getSanitizationResult();
echo "Received response:" . PHP_EOL;
echo " Match State: " . FilterMatchState::name($result->getFilterMatchState()) . PHP_EOL;
echo " Invocation Result: " . InvocationResult::name($result->getInvocationResult()) . PHP_EOL;
} else {
echo "Received empty response." . PHP_EOL;
}
}
echo "Stream finished and closed." . PHP_EOL;
} catch (ApiException $e) {
echo "Error during streaming: " . $e->getMessage() . PHP_EOL;
foreach ($e->getMetadata() as $key => $value) {
echo $key . ": " . print_r($value, true) . PHP_EOL;
}
} catch (Exception $e) {
echo "An unexpected error occurred: " . $e->getMessage() . PHP_EOL;
} finally {
if (isset($modelArmorClient)) {
$modelArmorClient->close();
}
}
}
stream_sanitize_user_prompt_example();
Python
이 코드를 실행하려면 Python 개발 환경을 설정하고 Model Armor Python SDK를 설치합니다.
from google.cloud import modelarmor_v1beta
def sample_stream_sanitize_user_prompt():
# Create a client
client = modelarmor_v1beta.ModelArmorClient(transport="grpc", client_options = {"api_endpoint" : "modelarmor.us-central1.rep.googleapis.com"})
# Specify the Google Project ID.
project_id = "YOUR_PROJECT_ID"
# Specify the location ID. For example, us-central1.
location = "LOCATION_ID"
# Specify the template ID.
template_id = "YOUR_TEMPLATE_ID"
template_name = client.template_path(project_id, location, template_id)
# Initialize request argument(s)
user_prompt_data = modelarmor_v1beta.DataItem()
# Specify the user prompt.
user_prompt_data.text = "This is a sample user prompt"
request = modelarmor_v1beta.SanitizeUserPromptRequest(
name=template_name,
user_prompt_data=user_prompt_data,
)
# This method expects an iterator which contains
# 'modelarmor_v1beta.SanitizeUserPromptRequest' objects
# Here we create a generator that yields a single `request` for
# demonstrative purposes.
requests = [request]
def request_generator():
for request in requests:
yield request
# Make the request
stream = client.stream_sanitize_user_prompt(requests=request_generator())
# Handle the response
for response in stream:
# Results can be consumed or assigned here in production workflows
sample_stream_sanitize_user_prompt()
스트리밍 텍스트 프롬프트 또는 응답을 삭제할 때는 다음 사항을 고려하세요.
- 콘텐츠를 효과적으로 정리하려면 개별 청크가 토큰 한도를 초과하지 않아야 합니다.
- Model Armor 스트리밍 메서드는 텍스트 입력만 지원하며 이미지 및 파일과 같은 첨부파일은 지원하지 않습니다.
- 연관 ID를 사용하여 특정 요청의 스트리밍 삭제 로그를 추적합니다.
- Model Armor 스트리밍 메서드는 Sensitive Data Protection 익명화를 지원하지 않습니다.
파일 기반 프롬프트
파일에 저장된 프롬프트를 정리하려면 파일 콘텐츠를 base64 형식으로 제공하세요. Model Armor는 파일 유형을 자동으로 감지하지 않습니다. 파일 형식을 나타내려면 byteDataType 필드를 명시적으로 설정해야 합니다. 필드가 누락되거나 지정되지 않으면 요청이 실패합니다. 가능한 byteDataType 값은 PLAINTEXT_UTF8, PDF, WORD_DOCUMENT, EXCEL_DOCUMENT, POWERPOINT_DOCUMENT, TXT, CSV입니다.
민감한 정보 보호 익명화는 파일 기반 프롬프트에 지원되지 않습니다.
REST
curl -X POST \ -d "$(jq -n \ --arg data "$(base64 -w 0 -i sample.pdf)" \ '{userPromptData: {byteItem: {byteDataType: "FILE_TYPE", byteData: $data}}}')" \ -H "Content-Type: application/json" \ -H "Authorization: Bearer $(gcloud auth print-access-token)" \ "https://modelarmor.LOCATION.rep.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/templates/TEMPLATE_ID:sanitizeUserPrompt"
다음을 바꿉니다.
PROJECT_ID: 템플릿이 속한 프로젝트의 IDLOCATION: 템플릿의 위치TEMPLATE_ID: 템플릿의 IDFILE_TYPE: 입력 파일의 형식입니다.
Go
이 코드를 실행하려면 먼저 Go 개발 환경을 설정하고 Model Armor Go SDK를 설치합니다.
C#
이 코드를 실행하려면 먼저 C# 개발 환경을 설정하고 Model Armor C# SDK를 설치합니다.
자바
이 코드를 실행하려면 먼저 Java 개발 환경을 설정하고 Model Armor Java SDK를 설치합니다.
Node.js
이 코드를 실행하려면 먼저 Node.js 개발 환경을 설정하고 Model Armor Node.js SDK를 설치합니다.
PHP
이 코드를 실행하려면 먼저 PHP 개발 환경을 설정하고 Model Armor PHP SDK를 설치합니다.
Python
이 코드를 실행하려면 Python 개발 환경을 설정하고 Model Armor Python SDK를 설치합니다.
기본 Sensitive Data Protection 구성
Model Armor는 Sensitive Data Protection과 통합되어 개인 정보의 우발적 노출을 방지합니다. 기본 Sensitive Data Protection 설정이 사용 설정된 템플릿을 만듭니다. 기본 Sensitive Data Protection을 사용하면 Sensitive Data Protection infoType의 고정된 집합을 검사할 수 있습니다.
다음 Sensitive Data Protection infoType은 모든 리전의 프롬프트에서 검사됩니다.
CREDIT_CARD_NUMBER: 신용카드 번호는 12~19자리 숫자입니다. 전 세계에서 결제에 사용됩니다.FINANCIAL_ACCOUNT_NUMBER: 특정 금융 계좌를 나타내는 숫자입니다(예: 은행 계좌 번호 또는 퇴직 계좌 번호).GCP_CREDENTIALS: Google Cloud 서비스 계정 사용자 인증 정보입니다. {api_client_lib_name} 및 서비스 계정으로 인증하는 데 사용할 수 있는 사용자 인증 정보입니다.GCP_API_KEY: Google Cloud API 키입니다. 비공개 사용자 데이터에 액세스할 필요가 없는 Google Cloud API를 호출할 때 사용되는 암호화된 문자열입니다.PASSWORD: 구성, 코드, 기타 텍스트의 일반 텍스트 비밀번호입니다.
미국 기반 리전의 프롬프트에서 다음과 같은 추가 Sensitive Data Protection infoType이 검사됩니다.
US_SOCIAL_SECURITY_NUMBER: 미국 사회보장번호(SSN)는 미국 시민권자, 영주권자, 임시 거주자에게 발급되는 9자리 번호입니다. 숫자 그룹의 숫자가 모두 0인 번호(즉, 000-##-####, ###-00-####, ###-##-0000), 첫 번째 숫자 그룹이 666인 번호, 첫 번째 숫자가 9인 번호는 이 감지기에서 대조하지 않습니다.US_INDIVIDUAL_TAXPAYER_IDENTIFICATION_NUMBER: 미국 개인 납세자 식별 번호(ITIN)는 미국 국세청(IRS)이 발급하는 세금 식별 번호(TIN) 유형입니다. ITIN은 주민등록번호(SSN)를 받을 수 없는 특정 비거주/거주 외국인 및 이들의 배우자와 부양 가족에게만 제공되는 세금 처리 번호입니다.
다음은 기본 Sensitive Data Protection 구성의 예시입니다.
gcloud
gcloud model-armor templates create TEMPLATE_ID \ --location=LOCATION \ --project=PROJECT_ID \ --basic-config-filter-enforcement=enabled
다음을 바꿉니다.
TEMPLATE_ID: 템플릿의 IDLOCATION: 템플릿의 위치
REST
export FILTER_CONFIG_SDP_BASIC='{ "filterConfig": { "sdpSettings": { "basicConfig": { "filterEnforcement": "ENABLED" } } } }' curl -X PATCH \ -d "$FILTER_CONFIG_SDP_BASIC" \ -H "Content-Type: application/json" \ -H "Authorization: Bearer $(gcloud auth print-access-token)" \ "https://modelarmor.LOCATION.rep.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/templates/TEMPLATE_ID?updateMask=filterConfig.sdpSettings.basicConfig.filterEnforcement"
다음을 바꿉니다.
PROJECT_ID: 템플릿이 속한 프로젝트의 IDLOCATION: 템플릿의 위치TEMPLATE_ID: 템플릿의 ID
Go
이 코드를 실행하려면 먼저 Go 개발 환경을 설정하고 Model Armor Go SDK를 설치합니다.
C#
이 코드를 실행하려면 먼저 C# 개발 환경을 설정하고 Model Armor C# SDK를 설치합니다.
자바
이 코드를 실행하려면 먼저 Java 개발 환경을 설정하고 Model Armor Java SDK를 설치합니다.
Node.js
이 코드를 실행하려면 먼저 Node.js 개발 환경을 설정하고 Model Armor Node.js SDK를 설치합니다.
PHP
이 코드를 실행하려면 먼저 PHP 개발 환경을 설정하고 Model Armor PHP SDK를 설치합니다.
Python
이 코드를 실행하려면 Python 개발 환경을 설정하고 Model Armor Python SDK를 설치합니다.
만든 템플릿을 사용하여 프롬프트를 검사합니다. 예를 들면 다음과 같습니다.
curl -X POST \ -d '{"userPromptData":{"text":"can you remember my ITIN : ###-##-####"}}' \ -H "Content-Type: application/json" \ -H "Authorization: Bearer $(gcloud auth print-access-token)" \ "https://modelarmor.LOCATION.rep.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/templates/TEMPLATE_ID:sanitizeUserPrompt"
다음을 바꿉니다.
PROJECT_ID: 템플릿이 속한 프로젝트의 IDLOCATION: 템플릿의 위치TEMPLATE_ID: 템플릿의 ID
이 예시에서는 다음과 같은 응답이 반환됩니다.
{ "sanitizationResult": { "filterMatchState": "MATCH_FOUND", "invocationResult": "SUCCESS", "filterResults": [ { "csamFilterFilterResult": { "executionState": "EXECUTION_SUCCESS", "matchState": "NO_MATCH_FOUND" } }, { "sdpFilterResult": { "inspectResult": { "executionState": "EXECUTION_SUCCESS", "matchState": "MATCH_FOUND", "findings": [ { "infoType": "US_INDIVIDUAL_TAXPAYER_IDENTIFICATION_NUMBER", "likelihood": "LIKELY", "location": { "byteRange": { "start": "26", "end": "37" }, "codepointRange": { "start": "26", "end": "37" } } } ] } } } ] } }
고급 Sensitive Data Protection 구성
Model Armor는 고급 Sensitive Data Protection 구성 설정을 사용하여 LLM 프롬프트와 응답을 검사합니다. 이렇게 하면 기본 Sensitive Data Protection 설정에서 제공되는 infoType 외에도 Sensitive Data Protection 기능을 사용할 수 있습니다.
Model Armor에서 Sensitive Data Protection 고급 필터를 사용하려면 Sensitive Data Protection 템플릿이 Model Armor 템플릿과 동일한 클라우드 위치에 있어야 합니다.
gcloud
gcloud model-armor templates create TEMPLATE_ID \ --location=LOCATION \ --advanced-config-inspect-template="path/to/template" \
다음을 바꿉니다.
TEMPLATE_ID: 템플릿의 IDLOCATION: 템플릿의 위치
REST
export FILTER_CONFIG_SDP_ADV='{ "filterConfig": { "sdpSettings": { "advancedConfig": { "deidentifyTemplate": "projects/PROJECT_ID/locations/LOCATION/deidentifyTemplates/deidentify-ip-address", "inspectTemplate": "projects/PROJECT_ID/locations/LOCATION/inspectTemplates/inspect-ip-address" } } } }' curl -X POST \ -d "$FILTER_CONFIG_SDP_ADV" \ -H "Content-Type: application/json" \ -H "Authorization: Bearer $(gcloud auth print-access-token)" \ "https://modelarmor.LOCATION.rep.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/templates/TEMPLATE_ID?updateMask=filterConfig.sdpSettings.advancedConfig"
다음을 바꿉니다.
PROJECT_ID: 템플릿이 속한 프로젝트의 IDLOCATION: 템플릿의 위치TEMPLATE_ID: 템플릿의 ID
이 예시에서는 다음과 같은 응답이 반환됩니다.
{ "name": "projects/PROJECT_ID/locations/LOCATION/templates/all-filters-test", "createTime": "2024-12-16T17:08:19.626693819Z", "updateTime": "2024-12-16T17:08:19.626693819Z", "filterConfig": { "sdpSettings": { "advancedConfig": { "deidentifyTemplate": "projects/PROJECT_ID/locations/LOCATION/deidentifyTemplates/deidentify-ip-address", "inspectTemplate": "projects/PROJECT_ID/locations/LOCATION/inspectTemplates/inspect-ip-address" } } } }
C#
이 코드를 실행하려면 먼저 C# 개발 환경을 설정하고 Model Armor C# SDK를 설치합니다.
Go
이 코드를 실행하려면 먼저 Go 개발 환경을 설정하고 Model Armor Go SDK를 설치합니다.
자바
이 코드를 실행하려면 먼저 Java 개발 환경을 설정하고 Model Armor Java SDK를 설치합니다.
Node.js
이 코드를 실행하려면 먼저 Node.js 개발 환경을 설정하고 Model Armor Node.js SDK를 설치합니다.
PHP
이 코드를 실행하려면 먼저 PHP 개발 환경을 설정하고 Model Armor PHP SDK를 설치합니다.
Python
이 코드를 실행하려면 Python 개발 환경을 설정하고 Model Armor Python SDK를 설치합니다.
만든 템플릿을 사용하여 프롬프트를 검사합니다. 예를 들면 다음과 같습니다.
curl -X POST \ -d '{"userPromptData":{"text":"is there anything malicious running on 1.1.1.1?"}}' \ -H "Content-Type: application/json" \ -H "Authorization: Bearer $(gcloud auth print-access-token)" \ "https://modelarmor.LOCATION.rep.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/templates/TEMPLATE_ID:sanitizeUserPrompt"
다음을 바꿉니다.
PROJECT_ID: 템플릿이 속한 프로젝트의 IDLOCATION: 템플릿의 위치TEMPLATE_ID: 템플릿의 ID
이 예시에서는 다음과 같은 응답이 반환됩니다.
{ "sanitizationResult": { "filterMatchState": "MATCH_FOUND", "invocationResult": "SUCCESS", "filterResults": [ { "csamFilterFilterResult": { "executionState": "EXECUTION_SUCCESS", "matchState": "NO_MATCH_FOUND" } }, { "sdpFilterResult": { "deidentifyResult": { "executionState": "EXECUTION_SUCCESS", "matchState": "MATCH_FOUND", "data": { "text": "is there anything malicious running on [IP_ADDRESS]?" }, "transformedBytes": "7", "infoTypes": ["IP_ADDRESS"] } } } ] } }
이미지 수정 요청 및 응답에 관한 자세한 내용은 이미지 수정을 참고하세요.
모델 응답 정리
LLM은 때때로 유해한 대답을 생성할 수 있습니다. 애플리케이션에서 LLM을 사용할 때 발생하는 위험을 줄이려면 LLM의 대답을 정리하는 것이 중요합니다.
다음은 Model Armor에서 모델 응답을 정리하는 명령어의 예시입니다.
REST
curl -X POST \
-d '{"modelResponseData":{"text":"IP address of the current network is ##.##.##.##"}}' \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
"https://modelarmor.LOCATION.rep.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/templates/TEMPLATE_ID:sanitizeModelResponse"
다음을 바꿉니다.
PROJECT_ID: 템플릿이 속한 프로젝트의 IDLOCATION: 템플릿의 위치TEMPLATE_ID: 템플릿의 ID이 예시에서는 다음과 같은 응답이 반환됩니다.
{ "sanitizationResult": { "filterMatchState": "MATCH_FOUND", "invocationResult": "SUCCESS", "filterResults": { "rai": { "raiFilterResult": { "executionState": "EXECUTION_SUCCESS", "matchState": "MATCH_FOUND", "raiFilterTypeResults": { "dangerous": { "confidenceLevel": "MEDIUM_AND_ABOVE", "matchState": "MATCH_FOUND" }, "sexually_explicit": { "matchState": "NO_MATCH_FOUND" }, "hate_speech": { "matchState": "NO_MATCH_FOUND" }, "harassment": { "matchState": "NO_MATCH_FOUND" } } } }, "pi_and_jailbreak": { "piAndJailbreakFilterResult": { "executionState": "EXECUTION_SUCCESS", "matchState": "NO_MATCH_FOUND" } }, "csam": { "csamFilterFilterResult": { "executionState": "EXECUTION_SUCCESS", "matchState": "NO_MATCH_FOUND" } }, "malicious_uris": { "maliciousUriFilterResult": { "executionState": "EXECUTION_SUCCESS", "matchState": "NO_MATCH_FOUND" } }, } } }
C#
이 코드를 실행하려면 먼저 C# 개발 환경을 설정하고 Model Armor C# SDK를 설치합니다.
Go
이 코드를 실행하려면 먼저 Go 개발 환경을 설정하고 Model Armor Go SDK를 설치합니다.
자바
이 코드를 실행하려면 먼저 Java 개발 환경을 설정하고 Model Armor Java SDK를 설치합니다.
Node.js
이 코드를 실행하려면 먼저 Node.js 개발 환경을 설정하고 Model Armor Node.js SDK를 설치합니다.
PHP
이 코드를 실행하려면 먼저 PHP 개발 환경을 설정하고 Model Armor PHP SDK를 설치합니다.
Python
이 코드를 실행하려면 Python 개발 환경을 설정하고 Model Armor Python SDK를 설치합니다.
다국어 감지가 사용 설정된 모델 응답 정리
개별 응답마다 enableMultiLanguageDetection 플래그를 true로 설정하여 요청별로 다국어 감지를 사용 설정합니다.
원하는 경우 출발어를 지정하여 더 정확한 결과를 얻을 수 있습니다.
- 출발어를 지정하지 않으면 Model Armor에서 다국어 지원을 위해 언어를 자동으로 감지합니다.
- 소스 언어를 지정하면 Model Armor는 해당 언어를 사용하여 모델 응답을 평가하고 자동 언어 감지를 실행하지 않습니다.
curl -X POST \ -d '{"modelResponseData":{"text":"[UNSAFE TEXT]"}, "multiLanguageDetectionMetadata": { "enableMultiLanguageDetection": true , "sourceLanguage": "jp"}}' \ -H "Content-Type: application/json" \ -H "Authorization: Bearer $(gcloud auth print-access-token)" \ "https://modelarmor.LOCATION.rep.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/templates/TEMPLATE_ID:sanitizeModelResponse"
다음을 바꿉니다.
PROJECT_ID: 템플릿이 속한 프로젝트의 IDLOCATION: 템플릿의 위치TEMPLATE_ID: 템플릿의 ID
여러 프로젝트에서 모델 응답 정리
중앙 집중식 AI 안전 관리를 사용 설정하기 위해 조직은 애플리케이션이 별도의 프로젝트(프로젝트 B)에서 실행되는 동안 전용 프로젝트 (프로젝트 A: TEMPLATE_PROJECT_ID)에 Model Armor 템플릿을 저장하는 경우가 많습니다.
프로젝트 B의 서비스 계정 (CALLER_SERVICE_ACCOUNT)이 프로젝트 A의 템플릿에 액세스하도록 허용하려면 템플릿 프로젝트에 IAM 정책 바인딩을 추가해야 합니다.
필요한 교차 프로젝트 권한을 부여하려면 다음 명령어를 실행합니다.
gcloud projects add-iam-policy-binding TEMPLATE_PROJECT_ID \ --member='serviceAccount:CALLER_SERVICE_ACCOUNT' \ --role='roles/modelarmor.user'
다음을 바꿉니다.
TEMPLATE_PROJECT_ID: 템플릿이 호스팅되는 프로젝트의 IDCALLER_SERVICE_ACCOUNT: API 요청을 하는 프로젝트의 서비스 계정입니다.
다음 단계
- Model Armor 자세히 알아보기
- Model Armor 최소 기준 설정에 대해 알아보기
- Model Armor 템플릿에 대해 알아보기
- Model Armor 문제 해결하기