
إطار هجوم ترويج جماعي قائم على الوكلاء مدفوع بنموذج لغوي كبير يتلاعب بترتيبات أنظمة التوصية القائمة على التصفية التعاونية ذات الصندوق الأسود باستخدام استراتيجيات متعددة الأدوار تكيفية مع تفادي الكشف.
هذا هو الكود الرسمي للورقة البحثية: "An Efficient and Effective Agentic Group Shilling Attack on Recommender Systems". تقدّم هذه الورقة AGAS، وهو هجوم شيلينغ مدفوع بنماذج اللغة الكبيرة (LLM) ضد أنظمة التوصية القائمة على التصفية التعاونية ذات الصندوق الأسود. يقوم منسّق (Coordinator) واحد بتنسيق مجموعة من العاملين (workers) الوهميين من المستخدمين المزيّفين عبر سلسلة من الجولات. في كل جولة، يختار المنسّق واحدة من ثماني استراتيجيات ويُسنِد دورًا لكل عامل. ثم يقرّر العاملون العناصر التي سيقيّمونها باستخدام حلقة استدلال خاصة بهم على نمط ReAct.
agent_attack_rs/ bash/ # Reviewer-friendly shell scripts (RQ1–RQ5) prompts/ # Coordinator + per-role prompt templates scripts/run_agas.py # Single entry point (--dataset --victim ...) src/agas/ roles.py # Role enum {PR, SN, CA, IN} (paper symbols) signals.py # WorkerSignals (τ, γ, φ) + EnvSignals (ρ, Δρ, η, ξ, a) strategies.py # 8-strategy enum agents/ # Coordinator + Worker policies simulation/ # Episode runner (= AGAS algorithm outer loop) llm/ # OpenAI / Ollama recsys/ # Surrogate + 11-victim backends data/ # Dataset loaders + preprocessing pipeline tests/ # Pytest suite
## 2. ملخص الطريقة
يقوم AGAS بإنشاء أربعة أدوار للعاملين (رموز الورقة في `roles.py`):
| الرمز | الاسم الكامل | ما يفعله |
|--------|----------------|-------------------------------------------------------------------------|
| `PR` | Profiler | تقييمات آمنة لعناصر الحشو لاستكشاف المنصة وبناء مجموعات الجسور. |
| `SN` | Sniper | دور الحمولة؛ الدفع المباشر نحو الهدف أو ترقية عنصر الجسر. |
| `CA` | Camouflageur | دور التخفي؛ يعيد بناء الثقة من خلال نشاط يبدو حميدًا. |
| `IN` | Inactive | لا إجراء في هذه الجولة (تهدئة أو حجر صحي). |
في كل جولة يختار المنسق واحدة بالضبط من ثماني استراتيجيات من
`strategies.py` (انظر `method_strategies.tex`):
1. **Victim Probe** (`S1_VICTIM_PROBE`)
2. **Bridge Building** (`S2_BRIDGE_BUILDING`، لضحايا الرسم البياني فقط)
3. **Warm-up** (`S3_WARM_UP`)
4. **First Push** (`S4_FIRST_PUSH`)
5. **Silent Slowdown** (`S5_SILENT_SLOWDOWN`)
6. **Profile Cleanup** (`S6_PROFILE_CLEANUP`)
7. **Safe Replacement** (`S7_SAFE_REPLACEMENT`)
8. **Main Attack** (`S8_MAIN_ATTACK`)
يقود المنسق هذه القرارات انطلاقًا من مجموعتي إشارات (`signals.py`):
* **إشارات العاملين** `τ_{t,w}, γ_{t,w}, φ_{t,w}` — الثقة، والمخاطر، ومدقق
بنيوي. تطابق معادلات التحديث `method_coordinator.tex`
تمامًا (`eq:trust_update`، `eq:risk_update`، `eq:risk_decay`،
`eq:profile_validator`).
* **إشارات البيئة** `ρ^{(t)}, Δρ^{(t)}, η_t, ξ_t = (q_t, s_t), a_t` —
الرتبة، وحركة الرتبة، ومعدل القبول، وإشارة الكبت، وعلم التنبيه. درجة
الاشتباه `q_t` هي المجموع الموزون بمعامل 0.2 للمصطلحات الخمسة المعيارية
`(d̂_t, δ̂_t, m̂_t, ŝ_t, g_t)` من `eq:round_suppression_terms` و
`eq:round_suppression_score`.
### حلقة الجولة (ASCII)```
┌─────────────────────────────────────────────────┐
t=0…T-1 ──► │ 1. Observe ρ^{(t)}, update memory m_t │
│ 2. Update τ, γ, φ, η, ξ, a │
│ 3. Coordinator picks Strategy ∈ {S1…S8} │
│ and assigns Role ∈ {PR, SN, CA, IN} per worker│
│ 4. Workers act (filler / bridge / target items) │
│ 5. Validate + accept actions → ΔR̃^{(t+1)} │
│ 6. Refit / query victim → ρ^{(t+1)} │
└─────────────────────────────────────────────────┘
│
▼
t* = argmin_t ρ^{(t)}, return R* = [R ; R̃^{(≤t*)}]
تُنفَّذ الحلقة الخارجية في src/agas/simulation/episode.py وتحاكي
algorithms/agas_end_to_end.tex.
لا يُشترط PyTorch وCUDA إلا لنماذج الضحية الخاصة بالتعلّم العميق (إضافة [targets]). تعمل حلقة AGAS الأساسية والمسارات القائمة على القواعد / البديلة على CPU دون أي اعتماد على GPU.
pip install -e .
pip install -e '.[targets]'
متغيرات البيئة المطلوبة:
| المتغير | الغرض | الافتراضي |
|--------------------|---------------------------------------------------------------|--------------------------|
| `OPENAI_API_KEY` | مفتاح OpenAI Responses API لوكلاء Coordinator / worker LLMs. | *(غير معيّن → fallback)* |
| `OPENAI_MODEL` | اسم النموذج المُمرَّر إلى OpenAI. | `gpt-5.1` |
## 4. Datasets
تقيّم الورقة البحثية على ستة معايير CF عامة (انظر `experiment.tex`):
| الاسم المختصر | المصدر | المستخدمون | العناصر | التفاعلات | التنزيل | ضع الملفات الخام في |
|-------------|---------------------------|----------:|-------:|-------------------:|-------------------------------------------------------------------|---------------------|
| ML-100K | MovieLens 100K | 943 | 1,682 | 100,000 | [GroupLens](https://files.grouplens.org/datasets/movielens/ml-100k.zip) | `data/ml-100k/` |
| ML-1M | MovieLens 1M | 6,040 | 3,706 | 1,000,209 | [GroupLens](https://files.grouplens.org/datasets/movielens/ml-1m.zip) | `data/ml-1m/` |
| Genome 2021 | MovieLens Tag Genome 2021 | 37,941 | 84,661 | 2,000,000 (محدود) | [GroupLens](https://grouplens.org/datasets/movielens/tag-genome-2021/) | `data/genome2021/` |
| Netflix | Netflix Prize | 342,445 | 17,434 | 2,000,000 (محدود) | [Kaggle](https://www.kaggle.com/datasets/netflix-inc/netflix-prize-data) | `data/netflix/` |
| Douban | Douban Movie | 28,057 | 49,176 | 8,085,679 | [HKUST](http://shichuan.org/HIN_dataset.html) | `data/douban/` |
| Amazon | Amazon Reviews 2018 | 998,653 | 30,964 | 2,000,000 (محدود) | [UCSD](https://nijianmo.github.io/amazon/index.html) | `data/amazon/` |
بعد إسقاط التنزيلات الخام في `data/<dataset>/`، شغّل:```bash
python scripts/preprocess_all.py --data-root data --output-root processed
يُعاد كتابة كل مجموعة بيانات إلى ملفات interactions.csv + items.csv القياسية
تحت processed/<dataset>/. تستخدم اختبارات التحقق السريع عيّنة
ml-latest-small الأصغر بكثير التي تُشحن مع MovieLens.
لا تُخزّن خط أنابيب المعالجة المسبقة أي ملفات تقسيم — بل تُصدّر سجل التفاعل الكامل. تُطبَّق عمليات التقسيم في وقت التشغيل:
يتبع هذا بروتوكول تقييم هجوم التزييف القياسي: يراقب المهاجم ترتيبات الضحية على مستخدمي مجموعة التدريب ويحسّن وفقًا لذلك، محاكيًا سيناريو نشر الصندوق الأسود.
scripts/run_agas.py هو نقطة الدخول الوحيدة. الأعلام السبعة المطلوبة
بموجب بروتوكول الورقة البحثية هي:```
python scripts/run_agas.py
--dataset ml-100k
--victim lightgcn
--rounds 18
--seed 42
--n_workers 8
--budget 0.01
--out outputs/agas_ml100k_lightgcn_seed42.json
| العلامة | المعنى |
|----------------|--------------------------------------------------------------------------------------------------|
| `--dataset` | واحد من `ml-100k`، `ml-1m`، `genome2021`، `netflix`، `douban`، `amazon`، `ml-latest-small`. |
| `--victim` | واحد من 11 ضحية من `experiment.tex` (`mf`، `bpr`، `neumf`، `gmf`، `ncf`، `ngcf`، `lightgcn`، `simgcl`، `xsimgcl`، `egcf`، `lightccf`). |
| `--rounds` | عدد جولات AGAS `T` (القيمة الافتراضية في الورقة `18`). |
| `--seed` | البذرة العشوائية (تأخذ الورقة المتوسط على خمس بذور). |
| `--n_workers` | حجم مجموعة المستخدمين الوهميين |
| `--budget` | ميزانية التفاعل لكل مستخدم `L`، معبَّر عنها ككسر من. |
| `--out` | مسار JSON الناتج لتتبع الحلقة الكامل ومقاييس الملخص. |
### إعادة إنتاج كل سؤال بحثي على عينة صغيرة من ML-100K```bash
bash bash/run_performance.sh # RQ1
bash bash/run_stealth_and_detect.sh # RQ2 + RQ3
bash bash/run_ablation.sh # RQ4
bash bash/run_efficiency.sh # RQ5
كل سكربت يطبع التجربة التي يقوم بتشغيلها، ومسار الإخراج، وملاحظة تشير إلى الشكل/الجدول المقابل في الورقة البحثية.
مثال على الإخراج المتوقع في الطرفية (مقتطع):``` [RQ1] Performance benchmark — tiny ML-100K sample [RQ1] Output directory: agent_attack_rs/outputs/rq1_performance [RQ1] Map outputs to tables/benchmark_unpopular.tex === ml-latest-small / lightgcn / seed=42 === Round 0 | ρ = 1834 Δρ = +0 strategy = S1_VICTIM_PROBE Round 1 | ρ = 1450 Δρ = +384 strategy = S1_VICTIM_PROBE Round 2 | ρ = 1212 Δρ = +238 strategy = S3_WARM_UP … [RQ1] Done. Expected outputs in agent_attack_rs/outputs/rq1_performance
### هجوم النقل ضد LightGCN (داخل الحلقة)
يشغّل LightGCN كلاً من نموذج الحلقة وهدف التقييم. يعيد الضحية التدريب بعد كل جولة
بحيث يتلقى المنسّق تغذية راجعة حقيقية عن الترتيب ويكيّف الأدوار والاستراتيجية وفقاً لذلك.```bash
agas run-transfer \
--dataset ml-latest-small \
--target-item-id 7114 \
--target-keyword horror \
--num-agents 50 \
--num-steps 10 \
--victim-model-hint lightgcn \
--profiler-bridge-method cooccurrence \
--probe-steps 0 \
--graph-sniper \
--clone-segment-users-to-agents \
--transfer-mode option-b \
--target-models lightgcn \
--target-epochs 50 \
--target-embedding-dim 32 \
--target-lightgcn-layers 3 \
--min-active-fraction 0.5 \
--min-sniper-fraction 0.3 \
--output outputs/optb_warmstart_clean_cooc_50ag_10r.json
| العَلم | المعنى |
|---|---|
--profiler-bridge-method cooccurrence | يتم اختيار عناصر الجسر بناءً على التواجد المشترك مع مجموعة المُقيّمين الخاصة بالهدف. |
--graph-sniper | يقوم القنّاصون بتقييم عناصر الجسر و الهدف مباشرةً (إجراء مزدوج). |
بعد انتهاء التشغيل، تُطبع النتائج وتُحفظ في ملف JSON الناتج:``` Bridge-item selection (cooccurrence): 50 items selected for profiler pool. ... Transfer evaluation saved to outputs/optb_warmstart_clean_cooc.json Option B (in-loop target models): lightgcn: final rank (best in-loop at step , best-seq retrain rank )
## 6. تسجيل الرموز، تفعيل الأدوار وتتبع الاستراتيجية
كل استدعاء لـ `run-episode` يحسب ويسجل تلقائيًا ثلاثة أنواع من التحليلات:
### 6a. استخدام الرموز
يتم عد الرموز لكل استدعاء LLM وتجميعها عبر الحلقة لكل من المنسق وكل وكيل عامل بشكل منفصل. يتم طباعتها إلى وحدة التحكم بعد الحلقة وحفظها داخل JSON الناتج تحت `token_usage`.
**مثال على مخرجات وحدة التحكم:**```
--- Token Usage ---
Coordinator : prompt=20,043 completion=2,526 total=22,569
agent_1 : prompt=1,308 completion=619 total=1,927
agent_2 : prompt=3,930 completion=451 total=4,381
agent_3 : prompt=0 completion=0 total=0
AGGREGATE : prompt=25,281 completion=3,596 total=28,877
-------------------
بنية JSON (output["token_usage"]):```json
{
"coordinator": {"prompt_tokens": 20043, "completion_tokens": 2526, "total_tokens": 22569},
"by_agent": {"agent_1": {"prompt_tokens": 1308, ...}, ...},
"aggregate": {"prompt_tokens": 25281, "completion_tokens": 3596, "total_tokens": 28877}
}
**قراءة عدد الرموز من تشغيل محفوظ:**```python
import json
with open("outputs/my_run.json") as f:
data = json.load(f)
agg = data["token_usage"]["aggregate"]
print(f"Total tokens used: {agg['total_tokens']:,}")
print(f" Prompt : {agg['prompt_tokens']:,}")
print(f" Completion : {agg['completion_tokens']:,}")
# Per-step token usage (inside each worker trace)
for step in data["history"]:
for report in step["reports"]:
tok = (report.get("trace") or {}).get("token_usage") or {}
print(f"Step {step['step']} {report['agent_id']}: {tok.get('total_tokens', 0)} tokens")
ملاحظات المزوّد:
| المزوّد | الحقول المقروءة |
|---|---|
| OpenAI Responses API | response.usage.input_tokens, .output_tokens |
Ollama /api/generate | data["prompt_eval_count"], data["eval_count"] |
بعد كل حلقة، يحسب CLI عدد المرات التي تم فيها تعيين كل دور
عبر جميع الوكلاء وجميع الخطوات. يُطبع في الطرفية ويُحفظ تحت
output["activation_stats"]["role_counts"].
مثال على مخرجات الطرفية:```
--- Role Activations ---
inactive : 10
profiler : 4
--- Role Activations by Agent ---
agent_1 : inactive=3 profiler=1
agent_2 : profiler=3 inactive=2
agent_3 : inactive=5
**قراءة عدد الأدوار برمجيًا:**```python
stats = data["activation_stats"]
print("Most used role:", max(stats["role_counts"], key=stats["role_counts"].get))
print("Role counts:", stats["role_counts"])
print("By agent:", stats["role_counts_by_agent"])
يُربط نمط تعيين الأدوار لدى المنسّق بإحدى استراتيجيات الورقة الثماني (S1–S8) في كل خطوة باستخدام قواعد الاستدلال التالية:
محفوظة تحت output["activation_stats"]["strategy_counts"].
مثال على مخرجات الطرفية:``` --- Strategy Activations --- S1_VICTIM_PROBE : 1 S3_WARM_UP : 4
### 6d. سجل مقروء بشريًا لكل تشغيل
يُكتب ملف `.log` إلى جانب كل ملف JSON ناتج تلقائيًا
(على سبيل المثال `outputs/my_run.log`). يحتوي على:
- بيانات وصفية للحلقة (مجموعة البيانات، الهدف، عدد الوكلاء، السياسات)
- الجدول الزمني لكل خطوة: الرتبة، الاستراتيجية، دور كل وكيل، الإجراءات، وعدد الرموز لكل استدعاء
- ملخص استخدام الرموز
- إحصاءات تفعيل الأدوار والاستراتيجيات
**تشغيل CLI وقراءة السجل:**```bash
agas run-episode \
--dataset ml-latest-small \
--target-item-id 2571 \
--target-keyword "Matrix" \
--num-agents 3 \
--num-steps 10 \
--coordinator-policy openai \
--worker-policy openai \
--output outputs/run_matrix.json
# Human-readable log is at:
cat outputs/run_matrix.log
# JSON output is at:
python -c "
import json
d = json.load(open('outputs/run_matrix.json'))
print('Token aggregate:', d['token_usage']['aggregate'])
print('Role counts:', d['activation_stats']['role_counts'])
print('Strategy counts:',d['activation_stats']['strategy_counts'])
"
المنسّق وكل عامل هم وكلاء LLM يقرؤون من
prompts/<role>/{system,user}.txt. البروتوكول الكامل — ما يستبدله
المنسّق في مطالبه، والمتغيرات التي يراها العمال،
ومخططات مخرجات JSON المتوقعة — موجود في
prompts/README.md.
ملخص موجز:
{"strategy": "S?_…", "assignments": {agent: ROLE}}.{"actions": [{"item_id": …, "rating": …, "reason": …}]}.جميع الأرقام أدناه هي المتوسط ± فاصل الثقة 95% على مدى 5 بذور، مقيسة بمقياس 10³
(أي أن خلية بقيمة 40.0±0.2 تعني HR@10 = 0.0400 ± 0.0002). الخط العريض = الأفضل،
المائل = الثاني في الأفضلية، مطابقًا لـ tables/benchmark_unpopular.tex و
tables/detection_mf.tex في الورقة البحثية.
tables/benchmark_unpopular.tex)أعد الإنتاج باستخدام:```bash bash bash/run_performance.sh # RQ1; writes outputs/rq1_performance/
**الضحايا القائمون على التضمين** (الخلية = `H@10 / NDCG@10`):
| الطريقة | ML-100K·MF(BPR) | ML-100K·NeuMF | ML-1M·GMF | ML-1M·NCF | Amazon·MF(BPR) | Amazon·NCF | Genome·GMF | Genome·NeuMF | Netflix·MF(BPR) | Netflix·NeuMF |
|---|---|---|---|---|---|---|---|---|---|---|
| NoneAttack | 1.8±0.2 / 0.7±0.5 | 2.2±0.2 / 0.9±0.6 | 0.9±0.1 / 0.4±0.3 | 0.8±0.1 / 0.3±0.2 | 0.4±0.1 / 0.1±0.2 | 0.5±0.1 / 0.2±0.2 | 0.2±0.1 / 0.1±0.2 | 0.5±0.1 / 0.2±0.2 | 0.6±0.1 / 0.2±0.2 | 0.7±0.1 / 0.3±0.2 |
| RandomAttack | 4.1±0.3 / 1.6±0.6 | 4.7±0.3 / 1.8±0.6 | 2.4±0.2 / 1.0±0.5 | 2.0±0.2 / 0.8±0.4 | 1.2±0.1 / 0.5±0.3 | 1.3±0.1 / 0.5±0.3 | 0.7±0.1 / 0.3±0.2 | 1.3±0.1 / 0.5±0.3 | 1.8±0.2 / 0.7±0.4 | 2.0±0.2 / 0.8±0.5 |
| BandwagonAttack | 6.2±0.3 / 2.5±0.7 | 6.8±0.3 / 2.7±0.8 | 3.4±0.2 / 1.4±0.6 | 2.9±0.2 / 1.2±0.5 | 2.0±0.1 / 0.8±0.4 | 2.2±0.1 / 0.9±0.4 | 1.2±0.1 / 0.5±0.3 | 2.0±0.1 / 0.8±0.4 | 2.7±0.2 / 1.1±0.5 | 3.0±0.2 / 1.2±0.5 |
| AUSH | 10.6±0.6 / 4.3±1.2 | 10.0±0.5 / 4.1±1.1 | 6.5±0.4 / 2.6±0.9 | 4.3±0.3 / 1.8±0.7 | 3.3±0.3 / 1.3±0.6 | 3.1±0.3 / 1.2±0.6 | 1.9±0.2 / 0.8±0.5 | 2.8±0.3 / 1.1±0.6 | 4.2±0.3 / 1.7±0.7 | 4.5±0.3 / 1.8±0.8 |
| PoisonRec | 13.4±0.7 / 5.3±1.6 | 11.5±0.6 / 4.7±1.5 | 7.6±0.5 / 3.0±1.1 | 5.5±0.4 / 2.1±0.9 | _5.8±0.5_ / _2.3±1.0_ | 4.8±0.3 / 1.9±0.8 | 2.3±0.3 / 0.9±0.6 | 3.2±0.3 / 1.3±0.7 | 5.6±0.4 / 2.2±1.0 | 5.7±0.4 / 2.3±1.0 |
| PGA | 11.5±0.6 / 4.6±1.3 | 12.2±0.6 / 5.0±1.4 | 8.4±0.5 / 3.4±1.1 | 6.0±0.4 / 2.4±0.9 | 4.3±0.3 / 1.7±0.8 | 4.0±0.3 / 1.6±0.7 | 2.8±0.2 / 1.1±0.6 | 3.8±0.3 / 1.5±0.7 | 5.5±0.4 / 2.2±1.0 | 6.0±0.5 / 2.4±1.0 |
| AgentSA | 12.7±0.6 / 5.2±1.4 | _12.5±0.6_ / _5.1±1.4_ | 8.2±0.4 / 3.3±1.0 | _7.2±0.4_ / _2.9±1.0_ | 5.6±0.3 / 2.2±0.9 | 4.9±0.3 / 1.9±0.8 | _2.9±0.2_ / _1.1±0.6_ | 4.2±0.3 / 1.7±0.7 | _6.3±0.4_ / _2.5±1.0_ | 6.5±0.4 / 2.6±1.0 |
| AgentAttack | _13.6±0.7_ / _5.5±1.5_ | 12.1±0.6 / 4.9±1.4 | _8.8±0.5_ / _3.5±1.1_ | 6.8±0.4 / 2.7±1.0 | 5.7±0.3 / 2.2±0.9 | _5.2±0.3_ / _2.0±0.9_ | 2.7±0.2 / 1.0±0.6 | _4.5±0.3_ / _1.8±0.8_ | 6.1±0.4 / 2.4±1.0 | _6.9±0.5_ / _2.8±1.0_ |
| **AGAS (Ours)** | **40.0±0.2 / 16.1±0.3** | **35.0±0.2 / 14.2±0.3** | **22.6±0.1 / 9.0±0.2** | **17.6±0.1 / 7.1±0.2** | **16.1±0.1 / 6.3±0.2** | **15.0±0.1 / 5.9±0.2** | **8.2±0.1 / 3.2±0.2** | **11.5±0.1 / 4.6±0.2** | **18.2±0.1 / 7.3±0.2** | **19.6±0.1 / 7.9±0.2** |
| **Improvement** | **+187.8% / +182.5%** | **+186.9% / +184.0%** | **+162.8% / +164.7%** | **+155.1% / +153.6%** | **+177.6% / +173.9%** | **+172.7% / +168.2%** | **+192.9% / +190.9%** | **+161.4% / +155.6%** | **+198.4% / +192.0%** | **+192.5% / +192.6%** |
**الضحايا القائمون على الرسم البياني** (الخلية = `H@10 / NDCG@10`):
| الطريقة | ML-100K·NGCF | ML-100K·LightGCN | ML-1M·SimGCL | ML-1M·XSimGCL | Amazon·EGCF | Amazon·LightCCF | Genome·NGCF | Genome·LightGCN | Douban·NGCF | Douban·LightGCN |
|---|---|---|---|---|---|---|---|---|---|---|
| NoneAttack | 1.9±0.2 / 0.8±0.5 | 2.4±0.2 / 1.0±0.6 | 0.8±0.1 / 0.3±0.2 | 0.9±0.1 / 0.4±0.3 | 0.4±0.1 / 0.2±0.2 | 0.5±0.1 / 0.2±0.2 | 0.2±0.1 / 0.1±0.2 | 0.3±0.1 / 0.1±0.2 | 0.7±0.1 / 0.3±0.2 | 0.6±0.1 / 0.2±0.2 |
| RandomAttack | 4.5±0.3 / 1.8±0.6 | 5.0±0.3 / 2.0±0.7 | 1.8±0.2 / 0.7±0.4 | 2.2±0.2 / 0.9±0.5 | 1.1±0.1 / 0.4±0.3 | 1.2±0.1 / 0.5±0.3 | 0.6±0.1 / 0.2±0.2 | 0.6±0.1 / 0.2±0.2 | 2.0±0.2 / 0.8±0.5 | 1.9±0.2 / 0.7±0.4 |
| BandwagonAttack | 5.9±0.3 / 2.4±0.7 | 6.7±0.3 / 2.7±0.8 | 2.4±0.2 / 1.0±0.5 | 2.9±0.2 / 1.2±0.6 | 1.8±0.2 / 0.7±0.4 | 1.9±0.2 / 0.8±0.4 | 1.1±0.1 / 0.4±0.3 | 1.0±0.1 / 0.4±0.3 | 2.8±0.2 / 1.1±0.6 | 2.7±0.2 / 1.1±0.5 |
| GSPAttack | 11.0±0.6 / 4.5±1.3 | 11.5±0.6 / 4.7±1.3 | 4.8±0.3 / 1.9±0.8 | 5.8±0.4 / 2.3±0.9 | 3.2±0.3 / 1.3±0.6 | 3.4±0.3 / 1.4±0.6 | 2.0±0.2 / 0.8±0.5 | 1.8±0.2 / 0.7±0.5 | 5.0±0.3 / 2.0±0.8 | 4.8±0.3 / 1.9±0.8 |
| TargetedAttack | 11.9±0.6 / 4.8±1.3 | 12.6±0.6 / 5.1±1.4 | 5.4±0.4 / 2.2±0.8 | 6.4±0.4 / 2.5±1.0 | 4.7±0.3 / 1.9±0.7 | 4.5±0.3 / 1.8±0.7 | 2.5±0.2 / 1.0±0.6 | 2.2±0.2 / 0.9±0.5 | 5.4±0.4 / 2.2±0.8 | 5.2±0.3 / 2.1±0.8 |
| CLeaR | 13.1±0.7 / 5.4±1.4 | 13.9±0.7 / 5.7±1.5 | 6.4±0.4 / 2.6±0.9 | 7.7±0.5 / 3.1±1.0 | 4.6±0.3 / 1.8±0.7 | 5.2±0.4 / 2.1±0.8 | 2.9±0.3 / 1.2±0.6 | 2.8±0.2 / 1.1±0.6 | 5.8±0.4 / 2.3±0.9 | 5.5±0.3 / 2.2±0.9 |
| AgentSA | 13.8±0.6 / 5.6±1.4 | _14.2±0.7_ / _5.8±1.5_ | 6.1±0.4 / 2.4±0.8 | _8.4±0.5_ / _3.3±1.0_ | 4.5±0.3 / 1.8±0.7 | _5.4±0.3_ / _2.2±0.8_ | 2.8±0.2 / 1.1±0.6 | _2.9±0.2_ / _1.1±0.6_ | 5.4±0.3 / 2.2±0.8 | _5.8±0.4_ / _2.3±0.9_ |
| AgentAttack | _14.4±0.7_ / _5.9±1.5_ | 14.0±0.7 / 5.6±1.5 | _6.6±0.4_ / _2.6±0.9_ | 8.0±0.5 / 3.1±1.0 | _4.9±0.3_ / _1.9±0.7_ | 5.0±0.3 / 2.0±0.8 | _3.1±0.3_ / _1.2±0.6_ | 2.5±0.2 / 1.0±0.5 | _6.0±0.4_ / _2.4±0.9_ | 5.5±0.3 / 2.2±0.9 |
| **AGAS (Ours)** | **40.0±0.2 / 17.0±0.3** | **40.5±0.2 / 16.5±0.3** | **16.8±0.1 / 6.7±0.2** | **20.7±0.1 / 8.2±0.2** | **13.1±0.1 / 5.2±0.2** | **13.8±0.1 / 5.4±0.2** | **8.9±0.1 / 3.4±0.2** | **7.8±0.1 / 3.1±0.2** | **17.0±0.1 / 6.8±0.2** | **16.9±0.1 / 6.7±0.2** |
| **Improvement** | **+181.7% / +193.1%** | **+189.3% / +194.6%** | **+162.5% / +157.7%** | **+155.6% / +156.2%** | **+178.7% / +173.7%** | **+165.4% / +157.1%** | **+196.7% / +183.3%** | **+178.6% / +181.8%** | **+193.1% / +195.7%** | **+196.5% / +191.3%** |
## 9. الترخيص
رخصة MIT.
| المكوّن | المتطلب | تم اختباره مع |
|---|
| Python | ≥ 3.10 | 3.13.5 |
| PyTorch | ≥ 2.1 (الأهداف فقط) | 2.11.0+cu128 |
| CUDA | اختياري | 12.8 |
| NumPy | ≥ 1.24 | 2.4.2 |
| Pandas | ≥ 2.0 | 3.0.1 |
| SciPy | ≥ 1.10 | 1.17.0 |
| scikit-learn | ≥ 1.3 | 1.8.0 |
| openai SDK | ≥ 1.12 | 2.21.0 |
| المرحلة | البيانات المستخدمة | التفاصيل |
|---|
| التدريب | جميع التفاعلات في interactions.csv | يُدرَّب النموذج البديل (وأي نموذج هدف) على المجموعة الكاملة من التقييمات التاريخية. |
| تقييم الهجوم | الترتيب على مستخدمي الشريحة | بعد كل جولة، يُقاس متوسط رتبة العنصر الهدف عبر المستخدمين الحقيقيين الحميدين الذين قيّموا ≥ 4.0 على الأقل لعنصر واحد من عناصر مجموعة الهدف (حتى 2 000 مستخدم). لا تُكتب أي مجموعة اختبار محجوزة على القرص. |
| الحقن المزيّف | تُضاف في الذاكرة | تُضاف تفاعلات المستخدمين المزيّفين ويُعاد تدريب النموذج تدريجيًا في كل جولة. ولا تُخلط أبدًا في ملفات CSV القياسية. |
| الشرط | الاستراتيجية المستنتجة |
|---|
| مرحلة التحقق / وكيل التشخيص نشط | S1_VICTIM_PROBE |
علامة التنبيه مضبوطة (a_t = 1) | S7_SAFE_REPLACEMENT |
| أقصى درجة اشتباه ≥ 0.5 | S6_PROFILE_CLEANUP |
| لا قناصة + خصم مرئي | S5_SILENT_SLOWDOWN |
| لا قناصة + لا خصم | S3_WARM_UP |
| القناصة نشطون | S4_FIRST_PUSH |
| القناصة نشطون | S8_MAIN_ATTACK |