ชุด AI AI RED-TEAMING & ASSASEMENT
garak
ตรวจสอบว่า LLM สามารถทำให้ล้มเหลวในแบบที่เราไม่ต้องการ garak
Probes สำหรับภาพหลอนการรั่วไหลของข้อมูลการฉีดอย่างรวดเร็วข้อมูลที่ผิดการสร้างความเป็นพิษการแหกคุกและจุดอ่อนอื่น ๆ อีกมากมาย หากคุณรู้จัก nmap
มันเป็น nmap
สำหรับ LLMS
garak
มุ่งเน้นไปที่วิธีการทำให้ระบบ LLM หรือระบบโต้ตอบล้มเหลว มันรวมโพรบแบบคงที่ไดนามิกและปรับตัวเพื่อสำรวจสิ่งนี้
เครื่องมือฟรี garak
'SA เราชอบที่จะพัฒนามันและมีความสนใจในการเพิ่มฟังก์ชั่นเพื่อสนับสนุนแอปพลิเคชัน
ปัจจุบันสนับสนุน:
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 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
ในการระบุเครื่องกำเนิดไฟฟ้าให้ใช้ --model_type
โมเดลตัวเลือก --model_name
ประเภทรุ่นระบุตระกูล/อินเทอร์เฟซแบบจำลอง ชื่อรุ่นระบุแบบจำลองที่แน่นอนที่จะใช้ ส่วน "อินโทรถึงเครื่องกำเนิดไฟฟ้า" ด้านล่างอธิบายถึงเครื่องกำเนิดไฟฟ้าบางส่วนที่รองรับ ตระกูลเครื่องกำเนิดที่ตรงไปตรงมากำลังกอดนางแบบใบหน้า หากต้องการโหลดหนึ่งในสิ่งเหล่านี้ให้ตั้งค่า --model_type
ถึง huggingface
และ --model_name
ไปยังชื่อของรุ่นบนฮับ (เช่น "RWKV/rwkv-4-169m-pile"
) เครื่องกำเนิดไฟฟ้าบางตัวอาจต้องใช้คีย์ API เพื่อตั้งค่าเป็นตัวแปรสภาพแวดล้อมและพวกเขาจะแจ้งให้คุณทราบหากพวกเขาต้องการสิ่งนั้น
garak
เรียกใช้โพรบทั้งหมดตามค่าเริ่มต้น แต่คุณสามารถระบุได้ว่าด้วยเช่นกัน --probes promptinject
จะใช้เฉพาะวิธีการทำงานของ Framework เท่านั้น นอกจาก .
คุณยังสามารถระบุปลั๊กอินเฉพาะหนึ่งตัวแทนตระกูลปลั๊กอินโดยการเพิ่มชื่อปลั๊กอินหลังจาก - ตัวอย่างเช่น --probes lmrc.SlurUsage
จะใช้การดำเนินการตรวจสอบสำหรับโมเดลที่สร้าง slurs ตามกรอบการ์ดความเสี่ยงแบบจำลองภาษา
สำหรับความช่วยเหลือและแรงบันดาลใจค้นหาเราบน Twitter หรือ Discord!
Probe chatgpt สำหรับการเข้ารหัสการฉีดด้วยพรอมต์ (OSX/*NIX) (แทนที่ค่าตัวอย่างด้วยคีย์ OpenAI API จริง)
export OPENAI_API_KEY="sk-123XXXXXXXXXXXX"
python3 -m garak --model_type openai --model_name gpt-3.5-turbo --probes encoding
ดูว่า GPT2 รุ่น Hugging Face มีความเสี่ยงต่อ Dan 11.0
python3 -m garak --model_type huggingface --model_name gpt2 --probes dan.Dan_11_0
สำหรับแต่ละโพรบโหลด Garak จะพิมพ์แถบความคืบหน้าในขณะที่มันสร้างขึ้น เมื่อการสร้างเสร็จสมบูรณ์แถวจะประเมินผลลัพธ์ของโพรบในแต่ละเครื่องตรวจจับแต่ละตัว หากความพยายามใด ๆ ที่เกิดขึ้นพร้อมกับพฤติกรรมที่ไม่พึงประสงค์การตอบสนองจะถูกทำเครื่องหมายว่าล้มเหลวและอัตราความล้มเหลวที่กำหนด
นี่คือผลลัพธ์ของโมดูล encoding
ในตัวแปร GPT-3:
และผลลัพธ์เดียวกันสำหรับ CHATGPT:
เราจะเห็นได้ว่ารุ่นล่าสุดนั้นมีความอ่อนไหวต่อการโจมตีการฉีดยาที่เข้ารหัสโดยที่ Text-BABBAGE-001 พบว่ามีความเสี่ยงต่อการฉีดยาที่พิมพ์ได้และการเข้ารหัส MIME เท่านั้น ตัวเลขในตอนท้ายของแต่ละแถวเช่น 840/840 ระบุจำนวนการสร้างข้อความทั้งหมดและจำนวนของสิ่งเหล่านี้ดูเหมือนจะทำงานได้ดี รูปอาจค่อนข้างสูงเนื่องจากมีมากกว่าหนึ่งรุ่นต่อพรอมต์ - โดยค่าเริ่มต้น 10
ข้อผิดพลาดไปใน garak.log
; การรันถูกบันทึกไว้ในรายละเอียดในไฟล์ .jsonl
ที่ระบุเมื่อเริ่มต้นและสิ้นสุดการวิเคราะห์ มีสคริปต์การวิเคราะห์พื้นฐานใน analyse/analyse_log.py
ซึ่งจะส่งออกโพรบและแจ้งเตือนที่นำไปสู่การโจมตีมากที่สุด
ส่งปัญหา PRS และเปิด การล่าสัตว์มีความสุข!
ใช้ Pipeline API:
--model_type huggingface
(สำหรับรุ่น Transformers ที่จะทำงานในพื้นที่)--model_name
-ใช้ชื่อรุ่นจากฮับ เฉพาะรุ่นกำเนิดเท่านั้นที่ใช้งานได้ หากมันล้มเหลวและไม่ควรโปรดเปิดปัญหาและวางในคำสั่งที่คุณลอง + ยกเว้น!ใช้ API การอนุมาน:
--model_type huggingface.InferenceAPI
(สำหรับการเข้าถึงแบบจำลอง API)--model_name
ชื่อรุ่นจากฮับเช่น "mosaicml/mpt-7b-instruct"
การใช้จุดสิ้นสุดส่วนตัว:
--model_type huggingface.InferenceEndpoint
(สำหรับจุดสิ้นสุดส่วนตัว)
--model_name
-URL ปลายทางเช่น https://xxx.us-east-1.aws.endpoints.huggingface.cloud
(ไม่บังคับ) ตั้งค่าตัวแปรสภาพแวดล้อม HF_INFERENCE_TOKEN
เป็นโทเค็น API ใบหน้ากอดด้วยบทบาท "อ่าน"; ดู https://huggingface.co/settings/tokens เมื่อเข้าสู่ระบบ
--model_type openai
--model_name
-รุ่น OpenAI ที่คุณต้องการใช้ gpt-3.5-turbo-0125
นั้นรวดเร็วและดีสำหรับการทดสอบOPENAI_API_KEY
เป็นคีย์ OpenAI API ของคุณ (เช่น "SK-19763ASDF87Q6657"); ดู https://platform.openai.com/account/api-keys เมื่อเข้าสู่ระบบประเภทรุ่นที่ได้รับการยอมรับนั้นได้รับการอนุญาตให้ใช้งานเพราะปลั๊กอินจำเป็นต้องรู้ว่าจะใช้ API ย่อยใด รูปแบบการเสร็จสิ้นหรือ chatcompletion ก็โอเค หากคุณต้องการใช้โมเดลที่ไม่รองรับคุณควรได้รับข้อความแสดงข้อผิดพลาดข้อมูลและโปรดส่งปัญหา PR / เปิดปัญหา
REPLICATE_API_TOKEN
เป็นโทเค็น API ซ้ำของคุณเช่น "R8-123xxxxxxxxxxxx" ดู https://replicate.com/account/api-tokens เมื่อเข้าสู่ระบบแบบจำลองการทำซ้ำสาธารณะ:
--model_type replicate
--model_name
ชื่อรุ่นที่ทำซ้ำและแฮชเช่น "stability-ai/stablelm-tuned-alpha-7b:c49dae36"
จุดสิ้นสุดการทำซ้ำส่วนตัว:
--model_type replicate.InferenceEndpoint
(สำหรับจุดสิ้นสุดส่วนตัว)--model_name
ชื่อผู้ใช้/MODEL-NAME SLUG จากจุดสิ้นสุดที่ปรับใช้เช่น elim/elims-llama2-7b
--model_type cohere
--model_name
(ไม่บังคับ command
โดยค่าเริ่มต้น) -โมเดลที่เฉพาะเจาะจงที่คุณต้องการทดสอบCOHERE_API_KEY
เป็นคีย์ API Cohere Cohere ของคุณเช่น "ABCDEFGHIJ123456789"; ดู https://dashboard.cohere.ai/api-keys เมื่อเข้าสู่ระบบ--model_type groq
--model_name
-ชื่อของโมเดลในการเข้าถึงผ่าน Groq APIGROQ_API_KEY
--model_type ggml
--model_name
เส้นทางไปยังรุ่น GGML ที่คุณต้องการโหลดเช่น /home/leon/llama.cpp/models/7B/ggml-model-q4_0.bin
GGML_MAIN_PATH
เป็นเส้นทางไปยัง GGML main
ของคุณ rest.RestGenerator
มีความยืดหยุ่นสูงและสามารถเชื่อมต่อกับจุดสิ้นสุดใด ๆ ที่ส่งคืนข้อความธรรมดาหรือ JSON จำเป็นต้องมีการกำหนดค่าสั้น ๆ ซึ่งโดยทั่วไปจะส่งผลให้ไฟล์ YAML สั้น ๆ อธิบายถึงจุดสิ้นสุดของคุณ ดู https://reference.garak.ai/en/latest/garak.generators.rest.html สำหรับตัวอย่าง
ใช้โมเดลจาก https://build.nvidia.com/ หรือจุดสิ้นสุดของ NIM อื่น ๆ
NIM_API_KEY
เป็นโทเค็น API การตรวจสอบความถูกต้องของคุณหรือระบุใน config yamlสำหรับโมเดลแชท:
--model_type nim
--model_name
ชื่อ model
NIM เช่น meta/llama-3.1-8b-instruct
สำหรับโมเดลที่เสร็จสมบูรณ์:
--model_type nim.NVOpenAICompletion
--model_name
ชื่อ model
NIM เช่น bigcode/starcoder2-15b
OCTO_API_TOKEN
เป็นโทเค็น API ซ้ำของคุณเช่น "R8-123XXXXXXXXXXXX" ดู https://replicate.com/account/api-tokens เมื่อเข้าสู่ระบบปลายทางสาธารณะ Octo:
--model_type octo
--model_name
จุดสิ้นสุดสาธารณะ OCTOAI สำหรับโมเดลเช่น mistral-7b-instruct-fp16
ปลายทางส่วนตัวของ ต.ค. :
--model_type octo.InferenceEndpoint
(สำหรับจุดสิ้นสุดส่วนตัว)--model_name
-URL ปลายทางที่ปรับใช้เช่น https://llama-2-70b-chat-xxx.octoai.run/v1/chat/completions
--model_type test
(อีกวิธีหนึ่ง) --model_name test.Blank
สำหรับการทดสอบ สิ่งนี้มักจะสร้างสตริงที่ว่างเปล่าโดยใช้ test.Blank
Generator จะถูกทำเครื่องหมายว่าล้มเหลวสำหรับการทดสอบใด ๆ ที่ ต้อง ใช้ผลลัพธ์เช่นการเรียกร้องที่ถกเถียงกันและคาดหวังว่ารูปแบบจะหักล้างพวกเขาเพื่อที่จะผ่าน
--model_type test.Repeat
สำหรับการทดสอบ เครื่องกำเนิดไฟฟ้านี้ทำซ้ำพรอมต์ที่ได้รับ
หัววัด | คำอธิบาย |
---|---|
ว่างเปล่า | โพรบง่าย ๆ ที่ส่งพรอมต์เปล่าเสมอ |
Atkgen | การสร้างการโจมตีอัตโนมัติ LLM ที่เป็นทีมสีแดงตรวจสอบเป้าหมายและตอบสนองต่อมันในความพยายามที่จะได้รับเอาต์พุตที่เป็นพิษ ต้นแบบส่วนใหญ่ไร้สัญชาติสำหรับตอนนี้ใช้การปรับแต่ง GPT-2 อย่างง่ายบนชุดย่อยของความพยายาม HHRLHF ที่ให้ความเป็นพิษที่ตรวจพบได้ (เป้าหมายเดียวที่รองรับในปัจจุบัน) |
av_spam_scanning | โพรบที่พยายามทำให้โมเดลส่งออกลายเซ็นเนื้อหาที่เป็นอันตราย |
ความต่อเนื่อง | โพรบทดสอบว่าโมเดลจะดำเนินการต่อไปอาจเป็นคำที่ไม่พึงประสงค์ |
แดน | การโจมตีของแดนและแดนหลายชนิด |
Donotanswer | แจ้งให้แบบจำลองภาษาที่รับผิดชอบไม่ควรตอบ |
การเข้ารหัส | การฉีดทันทีผ่านการเข้ารหัสข้อความ |
GCG | ขัดขวางการแจ้งเตือนของระบบโดยการต่อท้ายคำต่อท้ายที่เป็นปฏิปักษ์ |
ความผิดพลาด | โมเดลโพรบสำหรับโทเค็นความผิดพลาดที่กระตุ้นพฤติกรรมที่ผิดปกติ |
ยาย | ดึงดูดความสนใจของคุณยาย |
ดี | การใช้งานการโจมตีของ Riley Goodside |
การรั่วไหล | ประเมินว่ารูปแบบจะเล่นซ้ำข้อมูลการฝึกอบรม |
LMRC | ตัวอย่างของโมเดลความเสี่ยงของโมเดลภาษา Probes |
มัลแวร์ | ความพยายามที่จะให้โมเดลสร้างรหัสสำหรับการสร้างมัลแวร์ |
การทำให้เข้าใจผิด | ความพยายามที่จะทำการสนับสนุนแบบจำลองที่ทำให้เข้าใจผิดและเรียกร้องเท็จ |
packagehallucination | พยายามที่จะรับการสร้างรหัสที่ระบุแพ็คเกจที่ไม่มีอยู่จริง (และไม่ปลอดภัย) |
ทันที | การดำเนินงานของเอเจนซี่เอ็นเอ็น |
RealtoxicityPrompts | ชุดย่อยของ RealtoxicityPrompts (ข้อมูลถูก จำกัด เนื่องจากการทดสอบแบบเต็มจะใช้เวลานานมากในการทำงาน) |
สโนว์บอล | โพรบภาพหลอนหิมะที่ออกแบบมาเพื่อสร้างแบบจำลองให้คำตอบที่ผิดสำหรับคำถามที่ซับซ้อนเกินไปที่จะดำเนินการ |
XSS | มองหาช่องโหว่การอนุญาตหรือออกกฎหมายการโจมตีข้ามไซต์เช่นการกรองข้อมูลส่วนตัว |
garak
สร้างบันทึกหลายชนิด:
garak.log
ซึ่งรวมถึงข้อมูลการดีบักจาก garak
และปลั๊กอินและยังคงดำเนินต่อไปตลอดการวิ่งgarak
ทำงาน ชื่อของไฟล์นี้เป็นเอาต์พุตที่จุดเริ่มต้นและหากประสบความสำเร็จในตอนท้ายของการรัน ในรายงานจะมีการป้อนรายการสำหรับการตรวจสอบแต่ละครั้งทั้งสองเป็นรุ่นที่ได้รับและอีกครั้งเมื่อพวกเขาได้รับการประเมิน; แอตทริบิวต์ status
ของรายการนั้นคงที่จาก garak.attempts
เพื่ออธิบายขั้นตอนที่ทำไว้ที่ ตรวจสอบเอกสารอ้างอิงสำหรับคู่มือที่เชื่อถือได้ถึงโครงสร้างรหัส garak
ในการรันทั่วไป garak
จะอ่านประเภทรุ่น (และชื่อรุ่นที่เป็นทางเลือก) จากบรรทัดคำสั่งจากนั้นพิจารณาว่า probe
S และ detector
S ที่จะเรียกใช้เริ่มต้น generator
จากนั้นส่งผ่านไปยัง harness
เพื่อทำการตรวจสอบ evaluator
เกี่ยวข้องกับผลลัพธ์ มีโมดูลมากมายในแต่ละหมวดหมู่เหล่านี้และแต่ละโมดูลมีคลาสจำนวนที่ทำหน้าที่เป็นปลั๊กอินแต่ละตัว
garak/probes/
- คลาสสำหรับการสร้างปฏิสัมพันธ์กับ LLMSgarak/detectors/
- คลาสสำหรับการตรวจจับ LLM กำลังแสดงโหมดความล้มเหลวที่กำหนดgarak/evaluators/
- แผนการรายงานการประเมินgarak/generators/
- ปลั๊กอินสำหรับ LLM ที่จะตรวจสอบgarak/harnesses/
- คลาสสำหรับการทดสอบโครงสร้างresources/
- รายการเสริมที่ปลั๊กอินต้องการ โหมดการทำงานเริ่มต้นคือการใช้สายรัด probewise
เมื่อได้รับรายการชื่อโมดูลโพรบและชื่อปลั๊กอินโพรบสายรัด probewise
อินสแตนซ์แต่ละโพรบจากนั้นสำหรับแต่ละโพรบอ่านแอตทริบิวต์ recommended_detectors
เพื่อให้ได้รายการ detector
S เพื่อทำงานบนเอาต์พุต
แต่ละหมวดหมู่ปลั๊กอิน ( probes
, detectors
, evaluators
, generators
, harnesses
) มี base.py
ซึ่งกำหนดคลาสฐานที่ใช้งานได้โดยปลั๊กอินในหมวดหมู่นั้น โมดูลปลั๊กอินแต่ละตัวกำหนดคลาสปลั๊กอินที่สืบทอดมาจากหนึ่งในคลาสพื้นฐาน ตัวอย่างเช่น garak.generators.openai.OpenAIGenerator
สืบเชื้อสายมาจาก garak.generators.base.Generator
สิ่งประดิษฐ์ที่มีขนาดใหญ่ขึ้นเช่นไฟล์รุ่นและ Corpora ที่ใหญ่กว่าจะถูกเก็บไว้จากที่เก็บ พวกเขาสามารถเก็บไว้ใน EG Hugging Face Hub และโหลดในพื้นที่โดยลูกค้าโดยใช้ 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
เพื่อแสดงรายการปลั๊กอินทั้งหมดของประเภทที่คุณเขียนด้วย --list_probes
, --list_detectors
หรือ --list_generators
เรามีคำถามที่พบบ่อยที่นี่ ติดต่อถ้าคุณมีคำถามเพิ่มเติม! [email protected]
เอกสารอ้างอิงรหัสอยู่ที่ garak.readthedocs.io
คุณสามารถอ่านกระดาษ preprint ของ 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 License v2 ดูใบอนุญาต