Guardrails· ▶ Jugable
Canary
Un juego de navegador donde eres el atacante: cuela una inyección de prompts ante un guardrail que corre 100% en tu dispositivo. Un pipeline por capas (normalización, heurísticas, un clasificador ONNX de 22M) responde BLOCKED o PASS con un score de confianza y la capa que te atrapó.
- Transformers.js
- ONNX
- Llama Prompt Guard 2 (22M)
- React
- TypeScript
- Vite
- Tailwind v4
- Zustand
Problema
Las apps de LLM necesitan un guardrail contra prompt-injection, pero uno alojado cuesta plata, agrega latencia y manda el texto del usuario a un servidor. ¿Puede un guardrail útil correr sin backend, en cualquier dispositivo, incluido el teléfono, y ser honesto sobre que es evadible? Eso último importa: un guard que se sobrevende es peor que no tener guard.
Mi rol
Diseñé y construí todo spec-first como una defensa por capas, del lado del cliente (OWASP LLM01). Un pipeline, no una sola llamada al modelo: normalización Unicode NFKC más limpieza de caracteres de ancho cero y homoglifos y decodificación de base64/leet, una denylist de regex explicable con patrones de inyección conocidos, luego Llama Prompt Guard 2 de Meta (22M, DeBERTa-xsmall) como modelo ONNX cuantizado de ~72 MB corriendo en el navegador vía Transformers.js sobre WASM/CPU, y una etapa de fusión de scores que devuelve un BLOCKED/PASS calibrado con su confianza y la capa exacta que disparó. Lo envolví en un juego: cada ronda asigna una intención (infiltrar vs. stress-test) para que un PASS sea significativo, con un intent gate indulgente, separado del guard, que elimina el truco de "escribe hola y ganas".
Tradeoff
Elegí un clasificador encoder de 22M sobre un LLM-guard generativo. Eso renuncia a algo de recall y a toda la cobertura fuera del inglés, y el modelo corre en WASM/CPU porque el camino WebGPU de ORT calcula mal este modelo int8. A cambio: costo cercano a $0, inferencia sub-segundo, privacidad total (nada sale del dispositivo) y funciona en el teléfono. La capa heurística recupera recall sobre los ataques obvios y conocidos que el modelo pequeño dejaría pasar, y la normalización mata los trucos de ofuscación que engañan a ambos. Ninguna etapa se confía sola.
Métrica
El clasificador cuantizado reporta precisión 0.997 / recall 0.920 en inglés (reportado por el vendor sobre un set de jailbreak), así que rara vez marca de más pero se le escapan algunos ataques, que es justo por lo que el pipeline está en capas. v1 corre 100% en el cliente, ~$0, offline tras la primera carga, con el modelo cacheado en el navegador. Lo que mediría a continuación: recall end-to-end del pipeline sobre un set adversarial/ofuscado, y la tasa de falsos positivos sobre texto benigno en inglés y español. La UI declara el límite honesto: la detección de v1 es efectiva en inglés.