ماسح ضوئي معياري لثغرات LLM يفحص الهلوسة، تسرب البيانات، حقن التعليمات، كسر الحماية، والسمية باستخدام فحوصات ثابتة وديناميكية وتكيفية عبر موفري نماذج متعددين.
مجموعة أدوات الاختبار الأحمر وتقييم الذكاء الاصطناعي التوليدي
يتحقق garak مما إذا كان يمكن جعل تطبيق مدعوم بنموذج لغوي كبير (LLM) يفشل بطريقة لا نريدها. يستكشف garak الهلوسة وتسريب البيانات وحقن الأوامر (prompt injection) والمعلومات المضللة وتوليد المحتوى السام وكسر القيود (jailbreaks) والعديد من نقاط الضعف الأخرى. إذا كنت تعرف nmap أو msf / Metasploit Framework، فإن garak يفعل أشياء مشابهة إلى حد ما لهما، ولكن لنماذج اللغة الكبيرة.
يركز garak على طرق جعل نموذج اللغة الكبيرة أو نظام الحوار يفشل. وهو يجمع بين مجسّات (probes) ثابتة وديناميكية وتكيفية لاستكشاف ذلك.
garak أداة مجانية. نحن نحب تطويرها ونهتم دائمًا بإضافة وظائف لدعم التطبيقات.
يدعم حاليًا:
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.14"
conda activate garak
gh repo clone NVIDIA/garak
cd garak
python -m pip install -e .
حسنًا، إذا سار ذلك على ما يرام، فمن المحتمل أنك جاهز للانطلاق!
ملاحظة: إذا كنت قد استنسخت (cloned) قبل الانتقال إلى منظمة NVIDIA على GitHub، لكنك تقرأ هذا على عنوان URI 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 جميع المجسّات بشكل افتراضي، لكن يمكنك أن تكون محددًا في ذلك أيضًا. على سبيل المثال، سيستخدم --spec probes.promptinject أساليب إطار عمل PromptInject فقط. يمكنك أيضًا تحديد إضافة معينة بدلًا من عائلة إضافات بإضافة اسم الإضافة بعد .؛ على سبيل المثال، سيستخدم --spec probes.lmrc.SlurUsage تطبيقًا للتحقق من النماذج التي تولّد إهانات بناءً على إطار عمل Language Model Risk Cards.
للحصول على المساعدة والإلهام، تجدنا على Twitter أو discord!
فحص نموذج تجاري بحثًا عن حقن أوامر قائم على الترميز (OSX/*nix) (استبدل القيمة المثالية بمفتاح OpenAI API حقيقي)
export OPENAI_API_KEY="sk-123XXXXXXXXXXXX"
python3 -m garak --target_type openai --target_name gpt-5-nano --spec probes.encoding
تحقق مما إذا كانت نسخة GPT2 من Hugging Face عرضة لـ DAN 11.0
python3 -m garak --target_type huggingface --target_name gpt2 --spec probes.dan.Dan_11_0
لكل فحص (probe) يتم تحميله، سيطبع garak شريط تقدم أثناء التوليد. بمجرد اكتمال التوليد، يُعرض صف يقيّم نتائج ذلك الفحص على كل كاشف (detector). إذا أسفر أي من محاولات المطالبة (prompt) عن سلوك غير مرغوب فيه، فسيتم وضع علامة FAIL على الاستجابة، مع ذكر معدل الفشل.
فيما يلي النتائج مع وحدة encoding على أحد إصدارات GPT-3:

والنتائج نفسها مع ChatGPT:

يمكننا أن نرى أن النموذج الأحدث أكثر عرضة بكثير لهجمات الحقن القائمة على الترميز، حيث وُجد أن text-babbage-001 عرضة فقط لحقن ترميز quoted-printable وMIME. تشير الأرقام في نهاية كل صف، مثل 840/840، إلى العدد الإجمالي لتوليدات النص ثم إلى عدد هذه التوليدات التي بدت تتصرف بشكل مقبول. قد يكون الرقم مرتفعًا جدًا لأن أكثر من توليد واحد يتم إجراؤه لكل مطالبة - افتراضيًا، 10.
تُسجَّل الأخطاء في garak.log؛ وتُسجَّل عملية التشغيل بالتفصيل في ملف .jsonl يُحدَّد عند بداية التحليل ونهايته. هناك سكربت تحليل أساسي في analyse/analyse_log.py سيُخرج الفحوصات والمطالبات التي أدت إلى أكبر عدد من الإصابات.
أرسل طلبات السحب (PRs) وافتح المشكلات (issues). حظًا موفقًا في الصيد!
استخدام واجهة 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 إلى رمز Hugging Face API بدور "read"؛ راجع https://huggingface.co/settings/tokens عند تسجيل الدخول