
LLM-संचालित एजेंटिक समूह शिलिंग हमला ढांचा जो अनुकूली बहु-भूमिका रणनीतियों का उपयोग करके ब्लैक-बॉक्स सहयोगी-फ़िल्टरिंग सिफ़ारिश रैंकिंग में हेरफेर करता है और साथ ही पकड़ में आने से बचता है।
यह पेपर का आधिकारिक कोड है: "An Efficient and Effective Agentic Group Shilling Attack on Recommender Systems"। यह पेपर AGAS प्रस्तुत करता है, जो ब्लैक-बॉक्स कोलैबोरेटिव-फ़िल्टरिंग रिकमेंडर्स के विरुद्ध एक LLM-संचालित शिलिंग अटैक है। एक Coordinator राउंड्स के एक क्रम में फ़ेक-यूज़र workers के एक पूल को ऑर्केस्ट्रेट करता है। प्रत्येक राउंड में, Coordinator आठ रणनीतियों में से एक चुनता है और प्रत्येक worker को एक रोल सौंपता है। इसके बाद 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` | प्रोफाइलर | प्लेटफ़ॉर्म की जाँच करने और ब्रिज पूल बनाने के लिए सुरक्षित फ़िलर-आइटम रेटिंग। |
| `SN` | स्नाइपर | पेलोड भूमिका; सीधा लक्ष्य पुश या ब्रिज-आइटम प्रोन्नति। |
| `CA` | कैमोफ्लाजर | स्टील्थ भूमिका; सौम्य दिखने वाली गतिविधि से विश्वास पुनर्निर्मित करता है। |
| `IN` | निष्क्रिय | इस राउंड में कोई कार्रवाई नहीं (कूल-डाउन या क्वारंटाइन)। |
प्रत्येक राउंड में समन्वयक `strategies.py` से आठ रणनीतियों में से ठीक एक चुनता है
(`method_strategies.tex` देखें):
1. **विक्टिम प्रोब** (`S1_VICTIM_PROBE`)
2. **ब्रिज बिल्डिंग** (`S2_BRIDGE_BUILDING`, केवल ग्राफ़ विक्टिम)
3. **वार्म-अप** (`S3_WARM_UP`)
4. **फर्स्ट पुश** (`S4_FIRST_PUSH`)
5. **साइलेंट स्लोडाउन** (`S5_SILENT_SLOWDOWN`)
6. **प्रोफ़ाइल क्लीनअप** (`S6_PROFILE_CLEANUP`)
7. **सेफ रिप्लेसमेंट** (`S7_SAFE_REPLACEMENT`)
8. **मेन अटैक** (`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` पाँच सामान्यीकृत पदों `(d̂_t, δ̂_t, m̂_t, ŝ_t, g_t)` का 0.2-भारित योग है
जो `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] extra) के लिए आवश्यक हैं। मुख्य AGAS लूप और नियम-आधारित / सरोगेट पथ बिना किसी GPU निर्भरता के CPU पर चलते हैं।
pip install -e .
pip install -e '.[targets]'
आवश्यक environment variables:
| Variable | उद्देश्य | डिफ़ॉल्ट |
|--------------------|---------------------------------------------------------------|--------------------------|
| `OPENAI_API_KEY` | Coordinator / worker LLMs के लिए OpenAI Responses API key। | *(unset → fallback)* |
| `OPENAI_MODEL` | OpenAI को पास किया गया model name। | `gpt-5.1` |
## 4. Datasets
यह पेपर छह सार्वजनिक CF benchmarks पर मूल्यांकन करता है (देखें `experiment.tex`):
| Short name | Source | Users | Items | Interactions | Download | Place raw files in |
|-------------|---------------------------|----------:|-------:|-------------------:|-------------------------------------------------------------------|---------------------|
| 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 (capped) | [GroupLens](https://grouplens.org/datasets/movielens/tag-genome-2021/) | `data/genome2021/` |
| Netflix | Netflix Prize | 342,445 | 17,434 | 2,000,000 (capped) | [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 (capped) | [UCSD](https://nijianmo.github.io/amazon/index.html) | `data/amazon/` |
raw downloads को `data/<dataset>/` में डालने के बाद, चलाएँ:```bash
python scripts/preprocess_all.py --data-root data --output-root processed
प्रत्येक डेटासेट को processed/<dataset>/ के अंतर्गत canonical interactions.csv + items.csv फ़ाइलों में पुनः लिखा जाता है। स्मोक टेस्ट MovieLens के साथ आने वाले बहुत छोटे ml-latest-small सैंपल का उपयोग करते हैं।
प्रीप्रोसेसिंग पाइपलाइन कोई स्प्लिट फ़ाइल संग्रहीत नहीं करती — यह पूर्ण इंटरैक्शन लॉग निर्यात करती है। स्प्लिट रनटाइम पर लागू किए जाते हैं:
यह मानक शिलिंग-अटैक मूल्यांकन प्रोटोकॉल का अनुसरण करता है: हमलावर ट्रेनिंग-सेट उपयोगकर्ताओं पर विक्टिम की रैंकिंग देखता है और तदनुसार ऑप्टिमाइज़ करता है, जो ब्लैक-बॉक्स डिप्लॉयमेंट परिदृश्य की नकल करता है।
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` | `experiment.tex` से 11 शिकारों में से एक (`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 को एपिसोड मॉडल और मूल्यांकन लक्ष्य दोनों के रूप में चलाता है। प्रत्येक राउंड के बाद पीड़ित (victim) पुनः प्रशिक्षण करता है ताकि Coordinator को वास्तविक रैंक फीडबैक प्राप्त हो और वह तदनुसार भूमिकाओं और रणनीति को अनुकूलित कर सके।```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. प्रति-रन मानव-पठनीय लॉग
प्रत्येक आउटपुट JSON के साथ स्वचालित रूप से एक `.log` फ़ाइल लिखी जाती है
(जैसे `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'])
"
Coordinator और प्रत्येक worker LLM एजेंट हैं जो
prompts/<role>/{system,user}.txt से पढ़ते हैं। पूरा प्रोटोकॉल — Coordinator अपने प्रॉम्प्ट में क्या इंटरपोलेट करता है, workers कौन से वेरिएबल देखते हैं,
और अपेक्षित JSON आउटपुट स्कीमा —
prompts/README.md में है।
संक्षिप्त सारांश:
{"strategy": "S?_…", "assignments": {agent: ROLE}}.{"actions": [{"item_id": …, "rating": …, "reason": …}]}.नीचे दी गई सभी संख्याएँ 5 seeds पर mean ± 95 % CI, 10³ से स्केल की गई
हैं (अर्थात, 40.0±0.2 का एक सेल HR@10 = 0.0400 ± 0.0002 दर्शाता है)। Bold = सर्वश्रेष्ठ,
italic = दूसरा सर्वश्रेष्ठ, जो पेपर में 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`):
| Method | 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`):
| Method | 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 License।
| घटक | आवश्यकता | परीक्षण किया गया |
|---|
| Python | ≥ 3.10 | 3.13.5 |
| PyTorch | ≥ 2.1 (केवल targets) | 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 उपयोगकर्ता)। डिस्क पर कोई होल्ड-आउट टेस्ट सेट नहीं लिखा जाता। |
| फ़ेक इंजेक्शन | इन-मेमोरी में जोड़ा गया | फ़ेक-यूज़र इंटरैक्शन जोड़े जाते हैं और प्रत्येक राउंड में मॉडल को इंक्रीमेंटली री-फिट किया जाता है। इन्हें कभी भी canonical 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 |