これは論文「An Efficient and Effective Agentic Group Shilling Attack on Recommender Systems」の公式コードです。本論文ではAGASを紹介しています。これはブラックボックスの協調フィルタリング推薦システムに対するLLM駆動のシリング攻撃です。1つの Coordinatorが、一連のラウンドにわたって偽ユーザーworkerのプールを統括します。各ラウンドで、Coordinatorは8つの戦略のうち1つを選び、 すべてのworkerに役割を割り当てます。その後、workerは自身の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
AGAS は 4 つのワーカーロールをインスタンス化します(論文上の記号は roles.py にあります):
| 記号 | 正式名称 | 役割 |
|---|---|---|
PR | Profiler | 安全なフィラーアイテムの評価によりプラットフォームを調査し、ブリッジプールを構築します。 |
SN | Sniper | ペイロードロール。直接的なターゲットプッシュまたはブリッジアイテムの昇格を行います。 |
CA | Camouflageur | ステルスロール。無害に見える活動で信頼を再構築します。 |
IN | Inactive | このラウンドでは何も行いません(クールダウンまたは隔離)。 |
各ラウンドで Coordinator は strategies.py にある 8 つの戦略から
ちょうど 1 つを選択します(method_strategies.tex を参照):
S1_VICTIM_PROBE)S2_BRIDGE_BUILDING、グラフ被害者のみ)S3_WARM_UP)S4_FIRST_PUSH)S5_SILENT_SLOWDOWN)S6_PROFILE_CLEANUP)S7_SAFE_REPLACEMENT)S8_MAIN_ATTACK)Coordinator はこれらの決定を 2 つのシグナルグループ(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 は、eq:round_suppression_terms と
eq:round_suppression_score からの 5 つの正規化項
(d̂_t, δ̂_t, m̂_t, ŝ_t, g_t) の 0.2 重み付き和です。 ┌─────────────────────────────────────────────────┐
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 を反映しています。
| コンポーネント | 要件 | テスト済み |
|---|---|---|
| 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 |
PyTorch と CUDA は深層学習の被害者モデル([targets] extra)にのみ必要です。コア AGAS ループおよびルールベース/サロゲートパスは GPU 依存なしで CPU 上で動作します。
pip install -e .
# If you want to use the deep-learning victim models (LightGCN, NeuMF, …)
pip install -e '.[targets]'
必須の環境変数:
| 変数 | 目的 | デフォルト |
|---|---|---|
OPENAI_API_KEY | Coordinator / worker LLM 用の OpenAI Responses API キー。 | (未設定 → フォールバック) |
OPENAI_MODEL | OpenAI に渡されるモデル名。 | gpt-5.1 |
本論文では6つの公開CFベンチマークで評価を行います(experiment.tex を参照):
| 略称 | ソース | ユーザー数 | アイテム数 | インタラクション数 | ダウンロード | 生ファイルの配置先 |
|---|---|---|---|---|---|---|
| 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(上限あり) | GroupLens | data/genome2021/ |
| Netflix | Netflix Prize | 342,445 | 17,434 | 2,000,000(上限あり) | 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(上限あり) | UCSD | data/amazon/ |
生のダウンロードファイルを data/<dataset>/ に配置した後、以下を実行します:
python scripts/preprocess_all.py --data-root data --output-root processed
各データセットは processed/<dataset>/ 配下の正規化された interactions.csv + items.csv ファイルに書き換えられます。スモークテストでは、MovieLens に同梱されているはるかに小さい ml-latest-small サンプルを使用します。
前処理パイプラインは分割ファイルを保存しません — 完全なインタラクションログをエクスポートします。分割は実行時に適用されます:
| 段階 | 使用データ | 詳細 |
|---|---|---|
| 訓練 | interactions.csv 内のすべてのインタラクション | サロゲート(および任意のターゲットモデル)は、過去の評価の完全なセットでフィットされます。 |
| 攻撃評価 | セグメントユーザーに対するランキング | 各ラウンド後、ターゲットアイテムの平均ランクが、少なくとも1つのターゲットクラスターアイテムに 4.0 以上を評価した実際の良性ユーザー(最大 2 000 ユーザー)全体で測定されます。ホールドアウトテストセットはディスクに書き込まれません。 |
| 偽注入 | メモリ内で追加 | 偽ユーザーのインタラクションが追加され、モデルは各ラウンドでインクリメンタルに再フィットされます。それらが正規の CSV ファイルに混入されることはありません。 |
これは標準的なシリング攻撃評価プロトコルに従っています: 攻撃者は訓練セットユーザーに対する被害者のランキングを観察し、それに応じて最適化し、ブラックボックス展開シナリオを模倣します。