Kit generativo de Evaluación Red y Evaluación de AI
Checks garak
si se puede hacer que un LLM falle de una manera que no queremos. garak
sondea para la alucinación, la fuga de datos, la inyección inmediata, la información errónea, la generación de toxicidad, los jailbreaks y muchas otras debilidades. Si conoce nmap
, es nmap
para LLMS.
garak
se centra en formas de hacer que un sistema de diálogo LLM fallen. Combina sondas estáticas, dinámicas y adaptativas para explorar esto.
garak
'SA Herramienta gratuita. Nos encanta desarrollarlo y siempre estamos interesados en agregar funcionalidad para admitir aplicaciones.
Actualmente es compatible:
garak
es una herramienta de línea de comandos. Está desarrollado en Linux y OSX.
pip
Solo tomalo de Pypi y deberías estar listo:
python -m pip install -U garak
pip
La versión estándar de PIP de garak
se actualiza periódicamente. Para obtener una versión más fresca de GitHub, intente:
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 condena:
conda create --name garak "python>=3.10,<=3.12"
conda activate garak
gh repo clone NVIDIA/garak
cd garak
python -m pip install -e .
Ok, si eso salió bien, ¡probablemente estés listo!
Nota : Si clonó antes del traslado a la organización NVIDIA
Github, pero está leyendo esto en el URI github.com/NVIDIA
, actualice sus 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 de manera predeterminada, intentará todas las sondas que conoce en ese modelo, utilizando los detectores de vulnerabilidad recomendados por cada sonda. Puede ver una lista de sondas usando:
garak --list_probes
Para especificar un generador, use --model_type
y, opcionalmente, las opciones --model_name
. El tipo de modelo especifica una familia/interfaz modelo; El nombre del modelo especifica el modelo exacto que se utilizará. La sección "Introducción a los generadores" a continuación describe algunos de los generadores compatibles. Una familia generadora directa está abrazando modelos de cara; Para cargar uno de estos, establezca --model_type
en huggingface
y --model_name
al nombre del modelo en Hub (por ejemplo, "RWKV/rwkv-4-169m-pile"
). Algunos generadores pueden necesitar una clave API para establecerse como una variable de entorno, y le informarán si lo necesitan.
garak
ejecuta todas las sondas por defecto, pero también puede ser específico al respecto. --probes promptinject
utilizará solo los métodos del marco de la prisión de la prisión, por ejemplo. También puede especificar un complemento específico en lugar de una familia de complementos agregando el nombre del complemento después de a .
; Por ejemplo, --probes lmrc.SlurUsage
utilizará una implementación de la verificación de modelos que generan insultos basados en el marco de tarjetas de riesgo del modelo de idioma.
Para obtener ayuda e inspiración, ¡busque en Twitter o Discord!
Probe ChatGPT para la inyección de inmediato basada en la codificación (OSX/*NIX) (reemplace el valor de ejemplo con una tecla API de OpenAI real)
export OPENAI_API_KEY="sk-123XXXXXXXXXXXX"
python3 -m garak --model_type openai --model_name gpt-3.5-turbo --probes encoding
Vea si la versión de abrazadera de GPT2 es vulnerable a Dan 11.0
python3 -m garak --model_type huggingface --model_name gpt2 --probes dan.Dan_11_0
Para cada sonda cargada, Garak imprimirá una barra de progreso mientras genera. Una vez que se completa la generación, se proporciona una fila que evalúa los resultados de la sonda en cada detector. Si alguno de los intentos rápidos arrojó un comportamiento indeseable, la respuesta se marcará como fallas y la tasa de falla dada.
Aquí están los resultados con el módulo encoding
en una variante GPT-3:
Y los mismos resultados para chatgpt:
Podemos ver que el modelo más reciente es mucho más susceptible a los ataques de inyección basados en la codificación, donde se encontró que Text-Babbage-001 solo era vulnerable a las inyecciones de codificación impresa y de MIME. Las cifras al final de cada fila, por ejemplo, 840/840, indican el número de generaciones de texto en total y luego cuántos de estos parecían comportarse bien. La cifra puede ser bastante alta porque se realiza más de una generación por aviso, por defecto, 10.
Los errores van en garak.log
; La ejecución se registra en detalle en un archivo .jsonl
especificado en el análisis Start & End. Hay un script de análisis básico en analyse/analyse_log.py
que generará las sondas y las indicaciones que condujeron a la mayor cantidad de golpes.
Enviar PRS y problemas abiertos. ¡Feliz caza!
Usando la API de la tubería:
--model_type huggingface
(para que los modelos Transformers se ejecuten localmente)--model_name
-Use el nombre del modelo de Hub. Solo funcionarán modelos generativos. Si falla y no debería, ¡abra un problema y pegue el comando que probó + la excepción!Usando la API de inferencia:
--model_type huggingface.InferenceAPI
(para el acceso al modelo basado en API)--model_name
-El nombre del modelo de Hub, por ejemplo, "mosaicml/mpt-7b-instruct"
Uso de puntos finales privados:
--model_type huggingface.InferenceEndpoint
(para puntos finales privados)
--model_name
-The Endpoint URL, por ejemplo, https://xxx.us-east-1.aws.endpoints.huggingface.cloud
(Opcional) Establezca la variable de entorno HF_INFERENCE_TOKEN
en un token de API de cara de abrazo con el rol de "Leer"; Consulte https://huggingface.co/settings/tokens cuando se registre
--model_type openai
--model_name
-El modelo OpenAI que desea usar. gpt-3.5-turbo-0125
es rápido y fino para las pruebas.OPENAI_API_KEY
en su tecla API OpenAI (por ejemplo "SK-19763AsDF87Q6657"); Consulte https://platform.openai.com/account/api-keys cuando se registreLos tipos de modelos reconocidos son blancos, porque el complemento necesita saber qué sub-API usar. Los modelos de finalización o CHATComppletion están bien. Si desea usar un modelo no compatible, debe recibir un mensaje de error informativo y enviar un PR / Abra un problema.
REPLICATE_API_TOKEN
en su token API replicada, por ejemplo, "R8-123xxxxxxxxxxxxxx"; Consulte https://replicate.com/account/api-tokens cuando se registreModelos de replicación pública:
--model_type replicate
--model_name
-El nombre del modelo replicante y hash, por ejemplo, "stability-ai/stablelm-tuned-alpha-7b:c49dae36"
Puntos finales de replicación privada:
--model_type replicate.InferenceEndpoint
(para puntos finales privados)--model_name
-Slug de nombre de usuario/modelo de model desde el punto final implementado, por ejemplo, elim/elims-llama2-7b
--model_type cohere
--model_name
(opcional, command
de forma predeterminada) -el modelo de coherente específico que desea probarCOHERE_API_KEY
en su clave API Cohere, por ejemplo, "ABCDEFGHIJ123456789"; Ver https://dashboard.cohere.ai/api- keys cuando se inicie sesión--model_type groq
--model_name
-el nombre del modelo a acceder a través de la API GroqGROQ_API_KEY
en su clave API Groq, consulte https://console.groq.com/docs/quickstart para obtener detalles sobre la creación de una clave API--model_type ggml
--model_name
-La ruta al modelo GGML que desea cargar, eg /home/leon/llama.cpp/models/7B/ggml-model-q4_0.bin
GGML_MAIN_PATH
en la ruta a su ejecutable main
de GGML rest.RestGenerator
es altamente flexible y puede conectarse a cualquier punto final REST que devuelva el texto sin formato o JSON. Necesita una configuración breve, que generalmente dará como resultado un archivo YAML corto que describe su punto final. Ver https://reference.garak.ai/en/latest/garak.generators.rest.html para ver ejemplos.
Use modelos de https://build.nvidia.com/ u otros puntos finales NIM.
NIM_API_KEY
en su token API de autenticación, o especifíquelo en la configuración YAMLPara modelos de chat:
--model_type nim
--model_name
-El nombre model
NIM, por ejemplo, meta/llama-3.1-8b-instruct
Para modelos de finalización:
--model_type nim.NVOpenAICompletion
--model_name
-El nombre model
NIM, por ejemplo, bigcode/starcoder2-15b
OCTO_API_TOKEN
en su token API replicado, por ejemplo, "R8-123xxxxxxxxxxxxxx"; Consulte https://replicate.com/account/api-tokens cuando se registreOcto punto final público:
--model_type octo
--model_name
-El punto final público de Octoi para el modelo, por ejemplo, mistral-7b-instruct-fp16
Octo punto final privado:
--model_type octo.InferenceEndpoint
(para puntos finales privados)--model_name
-URL de punto final implementado, por ejemplo, https://llama-2-70b-chat-xxx.octoai.run/v1/chat/completions
--model_type test
(alternativamente) --model_name test.Blank
para la prueba. Esto siempre genera la cadena vacía, usando el generador test.Blank
. Se marcará como falla para cualquier prueba que requiera una salida, por ejemplo, aquellas que hacen reclamos contenciosos y esperan que el modelo las refuta para que se aprueben.
--model_type test.Repeat
para la prueba. Este generador repite el mensaje que recibió.
Sonda | Descripción |
---|---|
blanco | Una sonda simple que siempre envía un mensaje vacío. |
atkgen | Generación de ataque automatizado. Un LLM de equipo rojo investiga el objetivo y reacciona a él en un intento de obtener una salida tóxica. Prototype, en su mayoría apátrido, por ahora utiliza un simple GPT-2 ajustado en el subconjunto de intentos de HHRLHF que produjeron toxicidad detectable (el único objetivo actualmente compatible por ahora). |
av_spam_scanning | Sondas que intentan hacer que el modelo salga de firmas de contenido malicioso |
continuación | Sondeas que prueban si el modelo continuará una palabra probablemente indeseable |
dan | Varios ataques de Dan y Dan |
donotanswer | Indicaciones a las que los modelos de idioma responsables no deben responder. |
codificación | Inyección rápida a través de la codificación de texto |
gcg | Interrumpir un indicador del sistema agregando un sufijo adversario. |
fallar | Modelo de sondeo para tokens de falla que provocan un comportamiento inusual. |
abuela | Apelar para que se le recorden a la abuela. |
bueno | Implementaciones de ataques de Riley Goodside. |
juego de fugas | Evalúe si un modelo reproducirá datos de capacitación. |
LMRC | Submuestra de las sondas de tarjetas de riesgo del modelo de idioma |
malware | Intenta que el modelo genere código para construir malware |
engañoso | Intentos de hacer que un modelo respalde reclamos engañosos y falsos |
paquete -allucinación | Intentando obtener generaciones de código que especifiquen paquetes inexistentes (y, por lo tanto, inseguros). |
apuración | Implementación de la agencia Enterprise PremIdEnject Work (Best Paper Awards @ Neurips ML Taller de seguridad 2022) |
REOTOXICITIONPROMPTS | El subconjunto del funcionamiento de la realtoxicidad Prompts (datos limitados porque la prueba completa tardará tanto en ejecutarse) |
bola de nieve | Las sondas de alucinación con bolas de nieve diseñadas para hacer que un modelo dale una respuesta incorrecta a las preguntas demasiado complejas para que se procese |
XSS | Busque vulnerabilidades el permiso o promulgan ataques entre sitios, como la exfiltración de datos privados. |
garak
genera múltiples tipos de registros:
garak.log
. Esto incluye la información de depuración de garak
y sus complementos, y continúa a través de las ejecuciones.garak
. El nombre de este archivo se emite al principio y, si tiene éxito, también al final de la ejecución. En el informe, se realiza una entrada para cada intento de sondeo tanto a medida que se reciben las generaciones, y nuevamente cuando se evalúan; El atributo status
de la entrada toma una constante de garak.attempts
para describir en qué etapa se hizo. Consulte los documentos de referencia para una guía autorizada para la estructura del código garak
.
En una ejecución típica, garak
leerá un tipo de modelo (y opcionalmente el nombre del modelo) desde la línea de comandos, luego determinará qué probe
S y detector
S para ejecutar, iniciar un generator
y luego pasarlos a un harness
para hacer el sondeo; Un evaluator
trata con 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 complementos individuales.
garak/probes/
- clases para generar interacciones con LLMSgarak/detectors/
- Las clases para detectar un LLM exhiben un modo de falla dadogarak/evaluators/
- Esquemas de informes de evaluacióngarak/generators/
- Plugins para sondeargarak/harnesses/
- clases para estructurar pruebasresources/
- Artículos auxiliares requeridos por complementos El modo de operación predeterminado es usar el arnés probewise
. Dada una lista de nombres de módulos de sonda y nombres de complementos de la sonda, el arnés probewise
instancia a cada sonda, entonces para cada sonda lee su atributo recommended_detectors
para obtener una lista de detector
s para ejecutar en la salida.
Cada categoría de complemento ( probes
, detectors
, evaluators
, generators
, harnesses
) incluye una base.py
que define las clases base utilizables por complementos en esa categoría. Cada módulo de complemento define las clases de complementos 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 los archivos de modelos y los corpus más grandes, se mantienen fuera del repositorio; Se pueden almacenar en EG abrazando Face Hub y cargados localmente por clientes que usan garak
.
garak.probes.base.TextProbe
import garak.probes.mymodule
p = garak.probes.mymodule.MyProbe()
python3 -m garak -m test.Blank -p mymodule -d always.Pass
python3 -m garak -m test.Blank -p test.Blank -d mymodule
python3 -m garak -m mymodule -p test.Blank -d always.Pass
garak
enumere todos los complementos del tipo que está escribiendo, con --list_probes
, --list_detectors
o --list_generators
Tenemos una pregunta frecuente aquí. ¡Comuníquese si tiene más preguntas! [email protected]
La documentación de referencia del código se encuentra en Garak.readthedocs.io.
Puedes leer el papel de preimpresión Garak. Si usa Garak, cíquanos.
@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 desea mantener un nivel de excelencia que debe practicar constantemente" - Elim
Para actualizaciones y noticias, consulte @garak_llm
© 2023- Leon Derczynski; Licencia de Apache V2, ver licencia