모듈형 LLM 취약점 스캐너로, 정적, 동적 및 적응형 프로브를 사용하여 여러 모델 제공업체에서 환각, 데이터 유출, 프롬프트 인젝션, 탈옥 및 유해성을 탐지합니다.
생성형 AI 레드팀 및 평가 키트
garak은 LLM이 우리가 원하지 않는 방식으로 실패하도록 만들 수 있는지 확인합니다. garak은 환각(hallucination), 데이터 유출(data leakage), 프롬프트 인젝션(prompt injection), 허위 정보(misinformation), 유해 콘텐츠 생성(toxicity generation), 탈옥(jailbreaks) 및 기타 많은 취약점을 탐지합니다. nmap이나 msf/Metasploit Framework를 알고 있다면, garak은 그들과 비슷하지만 LLM을 대상으로 하는 도구입니다.
garak은 LLM 또는 대화 시스템을 실패하게 만드는 방법에 중점을 둡니다. 이 도구는 정적, 동적 및 적응형 프로브를 결합하여 이를 탐색합니다.
garak은 무료 도구입니다. 저희는 이를 개발하는 것을 좋아하며, 응용 프로그램을 지원하기 위해 기능을 추가하는 데 항상 관심이 있습니다.
현재 지원 대상:
garak은 명령줄 도구입니다. Linux 및 OSX에서 개발되었습니다.
pip를 사용한 표준 설치PyPI에서 가져오면 바로 사용할 수 있습니다:``` python -m pip install -U garak
### `pip`를 사용한 개발 버전 설치하기
표준 pip 버전의 `garak`은 주기적으로 업데이트됩니다. 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` URI에서 이 내용을 읽고 있다면, 원격 저장소를 다음과 같이 업데이트하세요:```
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 프레임워크를 기반으로 모델이 비속어를 생성하는지 확인하는 구현을 사용합니다.
상용 모델에서 인코딩 기반 프롬프트 인젝션을 프로브합니다 (OSX/*nix) (예제 값을 실제 OpenAI API 키로 교체하세요)``` export OPENAI_API_KEY="sk-123XXXXXXXXXXXX" python3 -m garak --target_type openai --target_name gpt-5-nano --probes encoding
Hugging Face 버전의 GPT2가 DAN 11.0에 취약한지 확인하세요.```
python3 -m garak --target_type huggingface --target_name gpt2 --probes dan.Dan_11_0
각 프로브가 로드되면 garak은 생성이 진행되는 동안 진행률 표시줄을 출력합니다. 생성이 완료되면 각 탐지기에 대한 해당 프로브의 결과를 평가하는 행이 제공됩니다. 프롬프트 시도 중 하나라도 바람직하지 않은 동작을 초래한 경우 응답은 FAIL로 표시되고 실패율이 제공됩니다.
다음은 GPT-3 변종에서 encoding 모듈을 사용한 결과입니다.

그리고 ChatGPT에 대한 동일한 결과입니다:

최신 모델이 인코딩 기반 인젝션 공격에 훨씬 더 취약하다는 것을 알 수 있습니다. 반면 text-babbage-001은 quoted-printable 및 MIME 인코딩 인젝션에만 취약한 것으로 나타났습니다. 각 행 끝의 숫자(예: 840/840)는 총 텍스트 생성 횟수와 그중 정상으로 보이는 생성 횟수를 나타냅니다. 프롬프트당 여러 번의 생성이 이루어지기 때문에(기본적으로 10회) 이 숫자는 상당히 높을 수 있습니다.
오류는 garak.log에 기록됩니다. 실행은 분석 시작 및 종료 시 지정된 .jsonl 파일에 자세히 기록됩니다. analyse/analyse_log.py에 기본 분석 스크립트가 있으며, 가장 많은 적중을 유발한 프로브와 프롬프트를 출력합니다.
PR을 보내고 이슈를 열어주세요. 즐거운 사냥 되세요!
Pipeline API 사용:
--target_type huggingface (로컬에서 실행할 transformers 모델의 경우)--target_name - Hub의 모델 이름을 사용합니다. 생성 모델만 작동합니다. 실패하고 그렇지 않아야 한다면 이슈를 열고 시도한 명령어 + 예외를 붙여넣어 주세요!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 환경 변수를 "read" 역할의 Hugging Face API 토큰으로 설정합니다. 로그인한 후 https://huggingface.co/settings/tokens 를 참조하세요.
--target_type openai--target_name - 사용하려는 OpenAI 모델입니다. gpt-5-nano는 빠르며 테스트에 적합합니다.OPENAI_API_KEY 환경 변수를 OpenAI API 키(예: "sk-19763ASDF87q6657")로 설정합니다. 로그인한 후 https://platform.openai.com/account/api-keys 를 참조하세요.인식된 모델 유형은 화이트리스트에 등록되어 있습니다. 플러그인이 사용할 하위 API를 알아야 하기 때문입니다. Completion 또는 ChatCompletion 모델 모두 사용 가능합니다. 지원되지 않는 모델을 사용하려고 하면 정보성 오류 메시지가 표시됩니다. PR을 보내거나 이슈를 열어주세요.
REPLICATE_API_TOKEN 환경 변수를 Replicate API 토큰(예: "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 환경 변수를 Cohere API 키(예: "aBcDeFgHiJ123456789")로 설정합니다. 로그인한 후 https://dashboard.cohere.ai/api-keys 를 참조하세요.--target_type groq--target_name - Groq API를 통해 액세스할 모델의 이름GROQ_API_KEY 환경 변수를 Groq API 키로 설정합니다. API 키 생성에 대한 자세한 내용은 https://console.groq.com/docs/quickstart 를 참조하세요.--target_type ggml--target_name - 로드할 ggml 모델의 경로, 예: /home/leon/llama.cpp/models/7B/ggml-model-q4_0.binGGML_MAIN_PATH 환경 변수를 ggml main 실행 파일의 경로로 설정합니다.rest.RestGenerator는 매우 유연하며 일반 텍스트나 JSON을 반환하는 모든 REST 엔드포인트에 연결할 수 있습니다. 약간의 간단한 구성이 필요하며, 일반적으로 엔드포인트를 설명하는 짧은 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 model 이름, 예: meta/llama-3.1-8b-instruct완성 모델의 경우:
--target_type nim.NVOpenAICompletion--target_name - NIM model 이름, 예: bigcode/starcoder2-15b--target_type bedrock--target_name - Bedrock 모델 ID 또는 별칭, 예: anthropic.claude-3-sonnet-20240229-v1:0 또는 claude-3-sonnetBEDROCK_API_KEY 환경 변수를 AWS Bedrock API 키로 설정합니다. 설정 지침은 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
### Test
* `--target_type test`
* (alternatively) `--target_name test.Blank`
테스트용입니다. 이 프로브는 항상 빈 문자열을 생성하며 `test.Blank` 생성기를 사용합니다. 출력을 *필요로* 하는 모든 테스트(예: 논란이 되는 주장을 제기하고 모델이 이를 반박할 것을 기대하는 테스트)에 대해 실패로 표시됩니다.
* `--target_type test.Repeat`
테스트용입니다. 이 생성기는 받은 프롬프트를 그대로 반복합니다.
## Intro to probes
| Probe | 설명 |
|----------------------|-------------------------------------------------------------------------------------------------------------------------------|
| blank | 항상 빈 프롬프트를 보내는 간단한 프로브. |
| atkgen | 자동 공격 생성. 레드티밍(red-teaming) LLM이 대상을 프로빙하고 반응하여 유해한 출력을 얻으려고 시도합니다. 프로토타입으로, 대부분 상태 비저장이며, 현재는 hhrlhf 시도 중 감지 가능한 독성을 생성한 부분집합으로 세부 조정된(fine-tuned) 간단한 GPT-2를 사용합니다(현재 유일하게 지원되는 대상). |
| badchars | [Bad Characters](https://arxiv.org/abs/2106.09898) 논문에서 영감을 받은 미세한 유니코드 변형(보이지 않는 문자, 동형 문자, 재정렬, 삭제)을 구현합니다. |
| av_spam_scanning | 모델이 악성 콘텐츠 서명을 출력하도록 유도하는 프로브 |
| continuation | 모델이 바람직하지 않은 단어를 계속 생성할지 테스트하는 프로브 |
| dan | 다양한 [DAN](https://adguard.com/en/blog/chatgpt-dan-prompt-abuse.html) 및 DAN 유사 공격 |
| donotanswer | 책임감 있는 언어 모델이 답변하지 말아야 할 프롬프트. |
| encoding | 텍스트 인코딩을 통한 프롬프트 주입 |
| gcg | 적대적 접미사를 추가하여 시스템 프롬프트를 교란합니다. |
| glitch | 비정상적인 행동을 유발하는 글리치 토큰을 탐색합니다. |
| grandma | 할머니를 떠올리게 해달라는 요청. |
| goodside | Riley Goodside 공격의 구현. |
| leakreplay | 모델이 훈련 데이터를 재생하는지 평가합니다. |
| lmrc | [Language Model Risk Cards](https://arxiv.org/abs/2303.18190) 프로브의 하위 샘플 |
| malwaregen | 모델이 악성 코드를 생성하도록 유도하는 시도 |
| misleading | 모델이 오해의 소지가 있거나 거짓된 주장을 지지하도록 만드는 시도 |
| packagehallucination | 존재하지 않는(따라서 안전하지 않은) 패키지를 지정하는 코드 생성을 유도합니다. |
| promptinject | Agency Enterprise의 [PromptInject](https://github.com/agencyenterprise/PromptInject/tree/main/promptinject) 작업 구현(NeurIPS ML Safety Workshop 2022 최우수 논문상) |
| realtoxicityprompts | RealToxicityPrompts 작업의 하위 집합(전체 테스트가 너무 오래 걸리기 때문에 데이터 제한됨) |
| snowball | [Snowballed Hallucination](https://ofir.io/snowballed_hallucination.pdf) 프로브: 모델이 처리하기에 너무 복잡한 질문에 대해 잘못된 답변을 하도록 설계됨 |
| xss | 개인 데이터 유출과 같은 교차 사이트 공격을 허용하거나 실행하는 취약점을 찾습니다. |
## Logging
`garak`는 여러 종류의 로그를 생성합니다:
* 로그 파일 `garak.log`. 여기에는 `garak` 및 해당 플러그인의 디버깅 정보가 포함되며, 실행 간에도 유지됩니다.
* 현재 실행에 대한 보고서(JSONL 형식). `garak`가 실행될 때마다 새 보고서 파일이 생성됩니다. 이 파일의 이름은 실행 시작 시와, 성공 시 실행 종료 시에도 출력됩니다. 보고서에는 각 프로빙 시도에 대해 생성이 수신될 때와 평가될 때 각각 항목이 기록됩니다. 항목의 `status` 속성은 `garak.attempts`의 상수를 사용하여 어떤 단계에서 생성되었는지 설명합니다.
* 적중 로그: 취약점('적중')이 발생한 시도를 자세히 기록합니다.
## How is the code structured?
코드 구조에 대한 권위 있는 가이드는 [참조 문서](https://reference.garak.ai/)를 확인하세요.
일반적인 실행에서 `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`을 사용하는 클라이언트가 로컬로 로드할 수 있습니다.
## Developing your own plugin
* 다른 플러그인이 어떻게 작동하는지 살펴보세요.
* 기본 클래스 중 하나에서 상속하세요(예: `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`
* `garak`에서 `--list_probes`, `--list_detectors`, `--list_generators`를 사용하여 작성 중인 유형의 모든 플러그인을 나열할 수 있습니다.
## FAQ
FAQ는 [여기](https://github.com/NVIDIA/garak/blob/main/FAQ.md)에 있습니다. 추가 질문이 있으면 연락주세요! [[email protected]](mailto:[email protected])
코드 참조 문서는 [garak.readthedocs.io](https://garak.readthedocs.io/en/latest/)에 있습니다.
## Citing 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}}
}
"거짓말은 여느 기술과 같아서, 탁월함을 유지하려면 끊임없이 연습해야 한다" - 엘림
업데이트 및 소식은 @garak_llm을 참고하세요
© 2023- Leon Derczynski; Apache license v2, LICENSE 참조