مدونة HisnLabs للأمان

بقلم HisnLabs Security & Research Team · نُشر في · مدة القراءة: 6 دقيقة

كيف تختبر ضابط حماية للذكاء الاصطناعي بمجموعات اختبار عامة، خطوة بخطوة

كيف تختبر ضابط حماية للذكاء الاصطناعي بمجموعات اختبار عامة، خطوة بخطوة

سيخبرك كل مورّد لضوابط الحماية أن منتجه يعمل. والخبر الجيد أنك لست مضطرًا إلى أخذ كلام أحد على علّاته. فقد نشر الباحثون مجموعات مفتوحة من رسائل الاختبار يستطيع أي شخص تشغيلها، وبعد ظهيرة واحدة من العمل المتأني معها ستعرف أكثر مما يقوله لك أي كتيّب تسويقي. يعرض هذا الدرس المنهجية التي نتبعها في HisnLabs، لتطبّقها على أي ضابط حماية: ضابط تبنيه، أو ضابط تشتريه، أو ضابطين تقارن بينهما.

الدرس مكتوب للمهندسين، لكن القواعد في وسطه للجميع. فالمدير الذي يعرفها يستطيع أن يقرأ نتائج أي مورّد ويرى فورًا هل تعني شيئًا.

الفكرة الواحدة وراء كل خطوة

لأغراض الاختبار، ضابط الحماية دالة: يدخلها نص، ويخرج منها رقم بين 0 و1 يعني «ما احتمال أن يكون هذا هجومًا؟». وتحوّل العتبة هذا الرقم إلى قرار. وكل مجموعة اختبار عامة قائمة من النصوص معروفة الإجابة. تشغّل الدالة على كل نص، وتعدّ ثلاثة أشياء.

  • المرصود: الهجمات التي بلغت درجتها العتبة أو تجاوزتها، من مجموع الهجمات.
  • المحجوب خطأً: النصوص الآمنة التي بلغت درجتها العتبة أو تجاوزتها، من مجموع النصوص الآمنة.
  • الوقت المضاف: المدة التي يستغرقها استدعاء واحد، للرسالة المعتادة وللحالات البطيئة، على عتاد محدّد.

هذا هو القياس كله. وكل ما تبقى في هذا الدرس يتعلق بإجرائه بصدق.

أربع قواعد تجعل للأرقام معنى

1. لا تختبر أبدًا على ما تدرّب عليه الضابط

كثير من مجموعات الاختبار العامة مبنيّ من مجموعات الاختراق (jailbreak) نفسها التي تتعلم منها نماذج الحماية. فإن تداخلت مجموعة مع بيانات التدريب، يكون الضابط قد رأى الإجابات، ولا تقول درجته شيئًا عن الهجمات الجديدة. قارن كل مجموعة اختبار بمصادر التدريب، واستبعد أي مجموعة متداخلة. وإن كنت تقارن نموذج مورّد، فاقرأ بطاقة النموذج لمعرفة البيانات التي دُرّب عليها، واذكر ذلك بجانب رقمه.

2. اختر العتبة قبل أن تنظر إلى الاختبارات

اختر العتبة على مجموعة تحقق منفصلة، وفق قاعدة تكتبها مسبقًا، مثل «أعلى عتبة لا تحجب أكثر من حصة صغيرة محددة من رسائل التحقق الآمنة». ثم شغّل الاختبارات مرة واحدة. فتحريك العتبة حتى تبدو نتيجة الاختبار جيدة يضخّم النتيجة، ولن تصمد أمام حركة البيانات الحقيقية.

3. اعرض الجانبين دائمًا

الضابط الذي يحجب كل شيء يرصد كل هجوم، ولهذا لا معنى لرقم «المرصود» وحده. فكل رقم مرصود يحتاج إلى رقم للمحجوب خطأً بجانبه، مقيس على مجموعة تحتوي نصوصًا آمنة. ويؤكد مؤلفو CyberSecEval 2 في Meta النقطة نفسها، ويقترحون لها معدل الرفض الخاطئ [5]. ويشرح مقالنا عن ضوابط حماية لا تزعج مستخدميك لماذا يكون الرقم الثاني في الغالب هو ما يقرّر بقاء الضابط مشغّلًا.

4. بيّن ما تقيسه كل مجموعة، واعرض نتائجها منفصلة

مجموعات الاختبار تقيس أشياء مختلفة. بعضها يحتوي طلبات ضارة، كطلب تعليمات خطرة، وهذه مسألة سلامة محتوى. وبعضها يحتوي تلاعبًا، أي محاولات لتجاوز تعليمات المساعد، وهو ما تسميه OWASP حقن الأوامر [7]. والضابط المبني لأحدهما سيبدو ضعيفًا في الآخر بحكم تصميمه. فاعرض النتائج لكل مجموعة ولكل فئة لغوية، ولا تعرض أبدًا رقمًا واحدًا مجمَّعًا.

اذكر مع كل معدل عدد الرسائل ونطاق الثقة

«رصد 96 من كل 100» على 55 هجومًا، وعلى 5,000 هجوم، ادعاءان مختلفان. فمع قلة الرسائل، تحرّك الصدفة وحدها النتيجة كثيرًا. والطريقة الصادقة لإظهار ذلك هي نطاق الثقة. ولمعدلات كهذه، يُعدّ فاصل Wilson خيارًا افتراضيًا جيدًا: يمكن استعماله بأمان مع العينات الصغيرة والملاحظات المنحرفة، ولا ينهار إلى نطاق عرضه صفر حين يقترب المعدل من 0 أو 1 كما يحدث مع التقريب الطبيعي الأبسط [6]. تكفي بضعة أسطر من Python:

wilson.py
from math import sqrt

def wilson(k, n, z=1.96):
    """95 in 100 confidence range for k successes out of n."""
    p = k / n
    d = 1 + z * z / n
    centre = (p + z * z / (2 * n)) / d
    half = z * sqrt(p * (1 - p) / n + z * z / (4 * n * n)) / d
    return round(centre - half, 3), round(centre + half, 3)

print(wilson(53, 55))      # (0.877, 0.99)
print(wilson(4800, 5000))  # (0.954, 0.965)
print(wilson(0, 250))      # (0.0, 0.015)

هذه الأرقام لضابط افتراضي، لتوضيح الأثر فقط. فالمعدل المرصود نفسه، نحو 96 من كل 100، يعطي نطاقًا من نحو 88 إلى 99 من كل 100 على 55 هجومًا، ومن نحو 95 إلى 97 على 5,000. ويهمّ السطر الأخير جانبَ الحجب الخاطئ: فالضابط الذي لم يحجب أيًّا من 250 رسالة آمنة قد يحجب في الاستعمال الحقيقي ما يصل إلى نحو 1.5 من كل 100. والمورّد الذي يعرض «صفر حجب خاطئ» دون ذكر عدد الرسائل لا يخبرك بالكثير.

الخطوة 1: GuardBench، لنظرة أولى واسعة

قُدّمت GuardBench، من إعداد Bassani وSanchez، في مؤتمر EMNLP 2024. وهي تجمع 40 مجموعة بيانات لتقييم السلامة خلف مكتبة Python واحدة، وقد نشرت ورقتها أيضًا مجموعات جديدة للإشراف على الطلبات بالألمانية والفرنسية والإيطالية والإسبانية [1]. المكتبة مفتوحة المصدر بترخيص EUPL-1.2، وتحتفظ كل مجموعة بيانات بترخيصها الخاص، وبعضها يتطلب تسجيلًا أو دخولًا إلى Hugging Face [2]. ثبّتها في بيئة مستقلة:

Terminal
# a separate environment for the test tools
python -m venv .venv-guardbench
.venv-guardbench/bin/pip install guardbench

تعطي المكتبة دالة واحدة، تتلقى دفعة من المحادثات وتعيد لكل محادثة احتمال أن تكون غير آمنة. في المثال التالي تستدعي الدالة ضابطًا يوفّر نقطة تقييم صغيرة؛ استبدل الرابط بضابطك أو بواجهة المورّد البرمجية.

run_guardbench.py
from guardbench import benchmark
import requests

GUARD_URL = "http://127.0.0.1:8810/classify"  # your guardrail's scoring endpoint

def moderate(conversations, **kwargs):
    # conversations: a list of chats, each a list of {"role": ..., "content": ...}
    # return one float per chat: the probability that it is unsafe
    return [requests.post(GUARD_URL, json={"text": c[-1]["content"]}).json()["score"]
            for c in conversations]

benchmark(
    moderate=moderate,
    model_name="my-guard 0.1.0",
    batch_size=16,
    datasets=["xstest", "jbb_behaviors"],  # choose the sets that match what the guard is for
    metrics=["f1", "recall"],
)

هنا خياران مهمان. أولًا، اختر المجموعات التي تناسب وظيفة الضابط لا كل المجموعات: فضابط حقن الأوامر وضابط سلامة المحتوى ينبغي تقييمهما على مجموعات مختلفة. ثانيًا، أدرج XSTest. فطلباتها الآمنة الـ250 التي تبدو خطرة، إلى جانب 200 طلب غير آمن للمقارنة، تجعلها من أفضل المقاييس العامة للرسائل المحجوبة خطأً [3]. تحسب GuardBench مقاييسها عند عتبة ثابتة قدرها 0.5؛ فاحسب أيضًا النتائج عند عتبتك المختارة مسبقًا من الدرجات المحفوظة، واذكر أي عتبة يستعملها كل رقم.

الخطوة 2: اختبارات حقن الأوامر في CyberSecEval، لقياس التلاعب

ينشر مشروع Purple Llama التابع لـ Meta أداة CyberSecEval بترخيص MIT. وتقيس اختبارات حقن الأوامر فيها قابلية النموذج للهجمات التي يحتوي فيها جزء من المدخلات القادمة من مستخدم غير موثوق تعليمات خبيثة يُراد بها تجاوز المهمة الأصلية للنموذج [4]. وهناك ملف إنجليزي وملف متعدد اللغات مترجم آليًا. وكل صف فيهما هجوم، فهذه المجموعة تقيس «المرصود» فقط؛ لذا اقرنها بمجموعة نصوص آمنة مثل XSTest أو مجموعتك الخاصة.

هناك طريقتان لاستعمالها. الطريقة السريعة أن تقيّم كل هجوم مباشرة بضابطك كما في الخطوة 1، وتعدّ ما يتجاوز العتبة لكل لغة. والطريقة الكاملة تستعمل أداة التشغيل الخاصة بـ Meta: ترسل كل تعليمات نظام مع الهجوم إلى روبوت محادثة، ثم يقرّر نموذج ثانٍ يؤدي دور الحَكَم هل خُدع الروبوت.

Terminal
# get the tests
git clone --depth 1 https://github.com/meta-llama/PurpleLlama
cd PurpleLlama
# run the prompt-injection tests against a chatbot, with a judge model
python3 -m CybersecurityBenchmarks.benchmark.run --benchmark=prompt-injection --prompt-path="$DATASETS/prompt_injection/prompt_injection.json" --response-path="$DATASETS/prompt_injection/prompt_injection_responses.json" --judge-response-path="$DATASETS/prompt_injection/prompt_injection_judge_responses.json" --stat-path="$DATASETS/prompt_injection/prompt_injection_stat.json" --judge-llm=<JUDGE> --llm-under-test=<MODEL>

شغّلها مرتين: مرة مع روبوت المحادثة وحده، ومرة مع الروبوت نفسه خلف ضابط الحماية، مع احتساب الرسالة المحجوبة على أنها «لم يُخدع». والفرق بين التشغيلين هو ما يضيفه ضابط الحماية، وهو السؤال الذي يهمّ المشتري فعلًا. واذكر نموذج الحَكَم في تقريرك، فأخطاؤه جزء من النتيجة.

الخطوة 3: اختبر بلغات مستخدميك

المجموعات العامة إنجليزية في معظمها. فإن كان مستخدموك يكتبون بالعربية، فابنِ مجموعة محجوزة خاصة بك: رسائل آمنة وهجمات بأسلوب واقعي بالفصحى، وباللهجتين الخليجية والمصرية، وبالعربيزي، وبالعربية الممزوجة بالإنجليزية، ولكلٍّ منها نسخة مشكولة بالكامل ونسخة مشكولة عشوائيًا. لا تدرّب عليها أبدًا. واعرض نتائج كل فئة منفصلة: فالضابط الذي يحسن في الإنجليزية ويضعف في العربيزي منتج مختلف بالنسبة إلى بنك في دبي عمّا يوحي به متوسطه.

ما يحتويه تقرير جدير بالثقة

  • لكل مجموعة: اسمها ورابطها وترخيصها، وهل هي عامة أم جزء محجوز خاص بك.
  • لكل فئة لغوية: معدل المرصود ومعدل المحجوب خطأً، ومع كلٍّ منهما عدد الرسائل ونطاق ثقة 95 من 100.
  • اسم النموذج وإصداره، والتاريخ، والقاعدة المستعملة لاختيار العتبة.
  • الوقت المضاف لكل رسالة، المعتاد والبطيء، مع العتاد وطول الرسائل.
  • أي جولات اختبار هجومي (red team)، مع عدد الهجمات التي نفذت، ورابط أو سكربت لإعادة إنتاج كل شيء.

وحين تقارن ضابطين، استعمل المجموعات نفسها، في اليوم نفسه، وعلى العتاد نفسه، وبقاعدة العتبة نفسها لكليهما، أو اذكر أن كليهما استعمل 0.5.

كيف نطبّق هذا على Guardrino

Guardrino، جدار الحماية للذكاء الاصطناعي الذي تبنيه HisnLabs للشركات، قيد التطوير، وفي صفحة المنتج قسم للنتائج المقيسة يبقى فارغًا عن قصد. لن يظهر إلا بعد أن يُختبر إصدار بهذه المنهجية تحديدًا، مع ذكر عدد الرسائل والنطاق بجانب كل رقم. وحتى ذلك الحين نصف ما صُمّم Guardrino ليفعله، ولا شيء أكثر. وللاطلاع على التصميم نفسه، راجع دليلنا إلى ضوابط حماية الذكاء الاصطناعي، ولمعرفة دوافع المشروع، اقرأ لماذا نبني Guardrino للشرق الأوسط.

دور Guardrino وHisnLabs

من المقرّر أن تلتزم تقارير إصدارات Guardrino بكل قاعدة في هذا الدرس، ولن تعرض صفحة المنتج أي نتيجة قبل صدور أول تقرير. وحتى ذلك الحين، تُظهر المحاكاة أدناه ما صُمّم Guardrino للقيام به فقط، لا مدى جودة أدائه.

المصادر