Cómo detectar la inyección de prompts antes de que llegue a tu modelo
Revisa el texto cuando entra, antes de pegarlo en un prompt. /v1/prompt es la misma comprobación que /v1/text con los patrones de inyección activados, así que una sola llamada cubre también insultos, estafas y datos personales. Las comprobaciones gratuitas lo resuelven en torno a un milisegundo, y tú actúas según una de tres respuestas: enviarlo, retenerlo o rechazarlo. Los patrones solo se aplican en la superficie prompt, porque «ignora las instrucciones anteriores» en un foro es alguien diciendo algo raro, y de camino a un modelo es una instrucción.
Familias de intento que puntúan juntas
Una familia sola puede ser casualidad: un artículo sobre inyección de prompts también contiene esas palabras. Varias familias en el mismo mensaje son alguien intentándolo en serio, y la puntuación sigue eso y no la coincidencia más llamativa. Hay siete: saltarse las instrucciones, marcadores de plantilla de chat, adoptar otra identidad, pedir el prompt del sistema, un jailbreak con nombre, cerrar un delimitador e imponer la respuesta. La orden de saltarse las instrucciones está escrita en los dos sentidos, porque «ignora las instrucciones anteriores» y «olvida las reglas de arriba» dicen lo mismo, y un patrón que solo conociera una forma se perdería la mitad.
Contada o dada: a quién va dirigida la orden
«Le pedí al bot que ignore las instrucciones anteriores y me hizo caso» es alguien contando lo que pasó, y esa frase no cuenta. «Por favor, ignora las instrucciones anteriores» es la orden misma, dirigida a quien la lee, y cuenta como tal. La diferencia se lee en las palabras que van justo antes: si se le pidió a otro, es un relato; si se le pide al modelo, es una instrucción.
Marcadores de plantilla de chat y delimitadores cerrados
Marcadores como <|im_start|>, [INST], <<SYS>> o ### System: son el formato interno de una conversación, y nadie los escribe sin querer. Se buscan en el texto tal como llega, porque al normalizarlo desaparecerían, y bastan por sí solos. Una línea que finge que el contenido ha terminado (---end, fin del contenido, tres comillas invertidas) intenta que lo que viene después se lea como instrucciones: sola se retiene, y junto a una orden de saltarse las instrucciones suma.
Grafías disfrazadas y bloques codificados
Quien intenta esto ya está intentando esquivar un filtro, así que nada se busca en el texto tal como llega. Primero se normaliza: 0lv1d4, una ı sin punto, una letra cirílica que parece latina o un carácter invisible en mitad de una palabra vuelven a ser la palabra de siempre. El base64 no se descodifica, pero un bloque largo junto a dos o más familias es la forma de colar algo ante un filtro que solo lee palabras, y suma a la puntuación.
El delimitador de nuestro propio modelo
Cuando el modelo de ToxicFilter lee un mensaje, está leyendo un texto que ha escrito la persona a la que se modera, así que el mismo problema nos afecta a nosotros. El contenido va entre dos marcadores con doce caracteres hexadecimales aleatorios, distintos en cada petición, y las instrucciones dicen que todo lo que hay entre ellos son datos. Un marcador que alguien descubra en una petición no le sirve para la siguiente. El contenido nunca se recorta ni se escapa, porque el fragmento que se te devuelve tiene que ser exactamente lo que enviaste.