Tài liệu

Benchmark

English: benchmark.md. Nếu hai bản khác nhau, bản tiếng Anh là bản chính.

Trang này so sánh bộ phát hiện của Guard Spec với các bộ phát hiện prompt injection mã nguồn mở khác, trên eval set của chính Guard Spec và trên các dataset công khai. Mọi thứ ở đây đều ra từ một lệnh duy nhất, với mọi dataset và model được ghim phiên bản, nên ai cũng có thể chạy lại và kiểm tra các con số.

Đây chỉ là một phép đo, không hơn. Không có threshold, trọng số hay rule nào của Guard Spec được tinh chỉnh trên các dataset này hay trên eval/ để phục vụ trang này, và các detector khác chạy với cấu hình mặc định mà chúng công bố.

Tóm tắt

Chạy ngày 2026-11-07 (19:30 UTC ngày 2026-11-06) ở commit 2e182a0 (v0.2.1) bằng harness của benchmark này, trên laptop Apple M3 Max (macOS 15.4.1); các bảng đầy đủ nằm ở mục Kết quả. Quyết định mặc định, mọi ngôn ngữ:

Dataset Guard Spec L1+L2+L3: AUC / TPR / FPR ProtectAI v2: AUC / TPR / FPR LLM Guard default: TPR / FPR
eval/ (EN + VI, 2,176 rows) 0.987 / 95.0% / 1.4% 0.784 / 88.6% / 50.6% 83.0% / 45.6%
deepset test (116, half German/Spanish) 0.963 / 33.3% / 0.0% 0.901 / 36.7% / 0.0% 31.7% / 0.0%
jailbreak-classification test (262) 0.994 / 92.1% / 0.0% 0.979 / 84.2% / 1.6% 84.2% / 1.6%
Gandalf test (112, attacks only) - / 100% / - - / 100% / - 100% / -
SPML sample (2,000) 0.974 / 36.4% / 0.0% 0.997 / 99.2% / 8.4% 99.1% / 6.6%

Tái lập kết quả

make benchmark

Target đó tải ONNX Runtime và libtokenizers (make onnx-deps, ghim bằng SHA-256), chạy bench/run.py với các package Python được khoá trong bench/uv.lock (cần uv), rồi ghi ra:

Nó làm những việc sau:

  1. Tải các dataset công khai ở đúng commit Hugging Face đã ghim và chuyển chúng sang schema dòng của eval/.
  2. Kéo các model bằng go run ./cmd/models pull, lệnh này kiểm tra từng file với giá trị SHA-256 trong models/manifest.yaml: guardspec-classifier@v3b, multilingual-e5-small@614241f và protectai-deberta-v3-base-pi-v2@90c9989.
  3. Chạy Guard Spec qua cmd/eval -scores (build với -tags onnx), tức đúng đường xử lý input của gateway: sanitizer, các lớp detector, fusion và rule chặn của /v1/scan.
  4. Chạy model ProtectAI trong ONNX Runtime từ Python.
  5. Tính các metric bên dưới cho từng detector, dataset và ngôn ngữ.

Tuỳ chọn:

Biến Mặc định Tác dụng
BENCH_CACHE bench/.cache Downloads, converted datasets, per-row scores. About 1.2 GB (ProtectAI's ONNX file is 739 MB). The run stops when less than 6 GB is free there.
MODEL_DIR $BENCH_CACHE/models Use already pulled Guard Spec models (<dir>/cache/<name>/<version>) instead of pulling them.
ONNX_DIR .onnx Where make onnx-deps puts the native libraries.
PROMPTGUARD=1 off Also run Meta Prompt Guard 2, see below.

GitHub Actions: workflow Benchmark (.github/workflows/benchmark.yml) chạy make benchmark trên ubuntu-24.04 khi được khởi động bằng tay (Actions > Benchmark > Run workflow); nó không bao giờ tự chạy. Workflow ghi các bảng vào job summary và tải bench/results/ cùng trang này lên dưới dạng artifact benchmark-results.

Đưa Meta Prompt Guard 2 vào

meta-llama/Llama-Prompt-Guard-2-86M và -22M bị giới hạn truy cập (gated) trên Hugging Face theo Llama 4 Community License: không thể tải chúng nếu không có tài khoản đã chấp nhận điều khoản, nên chúng không có trong các bảng đã công bố. Nếu bạn có quyền truy cập:

  1. Chấp nhận giấy phép trên trang của cả hai model.
  2. Export một token chỉ đọc của tài khoản đó thành HF_TOKEN trong shell (huggingface_hub đọc biến này; bench/run.py không bao giờ đọc, in ra hay lưu nó).
  3. Chạy make benchmark PROMPTGUARD=1. Lệnh này cài extra promptguard (PyTorch và Transformers, CPU) và thêm hai dòng detector, ở các revision đã ghim a8ded8e (86M) và 11614a1 (22M), dùng quyết định argmax của model (xác suất malicious ≥ 0.5), 512 token đầu, một thread.

Trong workflow, thêm token làm repository secret HF_READ_TOKEN và đánh dấu "promptguard" khi khởi động lần chạy.

Đo những gì

Với mỗi tổ hợp detector × dataset × ngôn ngữ:

Dataset không có dòng lành tính (Gandalf) chỉ có TPR.

Dataset và giấy phép

Mọi dataset đều được kiểm tra trên trang (card) Hugging Face ở commit đã ghim. Benchmark tải chúng khi chạy; repository này không lưu dòng nào của chúng ngoài những gì eval/ vốn đã có (xem eval/LICENSES.md).

Dataset Giấy phép Có dùng Lý do
eval/ (Guard Spec) Apache-2.0 (project rows), Apache-2.0 / MIT (sourced rows) yes Our published EN/VI set.
deepset/prompt-injections Apache-2.0 yes, test Standard small benchmark; mixed English and German/Spanish.
jackhhao/jailbreak-classification Apache-2.0 yes, balanced test Jailbreak prompts versus benign prompts.
Lakera/gandalf_ignore_instructions MIT yes, test Real attacks from the Gandalf game (attacks only).
reshabhs/SPML_Chatbot_Prompt_Injection MIT yes, 1,000 rows per label, seeded sample Chatbot-specific injections; no detector here trained on it.
xTRam1/safe-guard-prompt-injection none on the card (revision a3a877d608f3) no No license.
Lakera/mosscap_prompt_injection MIT no Unlabelled: every prompt sent to the game, attack or not.
jayavibhav/prompt-injection none on the card no No license.

Số dòng và ngôn ngữ của mỗi lần chạy nằm trong các bảng sinh tự động bên dưới.

Tiếng Việt. Chúng tôi không tìm được dataset prompt injection tiếng Việt nào vừa công khai vừa có giấy phép. Các dòng tiếng Việt duy nhất ở đây là của eval/, vốn là dữ liệu tổng hợp và được gán nhãn bởi AI agent (xem eval/README.md).

Cột ngôn ngữ. eval/ gắn ngôn ngữ cho từng dòng (en, vi). Với các bộ công khai, dòng nào có dấu hiệu tiếng Đức, tiếng Tây Ban Nha hoặc chữ Cyrillic (theo rule của eval/build/build.py) được xếp vào other, còn lại là en. Chỉ deepset có tỉ lệ other đáng kể.

Trùng lặp với dữ liệu train. Hãy lưu ý điều này khi đọc các dòng công khai:

Các detector

Detector Có đưa vào Ghi chú
Guard Spec L1 yes Rules only, the default build without models (cmd/eval -detector fusion).
Guard Spec L1+L2 yes Rules + classifier v3b (-layers l1,l2).
Guard Spec L1+L2+L3 yes Rules + classifier + embeddings, the default with models (-layers l1,l2,l3).
ProtectAI deberta-v3-base-prompt-injection-v2 yes Apache-2.0. The published fp32 ONNX export, first 512 tokens, flags when P(INJECTION) ≥ 0.5 (argmax of the model card's pipeline).
LLM Guard PromptInjection as a threshold of the ProtectAI row llm-guard 0.3.16 (MIT, archived) wraps the same model: its default pins revision 89b085c, whose weights are byte-identical to 90c9989 (same SHA-256), reads the first 512 tokens (match_type=FULL) and flags when round(score, 2) > 0.92. Installing it would only rerun the same model, so its row reuses the ProtectAI scores with that rule: same AUC, different TPR/FPR. Its default runs the model in PyTorch rather than ONNX, so latency is not reported separately.
Meta Llama Prompt Guard 2 (86M, 22M) no (gated) Llama 4 Community License, gated on Hugging Face; see Including Meta Prompt Guard 2.

Kết quả

Chạy lúc 2026-11-06 19:30 UTC, commit 2e182a03bc62, máy local: Apple M3 Max, 14 logical CPU, 36 GB RAM, macOS 15.4.1 (arm64). go1.26.10, ONNX Runtime 1.31.1 (Go) / 1.31.1 (Python), Python 3.12.0.

Các dataset

Dataset Revision License Split Rows (attack / benign) Languages
Guard Spec eval set (eval/) this commit Apache-2.0 (project rows); Apache-2.0 / MIT for the deepset / Gandalf rows it includes eval/data/en.jsonl, vi.jsonl 2176 (1171 / 1005) en 926, vi 1250
deepset/prompt-injections 4f61ecb038e9 Apache-2.0 test 116 (60 / 56) en 60, other 56
jackhhao/jailbreak-classification 2f2ceeb39658 Apache-2.0 balanced test 262 (139 / 123) en 259, other 3
Lakera/gandalf_ignore_instructions 04737b65e90a MIT test 112 (112 / 0) en 111, other 1
reshabhs/SPML_Chatbot_Prompt_Injection 02ce8084e979 MIT seeded sample, 1000 per label 2000 (1000 / 1000) en 1995, other 5

Các detector đã chạy

Detector Model files Size on disk Runtime Default decision
Guard Spec L1 rules only (no model) 0 (rules) Go, ONNX Runtime (int8 models), 1 intra-op thread per session gateway /v1/scan rule: score >= 0.85, sanitizer anomaly >= 0.6, or input rejected
Guard Spec L1+L2 guardspec-classifier/v3b 119 MB Go, ONNX Runtime (int8 models), 1 intra-op thread per session gateway /v1/scan rule: score >= 0.85, sanitizer anomaly >= 0.6, or input rejected
Guard Spec L1+L2+L3 guardspec-classifier/v3b; multilingual-e5-small/614241f 237 MB Go, ONNX Runtime (int8 models), 1 intra-op thread per session gateway /v1/scan rule: score >= 0.85, sanitizer anomaly >= 0.6, or input rejected
ProtectAI v2 protectai/deberta-v3-base-prompt-injection-v2@90c9989 (onnx/model.onnx, fp32) 739 MB Python, ONNX Runtime 1.31.1 (fp32), 1 intra-op thread INJECTION probability >= 0.5 (argmax, model card pipeline)
LLM Guard PromptInjection (default) protectai/deberta-v3-base-prompt-injection-v2@90c9989 (onnx/model.onnx, fp32) 739 MB Python, ONNX Runtime 1.31.1 (fp32), 1 intra-op thread llm-guard 0.3.16 defaults: same model, match_type FULL (first 512 tokens), flag when round(score, 2) > 0.92

Không chạy: Meta Llama Prompt Guard 2 (86M, 22M): bị giới hạn truy cập trên Hugging Face (Llama 4 Community License); chạy với --promptguard và HF_TOKEN của riêng bạn sau khi chấp nhận điều khoản.

Eval set của Guard Spec (eval/)

Được công bố cùng repository này. L2, L3 và fusion chưa bao giờ được fit trên bộ này; các rule L1 được tinh chỉnh trên nửa dev của nó, nên số liệu L1 ở đây là lạc quan (eval/README.md).

Detector Lang n (att / ben) ROC AUC [95% CI] TPR @ default FPR @ default TPR @ FPR ≤ 1% p50 ms p95 ms
Guard Spec L1 all 1171 / 1005 0.952 [0.943, 0.962] 89.2% 0.1% 91.0% 0.11 0.22
Guard Spec L1 en 562 / 364 0.929 [0.911, 0.945] 84.2% 0.3% 86.7% 0.11 0.21
Guard Spec L1 vi 609 / 641 0.975 [0.964, 0.984] 93.9% 0.0% 94.9% 0.11 0.23
Guard Spec L1+L2 all 1171 / 1005 0.987 [0.982, 0.992] 94.9% 1.4% 93.3% 6.02 22.01
Guard Spec L1+L2 en 562 / 364 0.982 [0.973, 0.989] 94.0% 1.6% 90.4% 5.49 19.73
Guard Spec L1+L2 vi 609 / 641 0.991 [0.984, 0.996] 95.7% 1.2% 94.9% 6.51 23.95
Guard Spec L1+L2+L3 all 1171 / 1005 0.987 [0.981, 0.991] 95.0% 1.4% 93.4% 6.47 21.90
Guard Spec L1+L2+L3 en 562 / 364 0.980 [0.970, 0.988] 94.1% 1.6% 90.9% 6.10 19.62
Guard Spec L1+L2+L3 vi 609 / 641 0.992 [0.985, 0.997] 95.7% 1.2% 94.7% 6.91 23.46
ProtectAI v2 all 1171 / 1005 0.784 [0.764, 0.802] 88.6% 50.6% 26.2% 66.89 237.54
ProtectAI v2 en 562 / 364 0.897 [0.877, 0.917] 86.8% 23.4% 35.1% 46.41 169.34
ProtectAI v2 vi 609 / 641 0.661 [0.632, 0.690] 90.1% 66.1% 5.9% 76.69 262.98
LLM Guard PromptInjection (default) all 1171 / 1005 0.784 [0.764, 0.802] 83.0% 45.6% 26.2% same model as ProtectAI v2
LLM Guard PromptInjection (default) en 562 / 364 0.897 [0.877, 0.917] 84.0% 20.3% 35.1% same model as ProtectAI v2
LLM Guard PromptInjection (default) vi 609 / 641 0.661 [0.632, 0.690] 82.1% 59.9% 5.9% same model as ProtectAI v2

deepset/prompt-injections

Khoảng một nửa số dòng là tiếng Đức hoặc tiếng Tây Ban Nha (lang 'other'). Các dòng test tiếng Anh cũng có trong eval/; classifier của Guard Spec được train trên split train.

Detector Lang n (att / ben) ROC AUC [95% CI] TPR @ default FPR @ default TPR @ FPR ≤ 1% p50 ms p95 ms
Guard Spec L1 all 60 / 56 0.757 [0.674, 0.835] 13.3% 0.0% 28.3% 0.10 0.26
Guard Spec L1 en 31 / 29 0.877 [0.777, 0.953] 22.6% 0.0% 45.2% 0.10 0.21
Guard Spec L1 other 29 / 27 0.710 [0.621, 0.799] 3.4% 0.0% 24.1% 0.10 0.38
Guard Spec L1+L2 all 60 / 56 0.955 [0.913, 0.987] 35.0% 0.0% 88.3% 4.71 18.23
Guard Spec L1+L2 en 31 / 29 0.958 [0.883, 1.000] 45.2% 0.0% 90.3% 4.33 14.94
Guard Spec L1+L2 other 29 / 27 0.971 [0.930, 0.997] 24.1% 0.0% 86.2% 4.74 27.29
Guard Spec L1+L2+L3 all 60 / 56 0.963 [0.921, 0.991] 33.3% 0.0% 83.3% 5.42 18.53
Guard Spec L1+L2+L3 en 31 / 29 0.973 [0.914, 1.000] 45.2% 0.0% 93.5% 5.14 15.54
Guard Spec L1+L2+L3 other 29 / 27 0.941 [0.874, 0.989] 20.7% 0.0% 82.8% 5.73 27.70
ProtectAI v2 all 60 / 56 0.901 [0.839, 0.951] 36.7% 0.0% 53.3% 45.10 196.72
ProtectAI v2 en 31 / 29 0.889 [0.796, 0.959] 25.8% 0.0% 71.0% 39.97 123.84
ProtectAI v2 other 29 / 27 0.936 [0.866, 0.985] 48.3% 0.0% 58.6% 53.32 267.84
LLM Guard PromptInjection (default) all 60 / 56 0.901 [0.839, 0.951] 31.7% 0.0% 53.3% same model as ProtectAI v2
LLM Guard PromptInjection (default) en 31 / 29 0.889 [0.796, 0.959] 22.6% 0.0% 71.0% same model as ProtectAI v2
LLM Guard PromptInjection (default) other 29 / 27 0.936 [0.866, 0.985] 41.4% 0.0% 58.6% same model as ProtectAI v2

jackhhao/jailbreak-classification

Prompt jailbreak (nhập vai) so với prompt lành tính. Classifier của Guard Spec được train trên split train đã cân bằng; ProtectAI v2 liệt kê dataset này trong các nguồn dữ liệu train của nó.

Detector Lang n (att / ben) ROC AUC [95% CI] TPR @ default FPR @ default TPR @ FPR ≤ 1% p50 ms p95 ms
Guard Spec L1 all 139 / 123 0.961 [0.942, 0.977] 66.9% 0.0% 84.9% 0.43 2.99
Guard Spec L1+L2 all 139 / 123 0.993 [0.984, 0.999] 92.1% 0.0% 93.5% 42.14 507.41
Guard Spec L1+L2+L3 all 139 / 123 0.994 [0.986, 0.999] 92.1% 0.0% 93.5% 41.87 511.62
ProtectAI v2 all 139 / 123 0.979 [0.956, 0.995] 84.2% 1.6% 69.8% 327.75 1161.58
LLM Guard PromptInjection (default) all 139 / 123 0.979 [0.956, 0.995] 84.2% 1.6% 69.8% same model as ProtectAI v2

Lakera/gandalf_ignore_instructions

Chỉ có tấn công (không có dòng lành tính): chỉ TPR là xác định được. Các dòng test tiếng Anh cũng có trong eval/; classifier của Guard Spec được train trên split train.

Detector Lang n (att / ben) ROC AUC [95% CI] TPR @ default FPR @ default TPR @ FPR ≤ 1% p50 ms p95 ms
Guard Spec L1 all 112 / 0 - 77.7% - - 0.10 0.19
Guard Spec L1+L2 all 112 / 0 - 100.0% - - 3.90 7.13
Guard Spec L1+L2+L3 all 112 / 0 - 100.0% - - 4.87 8.22
ProtectAI v2 all 112 / 0 - 100.0% - - 32.18 62.98
LLM Guard PromptInjection (default) all 112 / 0 - 100.0% - - same model as ProtectAI v2

reshabhs/SPML_Chatbot_Prompt_Injection

Chỉ gồm prompt của người dùng. Nhãn phụ thuộc vào system prompt của chatbot (một yêu cầu vi phạm rule của bot đó là tấn công), thứ mà một detector đặt ở input không nhìn thấy. Không detector nào ở đây liệt kê bộ này là dữ liệu train.

Detector Lang n (att / ben) ROC AUC [95% CI] TPR @ default FPR @ default TPR @ FPR ≤ 1% p50 ms p95 ms
Guard Spec L1 all 1000 / 1000 0.961 [0.952, 0.969] 26.9% 0.2% 80.7% 0.13 0.93
Guard Spec L1+L2 all 1000 / 1000 0.979 [0.973, 0.985] 37.0% 0.0% 89.2% 7.03 130.35
Guard Spec L1+L2+L3 all 1000 / 1000 0.974 [0.967, 0.980] 36.4% 0.0% 84.5% 8.28 156.34
ProtectAI v2 all 1000 / 1000 0.997 [0.995, 0.999] 99.2% 8.4% 97.6% 61.24 631.59
LLM Guard PromptInjection (default) all 1000 / 1000 0.997 [0.995, 0.999] 99.1% 6.6% 97.6% same model as ProtectAI v2

Thảo luận

Những chỗ Guard Spec làm kém hơn.

Những chỗ nó làm tốt hơn, và vì sao điều đó phần nào là dự đoán được.

Ghi chú khác.

Kết quả cũng sẽ xuất hiện trên guardspec.io/docs, được build từ trang này.

Nguồn: docs/benchmark.vi.md @ f26302340bf1