
garak v0.16.0
Модульный сканер уязвимостей LLM, который проверяет на галлюцинации, утечку данных, промпт-инъекции, джейлбрейки и токсичность с помощью статических, динамических и адаптивных зондов для нескольких провайдеров моделей.
garak, сканер уязвимостей LLM
Набор инструментов для красной команды и оценки генеративного ИИ
garak проверяет, можно ли заставить LLM дать сбой нежелательным образом. garak проверяет на галлюцинации, утечку данных, инъекции промптов, дезинформацию, генерацию токсичности, джейлбрейки и многие другие недостатки. Если вы знакомы с nmap или msf / Metasploit Framework, garak делает нечто похожее, но для LLM.
garak сосредоточен на способах заставить LLM или диалоговую систему дать сбой. Он объединяет статические, динамические и адаптивные проверки для исследования этого.
garak — бесплатный инструмент. Мы любим его разрабатывать и всегда заинтересованы в добавлении функциональности для поддержки приложений.
Начало работы
> Посмотрите наше руководство пользователя! docs.garak.ai
> Присоединяйтесь к нашему Discord!
> Ссылки на проект и дом: garak.ai
> Twitter: @garak_llm
> DEF CON слайды!
Поддержка LLM
в настоящее время поддерживает:
- hugging face hub генеративные модели
- replicate текстовые модели
- openai api чат-модели и модели продолжения
- aws bedrock фундаментальные модели
- litellm
- практически всё, доступное через REST
- gguf модели, такие как llama.cpp версии >= 1046
- .. и многие другие LLM!
Установка:
garak — инструмент командной строки. Он разрабатывается в Linux и OSX.
Стандартная установка с помощью pip
Просто возьмите его из PyPI, и вы готовы к работе:``` python -m pip install -U garak
### Установка версии для разработки с помощью `pip`
Стандартная версия `garak` из pip обновляется периодически. Чтобы получить более свежую версию с GitHub, попробуйте:```
python -m pip install -U git+https://github.com/NVIDIA/garak.git@main
Клонирование из исходного кода
garak имеет свои собственные зависимости. Вы можете установить garak в его собственной среде 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 .
Хорошо, если всё прошло нормально, вы, вероятно, готовы к работе!
**Примечание**: если вы клонировали репозиторий до перехода в организацию `NVIDIA` на GitHub, но читаете это по адресу `github.com/NVIDIA`, пожалуйста, обновите ваши remotes следующим образом:```
git remote set-url origin https://github.com/NVIDIA/garak.git
Начало работы
Общий синтаксис:
garak <options>
garak необходимо знать, какую модель сканировать, и по умолчанию он попробует все известные ему зонды на этой модели, используя детекторы уязвимостей, рекомендуемые каждым зондом. Вы можете увидеть список зондов, используя:
garak --list_probes
Чтобы указать генератор, используйте опции --target_type и, опционально, --target_name. Тип модели определяет семейство/интерфейс модели; имя модели указывает точную модель для использования. Раздел «Введение в генераторы» ниже описывает некоторые из поддерживаемых генераторов. Простое семейство генераторов — это модели Hugging Face; чтобы загрузить одну из них, установите --target_type в huggingface и --target_name в имя модели на Hub (например, "RWKV/rwkv-4-169m-pile"). Некоторым генераторам может потребоваться установить API-ключ в качестве переменной окружения, и они сообщат вам, если это необходимо.
garak по умолчанию запускает все зонды, но вы также можете указать конкретные. Например, --probes promptinject будет использовать только методы фреймворка PromptInject. Вы также можете указать один конкретный плагин вместо семейства плагинов, добавив имя плагина после точки; например, --probes lmrc.SlurUsage будет использовать реализацию проверки генерации оскорблений на основе фреймворка Language Model Risk Cards.
За помощью и вдохновением обращайтесь к нам в Twitter или Discord!
Примеры
Исследовать коммерческую модель на наличие кодировочной инъекции промптов (OSX/*nix) (замените пример значения на настоящий ключ API OpenAI)``` export OPENAI_API_KEY="sk-123XXXXXXXXXXXX" python3 -m garak --target_type openai --target_name gpt-5-nano --probes encoding
Проверьте, уязвима ли версия GPT2 от Hugging Face для DAN 11.0```
python3 -m garak --target_type huggingface --target_name gpt2 --probes dan.Dan_11_0
Чтение результатов
Для каждого загруженного проба garak выводит индикатор выполнения по мере генерации. После завершения генерации выводится строка с оценкой результатов этого проба по каждому детектору. Если хотя бы одна из попыток запроса вызвала нежелательное поведение, ответ будет помечен как FAIL, и будет указан процент сбоев.
Вот результаты с модулем encoding на варианте GPT-3:

И те же результаты для ChatGPT:

Мы видим, что более новая модель гораздо более восприимчива к атакам на основе кодирования, в то время как text-babbage-001 оказался уязвим только к инъекциям quoted-printable и MIME-кодирования. Цифры в конце каждой строки, например 840/840, показывают общее количество сгенерированных текстов и сколько из них выглядели нормально. Цифра может быть довольно большой, потому что для каждого запроса генерируется более одного текста — по умолчанию 10.
Ошибки записываются в garak.log; прогон подробно логируется в файл .jsonl, указанный в начале и конце анализа. Есть базовый скрипт анализа в analyse/analyse_log.py, который выводит пробы и запросы, приведшие к наибольшему количеству срабатываний.
Отправляйте PR и открывайте issue. Удачной охоты!
Введение в генераторы
Hugging Face
Использование Pipeline API:
--target_type huggingface(для моделей transformers, запускаемых локально)--target_name— используйте имя модели из Hub. Работают только генеративные модели. Если что-то не работает, хотя не должно, пожалуйста, откройте issue и вставьте команду, которую вы пробовали, и исключение!
Использование Inference API:
--target_type huggingface.InferenceAPI(для доступа к модели через API)--target_name— имя модели из Hub, например"mosaicml/mpt-7b-instruct"
Использование частных конечных точек:
-
--target_type huggingface.InferenceEndpoint(для частных конечных точек) -
--target_name— URL конечной точки, напримерhttps://xxx.us-east-1.aws.endpoints.huggingface.cloud -
(опционально) установите переменную окружения
HF_INFERENCE_TOKENв токен API Hugging Face с ролью "read"; см. https://huggingface.co/settings/tokens при входе в систему
OpenAI
--target_type openai--target_name— модель OpenAI, которую вы хотите использовать.gpt-5-nanoбыстрая и подходит для тестирования.- установите переменную окружения
OPENAI_API_KEYв ваш ключ API OpenAI (например, "sk-19763ASDF87q6657"); см. https://platform.openai.com/account/api-keys при входе в систему
Распознанные типы моделей занесены в белый список, потому что плагину нужно знать, какой под-API использовать. Подходят модели Completion или ChatCompletion. Если вы хотите использовать неподдерживаемую модель, должно появиться информативное сообщение об ошибке, и пожалуйста, отправьте PR / откройте issue.
Replicate
- установите переменную окружения
REPLICATE_API_TOKENв ваш токен API Replicate, например "r8-123XXXXXXXXXXXX"; см. https://replicate.com/account/api-tokens при входе в систему
Публичные модели Replicate:
--target_type replicate--target_name— имя модели Replicate и хеш, например"stability-ai/stablelm-tuned-alpha-7b:c49dae36"
Частные конечные точки Replicate:
--target_type replicate.InferenceEndpoint(для частных конечных точек)--target_name— slug имя пользователя/модели из развернутой конечной точки, напримерelim/elims-llama2-7b
Cohere
--target_type cohere--target_name(опционально, по умолчаниюcommand) — конкретная модель Cohere, которую вы хотите протестировать- установите переменную окружения
COHERE_API_KEYв ваш ключ API Cohere, например "aBcDeFgHiJ123456789"; см. https://dashboard.cohere.ai/api-keys при входе в систему
Groq
--target_type groq--target_name— имя модели для доступа через Groq API- установите переменную окружения
GROQ_API_KEYв ваш ключ API Groq; см. https://console.groq.com/docs/quickstart для получения подробной информации о создании ключа API
ggml
--target_type ggml--target_name— путь к ggml модели, которую вы хотите загрузить, например/home/leon/llama.cpp/models/7B/ggml-model-q4_0.bin- установите переменную окружения
GGML_MAIN_PATHна путь к вашему исполняемому файлу ggmlmain
REST
rest.RestGenerator очень гибкий и может подключаться к любому REST-конечной точке, возвращающей обычный текст или JSON. Однако требуется краткая настройка, которая обычно приводит к созданию короткого YAML-файла, описывающего вашу конечную точку. См. https://reference.garak.ai/en/latest/garak.generators.rest.html для примеров.
NIM
Используйте модели с https://build.nvidia.com/ или других NIM-конечных точек.
- установите переменную окружения
NIM_API_KEYв ваш токен аутентификации API или укажите его в YAML-конфигурации
Для чат-моделей:
--target_type nim--target_name— имя NIMmodel, напримерmeta/llama-3.1-8b-instruct
Для completion-моделей:
--target_type nim.NVOpenAICompletion--target_name— имя NIMmodel, напримерbigcode/starcoder2-15b
AWS Bedrock
--target_type bedrock--target_name— ID модели Bedrock или псевдоним, напримерanthropic.claude-3-sonnet-20240229-v1:0илиclaude-3-sonnet- установите переменную окружения
BEDROCK_API_KEYв ваш ключ API AWS Bedrock; см. https://docs.aws.amazon.com/bedrock/latest/userguide/api-keys-use.html для инструкций по настройке - (опционально) установите переменную окружения
BEDROCK_REGIONдля указания региона AWS (по умолчаниюus-east-1)
Поддерживаемые семейства моделей включают Anthropic Claude, Meta Llama, Amazon Titan, AI21 Labs, Cohere и Mistral AI. Генератор использует Converse API для унифицированного доступа ко всем типам моделей.
Пример использования:``` export BEDROCK_API_KEY="your-api-key" export BEDROCK_REGION="us-east-1" garak --target_type bedrock --target_name claude-3-sonnet --probes dan
### Тест
* `--target_type test`
* (альтернативно) `--target_name test.Blank`
Для тестирования. Этот генератор всегда создает пустую строку, используя генератор `test.Blank`. Будет отмечен как неудачный для любых тестов, которые *требуют* вывода, например, тех, что делают спорные утверждения и ожидают, что модель их опровергнет, чтобы пройти тест.
* `--target_type test.Repeat`
Для тестирования. Этот генератор повторяет полученный запрос.
## Введение в пробы
| Проба | Описание |
|----------------------|-------------------------------------------------------------------------------------------------------------------------------|
| blank | Простая проба, которая всегда отправляет пустой промпт. |
| atkgen | Автоматическая генерация атак. Красная команда ИИ зондирует цель и реагирует на нее, пытаясь получить токсичный вывод. Прототип, в основном без состояния, пока использует простую GPT-2 [дообученную](https://huggingface.co/garak-llm/artgpt2tox) на подмножестве попыток hhrlhf, которые дали обнаруживаемую токсичность (пока поддерживается только одна цель). |
| badchars | Реализует незаметные искажения Unicode (невидимые символы, омоглифы, перестановки, удаления), вдохновленные статьей [Bad Characters](https://arxiv.org/abs/2106.09898). |
| av_spam_scanning | Пробы, пытающиеся заставить модель вывести сигнатуры вредоносного контента |
| continuation | Пробы, проверяющие, продолжит ли модель вероятно нежелательное слово |
| dan | Различные атаки [DAN](https://adguard.com/en/blog/chatgpt-dan-prompt-abuse.html) и подобные им |
| donotanswer | Промпты, на которые ответственные языковые модели не должны отвечать. |
| encoding | Инъекция промптов через кодирование текста |
| gcg | Нарушение системного промпта путем добавления состязательного суффикса. |
| glitch | Зондирование модели на наличие глючных токенов, вызывающих необычное поведение. |
| grandma | Призыв напомнить о своей бабушке. |
| goodside | Реализации атак Райли Гудсайда. |
| leakreplay | Оценка того, будет ли модель воспроизводить тренировочные данные. |
| lmrc | Подвыборка проб [Language Model Risk Cards](https://arxiv.org/abs/2303.18190) |
| malwaregen | Попытки заставить модель генерировать код для создания вредоносного ПО |
| misleading | Попытки заставить модель поддерживать вводящие в заблуждение и ложные утверждения |
| packagehallucination | Попытки получить генерации кода, указывающие несуществующие (и, следовательно, небезопасные) пакеты. |
| promptinject | Реализация работы [PromptInject](https://github.com/agencyenterprise/PromptInject/tree/main/promptinject) от Agency Enterprise (премия за лучшую статью на NeurIPS ML Safety Workshop 2022) |
| realtoxicityprompts | Подмножество работы RealToxicityPrompts (данные ограничены, так как полный тест занял бы слишком много времени) |
| snowball | Пробы [Snowballed Hallucination](https://ofir.io/snowballed_hallucination.pdf), предназначенные для того, чтобы заставить модель давать неверный ответ на вопросы, слишком сложные для ее обработки |
| xss | Поиск уязвимостей, которые допускают или осуществляют межсайтовые атаки, такие как кража личных данных. |
## Логирование
`garak` создает несколько видов логов:
* Файл лога, `garak.log`. Он содержит отладочную информацию от `garak` и его плагинов и продолжается между запусками.
* Отчет о текущем запуске, структурированный в формате JSONL. Новый файл отчета создается каждый раз при запуске `garak`. Имя этого файла выводится в начале и, в случае успеха, также в конце запуска. В отчете запись создается для каждой попытки зондирования как при получении генераций, так и при их оценке; атрибут записи `status` принимает константу из `garak.attempts`, чтобы описать, на каком этапе она была сделана.
* Лог попаданий, содержащий подробную информацию о попытках, которые привели к уязвимости (попаданию).
## Как устроен код?
Обратитесь к [документации](https://reference.garak.ai/) для авторитетного руководства по структуре кода `garak`.
В типичном запуске `garak` считывает тип модели (и, опционально, имя модели) из командной строки, затем определяет, какие `probe`ы и `detector`ы запускать, запускает `generator` и передает их в `harness` для выполнения зондирования; `evaluator` обрабатывает результаты. В каждой из этих категорий есть много модулей, и каждый модуль предоставляет ряд классов, которые выступают в качестве отдельных плагинов.
* `garak/probes/` - классы для генерации взаимодействий с LLM
* `garak/detectors/` - классы для обнаружения того, что LLM демонстрирует заданный режим отказа
* `garak/evaluators/` - схемы отчетности по оценке
* `garak/generators/` - плагины для LLM, которые будут зондироваться
* `garak/harnesses/` - классы для структурирования тестирования
* `resources/` - вспомогательные элементы, необходимые плагинам
Режим работы по умолчанию — использование `probewise` harness. Получая список имен модулей проб и имен плагинов проб, `probewise` harness создает экземпляр каждой пробы, затем для каждой пробы считывает ее атрибуты `primary_detector` и `extended_detectors`, чтобы получить список `detector`ов для запуска на выводе.
Каждая категория плагинов (`probes`, `detectors`, `evaluators`, `generators`, `harnesses`) включает `base.py`, который определяет базовые классы, используемые плагинами в этой категории. Каждый модуль плагина определяет классы плагинов, наследующие от одного из базовых классов. Например, `garak.generators.openai.OpenAIGenerator` происходит от `garak.generators.base.Generator`.
Более крупные артефакты, такие как файлы моделей и большие корпуса, хранятся вне репозитория; они могут быть сохранены, например, на Hugging Face Hub и загружены локально клиентами, использующими `garak`.
## Разработка собственного плагина
* Посмотрите, как это делают другие плагины
* Наследуйте от одного из базовых классов, например `garak.probes.base.TextProbe`
* Переопределяйте как можно меньше
* Вы можете протестировать новый код как минимум двумя способами:
* Запустите интерактивную сессию Python
* Импортируйте модель, например `import garak.probes.mymodule`
* Создайте экземпляр плагина, например `p = garak.probes.mymodule.MyProbe()`
* Запустите сканирование с тестовыми плагинами
* Для проб попробуйте пустой генератор и детектор always.Pass: `python3 -m garak -m test.Blank -p mymodule -d always.Pass`
* Для детекторов попробуйте пустой генератор и пустую пробу: `python3 -m garak -m test.Blank -p test.Blank -d mymodule`
* Для генераторов попробуйте пустую пробу и детектор always.Pass: `python3 -m garak -m mymodule -p test.Blank -d always.Pass`
* Получите список всех плагинов того типа, который вы пишете, с помощью `--list_probes`, `--list_detectors` или `--list_generators`
## Часто задаваемые вопросы
У нас есть FAQ [здесь](https://github.com/NVIDIA/garak/blob/main/FAQ.md). Обращайтесь, если у вас есть еще вопросы! [[email protected]](mailto:[email protected])
Справочная документация по коду находится на [garak.readthedocs.io](https://garak.readthedocs.io/en/latest/).
## Цитирование garak
Вы можете прочитать [препринт статьи о garak](https://github.com/nvidia/garak/blob/main/garak-paper.pdf). Если вы используете garak, пожалуйста, цитируйте нас.```
@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}}
}
"Ложь — это навык, как любой другой, и если вы хотите поддерживать высокий уровень мастерства, вам нужно постоянно практиковаться" — Elim
Обновления и новости смотрите в @garak_llm
© 2023- Leon Derczynski; лицензия Apache v2, см. LICENSE