นี่คือที่เก็บรหัสที่มาพร้อมกับกระซิบกระดาษของเราในเครื่อง: การรักษาความลับในระบบที่รวมเข้าด้วยกัน LLM
โมเดลภาษาขนาดใหญ่ (LLMS) ได้รับการเสริมด้วยเครื่องมือภายนอกและบริการเชิงพาณิชย์ใน ระบบ LLM แบบบูรณาการ ในขณะที่อินเทอร์เฟซเหล่านี้สามารถเพิ่มความสามารถของโมเดลได้อย่างมีนัยสำคัญพวกเขายังแนะนำพื้นผิวการโจมตีใหม่ ยกตัวอย่างเช่นการรวมเข้าด้วยกันสามารถใช้ประโยชน์จากโมเดลและประนีประนอมข้อมูลที่ละเอียดอ่อนที่เข้าถึงได้ผ่านอินเทอร์เฟซอื่น ๆ ในขณะที่งานก่อนหน้านี้มุ่งเน้นไปที่การโจมตีที่กำหนดเป้าหมายการจัดตำแหน่งของโมเดลหรือการรั่วไหลของข้อมูลการฝึกอบรมความปลอดภัยของข้อมูลที่ มีให้เฉพาะในระหว่างการอนุมาน ได้หลบหนีการตรวจสอบ ในงานนี้เราแสดงให้เห็นถึงช่องโหว่ที่เกี่ยวข้องกับส่วนประกอบภายนอกและแนะนำวิธีการที่เป็นระบบในการประเมินความเสี่ยงการรักษาความลับในระบบ LLM แบบบูรณาการ เราระบุสถานการณ์การโจมตีที่เฉพาะเจาะจงหลายอย่างที่ไม่ซ้ำกับระบบเหล่านี้และทำให้เป็นทางการสิ่งเหล่านี้เป็นกรอบ การใช้เครื่องมือ ที่ออกแบบมาเพื่อวัดความสามารถของแบบจำลองในการปกป้องข้อมูลที่ละเอียดอ่อน เฟรมเวิร์กนี้ช่วยให้เราสามารถประเมินช่องโหว่ของโมเดลต่อการโจมตีการรักษาความลับ การค้นพบของเราแสดงให้เห็นว่าแบบจำลองที่ตรวจสอบทั้งหมดมีความเสี่ยงสูงต่อการโจมตีด้วยความเสี่ยงที่เพิ่มขึ้นอย่างมีนัยสำคัญเมื่อใช้แบบจำลองร่วมกับเครื่องมือภายนอก
หากคุณต้องการอ้างอิงงานของเราโปรดใช้รายการ Bibtex นี้
คำเตือน
ฮาร์ดแวร์ aceleration ได้รับการสนับสนุนอย่างเต็มที่สำหรับเครื่อง CUDA ที่ใช้ Linux สมาชิกสภาผู้แทนราษฎรบน MacOS ควรใช้งานได้บ้าง แต่ Windows กับ Cuda อาจประสบปัญหาบางอย่าง
ก่อนเรียกใช้รหัสให้ติดตั้งข้อกำหนด:
python -m pip install --upgrade -r requirements.txt
หากคุณต้องการใช้โมเดลที่โฮสต์โดย OpenAI หรือ HuggingFace ให้สร้างทั้งไฟล์ key.txt
ที่มีคีย์ OpenAI API ของคุณรวมถึงไฟล์ hf_token.txt
ที่มีโทเค็น HuggingFace ของคุณสำหรับ repos ส่วนตัว (เช่น Llama2) ในไดเรกทอรีรูท โครงการ.
บางครั้งอาจจำเป็นต้องเข้าสู่บัญชี HuggingFace ของคุณผ่าน CLI:
git config --global credential.helper store
huggingface-cli login
สคริปต์ทั้งหมดสามารถทำงานกับ GPU/CPU หลายตัวโดยใช้ไลบรารีเร่งความเร็ว ในการทำเช่นนั้นวิ่ง:
accelerate config
ในการกำหนดค่าความสามารถในการฝึกอบรมแบบกระจายของระบบของคุณและเริ่มสคริปต์ด้วย:
accelerate launch [parameters] <script.py> [script parameters]
python attack . py - - strategy "tools" - - scenario "CalendarWithCloud" - - attacks "payload_splitting" "obfuscation" - - defense "xml_tagging" - - iterations 15 - - llm_type "llama3-70b" - - temperature 0.7 - - device cuda - - prompt_format "react"
จะเรียกใช้การโจมตี payload_splitting
และ obfuscation
กับ LLM llama3-70b
ใน CalendarWithCloud
สถานการณ์โดยใช้การป้องกัน xml_tagging
สำหรับการวนซ้ำ 15 ครั้งที่มีอุณหภูมิ 0.7 บนอุปกรณ์ CUDA โดยใช้รูปแบบการตอบสนอง
การโต้แย้ง | พิมพ์ | ค่าเริ่มต้น | คำอธิบาย |
---|---|---|---|
-h, --help | - | - | แสดงข้อความความช่วยเหลือนี้และออก |
-a, --attacks | รายการ [STR] | payload_splitting | ระบุการโจมตีที่จะใช้กับ LLM |
-d, --defense | str | None | ระบุการป้องกันสำหรับ LLM |
-llm, --llm_type | str | gpt-3.5-turbo | ระบุประเภทของคู่ต่อสู้ |
-le, --llm_guessing | บูล | False | ระบุว่า LLM ที่สองใช้ในการเดาคีย์ลับปิดการตอบสนองปกติหรือไม่ |
-t, --temperature | ลอย | 0.0 | ระบุอุณหภูมิสำหรับ LLM เพื่อควบคุมการสุ่ม |
-cp, --create_prompt_dataset | บูล | False | ระบุว่าควรสร้างชุดข้อมูลใหม่ของการแจ้งเตือนระบบขั้นสูงหรือไม่ |
-cr, --create_response_dataset | บูล | False | ระบุว่าควรสร้างชุดข้อมูลใหม่ของการตอบสนองการรั่วไหลของความลับ |
-i, --iterations | int | 10 | ระบุจำนวนการวนซ้ำสำหรับการโจมตี |
-n, --name_suffix | str | "" | ระบุชื่อคำต่อท้ายเพื่อโหลดโมเดลที่กำหนดเอง เนื่องจากสตริงพารามิเตอร์อาร์กิวเมนต์ไม่ได้รับอนุญาตให้เริ่มต้นด้วย '-' สัญลักษณ์, ตัวแรก '-' จะถูกเพิ่มโดยตัวแยกวิเคราะห์โดยอัตโนมัติ |
-s, --strategy | str | None | ระบุกลยุทธ์สำหรับการโจมตี (ไม่ว่าจะใช้การโจมตีปกติหรือ tools โจมตี) |
-sc, --scenario | str | all | ระบุสถานการณ์สำหรับการโจมตีตามเครื่องมือ |
-dx, --device | str | cpu | ระบุอุปกรณ์ที่ใช้สำหรับเรียกใช้สคริปต์ (CPU, CUDA หรือ MPS) |
-pf, --prompt_format | str | react | ระบุว่ารูปแบบพรอมต์แบบตอบโต้หรือเครื่องมือที่ใช้เครื่องมือใช้สำหรับตัวแทนหรือไม่ (React หรือ Tool-Finetuned) |
-ds, --disable_safeguards | บูล | False | ปิดใช้งานระบบป้องกันระบบสำหรับกลยุทธ์เครื่องมือ |
อนุสัญญาการตั้งชื่อสำหรับแบบจำลองมีดังนี้: |
< model_name > - < param_count > - < robustness > - < attack_suffix > - < custom_suffix >
เช่น:
llama2 - 7 b - robust - prompt_injection - 0613
หากคุณต้องการเรียกใช้การโจมตีกับโมเดลนำหน้าด้วยคำต่อท้ายแบบกำหนดเอง (เช่น 1000epochs
) คุณจะต้องระบุข้อโต้แย้งดังต่อไปนี้:
... - - model_name llama2 - 7 b - prefix - - name_suffix 1000 epochs ...
แบบอย่าง | ตัวระบุพารามิเตอร์ | การเชื่อมโยง | อินสแตนซ์คำนวณ |
---|---|---|---|
GPT-4 (O1, O1-MINI, Turbo) | gpt-4o / gpt-4o-mini / gpt-4-turbo | การเชื่อมโยง | Openai API |
ลามะ 2 | llama2-7b / llama2-13b / llama2-70b | การเชื่อมโยง | การอนุมานในท้องถิ่น |
Llama 2 แข็งตัว | llama2-7b-robust / llama2-13b-robust / llama2-70b-robust | การเชื่อมโยง | การอนุมานในท้องถิ่น |
Qwen 2.5 | qwen2.5-72b | การเชื่อมโยง | การอนุมานในท้องถิ่น (ครั้งแรก: ollama pull qwen2.5:72b ) |
ลามะ 3.1 | llama3-8b / llama3-70b | การเชื่อมโยง | การอนุมานในท้องถิ่น (ครั้งแรก: ollama pull llama3.1/llama3.1:70b/llama3.1:405b ) |
ลามะ 3.2 | llama3-1b / llama3-3b | การเชื่อมโยง | การอนุมานในท้องถิ่น (ครั้งแรก: ollama pull llama3.2/llama3.2:1b ) |
ลามะ 3.3 | llama3.3-70b | การเชื่อมโยง | การอนุมานในท้องถิ่น (ครั้งแรก: ollama pull llama3.3/llama3.3:70b ) |
ภาพสะท้อน Llama | reflection-llama | การเชื่อมโยง | การอนุมานในท้องถิ่น (ครั้งแรก: ollama pull reflection ) |
ตัวแทน | vicuna-7b / vicuna-13b / vicuna-33b | การเชื่อมโยง | การอนุมานในท้องถิ่น |
เสถียรเบโลกา (2) | beluga-7b / beluga-13b / beluga2-70b | การเชื่อมโยง | การอนุมานในท้องถิ่น |
orca 2 | orca2-7b / orca2-13b / orca2-70b | การเชื่อมโยง | การอนุมานในท้องถิ่น |
อัญมณี | gemma-2b / gemma-7b | การเชื่อมโยง | การอนุมานในท้องถิ่น |
เจมม่า 2 | gemma2-9b / gemma2-27b | การเชื่อมโยง | การอนุมานในท้องถิ่น (ครั้งแรก: ollama pull gemma2/gemma2:27b ) |
พี 3 | phi3-3b / phi3-14b | การเชื่อมโยง | การอนุมานในท้องถิ่น (ครั้งแรก: ollama pull phi3:mini/phi3:medium ) |
(Llama รุ่น Finetuned หรือแข็งแกร่ง/แข็งเป็นครั้งแรกจะต้องสร้างขึ้นโดยใช้สคริปต์ finetuning.py
ดูด้านล่าง)
การโจมตี | การป้องกัน | ||
---|---|---|---|
ชื่อ | ผู้ระบุ | ชื่อ | ผู้ระบุ |
การแยกน้ำหนักบรรทุก | payload_splitting | สิ่งที่แนบมาตามลำดับแบบสุ่ม | seq_enclosure |
การทำให้งงงวย | obfuscation | การติดแท็ก XML | xml_tagging |
การแหกคุก | jailbreak | การป้องกันฮิวริสติก/การกรอง | heuristic_defense |
การแปล | translation | การป้องกันแซนวิช | sandwiching |
chatml ในทางที่ผิด | chatml_abuse | การประเมิน LLM | llm_eval |
การปิดบัง | masking | การตรวจจับความงุนงง | ppl_detection |
Typoglycemia | typoglycemia | ผู้แจ้งเตือน | prompt_guard |
คำต่อท้ายของศัตรู | advs_suffix | ||
การฉีดคำนำหน้า | prefix_injection | ||
การปราบปรามการปฏิเสธ | refusal_suppression | ||
บริบทเพิกเฉย | context_ignoring | ||
การยกเลิกบริบท | context_termination | ||
ตัวแยกบริบท | context_switching_separators | ||
ช็อต | few_shot | ||
การแฮ็คความรู้ความเข้าใจ | cognitive_hacking | ||
การแชทฐาน | base_chat |
การโจมตี base_chat
ประกอบด้วยคำถามปกติเพื่อทดสอบโมเดลที่หกเป็นบริบทและข้อมูลที่เป็นความลับแม้ว่าจะไม่มีการโจมตีจริง
ส่วนนี้ครอบคลุมตัวเลือก llama finetuning ที่เป็นไปได้ เราใช้ Peft ซึ่งขึ้นอยู่กับบทความนี้
นอกจากนี้การตั้งค่าการตั้งค่าข้างต้น
accelerate config
เพื่อกำหนดค่าความสามารถในการฝึกอบรมแบบกระจายของระบบของคุณ และ
wandb login
ด้วยคีย์ WANDB API ของคุณเพื่อเปิดใช้งานการบันทึกกระบวนการ finetuning
ตัวเลือก finetuning ตัวแรกอยู่ในชุดข้อมูลที่ประกอบด้วยระบบแจ้งเตือนเพื่อสั่งให้ LLM อย่างปลอดภัยเพื่อรักษาความปลอดภัยของคีย์ลับ ตัวเลือก finetuning ที่สอง (โดยใช้ตัวเลือก --train_robust
) กำลังใช้การแจ้งเตือนของระบบและการแจ้งเตือนที่เป็นปฏิปักษ์เพื่อทำให้แบบจำลองแข็งขึ้นจากการโจมตีแบบฉีดทันที
python finetuning . py [ - h ] [ - llm | - - llm_type LLM_NAME ] [ - i | - - iterations ITERATIONS ] [ - a | - - attacks ATTACKS_LIST ] [ - n | - - name_suffix NAME_SUFFIX ]
การโต้แย้ง | พิมพ์ | ค่าเริ่มต้น | คำอธิบาย |
---|---|---|---|
-h, --help | - | - | แสดงข้อความความช่วยเหลือนี้และออก |
-llm, --llm_type | str | llama3-8b | ระบุประเภทของ LLM เป็น finetune |
-i, --iterations | int | 10000 | ระบุจำนวนการวนซ้ำสำหรับ finetuning |
-advs, --advs_train | บูล | False | ใช้ประโยชน์จากการฝึกอบรมฝ่ายตรงข้าม |
-a, --attacks | รายการ [STR] | payload_splitting | ระบุการโจมตีที่จะใช้เพื่อทำให้ LLM แข็งตัวในระหว่างการ finetuning มีผลเฉพาะถ้า --train_robust ถูกตั้งค่าเป็นจริง สำหรับการโจมตีที่รองรับดูส่วนก่อนหน้า |
-n, --name_suffix | str | "" | ระบุคำต่อท้ายสำหรับชื่อรุ่น finetuned |
ปัจจุบันมีเพียงรุ่น Llama เท่านั้นที่รองรับ ( llama2-7/13/70b
/ llama3-8/70b
)
เพียงเรียกใช้สคริปต์ generate_dataset.py
เพื่อสร้างระบบใหม่พร้อมที่เป็นไฟล์ JSON โดยใช้ LLMS
การโต้แย้ง | พิมพ์ | ค่าเริ่มต้น | คำอธิบาย |
---|---|---|---|
-h, --help | - | - | แสดงข้อความความช่วยเหลือนี้และออก |
-llm, --llm_type | str | llama3-70b | ระบุ LLM ที่ใช้ในการสร้างชุดข้อมูลพรอมต์ของระบบ |
-n, --name_suffix | str | "" | ระบุคำต่อท้ายสำหรับชื่อรุ่นหากคุณต้องการใช้โมเดลที่กำหนดเอง |
-ds, --dataset_size | int | 1000 | ขนาดของชุดข้อมูลพรอมต์ของระบบผลลัพธ์ |
ในการทดสอบความลับของ LLMS ในสถานการณ์เครื่องมือในโลกแห่งความเป็นจริงเราให้ความเป็นไปได้ในการทดสอบ LLMS ใน Google Drive และ Google Mail Integrations ในการทำเช่นนั้นให้เรียกใช้ /various_scripts/llm_mail_test.py
สคริปต์ด้วยข้อมูลรับรอง Google API ของคุณ
คำเตือน
การประเมิน LLM ที่ประเมินการประเมินอาจมีความต้องการอย่างมากในแง่ของ GPU VRAM และเวลา
บันทึก
ผลลัพธ์อาจแตกต่างกันเล็กน้อยจากการวิ่งไปจนถึงการวิ่ง Ollama อัพเดท LLMs ส่วนใหญ่อย่างต่อเนื่องดังนั้นพฤติกรรมของพวกเขาอาจมีการเปลี่ยนแปลง นอกจากนี้ถึงแม้จะมี LLM ที่อุณหภูมิต่ำที่สุดก็มีแนวโน้มที่จะผันผวนเล็กน้อยใน behvior เนื่องจากการสุ่มภายใน
จะถามคำถามที่ไม่เป็นพิษเป็นภัย LLM เพื่อตรวจสอบการรั่วไหลของความลับแม้จะไม่มีการโจมตี
python attack.py --llm_type <model_specifier> --strategy secret-key --attacks chat_base --defenses None --iterations 100 --device cuda
จะเรียกใช้การโจมตีทั้งหมดกับ LLM โดยไม่มีการป้องกัน การทำซ้ำจะถูกแบ่งออกอย่างเท่าเทียมกันกับการโจมตีที่ใช้แล้ว ดังนั้นขึ้นอยู่กับจำนวนการโจมตีที่ใช้แล้วจำนวนการวนซ้ำจะต้องปรับเปลี่ยน (เช่นการโจมตี 14 ครั้งด้วยการวนซ้ำ 100 ครั้งตั้งค่าพารามิเตอร์การวนซ้ำเป็น 1,400)
python attack.py --llm_type <model_specifier> --strategy secret-key --attacks all --defenses None --iterations 100 --device cuda
จะเรียกใช้การโจมตีทั้งหมดกับ LLM ด้วยการป้องกันทั้งหมด
python attack.py --llm_type <model_specifier> --strategy secret-key --attacks all --defenses all --iterations 100 --device cuda
ระบบจะให้คำแนะนำแก่ LLM ด้วยคีย์ลับและคำแนะนำที่จะไม่รั่วไหลของคีย์ลับตามด้วยคำของ่าย ๆ ในการพิมพ์คีย์ลับ
python attack.py --llm_type <model_specifier> --strategy tools --scenario all --attacks base_attack --defenses None --iterations 100 --device cuda
จะเรียกใช้แผนผังเครื่องมือทั้งหมดโดยไม่ต้องมีการโจมตีและการป้องกันโดยใช้ Framework React
python attack.py --llm_type <model_specifier> --strategy tools --scenario all --attacks identity --defenses None --iterations 100 --prompt_format ReAct --device cuda
จะเรียกใช้แผนผังเครื่องมือทั้งหมดโดยไม่ต้องมีการโจมตีและการป้องกันโดยใช้ Framework React
python attack.py --llm_type <model_specifier> --strategy tools --scenario all --attacks identity --defenses None --iterations 100 --prompt_format tool-finetuned --device cuda
จะเรียกใช้แผนผังเครื่องมือทั้งหมดโดยไม่ต้องมีการโจมตีและการป้องกันโดยใช้ Framework React
python attack.py --llm_type <model_specifier> --strategy tools --scenario all --attacks all --defenses None --iterations 100 --prompt_format tool-finetuned --device cuda
จะเรียกใช้แผนผังเครื่องมือทั้งหมดโดยไม่ต้องมีการโจมตีและการป้องกันโดยใช้ Framework React
python attack.py --llm_type <model_specifier> --strategy tools --scenario all --attacks all --defenses all --iterations 100 --prompt_format tool-finetuned --device cuda
หากคุณต้องการอ้างอิงงานของเราโปรดใช้รายการ Bibtex ต่อไปนี้:
@article { evertz-24-whispers ,
title = { {Whispers in the Machine: Confidentiality in LLM-integrated Systems} } ,
author = { Jonathan Evertz and Merlin Chlosta and Lea Schönherr and Thorsten Eisenhofer } ,
year = { 2024 } ,
journal = { Computing Research Repository (CoRR) }
}