
Eine offene Testumgebung und Benchmark für KI in Cybersicherheitsoperationen.
Testen Sie die neuesten Reasoning-LLMs als SOC-Agenten anhand von rohen NetFlow-Daten.
socbench benchmarkt die neuesten Reasoning-Modelle als SOC-Agenten: Jedes Modell durchläuft eine begrenzte Multi-Turn-Agentenschleife gegen einen deterministischen, vorindizierten NetFlow-Korpus mit persona-bezogenen Nur-Lese-Werkzeugen, festen Dollarbegrenzungen pro Untersuchung und einem strengen JSON-Vertrag für die endgültige Antwort. Vier Personas (SOC Analyst, Threat Analyst, Adversary Hunter, Detection Engineer) und drei Anbieter (OpenAI, Anthropic, Google) teilen sich dieselben Bewertungseinheiten, Bewertungslinsen und Ablationsoberfläche, sodass die Überschriftenzahlen und die Deltas von tools_off / playbooks_off direkt vergleichbar sind.
Das Repository ist lokal-zuerst. Ein Laptop, drei API-Schlüssel und ein im Repo festgeschriebenes Beispiel-Parquet reichen aus, um einen Smoke-Test unter einem Budget von 10 $ zu reproduzieren.
Alpha. Die gesamte Pipeline läuft von Anfang bis Ende. Abgedeckte Komponenten:
socbench build-index) mit deterministischen, inhaltsadressierten IndizesREPRODUCE.mdSie können noch heute einen kompletten Smoke-Test ohne API-Schlüssel über den Mock-Provider durchführen (siehe Quickstart Schritt 3 oder notebooks/quickstart.ipynb).
socbench wird als Standard-PEP-621-/Hatchling-Projekt ausgeliefert. Beide Installationswege funktionieren.
uv (empfohlen für die Entwicklung)curl -LsSf https://astral.sh/uv/install.sh | sh
git clone https://github.com/DeepTempo/socbench.git
cd socbench
uv venv --python 3.11
source .venv/bin/activate
uv pip install -e ".[dev,providers]"
pipgit clone https://github.com/DeepTempo/socbench.git
cd socbench
python3.11 -m venv .venv
source .venv/bin/activate
pip install -e ".[dev,providers]"
In beiden Fällen sollte socbench --help nun die verfügbaren Unterbefehle auflisten.
config/benchmark_config.yaml enthält sichere Standardwerte: Smoke cost_budget_usd: 10, voll cost_budget_usd: 900, fest cost_usd_cap_per_rendering: 0.50. Pfade darin, die auf Geschwister-Konfigurationsdateien verweisen (schema_path, pricing_path), werden relativ zum eigenen Verzeichnis der YAML aufgelöst, sodass Umbenennen oder Verschieben von config/ keine Codeänderungen erfordert.
socbench build-index \
--config config/benchmark_config.yaml \
--dataset sample
Dies normalisiert das Parquet gegen config/schema.json, sortiert global nach ts_start mit deterministischer Tie-Break-Auflösung, weist stabile flow_ids zu, leitet pair_timeline / host_egress-Bewertungseinheiten ab, berechnet Zusammenfassungen und schreibt in indexes/<dataset_hash>/.
Ein erneutes Ausführen des Befehls auf denselben Daten ist ein No-Op. Übergeben Sie --rebuild, um einen erneuten Build zu erzwingen.
socbench tools-smoke \
--dataset-hash <dataset_hash> \
--persona soc_analyst
Dies ruft jedes Werkzeug in der Zulassungsliste der Persona gegen den erstellten Index auf und gibt eine Zusammenfassung aus, ohne Modellaufrufe.
# Free, deterministic, no API keys (the mock provider):
socbench run --dataset-hash <dataset_hash> --providers mock --personas all
# Real models (after `pip install -e ".[providers]"` + exporting API keys):
socbench run --dataset-hash <dataset_hash> --providers all --personas all
Die Einheitenauswahl erfolgt standardmäßig durch stratifiziertes Sampling, deterministisch in (dataset_hash, sample_seed, mode). Jede (Einheit × Persona × Anbieter)-Rendering durchläuft eine begrenzte Multi-Turn-Agentenschleife; Ergebnisse landen unter runs/<run_id>/ mit summary.json (Bewertung + Kosten + Cache-Zusammenfassungen), eval_units_summary.jsonl, predictions_raw.jsonl, renderings.jsonl, tool_calls.jsonl und prompts_used/.
socbench run --dataset-hash <dataset_hash> --ablation tools_off --providers mock --personas all
socbench aggregate --dataset-hash <dataset_hash>
# → ablations/<dataset_hash>/<seed>/ablation_summary.json (tools_off → main deltas)
notebooks/quickstart.ipynb führt die gesamte Schleife aus (es synthetisiert einen Beispieldatensatz, benötigt also keine festgeschriebenen Daten) und zeichnet das F1 pro Persona. notebooks/results_explorer.ipynb lädt ein beliebiges runs/<run_id>/ und schneidet die Ergebnisse nach Stratum, Persona und Anbieter auf. Installieren mit pip install -e ".[notebooks]".
Jedes für die Weiterentwicklung konzipierte Interface ist entweder eine Registry oder ein YAML-Schlüssel:
src/socbench/tools/catalog/<name>.py an, mit einer Tool-Unterklasse, registrieren Sie es in src/socbench/tools/catalog/__init__.py durch Anhängen an ALL_TOOLS, und fügen Sie seinen Namen zu den entsprechenden Persona-tools:-Listen in config/benchmark_config.yaml hinzu. Der tools_manifest_sha verschiebt sich automatisch. Dateiname, YAML-Name und Matrixeintrag sind absichtlich 1:1.src/socbench/index.py und einen passenden Literal zu EvalUnitType in src/socbench/models.py hinzu.Adapter-ABC in einer neuen , registrieren Sie ihn in der -Factory in , und fügen Sie einen Eintrag unter in hinzu. Die Preisgestaltung kommt in . SDK-Importe bleiben lazy, sodass die Abhängigkeit optional ist.Die vollständige Methodik (Bewertungseinheiten, Persona x Tool-Matrix, Agentenschleife, Bewertung, Kostenmodell, Reparaturrichtlinie, Sampling, Ablationen, Laufartefakte) ist über die modulebene Dateien in src/socbench/ implementiert (jede enthält einen fokussierten Modul-Docstring).
Apache-2.0. Siehe LICENSE.
| Bereich | Standard | Ort |
|---|
| Benchmark-Standardwerte (Sampling, Agentenbudgets, Anbieter, Persona × Tool-Matrix) | benchmark_config.yaml | config/ |
| Kanonisches NetFlow-Schema + Normalisierungsaliase | schema.json | config/ |
| Preisschnappschuss des Anbieters (USD pro 1 M Token) | pricing.yaml | config/ |
| API-Schlüssel des Anbieters | Umgebungsvariablen OPENAI_API_KEY, ANTHROPIC_API_KEY, GOOGLE_API_KEY | Shell-Umgebung |
src/socbench/providers/<name>_adapter.pybuild_adapterproviders/base.pyproviders:config/benchmark_config.yamlconfig/pricing.yamlagent.personas: in config/benchmark_config.yaml mit ihrem Budget und der tools:-Zulassungsliste hinzu.score_unit in src/socbench/scoring.py und ein passendes Feld zu EvalUnitSummary in models.py hinzu.Ablation-Behandlung in prompts.py / agent.py und die Tag-Liste in aggregate.py.