En esta página, se describe en detalle cómo sanear las instrucciones y las respuestas. Model Armor ofrece un conjunto de filtros para proteger tus aplicaciones de IA. Model Armor verifica las instrucciones y las respuestas según los niveles de confianza de filtrado configurados.
Antes de comenzar
Crea una plantilla siguiendo las instrucciones en Cómo crear plantillas.
Obtén los permisos necesarios
Para obtener los permisos que necesitas para sanear instrucciones y respuestas, pídele a tu administrador que te otorgue los siguientes roles de IAM en Model Armor:
- Usuario de Model Armor (
roles/modelarmor.user) - Visualizador de Model Armor (
roles/modelarmor.viewer)
Para obtener más información sobre cómo otorgar roles, consulta Administra el acceso a proyectos, carpetas y organizaciones.
También puedes obtener los permisos necesarios a través de roles personalizados o cualquier otro rol predefinido.
En el proyecto que contiene la plantilla de Sensitive Data Protection, otorga el rol de usuario de DLP (roles/dlp.user) y el rol de lector de DLP (roles/dlp.reader) al agente de servicio creado como parte del paso de Protección avanzada de datos sensibles de Crea plantillas.
Omite este paso si la plantilla de Sensitive Data Protection se encuentra en el mismo proyecto que la plantilla de 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
Reemplaza lo siguiente:
SDP_PROJECT_ID: Es el ID del proyecto al que pertenece la plantilla avanzada de Sensitive Data Protection.PROJECT_NUMBER: Es el número del proyecto al que pertenece la plantilla.
Habilita las APIs
Para poder usar Model Armor, debes habilitar la API de Model Armor.
Console
Habilita la API de Model Armor.
Roles necesarios para habilitar las APIs
Para habilitar APIs, necesitas el permiso
serviceusage.services.enable. Si creaste el proyecto, es probable que ya tengas este permiso a través del rol de propietario (roles/owner). De lo contrario, puedes obtener este permiso a través del rol de administrador de Service Usage (roles/serviceusage.serviceUsageAdmin). Obtén más información para otorgar roles.Elige el proyecto en el que quieres activar Model Armor.
gcloud
Antes de empezar, sigue estos pasos a través de la Google Cloud CLI con la API de Model Armor:
En la consola de Google Cloud , activa Cloud Shell.
En la parte inferior de la consola de Google Cloud , se inicia una sesión de Cloud Shell en la que se muestra una ventana de línea de comandos. Cloud Shell es un entorno de shell con Google Cloud CLI ya instalada y con valores ya establecidos para el proyecto actual. La sesión puede tardar unos segundos en inicializarse.
Configura la anulación del extremo de API con la gcloud CLI.
Cómo configurar la anulación del extremo de API con la gcloud CLI
Este paso solo es necesario si usas gcloud CLI para habilitar la API de Model Armor. Debes configurar manualmente la anulación del extremo de API para garantizar que la gcloud CLI enrute correctamente las solicitudes al servicio de Model Armor.
Ejecuta el siguiente comando para configurar el extremo de API del servicio de Model Armor.
gcloud config set api_endpoint_overrides/modelarmor "https://modelarmor.LOCATION.rep.googleapis.com/"
Reemplaza LOCATION por la región en la que quieres usar Model Armor.
Limpiar instrucciones
Sanea las instrucciones para evitar entradas maliciosas y garantizar que se envíen instrucciones seguras y adecuadas a tus LLM.
Instrucciones de texto
Model Armor analiza el texto y aplica diferentes filtros para identificar y mitigar posibles amenazas, y así depurar las instrucciones de texto.
REST
Usa el siguiente comando para sanear una instrucción de texto en 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"
Reemplaza lo siguiente:
PROJECT_ID: Es el ID del proyecto para la plantilla.LOCATION: Es la ubicación de la plantilla.TEMPLATE_ID: Es el ID de la plantilla.
Esto genera la siguiente respuesta. Ten en cuenta que MATCH_FOUND se encuentra en la categoría Peligroso.
{ "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
Para ejecutar este código, primero configura un entorno de desarrollo de Go y, luego, instala el SDK de Go para Model Armor.
C#
Para ejecutar este código, primero configura un entorno de desarrollo de C# y, luego, instala el SDK de C# para Model Armor.
Java
Para ejecutar este código, primero configura un entorno de desarrollo de Java y, luego, instala el SDK de Java para Model Armor.
Node.js
Para ejecutar este código, primero configura un entorno de desarrollo de Node.js y, luego, instala el SDK de Node.js para Model Armor.
PHP
Para ejecutar este código, primero configura un entorno de desarrollo de PHP y, luego, instala el SDK de PHP para Model Armor.
Python
Para ejecutar este código, configura un entorno de desarrollo de Python y instala el SDK de Python para Model Armor.
Esto genera la siguiente respuesta.
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 }
Prácticas recomendadas para limpiar instrucciones en la IA conversacional
Cuando usas Model Armor para sanear las entradas en una aplicación de IA conversacional, es importante comprender qué incluir en el campo userPromptData para el método SanitizeUserPrompt.
Limpia cada entrada del usuario por separado: Llama a la API de
SanitizeUserPromptpara cada mensaje nuevo que recibas del usuario. Esto garantiza que cada entrada del usuario se analice en busca de posibles amenazas antes de que la procese tu LLM. El campouserPromptDatasolo debe contener el contenido del mensaje más reciente del usuario en la conversación actual.No incluyas el historial de conversaciones: Evita concatenar todo el historial de chat en el campo
userPromptData.No incluyas instrucciones del sistema: La instrucción del sistema no debe incluirse en el campo
userPromptData. Model Armor se enfoca en detectar amenazas solo en las entradas proporcionadas por el usuario.
Limpiar las instrucciones de texto con la detección en varios idiomas habilitada
Para habilitar la detección de varios idiomas por solicitud, establece la marca enableMultiLanguageDetection en true para cada solicitud individual.
De manera opcional, puedes especificar el idioma de origen para obtener resultados más precisos.
- Si no especificas el idioma de origen, Model Armor lo detectará automáticamente para brindar compatibilidad con varios idiomas.
- Si especificas el idioma de origen, Model Armor lo usará para evaluar la instrucción de texto y no realizará la detección automática del idioma.
Usa el siguiente comando para limpiar una instrucción de texto en Model Armor con la detección multilingüe habilitada a nivel de la solicitud.
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"
Reemplaza lo siguiente:
PROJECT_ID: Es el ID del proyecto para la plantilla.LOCATION: Es la ubicación de la plantilla.TEMPLATE_ID: Es el ID de la plantilla.
Instrucciones que contienen imágenes
Para habilitar el análisis de imágenes, establece la modalidad en los metadatos de la plantilla.
Puedes configurar modalidades en plantillas nuevas y existentes.
Si especificas una sola modalidad (IMAGE o TEXT), Model Armor omite la otra y devuelve EXECUTION_SKIPPED. Debes configurar de forma explícita el campo byteDataType como IMAGE y proporcionar la imagen codificada en base64 en el formato admitido en el campo byteData.
Usa el siguiente comando para sanear una instrucción que contiene una imagen.
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"
Reemplaza lo siguiente:
PROJECT_ID: Es el ID del proyecto que contiene la plantilla.LOCATION: Es la ubicación de la plantilla.TEMPLATE_ID: Es el ID de la plantilla.IMAGE: Es la imagen en un formato compatible.
La respuesta es similar a lo que se muestra a continuación:
{ "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" } } } }, } }
Cómo ocultar imágenes
En el modo avanzado de Sensitive Data Protection, Model Armor redacta imágenes solo si configuraste filtros de Model Armor con una plantilla de inspección de Sensitive Data Protection y una plantilla de desidentificación de Sensitive Data Protection. Para obtener más información, consulta Cómo establecer la configuración de Sensitive Data Protection. Asegúrate de configurar la ocultación de imágenes en la plantilla de desidentificación.
Cuando se usa el modo avanzado de Sensitive Data Protection, es posible que el BASIC_AUTH_HEADERinfoType se informe en los resultados de la detección, incluso si no se incluye de forma explícita en la plantilla de inspección configurada.
En el siguiente ejemplo, se muestra la configuración del filtro con la redacción de Sensitive Data Protection habilitada.
{ "filterConfig": { "sdpSettings": { "advancedConfig": { "inspectTemplate": "projects/PROJECT_ID/locations/LOCATION/inspectTemplates/TEMPLATE_ID", "deidentifyTemplate": "projects/PROJECT_ID/locations/LOCATION/deidentifyTemplates/TEMPLATE_ID" } } } }
Reemplaza lo siguiente:
PROJECT_ID: Es el ID del proyecto que contiene la plantilla.LOCATION: Es la ubicación de la plantilla.TEMPLATE_ID: Es el ID de la plantilla.
Esto genera la siguiente respuesta.
{ "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 } } } ] } } ] } } } } } }
Limpia las instrucciones de texto de transmisión
Los métodos de transmisión de Model Armor limpian las instrucciones y las respuestas en tiempo real como transmisiones de texto, sin esperar a que esté disponible todo el contenido. Esta capacidad es particularmente útil para las aplicaciones que controlan cargas útiles de texto grandes o que requieren interacciones de baja latencia con LLMs.
Usa estos métodos para habilitar la transmisión:
- StreamSanitizeUserPrompt: Transmite y limpia el texto proporcionado por el usuario.
- StreamSanitizeModelResponse: Transmite y corrige el texto generado por el LLM.
Model Armor ofrece los siguientes modos de transmisión:
- Modo de búfer: Recopila todos los fragmentos transmitidos y los procesa juntos como una sola unidad.
- Modo en tiempo real: Procesa cada fragmento de forma individual a medida que se recibe y proporciona comentarios continuos.
Model Armor admite una cantidad ilimitada de tokens cuando se usa el modo de transmisión en tiempo real, mientras que el modo almacenado en búfer está sujeto a límites de tokens.
La transmisión funciona de la siguiente manera:
- Entrada en fragmentos: Tu aplicación envía texto a Model Armor en fragmentos más pequeños en lugar de enviar todo el cuerpo del texto de una vez.
- Procesamiento en tiempo real: Model Armor procesa estos fragmentos a medida que llegan y aplica los filtros de seguridad configurados en tu plantilla.
- Comentarios continuos: Según el modo (en tiempo real o almacenado en búfer), Model Armor devuelve resultados por fragmento procesado o después de que se reciben todos los fragmentos.
Usa el siguiente comando para sanear una instrucción de texto de transmisión.
Go
Para ejecutar este código, primero configura un entorno de desarrollo de Go y, luego, instala el SDK de Go para Model Armor.
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#
Para ejecutar este código, primero configura un entorno de desarrollo de C# y, luego, instala el SDK de C# para Model Armor.
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
Para ejecutar este código, primero configura un entorno de desarrollo de Java y, luego, instala el SDK de Java para Model Armor.
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
Para ejecutar este código, primero configura un entorno de desarrollo de Node.js y, luego, instala el SDK de Node.js para Model Armor.
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
Para ejecutar este código, primero configura un entorno de desarrollo de PHP y, luego, instala el SDK de PHP para Model Armor.
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
Para ejecutar este código, configura un entorno de desarrollo de Python y instala el SDK de Python para Model Armor.
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()
Ten en cuenta lo siguiente cuando apliques el saneamiento a una instrucción de texto o respuesta de transmisión:
- Para limpiar el contenido de manera eficaz, asegúrate de que los fragmentos individuales no superen los límites de tokens.
- Los métodos de transmisión de Model Armor solo admiten entrada de texto, no archivos adjuntos como imágenes y archivos.
- Usa el ID de correlación para hacer un seguimiento de los registros de saneamiento de transmisión para una solicitud determinada.
- Los métodos de transmisión de Model Armor no admiten la desidentificación de Sensitive Data Protection.
Instrucciones basadas en archivos
Para limpiar una instrucción almacenada en un archivo, proporciona el contenido del archivo en formato base64. Model Armor no detecta automáticamente el tipo de archivo. Debes configurar de forma explícita el campo byteDataType para indicar el formato del archivo. Si falta el campo o no se especifica, la solicitud falla. Los valores posibles de byteDataType son PLAINTEXT_UTF8, PDF, WORD_DOCUMENT, EXCEL_DOCUMENT, POWERPOINT_DOCUMENT, TXT y CSV.
La desidentificación de Sensitive Data Protection no es compatible con las instrucciones basadas en archivos.
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"
Reemplaza los parámetros que se indican a continuación:
PROJECT_ID: Es el ID del proyecto al que pertenece la plantilla.LOCATION: Es la ubicación de la plantilla.TEMPLATE_ID: Es el ID de la plantilla.FILE_TYPE: Es el formato del archivo de entrada.
Go
Para ejecutar este código, primero configura un entorno de desarrollo de Go y, luego, instala el SDK de Go para Model Armor.
C#
Para ejecutar este código, primero configura un entorno de desarrollo de C# y, luego, instala el SDK de C# para Model Armor.
Java
Para ejecutar este código, primero configura un entorno de desarrollo de Java y, luego, instala el SDK de Java para Model Armor.
Node.js
Para ejecutar este código, primero configura un entorno de desarrollo de Node.js y, luego, instala el SDK de Node.js para Model Armor.
PHP
Para ejecutar este código, primero configura un entorno de desarrollo de PHP y, luego, instala el SDK de PHP para Model Armor.
Python
Para ejecutar este código, configura un entorno de desarrollo de Python y instala el SDK de Python para Model Armor.
Configuración básica de Sensitive Data Protection
Model Armor se integra con Sensitive Data Protection para ayudar a evitar la exposición accidental de información privada. Crea una plantilla con la configuración básica de Sensitive Data Protection habilitada. La Protección de datos sensibles básica te ayuda a detectar un conjunto fijo de infotipos de Sensitive Data Protection.
En la instrucción, se analizan los siguientes infotipos de Sensitive Data Protection para todas las regiones:
CREDIT_CARD_NUMBER: Un número de tarjeta de crédito tiene entre 12 y 19 dígitos. Se usa para transacciones de pago en todo el mundo.FINANCIAL_ACCOUNT_NUMBER: Es un número que hace referencia a una cuenta financiera específica, por ejemplo, un número de cuenta bancaria o de cuenta de jubilación.GCP_CREDENTIALS:Credenciales de la cuenta de servicio de Google Cloud . Son credenciales que se pueden usar para la autenticación con {api_client_lib_name} y cuentas de servicio.GCP_API_KEY: Google Cloud Clave de API. Es una cadena encriptada que se usa cuando se llama a Google Cloud APIs que no requieren acceso a datos privados del usuario.PASSWORD: Contraseñas en texto simple presentes en las configuraciones, el código y otros textos.
En las regiones de EE.UU., se analizan los siguientes infotipos adicionales de Sensitive Data Protection en la instrucción:
US_SOCIAL_SECURITY_NUMBER: Un número de seguridad social (NSS) de Estados Unidos es un número de 9 dígitos que se emite a los ciudadanos, los residentes permanentes y los residentes temporales de ese país. El detector no mostrará coincidencias de números que solo tengan ceros en alguno de los grupos de dígitos (es decir, 000-##-####, ###-00-#### o ###-##-0000), ni que tengan 666 en el primer grupo de dígitos, ni de números cuyo primer dígito sea 9.US_INDIVIDUAL_TAXPAYER_IDENTIFICATION_NUMBER: El número de identificación fiscal individual (ITIN) de Estados Unidos es un tipo de número de identificación fiscal (TIN) que emite el Internal Revenue Service (IRS). Es un número de procesamiento fiscal disponible solo para algunos extranjeros residentes y no residentes, sus cónyuges y dependientes que no pueden obtener un número de identificación personal (NSS).
A continuación, se muestra un ejemplo de configuración básica de Sensitive Data Protection:
gcloud
gcloud model-armor templates create TEMPLATE_ID \ --location=LOCATION \ --project=PROJECT_ID \ --basic-config-filter-enforcement=enabled
Reemplaza lo siguiente:
TEMPLATE_ID: Es el ID de la plantilla.LOCATION: Es la ubicación de la plantilla.
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"
Reemplaza los parámetros que se indican a continuación:
PROJECT_ID: Es el ID del proyecto al que pertenece la plantilla.LOCATION: Es la ubicación de la plantilla.TEMPLATE_ID: Es el ID de la plantilla.
Go
Para ejecutar este código, primero configura un entorno de desarrollo de Go y, luego, instala el SDK de Go para Model Armor.
C#
Para ejecutar este código, primero configura un entorno de desarrollo de C# y, luego, instala el SDK de C# para Model Armor.
Java
Para ejecutar este código, primero configura un entorno de desarrollo de Java y, luego, instala el SDK de Java para Model Armor.
Node.js
Para ejecutar este código, primero configura un entorno de desarrollo de Node.js y, luego, instala el SDK de Node.js para Model Armor.
PHP
Para ejecutar este código, primero configura un entorno de desarrollo de PHP y, luego, instala el SDK de PHP para Model Armor.
Python
Para ejecutar este código, configura un entorno de desarrollo de Python y instala el SDK de Python para Model Armor.
Usa la plantilla creada para revisar tus instrucciones. Por ejemplo:
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"
Reemplaza lo siguiente:
PROJECT_ID: Es el ID del proyecto al que pertenece la plantilla.LOCATION: Es la ubicación de la plantilla.TEMPLATE_ID: Es el ID de la plantilla.
Este ejemplo devuelve la siguiente respuesta:
{ "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" } } } ] } } } ] } }
Configuración avanzada de Sensitive Data Protection
Model Armor analiza las instrucciones y respuestas del LLM con el parámetro de configuración avanzado de Sensitive Data Protection. Esto te permite usar las capacidades de Sensitive Data Protection más allá de los infoTypes que se ofrecen en el parámetro de configuración básico de Sensitive Data Protection.
Para usar el filtro avanzado de Sensitive Data Protection en Model Armor, las plantillas de Sensitive Data Protection deben estar en la misma ubicación de la nube que la plantilla de Model Armor.
gcloud
gcloud model-armor templates create TEMPLATE_ID \ --location=LOCATION \ --advanced-config-inspect-template="path/to/template" \
Reemplaza lo siguiente:
TEMPLATE_ID: Es el ID de la plantilla.LOCATION: Es la ubicación de la plantilla.
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"
Reemplaza los parámetros que se indican a continuación:
PROJECT_ID: Es el ID del proyecto al que pertenece la plantilla.LOCATION: Es la ubicación de la plantilla.TEMPLATE_ID: Es el ID de la plantilla.
Este ejemplo devuelve la siguiente respuesta:
{ "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#
Para ejecutar este código, primero configura un entorno de desarrollo de C# y, luego, instala el SDK de C# para Model Armor.
Go
Para ejecutar este código, primero configura un entorno de desarrollo de Go y, luego, instala el SDK de Go para Model Armor.
Java
Para ejecutar este código, primero configura un entorno de desarrollo de Java y, luego, instala el SDK de Java para Model Armor.
Node.js
Para ejecutar este código, primero configura un entorno de desarrollo de Node.js y, luego, instala el SDK de Node.js para Model Armor.
PHP
Para ejecutar este código, primero configura un entorno de desarrollo de PHP y, luego, instala el SDK de PHP para Model Armor.
Python
Para ejecutar este código, configura un entorno de desarrollo de Python y instala el SDK de Python para Model Armor.
Usa la plantilla creada para revisar tus instrucciones. Por ejemplo:
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"
Reemplaza lo siguiente:
PROJECT_ID: Es el ID del proyecto al que pertenece la plantilla.LOCATION: Es la ubicación de la plantilla.TEMPLATE_ID: Es el ID de la plantilla.
Este ejemplo devuelve la siguiente respuesta:
{ "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"] } } } ] } }
Para obtener información sobre las solicitudes y respuestas de ocultamiento de imágenes, consulta Oculta imágenes.
Limpia la respuesta del modelo
A veces, los LLMs pueden generar respuestas dañinas. Para reducir los riesgos asociados al uso de LLMs en tus aplicaciones, es importante depurar sus respuestas.
Este es un ejemplo de un comando para limpiar una respuesta del modelo en 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"
Reemplaza los parámetros que se indican a continuación:
PROJECT_ID: Es el ID del proyecto al que pertenece la plantilla.LOCATION: Es la ubicación de la plantilla.TEMPLATE_ID: Es el ID de la plantilla.Este ejemplo devuelve la siguiente respuesta:
{ "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#
Para ejecutar este código, primero configura un entorno de desarrollo de C# y, luego, instala el SDK de C# para Model Armor.
Go
Para ejecutar este código, primero configura un entorno de desarrollo de Go y, luego, instala el SDK de Go para Model Armor.
Java
Para ejecutar este código, primero configura un entorno de desarrollo de Java y, luego, instala el SDK de Java para Model Armor.
Node.js
Para ejecutar este código, primero configura un entorno de desarrollo de Node.js y, luego, instala el SDK de Node.js para Model Armor.
PHP
Para ejecutar este código, primero configura un entorno de desarrollo de PHP y, luego, instala el SDK de PHP para Model Armor.
Python
Para ejecutar este código, configura un entorno de desarrollo de Python y instala el SDK de Python para Model Armor.
Limpia la respuesta del modelo con la detección de varios idiomas habilitada
Para habilitar la detección de varios idiomas por solicitud, configura la marca enableMultiLanguageDetection en true para cada respuesta individual.
De manera opcional, puedes especificar el idioma de origen para obtener resultados más precisos.
- Si no especificas el idioma de origen, Model Armor lo detectará automáticamente para brindar compatibilidad con varios idiomas.
- Si especificas el idioma de origen, Model Armor lo usará para evaluar la respuesta del modelo y no realizará la detección automática del idioma.
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"
Reemplaza lo siguiente:
PROJECT_ID: Es el ID del proyecto al que pertenece la plantilla.LOCATION: Es la ubicación de la plantilla.TEMPLATE_ID: Es el ID de la plantilla.
Limpia la respuesta del modelo en todos los proyectos
Para habilitar la administración centralizada de la seguridad de la IA, las organizaciones suelen almacenar plantillas de Model Armor en un proyecto dedicado (proyecto A: TEMPLATE_PROJECT_ID), mientras que sus aplicaciones se ejecutan en proyectos separados (proyecto B).
Para permitir que una cuenta de servicio (CALLER_SERVICE_ACCOUNT) del proyecto B acceda a una plantilla del proyecto A, debes agregar una vinculación de política de IAM al proyecto de plantilla.
Para otorgar los permisos necesarios entre proyectos, ejecuta el siguiente comando:
gcloud projects add-iam-policy-binding TEMPLATE_PROJECT_ID \ --member='serviceAccount:CALLER_SERVICE_ACCOUNT' \ --role='roles/modelarmor.user'
Reemplaza lo siguiente:
TEMPLATE_PROJECT_ID: Es el ID del proyecto en el que se aloja la plantilla.CALLER_SERVICE_ACCOUNT: Es la cuenta de servicio del proyecto que realiza la solicitud a la API.
¿Qué sigue?
- Obtén más información sobre Model Armor.
- Obtén más información sobre la configuración mínima de Model Armor.
- Obtén información sobre las plantillas de Model Armor.
- Soluciona problemas de Model Armor.