
أكواد بحثية لتدريب المحوّلات (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).
تحكم خاصيتان ما إذا كان الباب الخلفي سينجو من الضبط الدقيق الحميد (SFT): قوة الارتباط الأولية بين المُحفّز والهدف، وتوافق التدرّج الخاص به مع التحديثات الحميدة القادمة. يزيد المحوّل المشترك في PersistBD من كليهما؛ ويُظهر استئصال الورقة البحثية أن كل حدّ ضروري.
اقرأ docs/RELEASE.md لمزيد من التفاصيل.
| كود الطريقة (تدريب المحوّل + الدمج) | src/persistbd/ |
| أدوات قياس معدل التفعيل، وتقييم معدل الحلّ، وفحوص الكشف | eval/، src/persistbd/eval_gradient_loss.py |
| أدوات بناء مجموعات البيانات + مساعدات إنشاء الباب الخلفي | data_processing/ |
| خادم تقييم SWE-bench (الترقيع → المكافأة) | swe_eval_server/ |
| أوزان النموذج المصاب بالباب الخلفي | غير مُصدرة |
| مجموعة بيانات الباب الخلفي المبنية (أزواج المُحفّز + الخبيثة) | مقيّدة الوصول: uiuc-kang-lab/PersistBD |
src/persistbd/ PersistBD adapters get_delta_{s,c,j}.py, get_combined_model.py (merge),
and eval_gradient_loss.py (strength S / compatibility C)
eval/ trigger-rate scorers, eval_swe.py (SWE-bench RR), score_backdoor_logprobs.py
data_processing/ split + backdoor builders (make_*_v4.py, verify_splits_v4.py), the trigger
and malicious-pair helpers, and patch_ckpt_config.py
data/ the dataset itself (git-ignored except manifest.json)
configs/ torchtune configs for the developer's benign SFT stage
swe_eval_server/ FastAPI SWE-bench eval server used for RR and RL rewards
examples/slurm/ the jobs as we ran them, as reference templates
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 (ضبط دقيق SFT حميد) يشغّلان الخطوتين 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/ مع مدرّب تعلّم معزّز خارجي (verl،
غير مضمّن)؛ أما نقطة النهاية POST /evaluate ذاتية التنفيذ فلا تحتاج سوى Docker + SWE-bench.
يربط الخادم 0.0.0.0 دون مصادقة ويشغّل أوامر shell المولّدة من النموذج داخل
Docker — شغّله على شبكة موثوقة فقط.configs/ وexamples/slurm/ ومسارات outputs/… الواردة فيها هي قوالب؛ عدّل
المسارات وتوجيهات العنقود بما يناسب بيئتك.@misc{zhan2026persistbd,
title = {Understanding and Enhancing Backdoor Persistency
in LLM Agent Post-Training},
author = {Zhan, Qiusi and Lyu, Nian and Ding, Stephanie and
Mehta, Arnav and Canal, Chris and Tabarrok, Connor and
Davies, Xander and Kang, Daniel},
year = {2026},
eprint = {2610.07510},
archivePrefix = {arXiv},
primaryClass = {cs.CR},
url = {https://arxiv.org/abs/2610.07510}
}