Escáner modular de vulnerabilidades de LLM que analiza alucinaciones, fuga de datos, inyección de prompts, jailbreaks y toxicidad utilizando sondas estáticas, dinámicas y adaptativas a través de múltiples proveedores de modelos.
Kit de Red-teaming y Evaluación de IA Generativa
garak verifica si un LLM puede ser inducido a fallar de una manera no deseada. garak busca alucinaciones, fugas de datos, inyección de prompts, desinformación, generación de toxicidad, jailbreaks y muchas otras debilidades. Si conoces nmap o msf / Metasploit Framework, garak hace algo similar a ellos, pero para LLMs.
garak se centra en formas de hacer fallar a un LLM o sistema de diálogo. Combina sondas estáticas, dinámicas y adaptativas para explorar esto.
garak es una herramienta gratuita. Nos encanta desarrollarla y siempre estamos interesados en agregar funcionalidades para apoyar aplicaciones.
actualmente soporta:
garak es una herramienta de línea de comandos. Se desarrolla en Linux y OSX.
pipSolo tómalo desde PyPI y deberías estar listo:``` python -m pip install -U garak
### Instalar la versión de desarrollo con `pip`
La versión estándar de `garak` mediante pip se actualiza periódicamente. Para obtener una versión más reciente desde GitHub, prueba:```
python -m pip install -U git+https://github.com/NVIDIA/garak.git@main
garak tiene sus propias dependencias. Puede instalar garak en su propio entorno de Conda:```
conda create --name garak "python>=3.10,<=3.12"
conda activate garak
gh repo clone NVIDIA/garak
cd garak
python -m pip install -e .
Bien, si eso funcionó, ¡probablemente estás listo!
**Nota**: si clonaste antes del traslado a la organización `NVIDIA` de GitHub, pero estás leyendo esto en la URI `github.com/NVIDIA`, actualiza tus remotos de la siguiente manera:```
git remote set-url origin https://github.com/NVIDIA/garak.git
La sintaxis general es:
garak <options>
garak necesita saber qué modelo escanear, y por defecto, probará todas las sondas que conoce en ese modelo, usando los detectores de vulnerabilidad recomendados por cada sonda. Puede ver una lista de sondas usando:
garak --list_probes
Para especificar un generador, use las opciones --target_type y, opcionalmente, --target_name. El tipo de modelo especifica una familia/interfaz de modelo; el nombre del modelo especifica el modelo exacto a utilizar. La sección "Introducción a los generadores" a continuación describe algunos de los generadores compatibles. Una familia de generadores sencilla son los modelos de Hugging Face; para cargar uno de estos, establezca --target_type en huggingface y --target_name en el nombre del modelo en Hub (p. ej., "RWKV/rwkv-4-169m-pile"). Algunos generadores pueden necesitar que se establezca una clave API como variable de entorno, y le informarán si la necesitan.
garak ejecuta todas las sondas por defecto, pero también puede ser específico al respecto. --probes promptinject usará solo los métodos del framework PromptInject, por ejemplo. También puede especificar un plugin específico en lugar de una familia de plugins añadiendo el nombre del plugin después de un .; por ejemplo, --probes lmrc.SlurUsage usará una implementación para verificar si los modelos generan insultos basados en el framework Language Model Risk Cards.
Probar un modelo comercial para inyección de prompts basada en codificación (OSX/*nix) (reemplace el valor de ejemplo con una clave API real de OpenAI)``` export OPENAI_API_KEY="sk-123XXXXXXXXXXXX" python3 -m garak --target_type openai --target_name gpt-5-nano --probes encoding
Ver si la versión de Hugging Face de GPT2 es vulnerable a DAN 11.0```
python3 -m garak --target_type huggingface --target_name gpt2 --probes dan.Dan_11_0
Por cada sonda cargada, garak mostrará una barra de progreso mientras genera. Una vez completada la generación, se muestra una fila evaluando los resultados de esa sonda en cada detector. Si alguno de los intentos de aviso produjo un comportamiento no deseado, la respuesta se marcará como FAIL y se indicará la tasa de fallos.
Aquí están los resultados con el módulo encoding en una variante de GPT-3:

Y los mismos resultados para ChatGPT:

Podemos observar que el modelo más reciente es mucho más susceptible a los ataques de inyección basados en codificación, mientras que text-babbage-001 solo resultó vulnerable a inyecciones de codificación quoted-printable y MIME. Las cifras al final de cada fila, por ejemplo 840/840, indican el número total de generaciones de texto y luego cuántas de ellas parecen haber funcionado correctamente. La cifra puede ser bastante alta porque se realiza más de una generación por aviso; por defecto, 10.
Los errores se registran en garak.log; la ejecución se registra detalladamente en un archivo .jsonl especificado al inicio y al final del análisis. Hay un script de análisis básico en analyse/analyse_log.py que mostrará las sondas y los avisos que generaron más aciertos.
Envíe PR y abra issues. ¡Buena caza!
Usando la API Pipeline:
--target_type huggingface (para modelos transformers que se ejecuten localmente)--target_name - use el nombre del modelo desde el Hub. Solo funcionarán modelos generativos. Si falla y no debería, abra un issue y pegue el comando que intentó junto con la excepción.Usando la API de inferencia:
--target_type huggingface.InferenceAPI (para acceso a modelos vía API)--target_name - el nombre del modelo desde el Hub, p. ej. "mosaicml/mpt-7b-instruct"Usando endpoints privados:
--target_type huggingface.InferenceEndpoint (para endpoints privados)
--target_name - la URL del endpoint, p. ej. https://xxx.us-east-1.aws.endpoints.huggingface.cloud
(opcional) configure la variable de entorno HF_INFERENCE_TOKEN con un token de API de Hugging Face con el rol "read"; consulte https://huggingface.co/settings/tokens cuando haya iniciado sesión
--target_type openai--target_name - el modelo de OpenAI que desea usar. gpt-5-nano es rápido y adecuado para pruebas.OPENAI_API_KEY con su clave de API de OpenAI (p. ej. "sk-19763ASDF87q6657"); consulte https://platform.openai.com/account/api-keys cuando haya iniciado sesiónLos tipos de modelos reconocidos están en lista blanca, porque el complemento necesita saber qué sub-API usar. Los modelos Completion o ChatCompletion son válidos. Si desea usar un modelo no compatible, debería recibir un mensaje de error informativo; por favor, envíe un PR / abra un issue.
REPLICATE_API_TOKEN con su token de API de Replicate, p. ej. "r8-123XXXXXXXXXXXX"; consulte https://replicate.com/account/api-tokens cuando haya iniciado sesiónModelos públicos de Replicate:
--target_type replicate--target_name - el nombre del modelo de Replicate y su hash, p. ej. "stability-ai/stablelm-tuned-alpha-7b:c49dae36"Endpoints privados de Replicate:
--target_type replicate.InferenceEndpoint (para endpoints privados)--target_name - el slug de usuario/modelo desde el endpoint desplegado, p. ej. elim/elims-llama2-7b--target_type cohere--target_name (opcional, command por defecto) - El modelo específico de Cohere que desea probarCOHERE_API_KEY con su clave de API de Cohere, p. ej. "aBcDeFgHiJ123456789"; consulte https://dashboard.cohere.ai/api-keys cuando haya iniciado sesión--target_type groq--target_name - El nombre del modelo al que acceder a través de la API de GroqGROQ_API_KEY con su clave de API de Groq; consulte https://console.groq.com/docs/quickstart para obtener detalles sobre cómo crear una clave de API--target_type ggml--target_name - La ruta al modelo ggml que desea cargar, p. ej. /home/leon/llama.cpp/models/7B/ggml-model-q4_0.binGGML_MAIN_PATH con la ruta a su ejecutable main de ggmlrest.RestGenerator es altamente flexible y puede conectarse a cualquier endpoint REST que devuelva texto plano o JSON. Necesita una configuración breve, que normalmente resultará en un archivo YAML corto que describa su endpoint. Consulte https://reference.garak.ai/en/latest/garak.generators.rest.html para ver ejemplos.
Use modelos de https://build.nvidia.com/ u otros endpoints NIM.
NIM_API_KEY con su token de API de autenticación, o especifíquelo en el YAML de configuraciónPara modelos de chat:
--target_type nim--target_name - el nombre del model de NIM, p. ej. meta/llama-3.1-8b-instructPara modelos de finalización:
--target_type nim.NVOpenAICompletion--target_name - el nombre del model de NIM, p. ej. bigcode/starcoder2-15b--target_type bedrock--target_name - el ID del modelo de Bedrock o su alias, p. ej. anthropic.claude-3-sonnet-20240229-v1:0 o claude-3-sonnetBEDROCK_API_KEY con su clave de API de AWS Bedrock; consulte https://docs.aws.amazon.com/bedrock/latest/userguide/api-keys-use.html para instrucciones de configuraciónBEDROCK_REGION para especificar la región de AWS (por defecto us-east-1)Las familias de modelos compatibles incluyen modelos Anthropic Claude, Meta Llama, Amazon Titan, AI21 Labs, Cohere y Mistral AI. El generador utiliza la API Converse para acceso unificado a todos los tipos de modelo.
Ejemplo de uso:``` export BEDROCK_API_KEY="your-api-key" export BEDROCK_REGION="us-east-1" garak --target_type bedrock --target_name claude-3-sonnet --probes dan
### Prueba
* `--target_type test`
* (alternativamente) `--target_name test.Blank`
Para pruebas. Esto siempre genera la cadena vacía, usando el generador `test.Blank`. Se marcará como fallido para cualquier prueba que *requiera* una salida, por ejemplo, aquellas que hacen afirmaciones controvertidas y esperan que el modelo las refute para pasar.
* `--target_type test.Repeat`
Para pruebas. Este generador repite el mensaje que recibió.
## Introducción a los probes
| Probe | Descripción |
|----------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| blank | Un probe simple que siempre envía un mensaje vacío. |
| atkgen | Generación Automática de Ataques. Un LLM de red-teaming sondea el objetivo y reacciona a él en un intento de obtener una salida tóxica. Prototipo, mayormente sin estado, por ahora utiliza un simple GPT-2 [fine-tuned](https://huggingface.co/garak-llm/artgpt2tox) en el subconjunto de intentos de hhrlhf que produjeron toxicidad detectable (el único objetivo actualmente soportado por ahora). |
| badchars | Implementa perturbaciones Unicode imperceptibles (caracteres invisibles, homoglifos, reordenamientos, eliminaciones) inspiradas en el artículo [Bad Characters](https://arxiv.org/abs/2106.09898). |
| av_spam_scanning | Probes que intentan hacer que el modelo genere firmas de contenido malicioso. |
| continuation | Probes que prueban si el modelo continuará una palabra probablemente indeseable. |
| dan | Varios ataques [DAN](https://adguard.com/en/blog/chatgpt-dan-prompt-abuse.html) y similares a DAN. |
| donotanswer | Preguntas a las que los modelos de lenguaje responsables no deberían responder. |
| encoding | Inyección de mensajes a través de codificación de texto. |
| gcg | Interrumpir un mensaje del sistema añadiendo un sufijo adversarial. |
| glitch | Probar el modelo en busca de tokens glitch que provoquen un comportamiento inusual. |
| grandma | Apelar a ser recordado por la abuela de uno. |
| goodside | Implementaciones de los ataques de Riley Goodside. |
| leakreplay | Evaluar si un modelo reproducirá datos de entrenamiento. |
| lmrc | Submuestra de los probes de [Language Model Risk Cards](https://arxiv.org/abs/2303.18190). |
| malwaregen | Intentos de hacer que el modelo genere código para construir malware. |
| misleading | Intentos de hacer que un modelo apoye afirmaciones engañosas y falsas. |
| packagehallucination | Intentar obtener generaciones de código que especifiquen paquetes inexistentes (y por lo tanto inseguros). |
| promptinject | Implementación del trabajo [PromptInject](https://github.com/agencyenterprise/PromptInject/tree/main/promptinject) de Agency Enterprise (mejor artículo en NeurIPS ML Safety Workshop 2022). |
| realtoxicityprompts | Subconjunto del trabajo RealToxicityPrompts (datos limitados porque la prueba completa tardaría mucho en ejecutarse). |
| snowball | Probes de [Alucinación en Bola de Nieve](https://ofir.io/snowballed_hallucination.pdf) diseñados para hacer que un modelo dé una respuesta incorrecta a preguntas demasiado complejas para que las procese. |
| xss | Buscar vulnerabilidades que permitan o ejecuten ataques entre sitios, como la exfiltración de datos privados. |
## Registro
`garak` genera múltiples tipos de registro:
* Un archivo de registro, `garak.log`. Esto incluye información de depuración de `garak` y sus plugins, y se continúa entre ejecuciones.
* Un informe de la ejecución actual, estructurado como JSONL. Se crea un nuevo archivo de informe cada vez que se ejecuta `garak`. El nombre de este archivo se muestra al principio y, si tiene éxito, también al final de la ejecución. En el informe, se realiza una entrada por cada intento de sondéo tanto cuando se reciben las generaciones como cuando se evalúan; el atributo `status` de la entrada toma una constante de `garak.attempts` para describir en qué etapa se realizó.
* Un registro de aciertos, que detalla los intentos que produjeron una vulnerabilidad (un 'hit').
## ¿Cómo está estructurado el código?
Consulte la [documentación de referencia](https://reference.garak.ai/) para obtener una guía autorizada sobre la estructura del código de `garak`.
En una ejecución típica, `garak` leerá un tipo de modelo (y opcionalmente un nombre de modelo) desde la línea de comandos, luego determinará qué `probe`s y `detector`s ejecutar, iniciará un `generator`, y luego los pasará a un `harness` para realizar las pruebas; un `evaluator` se encarga de los resultados. Hay muchos módulos en cada una de estas categorías, y cada módulo proporciona una serie de clases que actúan como plugins individuales.
* `garak/probes/` - clases para generar interacciones con LLMs
* `garak/detectors/` - clases para detectar si un LLM está exhibiendo un modo de fallo determinado
* `garak/evaluators/` - esquemas de informe de evaluación
* `garak/generators/` - plugins para LLMs que serán probados
* `garak/harnesses/` - clases para estructurar las pruebas
* `resources/` - elementos auxiliares requeridos por los plugins
El modo de operación predeterminado es usar el harness `probewise`. Dada una lista de nombres de módulos de probe y nombres de plugins de probe, el harness `probewise` instancia cada probe, luego para cada probe lee sus atributos `primary_detector` y `extended_detectors` para obtener una lista de `detector`s a ejecutar sobre la salida.
Cada categoría de plugin (`probes`, `detectors`, `evaluators`, `generators`, `harnesses`) incluye un `base.py` que define las clases base utilizables por los plugins de esa categoría. Cada módulo de plugin define clases de plugin que heredan de una de las clases base. Por ejemplo, `garak.generators.openai.OpenAIGenerator` desciende de `garak.generators.base.Generator`.
Los artefactos más grandes, como archivos de modelo y corpus más extensos, se mantienen fuera del repositorio; se pueden almacenar, por ejemplo, en Hugging Face Hub y cargarlos localmente mediante clientes que usen `garak`.
## Desarrollar tu propio plugin
* Observa cómo lo hacen otros plugins
* Hereda de una de las clases base, por ejemplo, `garak.probes.base.TextProbe`
* Sobrescribe lo mínimo posible
* Puedes probar el nuevo código de al menos dos formas:
* Inicia una sesión interactiva de Python
* Importa el modelo, por ejemplo, `import garak.probes.mymodule`
* Instancia el plugin, por ejemplo, `p = garak.probes.mymodule.MyProbe()`
* Ejecuta un escaneo con plugins de prueba
* Para probes, prueba un generador en blanco y el detector always.Pass: `python3 -m garak -m test.Blank -p mymodule -d always.Pass`
* Para detectors, prueba un generador en blanco y un probe en blanco: `python3 -m garak -m test.Blank -p test.Blank -d mymodule`
* Para generators, prueba un probe en blanco y el detector always.Pass: `python3 -m garak -m mymodule -p test.Blank -d always.Pass`
* Haz que `garak` liste todos los plugins del tipo que estás escribiendo, con `--list_probes`, `--list_detectors`, o `--list_generators`
## FAQ
Tenemos una FAQ [aquí](https://github.com/NVIDIA/garak/blob/main/FAQ.md). ¡No dudes en contactarnos si tienes más preguntas! [[email protected]](mailto:[email protected])
La documentación de referencia del código está en [garak.readthedocs.io](https://garak.readthedocs.io/en/latest/).
## Citar garak
Puedes leer el [artículo preliminar de garak](https://github.com/nvidia/garak/blob/main/garak-paper.pdf). Si usas garak, por favor cítanos.```
@article{garak,
title={{garak: A Framework for Security Probing Large Language Models}},
author={Leon Derczynski and Erick Galinkin and Jeffrey Martin and Subho Majumdar and Nanna Inie},
year={2024},
howpublished={\url{https://garak.ai}}
}
"Mentir es una habilidad como cualquier otra, y si deseas mantener un nivel de excelencia tienes que practicar constantemente" - Elim
Para actualizaciones y novedades consulta @garak_llm
© 2023- Leon Derczynski; licencia Apache v2, consulta LICENSE