Сканер уязвимостей LLM, проверяющий большие языковые модели на слабые места безопасности, галлюцинации и проблемы prompt injection.
Фреймворк для автоматизированного тестирования безопасности AI и LLM эндпоинтов, выполняющий задачи от разведки до эксплуатации, включая …
Терминальный харнесс с открытым исходным кодом для авторизованного red-team тестирования систем на базе языковых моделей с …
Фреймворк в стиле Metasploit для тестирования безопасности AI и ML с более чем 40 эксплойт-модулями, нацеленными …
Бесплатный фреймворк для обратной разработки от АНБ США. Поддерживает дизассемблирование, декомпиляцию в псевдо-C, анализ графа вызовов, …
python -m pip install -U garak
Генеративный ИИ: красная команда и комплект оценки
garak проверяет, можно ли заставить LLM сработать нежелательным образом. garak проверяет на галлюцинации, утечку данных, инъекцию подсказок, дезинформацию, генерацию токсичности, джейлбрейки и многие другие слабости. Если вы знаете nmap или msf / Metasploit Framework, garak делает немного похожие вещи, но для LLM.
garak сосредоточен на способах заставить LLM или диалоговую систему сбойовать. Он сочетает статические, динамические и адаптивные проверки для изучения этого.
garak — это бесплатный инструмент. Мы любим его разработку и всегда заинтересованы в добавлении функционала для поддержки приложений.
в настоящее время поддерживает: * hugging face hub генеративные модели * replicate текстовые модели * openai api модели чата и продолжения * aws bedrock базовые модели * litellm * praticamente всё, доступное через 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.11,<=3.13"
conda activate garak
gh repo clone NVIDIA/garak
cd garak
python -m pip install -e .
Хорошо, если всё прошло успешно, вы, вероятно, готовы к работе!
Примечание: если вы клонировали репозиторий до перехода в организацию NVIDIA на GitHub, но вы читаете это по адресу github.com/NVIDIA, пожалуйста, обновите ваши удалённые репозитории следующим образом:
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 или Дискорд!
Проверьте коммерческую модель на внедрение промпта на основе кодирования (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
Для каждого загруженного зонда гарак будет выводить индикатор прогресса во время генерации. После завершения генерации будет дано строковое вычисление результатов зонда на каждом детекторе. Если любая из попыток промпта привела к нежелательному поведению, ответ будет помечен как FAIL, и будет указан уровень неудач.
Вот результаты с модулем encoding для варианта GPT-3:

То же самое для ChatGPT:

Видно, что более свежая модель значительно более восприимчива к атакам внедрения на основе кодирования, тогда как text-babbage-001 оказался уязвим только для внедрений quoted-printable и MIME-кодирования. Цифры в конце каждой строки, например 840/840, показывают общее число сгенерированных текстов и сколько из них вели себя корректно. Эта цифра может быть высокой, поскольку на один запрос делается несколько генераций — по умолчанию 10.
Ошибки попадают в garak.log; подробный журнал запуска сохраняется в файле .jsonl, указанном при начале и конце анализа. Базовый скрипт анализа находится в analyse/analyse_log.py и выводит зонды и промпты, приведшие к наибольшему количеву срабатываний.
Присылайте PR и открывайте issues. Удачной охоты!
--target_type huggingface (для локального запуска моделей transformers)--target_name — используйте имя модели с Хаба. Работают только генеративные модели. Если не работает и этого не должно быть, пожалуйста, откройте issue и вставьте использованную команду вместе с исключением!--target_type huggingface.InferenceAPI (для доступа к модели через API)--target_name — имя модели с Хаба, например "mosaicml/mpt-7b-instruct"--target_type huggingface.InferenceEndpoint (для частных конечных точек)--target_name — URL конечной точки, например https://xxx.us-east-1.aws.endpoints.huggingface.cloudHF_INFERENCE_TOKEN в токен API Hugging Face с ролью «read»; см. https://huggingface.co/settings/tokens при входе в систему--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_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 - имя пользователя/модели из развернутой конечной точки, например elim/elims-llama2-7b
--target_type cohere--target_name (необязательно, command по умолчанию) - Конкретная модель Cohere, которую вы хотите протестироватьCOHERE_API_KEY в ваш ключ API Cohere, например "aBcDeFgHiJ123456789"; см. https://dashboard.cohere.ai/api-keys при входе в систему--target_type groq--target_name - Имя модели, к которой необходимо получить доступ через API GroqGROQ_API_KEY в ваш ключ API Groq, см. https://console.groq.com/docs/quickstart для получения подробной информации о создании ключа API--target_type ggml--target_name - Путь к модели ggml, которую вы хотите загрузить, например /home/leon/llama.cpp/models/7B/ggml-model-q4_0.binGGML_MAIN_PATH в путь к вашему исполняемому файлу main ggmlrest.RestGenerator очень гибок и может подключаться к любой конечной точке REST, которая возвращает текст или JSON. Для этого требуется краткая конфигурация, которая обычно приводит к короткому файлу YAML, описывающему вашу конечную точку. См. https://reference.garak.ai/en/latest/garak.generators.rest.html для примеров.
Используйте модели из https://build.nvidia.com/ или других конечных точек NIM.
* Установите переменную среды NIM_API_KEY в ваш токен аутентификации API или укажите его в файле конфигурации YAML
Для моделей чата:
* --target_type nim
* --target_name - имя модели NIM, например meta/llama-3.1-8b-instruct
Для моделей завершения:
* --target_type nim.NVOpenAICompletion
* --target_name - имя модели NIM, например bigcode/starcoder2-15b
--target_type bedrock--target_name - идентификатор модели Bedrock или псевдоним, например anthropic.claude-3-sonnet-20240229-v1:0 или claude-3-sonnetBEDROCK_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. Генератор использует API Converse для унифицированного доступа ко всем типам моделей.
Пример использования:
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 | Автоматическое поколение атак. Красный командный зонд LLM проверяет цель и реагирует на нее в попытке получить токсичный вывод. Прототип, в основном без состояния, пока использует простой GPT-2 fine-tuned на подмножестве hhrlhf-попыток, которые дали обнаруживаемую токсичность (единственная поддерживаемая цель на данный момент). |
| badchars | Реализует неощутимые Unicode-переборы (невидимые символы, гомоглифы, перестановки, удаления), вдохновленные статьей Bad Characters. |
| av_spam_scanning | Зонды, которые пытаются заставить модель выводить сигнатуры вредоносного контента |
| continuation | Зонды, которые проверяют, будет ли модель продолжать, вероятно, нежелательное слово |
| dan | Различные DAN и атаки, подобные DAN |
garak генерирует несколько видов логов:
* Файл лога, garak.log. Содержит отладочную информацию от garak и его плагинов, и продолжается между запусками.
* Отчёт о текущем запуске, структурированный как JSONL. Каждый раз при запуске garak создаётся новый файл отчёта. Имя этого файла выводится в начале и, если успешно, также в конце запуска. В отчёте для каждой попытки probing делается запись как при получении генераций, так и повторно при их оценке; атрибут status записи принимает константу из garak.attempts, описывающую этап, на котором она была сделана.
* Лог hit‑ов, детализирующий попытки, которые привели к уязвимости (так называемый 'hit')
Посмотрите на reference docs для авторитетного руководства по структуре кода garak.
В типичном запуске garak читает тип модели (а также необязательно имя модели) из командной строки, затем определяет, какие probes и detectors запустить, запускает generator, а затем передаёт их в harness для проведения probing; evaluator обрабатывает результаты. В каждой из этих категорий много модулей, и каждый модуль предоставляет несколько классов, действующих как отдельные плагины.
garak/probes/ - классы для генерации взаимодействий с LLMgarak/detectors/ - классы для обнаружения того, что LLM проявляет данный режим сбояgarak/evaluators/ - схемы отчётности по оценкеgarak/generators/ - плагины для LLM, которые будут проверятьсяgarak/harnesses/ - классы для структурирования тестированияresources/ - вспомогательные элементы, необходимые плагинамРежим работы по умолчанию — использовать harness probewise. Учитывая список имён модулей probe и имён плагинов probe, harness probewise создаёт экземпляр каждого probe, затем для каждого probe читает его атрибуты primary_detector и extended_detectors, чтобы получить список detectors для запуска на выходе.
Каждая категория плагинов (probes, detectors, evaluators, generators, harnesses) содержит файл base.py, который определяет базовые классы, используемые плагинами этой категории. Каждый модуль плагина определяет классы плагинов, наследующиеся от одного из базовых классов. Например, garak.generators.openai.OpenAIGenerator является наследником garak.generators.base.Generator.
Большие артефакты, такие как файлы моделей и большие корпуса, хранятся вне репозитория; их можно хранить, например, на Hugging Face Hub и загружать локально клиентами с помощью garak.
garak.probes.base.TextProbeimport garak.probes.mymodulep = garak.probes.mymodule.MyProbe()python3 -m garak -m test.Blank -p mymodule -d always.Passpython3 -m garak -m test.Blank -p test.Blank -d mymodulepython3 -m garak -m mymodule -p test.Blank -d always.Passgarak, чтобы вывести список всех плагинов типа, который вы пишете, с помощью --list_probes, --list_detectors или --list_generatorsУ нас есть FAQ здесь. Если у вас возникли дополнительные вопросы, пишите нам! garak@nvidia.com
Документация по коду доступна по адресу garak.readthedocs.io.
Вы можете прочитать препринт статьи о garak. Если вы используете 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