
أكواد بحثية لتدريب المحوّلات (adapters) التي تجعل أبواب LLM agent الخلفية تصمد أمام الضبط الدقيق غير الضار، مع تقييم معدل التفعيل، وتقييم SWE-bench، وبانيات مجموعات البيانات.
كود "Understanding and Enhancing Backdoor Persistency in LLM Agent Post-Training" (Findings of EMNLP 2026).
📄 الورقة البحثية · 🌐 صفحة المشروع · 📦 مجموعة البيانات (مقيّدة الوصول)
عادةً ما يَستهلك الضبط الدقيق الحميد الذي يُجريه المطوّر في المراحل اللاحقة باباً خلفياً مزروعاً في نموذج قبل إصداره. يقوم PersistBD بتحسين نموذج يحتوي بالفعل على باب خلفي باستخدام محوّل صغير (adapter) بحيث ينجو الباب الخلفي من ذلك التدريب. على Qwen2.5-Coder-7B، ينخفض معدل تفعيل الباب الخلفي الأساسي (ASR) من 100% إلى 20% خلال 3,000 خطوة من الضبط الدقيق الحميد (SFT)؛ بينما يبقى الباب الخلفي نفسه بعد تحسينه بـ PersistBD عند 74% (76% بعد مرحلة التعلّم المعزّز اللاحقة)، مع معدل حلّ حميد يطابق معدل الباب الخلفي الأساسي على SWE-bench Lite (7.7% مقابل 6.7% بعد SFT؛ 9.0% مقابل 9.0% بعد RL).
تحكم خاصيتان ما إذا كان الباب الخلفي سينجو من الضبط الدقيق الحميد: قوة ارتباط المُحفّز→الهدف الأولية، وتوافق التدرّج مع التحديثات الحميدة القادمة. يزيد المحوّل المشترك في PersistBD من كليهما؛ ويُظهر استئصال (ablation) الورقة أن كل حدّ ضروري.
اقرأ docs/RELEASE.md لمزيد من التفاصيل.
| كود الطريقة (تدريب المحوّل + الدمج) | src/persistbd/ |
| مقاييس معدل التفعيل، تقييم معدل الحلّ، مجسّات الكشف | eval/، src/persistbd/eval_gradient_loss.py |
| بواني مجموعات البيانات + مساعدات بناء الباب الخلفي | data_processing/ |
| خادم تقييم SWE-bench (patch → reward) | swe_eval_server/ |
| أوزان النموذج ذي الباب الخلفي | غير مُصدَّرة |
| مجموعة بيانات الباب الخلفي المبنية (المُحفّز + الأزواج الخبيثة) | مقيّدة: uiuc-kang-lab/PersistBD |
src/persistbd/ محوّلات PersistBD get_delta_{s,c,j}.py، get_combined_model.py (الدمج)،
و eval_gradient_loss.py (القوة S / التوافق C)
eval/ مقاييس معدل التفعيل، eval_swe.py (SWE-bench RR)، score_backdoor_logprobs.py
data_processing/ بواني التقسيم + الباب الخلفي (make_*_v4.py، verify_splits_v4.py)، مساعدات
المُحفّز والأزواج الخبيثة، و patch_ckpt_config.py
data/ مجموعة البيانات نفسها (مُتجاهَلة من git عدا manifest.json)
configs/ إعدادات torchtune لمرحلة الضبط الدقيق الحميد لدى المطوّر
swe_eval_server/ خادم تقييم SWE-bench بـ FastAPI المستخدم لمكافآت RR و RL
examples/slurm/ المهام كما شغّلناها، كقوالب مرجعية
pip install torch transformers peft accelerate datasets pyarrow tqdm wandb vllm
# SWE-bench RR + evaluation server:
pip install -r swe_eval_server/requirements.txt
data/ مُتجاهَلة من git عدا manifest.json. نزّل مجموعة البيانات من
huggingface.co/datasets/uiuc-kang-lab/PersistBD
(مقيّدة — اطلب الوصول)، أو أعد بناءها (التقسيم مثبّت بالبذرة 42 في
data/manifest.json) باستخدام البواني، مع التشغيل من جذر المستودع:
python data_processing/make_splits_v4.py # 5-way instance-disjoint split
python data_processing/make_backdoor_data_v4.py --no-thought # triggered train + random-position test
python data_processing/make_backdoor_test_first_position_v4.py # paired first-position test
python data_processing/verify_splits_v4.py # check the split invariants
تحتوي المساعدات في data_processing/ على سلسلة المُحفّز والأمر الخبيث؛ راجع
docs/RELEASE.md لمعرفة سبب تقييد مجموعة البيانات المبنية.
# 1. PersistBD — train the joint adapter Δj on a backdoored checkpoint.
# Defaults reproduce the 7B arm; see the paper's table for the 3B/30B values.
torchrun --nproc_per_node=1 src/persistbd/get_delta_j.py \
--model_path <backdoored_ckpt> \
--backdoor_data_path data/backdoor_train_no_thought.jsonl \
--benign_data_path data/attacker_train.jsonl \
--output_dir outputs/delta_j_7b
# then merge Δj into the checkpoint (PEFT merge_and_unload — see the example below).
# 2. developer benign SFT (torchtune) on the merged model
tune run --nproc_per_node 8 full_finetune_distributed \
--config configs/swe-7b_v4_post_persistbd_hiC.yaml \
backdoor_dir=<merged_model> output_dir=outputs/post
# 3. trigger rate (ASR) on any checkpoint
python eval/evaluate_comment_trigger_strict.py --model_path <ckpt> \
--data_path data/backdoor_test_random_position_no_thought.json
# 4. benign resolved rate on SWE-bench Lite (needs the eval server, see swe_eval_server/)
python eval/eval_swe.py --model_path <ckpt> --server http://localhost:8000
يشغّل examples/slurm/delta_j_7b_v4.sbatch (تدريب + دمج Δj) و
examples/slurm/post_7b_v4_persistbd_hiC.sbatch (الضبط الدقيق الحميد) الخطوتين 1–2 من البداية إلى النهاية
ويتسلسلان عبر outputs/delta_j_7b_merged.
توجد مسح القوة/التوافق التشخيصي (Δs، Δc وشبكتهما α·Δs + β·Δc) في
get_delta_s.py، وget_delta_c.py، وget_combined_model.py.
| الكود | الورقة |
|---|---|
مجموعات اختبار random_position، first_position | الموضع العشوائي (الأساسي)، الموضع الأول |
--lambda_bd، --lambda_c، --lambda_cl | λ_bd، λ_c، λ_cl^j |
Δs، Δc، Δj (α·Δs + β·Δc) | محوّلات القوة / التوافق / المشتركة |
S، C في eval_gradient_loss.py | القوة S، توافق التدرّج C |
swe_eval_server/ مع مدرّب RL خارجي (verl،
غير مُضمَّن)؛ نقطة النهاية POST /evaluate ذات الطلقة الواحدة تحتاج فقط إلى Docker + SWE-bench.
يربط الخادم 0.0.0.0 دون مصادقة ويشغّل أوامر shell المولّدة من النموذج داخل
Docker — شغّله على شبكة موثوقة فقط.configs/، وexamples/slurm/، ومسارات outputs/… فيها هي قوالب؛ عدّل
المسارات وتوجيهات العنقود لبيئتك.@inproceedings{zhan2026persistbd,
title = {Understanding and Enhancing Backdoor Persistency in LLM Agent Post-Training},
author = {Qiusi Zhan and Nian Lyu and Stephanie Ding and Arnav Mehta and Xander Davies and Daniel Kang},
booktitle = {Findings of the Association for Computational Linguistics: EMNLP 2026},
year = {2026},
url = {https://arxiv.org/abs/2610.07510}
}