Injection Detection

Детекция инъекций — слой ML-классификаторов, который оценивает входящий контент как safe / injection перед действием агента. Ключевая метрика — F1 (баланс Precision и Recall). Вывод материала: маленькие open-source классификаторы (PromptGuard-2) проваливаются (F1 ~0.35), а файн-тюненая модель под задачу (BrowseSafe на Qwen3-30B) достигает F1 ~0.91. Работает параллельно основному пайплайну, чтобы не растить latency.

status/volatile Конкретные модели и F1-баллы (PromptGuard-2, BrowseSafe, Qwen3-30B, GPT-5/Sonnet 4.5) быстро устаревают. Ревизия раз в квартал — актуализировать цифры/модели.

Суть

Атаки семантически разнообразны — их нельзя надёжно поймать паттерн-матчингом или regex. Нужна модель, понимающая структуру (включая HTML, скрытые CSS-свойства, комментарии, alt-текст картинок) и семантику. На выходе — бинарный сигнал safe/injection, при неуверенности эскалация на более «умную» frontier-модель.

Зачем это нужно

Это «уровень 1» защиты в продакшн-пайплайнах. Бинарный сигнал нужен для мгновенной остановки пайплайна (в отличие от размытых оценок 1-5 у LLM as Judge). Заодно это аргумент против использования слишком лёгких моделей в security-задачах (ср. Agent Routing, где маленькие модели — норма для роутинга, но не для защиты).

Как работает

Метрики (почему именно F1):

  • Precision — из всех, кого модель пометила «атака», сколько реально атак → борется с false positive (ложная блокировка «бесит пользователя»).
  • Recall — из всех реальных атак, сколько поймано → борется с false negative (пропуск атаки).
  • Они конкурируют: снижаешь порог → растёт Recall, но падает Precision. F1 — гармоническое среднее: если одна метрика просаживается, F1 падает — нельзя «спрятать» плохой Recall за хорошим Precision.

Бенчмарк моделей-детекторов:

Модель F1 Комментарий
PromptGuard-2 (Meta, ~100M) ~0.35 Слишком низко для прода; паттерн-матчинг не ловит семантику
GPT-5 / Sonnet 4.5 (reasoning) ~0.85 Хорошо, но медленно — не для real-time
BrowseSafe (Qwen3-30B-A3B MoE) ~0.91 Файн-тюн под задачу; быстрая, бинарный safe/injection

Архитектура: детектор работает параллельно основному пайплайну (не добавляя latency) — извлекает сырой HTML до начала reasoning, отдаёт бинарный сигнал. Гибридный подход: при неуверенности эскалация на frontier-модель. Альтернатива «не хочу разворачивать Qwen» — взять PromptGuard / gpt-oss-safeguard-20b для входной проверки (с поправкой на точность).

Ресурсы: модель perplexity-ai/browsesafe + датасет browsesafe-bench (Hugging Face), arXiv 2511.20597.

Эвристический детектор (слой 0, под классификатор): дешёвый regex-скан маркеров инъекций — быстрый фильтр, поверх которого в проде ставят ML-классификатор / Llama Guard:

import re
INJECTION_PATTERNS = [
    r"ignore\s+(all\s+)?previous", r"disregard\s+(all\s+)?(above|previous)",
    r"игнорируй\s+(все\s+)?(инструкции|выше|предыдущ)", r"system\s+prompt",
    r"you\s+are\s+now", r"ты\s+теперь", r"chat[_\s-]?id", r"new\s+instructions",
    r"reveal\s+(the\s+)?(system|prompt|secret|api[_\s-]?key)", r"exfiltrate",
]
_INJ_RE = re.compile("|".join(INJECTION_PATTERNS), re.IGNORECASE)

def scan_injection(text) -> list[str]:               # [] = чисто; иначе список сработавших маркеров
    return sorted({m.group(0).lower() for m in _INJ_RE.finditer(str(text or ""))})

⚠️ Regex — это только «гигиена»: ловит известные паттерны, но не семантически новые атаки. Поэтому поверх — файн-тюненый классификатор (см. таблицу выше). scan_injection() используется и в Guardrails (input-санитизация, output-ре-скан).

Связано с

  • Prompt Injection — что именно детектируем
  • Guardrails — детектор как Input-слой guardrails
  • LLM as Judge — родственная идея «модель-оценщик», но там качество, здесь — бинарная безопасность
  • Agent Routing — контраст: лёгкие модели ок для роутинга, не для security

Открытые вопросы

  • Стоимость самохостинга Qwen3-30B как детектора vs приемлемая точность PromptGuard для не-критичных потоков?