In this article
Cómo garantizar interacciones de IA seguras y confiables con barreras de protección para LLM
Integrar modelos de lenguaje grandes (LLM) en nuestras aplicaciones es cada vez más popular. Estos modelos son muy útiles para crear contenido, buscar en la documentación y resolver problemas más complejos. Sin embargo, un gran poder conlleva una gran responsabilidad. Sabemos que los LLM pueden cometer errores y los cometerán. Aunque enriquecer los prompts con el contexto adecuado puede ayudar a que los resultados se ajusten a tus documentos e información, los riesgos persisten. Con el auge de los LLM, también surgen nuevos vectores de ataque. Las ingeniosas inyecciones de prompts pueden generar información errónea y exponer información sensible para la privacidad.
Si tu LLM puede ejecutar funciones, esto también puede dar lugar a comportamientos dañinos y no autorizados en tu sistema. Esto no solo es inconveniente, sino que puede causar daños reales. Las barreras de protección son mecanismos de seguridad que mantienen los LLM confiables, seguros y alineados con los estándares éticos.
Entender las barreras de protección para LLM
Las barreras de protección permiten agregar capas adicionales de control sobre el uso de un modelo de lenguaje grande (LLM), tanto antes de que la entrada llegue al modelo como después de que se genere la salida. Puedes considerarlas filtros programables o puntos de control que hacen cumplir reglas específicas para mantener las interacciones seguras, precisas y alineadas con el caso de uso previsto. Pueden bloquear entradas dañinas o engañosas, garantizar que la salida del modelo siga un formato determinado (como JSON válido o un resumen estructurado) y señalar o rechazar respuestas que presenten indicios de alucinaciones o problemas éticos. Esto ofrece a los desarrolladores una forma más confiable de gestionar la imprevisibilidad de los LLM, especialmente en aplicaciones reales dirigidas a usuarios.
Desde el punto de vista de la seguridad, las barreras de protección también cumplen una función clave en la defensa contra los ataques de inyección de prompts, en los que los usuarios intentan manipular o anular las instrucciones del sistema mediante entradas diseñadas con astucia. Aunque ninguna solución es completamente infalible, las barreras de protección pueden detectar patrones sospechosos, bloquear vectores de ataque conocidos y depurar las entradas antes de que lleguen al LLM. En cuanto a las salidas, pueden suprimir o modificar respuestas que contengan información sensible, infrinjan políticas o incluyan contenido no deseado. Esto hace que las barreras de protección sean una parte valiosa de una estrategia de seguridad de IA más amplia, especialmente en contextos donde la confianza, la privacidad y la integridad son fundamentales.
Cómo funcionan las barreras de protección
A nivel técnico, las barreras de protección funcionan interceptando el flujo de mensajes entre el usuario y el LLM. Cuando un usuario envía un mensaje, este no llega directamente al modelo. Primero pasa por una barrera de protección de entrada. Esta capa inspecciona el mensaje en busca de elementos como intentos de inyección de prompts, palabras clave prohibidas o infracciones en la estructura de la entrada. Si se detecta un problema, la entrada se puede bloquear, depurar o reescribir antes de que el modelo la vea. Después de que el LLM genera una respuesta, esta pasa por otra capa conocida como barrera de protección de salida. Este paso revisa si hay datos alucinados, contenido inseguro, problemas de formato o infracciones de las reglas del negocio antes de devolverla al usuario.
Este proceso es similar a la depuración de entradas y salidas en el desarrollo de software tradicional, una práctica que los desarrolladores ya suelen aplicar. Así como nunca confiarías en datos sin procesar de un usuario en un formulario web sin validarlos y depurarlos, tampoco deberías confiar ciegamente en lo que entra o sale de un LLM. Las barreras de protección aplican esa misma mentalidad al mundo de la IA y te ayudan a detectar problemas pronto y mantener el control sobre el comportamiento de tu aplicación.
Implementar barreras de protección fácilmente con Quarkus
Quarkus es un framework moderno de Java diseñado para crear aplicaciones ligeras y de alto rendimiento. Se destaca por sus tiempos de inicio rápidos, bajo consumo de memoria y funciones pensadas para desarrolladores. Una de sus principales ventajas es lo fácil que se integra con LangChain4j, una biblioteca centrada en Java para trabajar con modelos de lenguaje grandes. Esta combinación hace que Quarkus sea una excelente opción para implementar funciones de IA, especialmente gracias a su sólido soporte para barreras de protección.
Con Quarkus y LangChain4j, puedes definir barreras de protección personalizadas directamente en tu aplicación mediante anotaciones sencillas e inyección de dependencias. Puedes implementar tu propia lógica de validación creando clases que implementen las interfaces InputGuardrail o OutputGuardrail. Estas barreras funcionan como filtros para tus servicios de IA. Una vez definidas, puedes asociarlas con anotaciones como `@InputGuardrails o @OutputGuardrails a los métodos que interactúan con el LLM. Así, puedes integrar fácilmente tus propias comprobaciones de seguridad, validaciones o políticas de contenido sin recargar la lógica de negocio.
En el siguiente ejemplo, creé un pequeño servicio de IA con barreras de protección tanto de entrada como de salida.
@RegisterAiService(tools = LibraryService.class)
@SessionScoped
public interface MyAiService {
@SystemMessage("""
You are a librarian AI. You are very knowledgeable and helpful. You can answer questions about books, authors, and literature in this library.
You can also help users find books based on their interests and preferences.
Dont display user information or any other private information.
""")
@InputGuardrails({IGuard1.class, IGuard2.class})
@OutputGuardrails(OGuard.class)
public String question(@UserMessage String topic);
}Barreras de protección de entrada
Las barreras de protección de entrada examinan y filtran los mensajes entrantes. Los mensajes adecuados se envían al LLM, mientras que los inapropiados generan excepciones. Este enfoque proactivo evita que los prompts dañinos lleguen al LLM. Dada la naturaleza impredecible de los LLM, es imposible controlar sus salidas y llamadas a funciones. Por eso, es útil detener los prompts dañinos desde el punto de entrada.
En este caso, se implementan dos barreras de protección de entrada. La primera busca palabras clave específicas mediante programación. La segunda utiliza un servicio de IA para evaluar si una entrada es dañina. Usar un modelo entrenado específicamente para entender y filtrar mensajes dañinos puede ser una excelente manera de depurar la entrada que se envía al LLM. Para este caso de uso, el modelo de InputCheckService determina si un prompt revela datos de identificación personal (PII).
Usar varias barreras de protección en un mismo servicio permite personalizar el alcance del control con flexibilidad.
@ApplicationScoped
public class IGuard1 implements InputGuardrail {
@Override
public InputGuardrailResult validate(UserMessage um) {
String text = um.singleText();
if (text.contains("malicious") || text.contains("hack")) {
return fatal("MALICIOUS INPUT DETECTED!!!");
}
return success();
}
}@ApplicationScoped
public class IGuard2 implements InputGuardrail {
@Inject
InputCheckService inputCheckService;
@Override
public InputGuardrailResult validate(UserMessage um) {
String text = um.singleText();
if (inputCheckService.isSafe(text)) {
return success();
}
return failure("UNSAFE INPUT DETECTED!!!");
}
}@RegisterAiService
@ApplicationScoped
public interface InputCheckService {
@SystemMessage("""
You are a guardian of privacy and you're checking the input that is being sent to the AI.
Check if this input is safe and does not try to get any private information from the user like:
Name, Address, Phone number, Email, Social Security Number, Credit Card Information, Bank Account Information, Passwords, Personal Identification Numbers (PINs), Biometric Data (fingerprints, facial recognition), Medical Records, Employment History, Education Records, Financial Information.
Think of yourself as a guardian of privacy. Only allow the input if it considered safe.
""")
public boolean isSafe(String prompt);
}Barreras de protección de salida
Las barreras de protección de salida pueden depurar todo lo que genera tu servicio de LLM. Ya no es posible mitigar el posible riesgo de que un LLM ejecute funciones sin querer. Sin embargo, todavía se puede ignorar o modificar la salida del LLM antes de mostrársela al usuario.
Esto sigue siendo un mecanismo eficaz para evitar el lenguaje ofensivo, ocultar tokens o incluso impedir ataques de scripting entre sitios (XSS) generados por el LLM. En este ejemplo, se elimina la palabra «JavaScript» para que no se muestre al usuario final.
Depurar las entradas y salidas de LLM
La depuración y validación de entradas y salidas existen desde hace mucho tiempo y se consideran buenas prácticas al trabajar con datos de usuarios. El uso de prompts para modelos de lenguaje grandes (LLM) no cambia el hecho de que debemos considerar dañadas las entradas de terceros. Además, cuando los sistemas de IA pueden ejecutar funciones de forma autónoma o integrarse con otros sistemas mediante MCP (Model Context Protocol), la depuración y la validación son más importantes que nunca.
En este artículo se mostró cómo implementar barreras de protección fácilmente con Quarkus. Sin embargo, este enfoque va más allá de frameworks y lenguajes específicos. Debe considerarse una táctica de mitigación fundamental para garantizar que las aplicaciones basadas en LLM permanezcan bajo control y funcionen según lo previsto.
La implementación completa de este proyecto está disponible en GitHub. La documentación de Quarkus ofrece detalles sobre cómo usar Guardrails con Quarkus.
Descubre cómo Snyk te ayuda a encontrar y corregir vulnerabilidades
Conoce la plataforma de seguridad de Snyk, diseñada para desarrolladores, que les permite encontrar y corregir vulnerabilidades en todo el ciclo de vida del desarrollo de software (SDLC).