viernes, agosto 23, 2024

Llama Guard 3: Un LLM de Seguridad para proteger LLMs

En el artículo anterior "Prompt Guard: Modelo de seguridad para evitar ataques de Prompt Injection & Jailbreak en LLMs" hablamos de Prompt Guard, pero como había prometido, hoy voy a hablaros de Llama Guard 3, que es un complemento ideal para proteger las aplicaciones y los servicios digitales que se han creado sobre LLMs.

En este caso, Llama Guard 3, a diferencia de Prompt Guard, si que se trata de un LLM pre-entrenado de 8B de parámetros que ha sido fine-tuneado para clasificación de contenido. Es la tercera versión de este modelo que se utiliza para clasificar tanto los prompts del usuario, como las respuestas del modelo. Así se evita que este responda de forma “peligrosa”.


Seguro que os ha pasado, que habéis hecho una petición a ChatGPT, Gemini, Claude, … y tras responder, la respuesta se ha eliminado y ha dicho que esa conversación no cumple con las políticas de uso del servicio, pues algo similar a esto está ocurriendo por detrás. Llama Guard 3 no sólo nos va a decir si el contenido es seguro o no, sino que además va a clasificar dicho contenido en 14 categorías diferentes (han introducido tres nuevas categorías respecto a Llama Guard 2):
  • S1: Violent Crimes
  • S2: Non-Violent Crimes
  • S3: Sex-Related Crimes
  • S4: Child Sexual Exploitation
  • S5: Defamation (Nueva)
  • S6: Specialized Advice
  • S7: Privacy
  • S8: Intellectual Property
  • S9: Indiscriminate Weapons
  • S10: Hate
  • S11: Suicide & Self-Harm
  • S12: Sexual Content
  • S13: Elections (Nueva)
  • S14: Code Interpreter Abuse (Nueva)
Estas categorías no han sido definidas por Meta, sino que han sido extraídas de una taxonomía creada por MLCommons, donde se estandarizan estos 14 grupos. Si queréis leer más sobre esto, os dejo por aquí este artículo donde se especifica todo.


Para probar Llama Guard 3, hay que tener en cuenta que funciona con un formato de prompt específico, que es el siguiente que podéis ver en esta imagen.

Figura 4: Formato de Prompt de Llama Guard 3

Como podéis ver, tenemos los siguientes elementos:

1) Tokens especiales:
  • “<|begin_of_text|>”: Marca el inicio del prompt.
  • “<|start_header_id|>” y “<|end_header_id|>”: Encierran el rol del mensaje (user o assistant).
  • “<|eot_id|>”: Marca el final del turno o interacción.
2) Variables que reemplazar:
  • “{{role}}”: Puede ser "user" o "agent", dependiendo de si se evalúa la entrada del usuario o la salida del modelo. 
  • “{{user_message_1}}”: Mensaje del usuario (puede haber más de uno). 
  • “{{model_answer_1}}”: Respuesta del modelo (puede haber más de uno).
3) Categorías de contenido inseguro
  • Aquí lo que podemos hacer es enviar el título de cada categoría, como en el ejemplo. Pero también podemos enviar junto al título, una descripción detallada de la categoría para cubrir casos de uso específico y de esta forma afinar la respuesta del modelo.
Vamos ahora a probar el modelo, en este caso, la versión de Llama Guard 3 8B no está disponible para probar en Hugging Face, si accedéis a su repositorio (Llama Guard 3 8B) vais a ver que Hugging Face nos dice que ese modelo aún no ha sido desplegado en la API de inferencia debido a la baja popularidad del mismo, como ya os comentaba al principio del artículo.

Figura 5: Mensaje de que el modelo no está desplegado

No obstante, sí que existe un “space”, al que podéis acceder desde aquí, donde podemos jugar un poco con el modelo. Yo he hecho varias pruebas y los resultados han ido bastante bien.


Primero, he tratado de confundirle con un falso positivo, pero no ha caído, sabe que matar procesos en GNU/Linux no es peligroso, por ahora. Después me he acordado del post de Chema Alonso titulado "ChatGPT, ¿me das ideas para cómo matar al presidente de los EEUU?". 


¿Será capaz Llama Guard 3 de detectar que ese prompt, además de inseguro, pertenece a la categoría de crímenes? Pues, como podéis ver, sí, hace bien ambas cosas. Lo detecta como “unsafe” y, además, menciona la categoría S1 (Violent Crimes).

Figura 9: Lo detecta como S1 (Violent Crimes)

Pero si probamos el truco del Juego de Rol para engañarle y que nos dé la información que deseamos haciéndole creer que es un juego, vemos que sale como Safe, así que hemos conseguido eludir la protección de Llama Guard 3.

Por último, vamos a ver como jugar con este modelo en local, para que todos vosotros podáis ajustar los parámetros que necesites y podáis ejecutarlo sin depender de terceros. Lo primero que debemos hacer es instalar la dependencia con el comando:

pip install 'transformers[torch]'

Para este modelo en particular, es necesario actualizar la librería a la última versión, ya que de lo contrario vamos a encontrar errores al cargar la configuración del modelo. Para actualizar la librería, utilizamos el siguiente comando:

pip install --upgrade Transformers

El código para ejecutar el modelo es el siguiente, que como podéis ver, al igual que antes, reemplazamos la variable "YOUR_HF_TOKEN" por el Token correspondiente y cargamos el tokenizador y el modelo pre-entrenado. Luego, definimos una función "moderate" que toma como entrada un array con la conversación entre el usuario y el asistente.

Figura 11: Usar Llama Guard 3 con Python

Para generar la entrada correspondiente, aplicamos la plantilla que hemos visto anteriormente usando "tokenizer.apply_chat_template()". Por último, generamos una respuesta utilizando el modelo. El resultado, al igual que antes es el esperado. En mi caso, para ejecutarlo, he tenido que hacer uso de “Colab Pro” ya que los 15 GB de RAM que ofrece la GPU T4 no eran suficientes (por muy poco).

Figura 12: Prueba del modelo de Llama Guard 3 8B

Antes de terminar el artículo, quiero mostrar algunas estadísticas que Meta ha compartido junto al lanzamiento de este modelo. En ellas podemos ver como Llama Guard 3 supera con creces la tasa de falsos positivos de la versión anterior y de GPT4. Además, Llama Guard 3 muestra mejoras notables en otras métricas de rendimiento. Su puntuación F1 de 0.939 y AUPRC de 0.985 superan a las de Llama Guard 2 y a la puntuación F1 de GPT4.

Figura 13: Comparativa de Llama Guard 2, Llama Guard 3 y GPT4

Obviamente aún queda mucho camino por recorrer y hay cosas por mejorar. Una de ellas es su performance, al ser un modelo de 8B de parámetros ya si que necesitamos hacer uso de GPU para obtener unas latencias aceptables, a diferencia de Prompt Guard, que puede ejecutarse en CPU sin problema.

Paa terminar

Por último, encontramos categorías como la S3 (difamación), S8 (propiedad intelectual) o S13 (procesos electorales) donde el modelo necesitará de un contexto más amplio y actualizado a la fecha actual para hacer una evaluación correcta. Por poner un ejemplo, he estado haciendo pruebas hablando sobre elecciones, fraudes, políticos, y nada… siempre dice que la conversación es segura.

Figura 14: Libro de Machine Learning aplicado a Ciberseguridad de
Carmen TorranoFran Ramírez, Paloma Recuero, José Torres y Santiago Hernández

Pero como comentábamos antes, es un buen punto de partida para comenzar a trabajar en la seguridad de los LLMs desde un punto de vista local y de código abierto. Ahora nos toca a nosotros, los desarrolladores e investigadores, ponernos a jugar con estos modelos y ver todo lo que podemos hacer con ellos.

¡¡Saludos hackers!!
 
AutorJavier Álvarez Páramo (Investigador de Seguridad en IdeasLocas)

No hay comentarios:

Entrada destacada

10 maneras de sacarle el jugo a tu cuenta de @MyPublicInbox si eres un Perfil Público

Cuando doy una charla a algún amigo, conocido, o a un grupo de personas que quieren conocer MyPublicInbox , siempre se acaban sorprendiendo ...

Entradas populares