Renderz.Studio
El Arsenal
OperacionesAvanzado40 minGratis

AI Safety y Guardrails

Filtros de contenido · rate limiting · validación · protege tu API de abusos

SafetyGuardrailsSeguridad
Guía gratuita · Acceso completo
01

Modelo de seguridad en profundidad

Nunca confíes en una sola capa. La seguridad de IA requiere múltiples barreras que trabajen juntas.

CapaQué protegeImplementación
Input ValidationPrompt injection, contenido ilegalRegex, clasificadores, sanitización
Rate LimitingCostes, DoSRedis, Upstash, middleware
Output FilteringContenido dañino, PIIPost-processing, regex
MonitoringPatrones sospechososLogs, alertas, dashboards

  Advertencia

El 80% de los ataques a APIs de IA son prompt injection. Nunca pases input del usuario directamente al system prompt sin sanitizar.
02

Input validation: filtrar antes del LLM

lib/guardrails/inputValidator.ts
const BLOCKED_PATTERNS = [
  /ignore (all |previous |above )?instructions/i,
  /you are now/i,
  /pretend (to be|you are)/i,
  /disregard (your |all )?rules/i,
  /jailbreak/i,
  /DAN mode/i,
]

const MAX_INPUT_LENGTH = 10000
const MAX_MESSAGES = 50

export function validateInput(input: string, messages: any[]): { valid: boolean; error?: string } {
  // Length check
  if (input.length > MAX_INPUT_LENGTH) {
    return { valid: false, error: 'Input demasiado largo' }
  }

  // History check
  if (messages.length > MAX_MESSAGES) {
    return { valid: false, error: 'Conversación demasiado larga' }
  }

  // Injection patterns
  for (const pattern of BLOCKED_PATTERNS) {
    if (pattern.test(input)) {
      return { valid: false, error: 'Contenido no permitido' }
    }
  }

  return { valid: true }
}
03

Output filtering: validar respuestas

lib/guardrails/outputFilter.ts
const PII_PATTERNS = {
  email: /[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}/g,
  phone: /\+?[0-9]{10,15}/g,
  ssn: /\d{3}-\d{2}-\d{4}/g,
  creditCard: /\d{4}[\s-]?\d{4}[\s-]?\d{4}[\s-]?\d{4}/g,
}

export function filterOutput(text: string): string {
  let filtered = text

  // Redact PII
  for (const [type, pattern] of Object.entries(PII_PATTERNS)) {
    filtered = filtered.replace(pattern, `[REDACTED_${type.toUpperCase()}]`)
  }

  return filtered
}

export function checkOutputSafety(text: string): boolean {
  const dangerousPatterns = [
    /how to (make|build|create) (a )?bomb/i,
    /instructions for (making |creating )?weapons/i,
  ]

  return !dangerousPatterns.some(p => p.test(text))
}
04

Rate limiting con Upstash

middleware.ts
import { Ratelimit } from '@upstash/ratelimit'
import { Redis } from '@upstash/redis'

const ratelimit = new Ratelimit({
  redis: Redis.fromEnv(),
  limiter: Ratelimit.slidingWindow(10, '1 m'), // 10 requests per minute
  analytics: true,
})

export async function middleware(request: Request) {
  if (request.url.includes('/api/chat')) {
    const ip = request.headers.get('x-forwarded-for') ?? '127.0.0.1'
    const { success, limit, remaining } = await ratelimit.limit(ip)

    if (!success) {
      return new Response('Rate limit exceeded', {
        status: 429,
        headers: {
          'X-RateLimit-Limit': limit.toString(),
          'X-RateLimit-Remaining': remaining.toString(),
        }
      })
    }
  }
}

  Tip Pro

Combina rate limiting por IP con rate limiting por usuario autenticado para mayor protección.

¿Quieres el sistema completo?

500+ páginas, 25 capítulos, código de producción, acceso a todas las guías del Arsenal.

Curso Completo · €29PayPal · Acceso inmediato
¿Hablamos?