
Un cadre ouvert et un benchmark pour l'IA dans les opérations de cybersécurité.
Benchmark les LLMs de raisonnement de pointe en tant qu'agents SOC sur des données NetFlow brutes.
socbench benchmark les modèles de raisonnement de pointe en tant qu'agents SOC : chaque modèle exécute une boucle agent multi-tours limitée sur un corpus NetFlow déterministe et pré-indexé, avec des outils en lecture seule limités par persona, des plafonds de dollars fixes par investigation, et un contrat JSON de réponse finale strict. Quatre personas (Analyste SOC, Analyste Menace, Chasseur d'Adversaires, Ingénieur Détection) et trois fournisseurs (OpenAI, Anthropic, Google) partagent les mêmes unités d'évaluation, objectifs de notation et surface d'ablation, de sorte que les chiffres clés et les deltas tools_off / playbooks_off sont directement comparables.
Le dépôt est local-first. Un ordinateur portable, trois clés API et un échantillon parquet engagé dans le dépôt suffisent pour reproduire un test sous un budget de 10 $.
Alpha. Le pipeline complet s'exécute de bout en bout. La construction couverte :
socbench build-index) avec des index à adressage par contenu déterministesREPRODUCE.mdVous pouvez exécuter un test complet aujourd'hui sans clés API via le fournisseur mock (voir Quickstart étape 3, ou notebooks/quickstart.ipynb).
socbench est fourni comme un projet standard PEP 621 / hatchling. Les deux méthodes d'installation fonctionnent.
uv (recommended for development)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]"
Dans les deux cas, socbench --help devrait maintenant lister les sous-commandes disponibles.
config/benchmark_config.yaml est livré avec des valeurs par défaut sûres : smoke cost_budget_usd: 10, full cost_budget_usd: 900, fixed cost_usd_cap_per_rendering: 0.50. Les chemins à l'intérieur qui pointent vers des fichiers de configuration frères (schema_path, pricing_path) sont résolus de manière relative au répertoire du YAML lui-même, donc renommer ou déplacer config/ ne nécessite aucune modification de code.
socbench build-index \
--config config/benchmark_config.yaml \
--dataset sample
Cela normalise le parquet par rapport à config/schema.json, trie globalement par ts_start avec un départage déterministe, attribue des flow_id stables, dérive les unités d'évaluation pair_timeline / host_egress, calcule les cumuls et écrit dans indexes/<dataset_hash>/.
Réexécuter la commande sur les mêmes données est sans effet. Passez --rebuild pour forcer une reconstruction.
socbench tools-smoke \
--dataset-hash <dataset_hash> \
--persona soc_analyst
Cela invoque chaque outil dans la liste blanche du persona sur l'index construit et imprime un résumé, sans appels de modèle.
# 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
La sélection des unités par défaut est un échantillonnage stratifié, déterministe dans (dataset_hash, sample_seed, mode). Chaque rendu (unité × persona × fournisseur) exécute une boucle agent multi-tours limitée ; les résultats atterrissent dans runs/<run_id>/ avec summary.json (cumuls de notation + coût + cache), eval_units_summary.jsonl, predictions_raw.jsonl, renderings.jsonl, tool_calls.jsonl et 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 → deltas principaux)
notebooks/quickstart.ipynb exécute toute la boucle (il synthétise un jeu de données échantillon donc il n'a besoin d'aucune donnée engagée) et trace le F1 par persona. notebooks/results_explorer.ipynb charge n'importe quel runs/<run_id>/ et découpe les résultats par strate, persona et fournisseur. Installez avec pip install -e ".[notebooks]".
Chaque interface conçue pour évoluer est un registre ou une clé YAML :
src/socbench/tools/catalog/<name>.py avec une sous-classe Tool, enregistrez-le dans src/socbench/tools/catalog/__init__.py en l'ajoutant à ALL_TOOLS, puis ajoutez son nom aux listes tools: du persona approprié dans config/benchmark_config.yaml. Le tools_manifest_sha change automatiquement. Le nom de fichier, le nom YAML et l'entrée de matrice sont en correspondance 1:1 par conception.src/socbench/index.py et un Literal correspondant à EvalUnitType dans src/socbench/models.py.Adapter dans un nouveau , enregistrez-le dans la fabrique dans , et ajoutez une entrée sous dans . Les prix vont dans . Les imports SDK restent paresseux donc la dépendance est optionnelle.La méthodologie complète (unités d'évaluation, matrice persona x outil, boucle agent, notation, modèle de coût, politique de réparation, échantillonnage, ablations, artefacts d'exécution) est implémentée dans les fichiers au niveau du module dans src/socbench/ (chacun porte une docstring de module ciblée).
Apache-2.0. Voir LICENSE.
| Surface | Default | Lives in |
|---|
| Valeurs par défaut du benchmark (échantillonnage, budgets d'agent, fournisseurs, matrice persona × outil) | benchmark_config.yaml | config/ |
| Schéma NetFlow canonique + alias de normalisation | schema.json | config/ |
| Instantané des prix des fournisseurs (USD pour 1M de tokens) | pricing.yaml | config/ |
| Clés API des fournisseurs | env vars OPENAI_API_KEY, ANTHROPIC_API_KEY, GOOGLE_API_KEY | shell env |
src/socbench/providers/<name>_adapter.pybuild_adapterproviders/base.pyproviders:config/benchmark_config.yamlconfig/pricing.yamlagent.personas: dans config/benchmark_config.yaml avec son budget et sa liste blanche tools:.score_unit dans src/socbench/scoring.py et un champ correspondant à EvalUnitSummary dans models.py.Ablation dans prompts.py / agent.py et la liste de balises dans aggregate.py.