
Estrutura de ataque de shilling em grupo agêntico orientado por LLM que manipula rankings de recomendadores de filtragem colaborativa de caixa-preta usando estratégias adaptativas de múltiplos papéis enquanto evade a detecção.
Este é o código oficial do artigo: "An Efficient and Effective Agentic Group Shilling Attack on Recommender Systems". Este artigo apresenta o AGAS, que é um ataque de shilling impulsionado por LLM contra recomendadores de filtragem colaborativa de caixa-preta. Um Coordenador orquestra um conjunto de trabalhadores usuários-falsos ao longo de uma sequência de rodadas. Em cada rodada, o Coordenador escolhe uma entre oito estratégias e atribui um papel a cada trabalhador. Os trabalhadores então decidem quais itens avaliar usando seu próprio loop de raciocínio no estilo 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
O AGAS instancia quatro papéis de worker (símbolos do artigo em roles.py):
| Símbolo | Nome completo | O que faz |
|---|---|---|
PR | Profiler | Avaliações seguras de itens de preenchimento para sondar a plataforma e construir pools de ponte. |
SN | Sniper | Papel de payload; envio direto ao alvo ou promoção de item de ponte. |
CA | Camouflageur | Papel furtivo; reconstrói a confiança com atividade de aparência benigna. |
IN | Inactive | Nenhuma ação nesta ronda (arrefecimento ou quarentena). |
A cada ronda, o Coordinator escolhe exatamente uma de oito estratégias de
strategies.py (ver method_strategies.tex):
S1_VICTIM_PROBE)S2_BRIDGE_BUILDING, apenas vítimas de grafo)S3_WARM_UP)S4_FIRST_PUSH)S5_SILENT_SLOWDOWN)S6_PROFILE_CLEANUP)S7_SAFE_REPLACEMENT)S8_MAIN_ATTACK)O Coordinator orienta essas decisões a partir de dois grupos de sinais (signals.py):
τ_{t,w}, γ_{t,w}, φ_{t,w} — confiança, risco e um
validador estrutural. As equações de atualização correspondem exatamente a
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 —
rank, movimento de rank, taxa de aceitação, sinal de supressão, flag de alerta. A
pontuação de suspeita q_t é a soma ponderada por 0,2 dos cinco termos
normalizados (d̂_t, δ̂_t, m̂_t, ŝ_t, g_t) de eq:round_suppression_terms e
eq:round_suppression_score. ┌─────────────────────────────────────────────────┐
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*)}]
O loop externo é implementado em src/agas/simulation/episode.py e espelha
algorithms/agas_end_to_end.tex.
| Componente | Requisito | Testado com |
|---|---|---|
| Python | ≥ 3.10 | 3.13.5 |
| PyTorch | ≥ 2.1 (apenas targets) | 2.11.0+cu128 |
| CUDA | opcional | 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 |
PyTorch e CUDA são necessários apenas para os modelos vítimas de deep learning (extra [targets]). O loop principal do AGAS e os caminhos baseados em regras / surrogate são executados em CPU sem dependência de GPU.
pip install -e .
# If you want to use the deep-learning victim models (LightGCN, NeuMF, …)
pip install -e '.[targets]'
Variáveis de ambiente necessárias:
| Variável | Finalidade | Padrão |
|---|---|---|
OPENAI_API_KEY | Chave da OpenAI Responses API para os LLMs do Coordenador / worker. | (não definida → fallback) |
OPENAI_MODEL | Nome do modelo passado para a OpenAI. | gpt-5.1 |
O artigo avalia em seis benchmarks públicos de CF (ver experiment.tex):
| Nome curto | Fonte | Usuários | Itens | Interações | Download | Coloque os arquivos brutos em |
|---|---|---|---|---|---|---|
| ML-100K | MovieLens 100K | 943 | 1,682 | 100,000 | GroupLens | data/ml-100k/ |
| ML-1M | MovieLens 1M | 6,040 | 3,706 | 1,000,209 | GroupLens | data/ml-1m/ |
| Genome 2021 | MovieLens Tag Genome 2021 | 37,941 | 84,661 | 2,000,000 (limitado) | GroupLens | data/genome2021/ |
| Netflix | Netflix Prize | 342,445 | 17,434 | 2,000,000 (limitado) | Kaggle | data/netflix/ |
| Douban | Douban Movie | 28,057 | 49,176 | 8,085,679 | HKUST | data/douban/ |
| Amazon | Amazon Reviews 2018 | 998,653 | 30,964 | 2,000,000 (limitado) | UCSD | data/amazon/ |