
LLM-gesteuertes agentisches Framework für Group-Shilling-Angriffe, das Black-Box-Collaborative-Filtering-Empfehlungsrankings mithilfe adaptiver Multi-Rollen-Strategien manipuliert und dabei der Erkennung entgeht.
Dies ist der offizielle Code zum Paper: „An Efficient and Effective Agentic Group Shilling Attack on Recommender Systems“. Dieses Paper stellt AGAS vor, einen LLM-gesteuerten Shilling-Angriff gegen Black-Box-Collaborative-Filtering-Empfehlungssysteme. Ein Coordinator orchestriert einen Pool von Fake-User-Workern über eine Sequenz von Runden. In jeder Runde wählt der Coordinator eine von acht Strategien und weist jedem Worker eine Rolle zu. Die Worker entscheiden dann, welche Items sie bewerten, indem sie ihre eigene ReAct-artige Reasoning-Schleife verwenden.
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. Methodenrückblick
AGAS instanziiert vier Worker-Rollen (Papiersymbole in `roles.py`):
| Symbol | Langname | Was es tut |
|--------|----------------|-------------------------------------------------------------------------|
| `PR` | Profiler | Sichere Filler-Item-Bewertungen, um die Plattform zu sondieren und Bridge-Pools aufzubauen. |
| `SN` | Sniper | Payload-Rolle; direkter Ziel-Push oder Bridge-Item-Promotion. |
| `CA` | Camouflageur | Stealth-Rolle; baut Vertrauen mit harmlos wirkender Aktivität wieder auf. |
| `IN` | Inactive | Keine Aktion in dieser Runde (Cool-down oder Quarantäne). |
Jede Runde wählt der Coordinator genau eine von acht Strategien aus
`strategies.py` (siehe `method_strategies.tex`):
1. **Victim Probe** (`S1_VICTIM_PROBE`)
2. **Bridge Building** (`S2_BRIDGE_BUILDING`, nur Graph-Opfer)
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`)
Der Coordinator steuert diese Entscheidungen aus zwei Signalgruppen (`signals.py`):
* **Worker-Signale** `τ_{t,w}, γ_{t,w}, φ_{t,w}` — Vertrauen, Risiko und ein
struktureller Validator. Die Aktualisierungsgleichungen stimmen exakt mit
`method_coordinator.tex` überein (`eq:trust_update`, `eq:risk_update`, `eq:risk_decay`,
`eq:profile_validator`).
* **Umgebungssignale** `ρ^{(t)}, Δρ^{(t)}, η_t, ξ_t = (q_t, s_t), a_t` —
Rang, Rangbewegung, Akzeptanzrate, Unterdrückungssignal, Alarm-Flag. Der
Verdachtswert `q_t` ist die mit 0,2 gewichtete Summe der fünf normalisierten
Terme `(d̂_t, δ̂_t, m̂_t, ŝ_t, g_t)` aus `eq:round_suppression_terms` und
`eq:round_suppression_score`.
### Runden-Schleife (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*)}]
Die äußere Schleife ist in src/agas/simulation/episode.py implementiert und spiegelt
algorithms/agas_end_to_end.tex wider.
PyTorch und CUDA werden nur für die Deep-Learning-Victim-Modelle benötigt (Extra [targets]). Die Kern-AGAS-Schleife und die regelbasierten / Surrogat-Pfade laufen auf der CPU ohne GPU-Abhängigkeit.
pip install -e .
pip install -e '.[targets]'
Erforderliche Umgebungsvariablen:
| Variable | Zweck | Standard |
|--------------------|---------------------------------------------------------------|--------------------------|
| `OPENAI_API_KEY` | OpenAI Responses API-Schlüssel für die Coordinator-/Worker-LLMs. | *(nicht gesetzt → Fallback)* |
| `OPENAI_MODEL` | An OpenAI übergebener Modellname. | `gpt-5.1` |
## 4. Datensätze
Das Paper evaluiert auf sechs öffentlichen CF-Benchmarks (siehe `experiment.tex`):
| Kurzname | Quelle | Nutzer | Elemente | Interaktionen | Download | Rohdateien ablegen 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 (begrenzt) | [GroupLens](https://grouplens.org/datasets/movielens/tag-genome-2021/) | `data/genome2021/` |
| Netflix | Netflix Prize | 342,445 | 17,434 | 2,000,000 (begrenzt) | [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 (begrenzt) | [UCSD](https://nijianmo.github.io/amazon/index.html) | `data/amazon/` |
Nachdem die Rohdownloads in `data/<dataset>/` abgelegt wurden, führe aus:```bash
python scripts/preprocess_all.py --data-root data --output-root processed
Jeder Datensatz wird in kanonische interactions.csv + items.csv-Dateien unter processed/<dataset>/ umgeschrieben. Die Smoke-Tests verwenden das deutlich kleinere ml-latest-small-Beispiel, das mit MovieLens ausgeliefert wird.
Die Vorverarbeitungs-Pipeline speichert keine Split-Dateien — sie exportiert das vollständige Interaktionsprotokoll. Splits werden zur Laufzeit angewendet:
Dies folgt dem Standard-Evaluierungsprotokoll für Shilling-Angriffe: Der Angreifer beobachtet die Rankings des Opfers auf Nutzern des Trainingssets und optimiert entsprechend, was ein Black-Box-Einsatzszenario nachahmt.
scripts/run_agas.py ist der einzige Einstiegspunkt. Die sieben Flags, die das Paper-Protokoll erfordert, sind:```
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
| Flag | Bedeutung |
|----------------|--------------------------------------------------------------------------------------------------|
| `--dataset` | Eines von `ml-100k`, `ml-1m`, `genome2021`, `netflix`, `douban`, `amazon`, `ml-latest-small`. |
| `--victim` | Eines der 11 Opfer aus `experiment.tex` (`mf`, `bpr`, `neumf`, `gmf`, `ncf`, `ngcf`, `lightgcn`, `simgcl`, `xsimgcl`, `egcf`, `lightccf`). |
| `--rounds` | Anzahl der AGAS-Runden `T` (Standard im Paper: `18`). |
| `--seed` | Zufallsseed (das Paper mittelt über fünf). |
| `--n_workers` | Größe des Fake-User-Pools |
| `--budget` | Interaktionsbudget pro Nutzer `L`, ausgedrückt als Bruchteil von. |
| `--out` | Ausgabe-JSON-Pfad für die vollständige Episode-Aufzeichnung und Zusammenfassungsmetriken. |
### Reproduktion jeder Forschungsfrage anhand einer winzigen ML-100K-Stichprobe```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
Jedes Skript gibt aus, welches Experiment es ausführt, den Ausgabepfad und einen Hinweis auf die entsprechende Abbildung/Tabelle im Paper.
Beispiel einer erwarteten Konsolenausgabe (gekürzt):``` [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
### Transfer-Angriff gegen LightGCN (in-loop)
Führt LightGCN sowohl als Episode-Modell als auch als Evaluierungsziel aus. Das Opfer
trainiert nach jeder Runde neu, sodass der Coordinator echtes Rang-Feedback erhält und
Rollen und Strategie entsprechend anpasst.```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
| Flag | Bedeutung |
|---|---|
--profiler-bridge-method cooccurrence | Bridge-Elemente werden durch Ko-Okkurrenz mit dem Rater-Cluster des Ziels ausgewählt. |
--graph-sniper | Sniper bewerten Bridge-Elemente und das Ziel direkt (Dual-Aktion). |
Nach dem Lauf werden die Ergebnisse ausgegeben und in der Ausgabe-JSON gespeichert:``` 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. Token-Protokollierung, Rollenaktivierung & Strategieverfolgung
Jeder `run-episode`-Aufruf berechnet und protokolliert automatisch drei Arten von Analysen:
### 6a. Token-Nutzung
Tokens werden pro LLM-Aufruf gezählt und über die Episode hinweg für den
Koordinator und für jeden Worker-Agenten separat akkumuliert. Sie werden nach
der Episode auf der Konsole ausgegeben und im Ausgabe-JSON unter
`token_usage` gespeichert.
**Beispiel für die Konsolenausgabe:**```
--- 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-Struktur (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}
}
**Token-Zählungen aus einem gespeicherten Lauf lesen:**```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")
Hinweise zu den Anbietern:
| Anbieter | Gelesene Felder |
|---|---|
| OpenAI Responses API | response.usage.input_tokens, .output_tokens |
Ollama /api/generate | data["prompt_eval_count"], data["eval_count"] |
Nach jeder Episode zählt die CLI, wie oft jede Rolle über alle Agenten und alle Schritte hinweg zugewiesen wurde. Ausgegeben auf der Konsole und gespeichert unter
output["activation_stats"]["role_counts"].
Beispiel für Konsolenausgabe:```
--- 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
**Rollenanzahlen programmatisch auslesen:**```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"])
Das Rollenzuweisungsmuster des Koordinators wird bei jedem Schritt mithilfe der folgenden Inferenzregeln einer der acht Paper-Strategien (S1–S8) zugeordnet:
Gespeichert unter output["activation_stats"]["strategy_counts"].
Beispiel für Konsolenausgabe:``` --- Strategy Activations --- S1_VICTIM_PROBE : 1 S3_WARM_UP : 4
### 6d. Menschenlesbares Protokoll pro Durchlauf
Neben jeder Ausgabe-JSON wird automatisch eine `.log`-Datei geschrieben
(z. B. `outputs/my_run.log`). Sie enthält:
- Episoden-Metadaten (Datensatz, Ziel, Agentenanzahl, Richtlinien)
- Zeitleiste pro Schritt: Rang, Strategie, Rolle jedes Agenten, Aktionen und Token-Anzahl pro Aufruf
- Zusammenfassung der Token-Nutzung
- Zählungen der Rollen- und Strategieaktivierungen
**Ausführen der CLI und Lesen des Protokolls:**```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'])
"
Der Coordinator und jeder Worker sind LLM-Agenten, die aus
prompts/<role>/{system,user}.txt lesen. Das vollständige Protokoll — was der
Coordinator in seinen Prompt interpoliert, welche Variablen die Worker sehen
und die erwarteten JSON-Ausgabeschemata — befindet sich in
prompts/README.md.
Kurze Zusammenfassung:
{"strategy": "S?_…", "assignments": {agent: ROLE}}.{"actions": [{"item_id": …, "rating": …, "reason": …}]}.Alle Zahlen unten sind Mittelwert ± 95 %-KI über 5 Seeds, skaliert mit 10³
(d. h. eine Zelle mit 40.0±0.2 bedeutet HR@10 = 0.0400 ± 0.0002). Fett = bestes,
kursiv = zweitbestes, übereinstimmend mit tables/benchmark_unpopular.tex und
tables/detection_mf.tex im Paper.
tables/benchmark_unpopular.tex)Reproduzieren mit:```bash bash bash/run_performance.sh # RQ1; writes outputs/rq1_performance/
**Embedding-basierte Opfer** (Zelle = `H@10 / NDCG@10`):
| Methode | 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%** |
**Graph-basierte Opfer** (Zelle = `H@10 / NDCG@10`):
| Methode | 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. Lizenz
MIT-Lizenz.
| Komponente | Anforderung | Getestet mit |
|---|
| Python | ≥ 3.10 | 3.13.5 |
| PyTorch | ≥ 2.1 (nur targets) | 2.11.0+cu128 |
| CUDA | optional | 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 |
| Phase | Verwendete Daten | Details |
|---|
| Training | Alle Interaktionen in interactions.csv | Das Surrogat (und jedes Zielmodell) wird auf dem vollständigen Satz historischer Bewertungen angepasst. |
| Angriffsbewertung | Ranking über Segmentnutzer | Nach jeder Runde wird der mittlere Rang des Zielitems über echte gutartige Nutzer gemessen, die mindestens ein Item des Zielclusters mit ≥ 4,0 bewertet haben (bis zu 2 000 Nutzer). Es wird kein zurückgehaltenes Testset auf die Festplatte geschrieben. |
| Fake-Injektion | Im Speicher angehängt | Fake-Nutzer-Interaktionen werden angehängt und das Modell wird in jeder Runde inkrementell neu angepasst. Sie werden niemals in die kanonischen CSV-Dateien eingemischt. |
| Bedingung | Abgeleitete Strategie |
|---|
| Probe-Phase / diagnostischer Agent aktiv | S1_VICTIM_PROBE |
Alert-Flag gesetzt (a_t = 1) | S7_SAFE_REPLACEMENT |
| Maximaler Verdachtsscore ≥ 0.5 | S6_PROFILE_CLEANUP |
| Keine Scharfschützen + sichtbares Discounting | S5_SILENT_SLOWDOWN |
| Keine Scharfschützen + kein Discounting | S3_WARM_UP |
| Scharfschützen aktiv | S4_FIRST_PUSH |
| Scharfschützen aktiv | S8_MAIN_ATTACK |