
Исследовательский конвейер для обнаружения латентных сигналов подверженности косвенным инъекциям промптов в агентных LLM посредством зондирования скрытых состояний, включающий сбор трасс, разметку, извлечение признаков и обучение зондов.
Это репозиторий с кодом для нашей статьи: Ваши агентные LLM тайно кодируют латентные сигналы подверженности косвенным промпт-инъекциям.
Версия на arXiv и ссылка на статью: https://arxiv.org/abs/2608.02657
В этом репозитории реализован конвейер зондирования латентных сигналов IPI-экспозиции: сбор трасс AgentDojo, разметка IPI-рисков, извлечение признаков из скрытых состояний, а также обучение и оценка зондов IPI-экспозиции.
@misc{dong2026agenticllmssecretlyencode,
title={Your Agentic LLMs Secretly Encode Latent Signals of Indirect Prompt-Injection Exposure},
author={Jianshuo Dong and Yiming Liu and Maosen Zhang and Nan Deng and Xu Peng and Xiaoping Zhang and Tianwei Zhang and Jie Zhang and Han Qiu},
year={2026},
eprint={2608.02657},
archivePrefix={arXiv},
primaryClass={cs.CR},
url={https://arxiv.org/abs/2608.02657},
}
Начните с проверок, работающих на CPU:
git clone https://github.com/jianshuod/IPI-exposure-signal.git
cd IPI-exposure-signal
# Install uv if needed.
curl -LsSf https://astral.sh/uv/install.sh | sh
# This repository targets Python 3.12.
uv python install 3.12
uv sync --extra dev
uv run pytest
Тестовый набор рассчитан на запуск без GPU. Он проверяет базовую сериализацию сообщений, регистрацию длительных атак AgentDojo, логику разметки, построение набора данных для зондов, метрики обучения, учёт токенов и упаковку патча vLLM.
Для сбора данных укажите коллектору на OpenAI-совместимый сервер модели:
export IPI_AWARE_UPSTREAM_BASE_URL=http://127.0.0.1:8000/v1
export IPI_AWARE_UPSTREAM_API_KEY=EMPTY
Для извлечения скрытых состояний и обучения зондов установите зависимости для моделей и сборку PyTorch, соответствующую вашему окружению CUDA:
uv sync --extra dev --extra models
Основной рабочий процесс доступен через ipi-signal-probe:
| Команда | Назначение |
|---|---|
collect | Запуск задач AgentDojo и сохранение трасс и точек принятия решений |
label | Назначение меток IPI-риска собранным точкам принятия решений |
featurize | Извлечение скрытых состояний модели для примеров зондов |
partition | Формирование обучающего, валидационного и оценочного разбиений |
train | Обучение лёгких зондов на признаках скрытых состояний |
eval | Оценка обученных зондов на заданных разбиениях |
eval-groups | Групповая оценка для протоколов разметки и отложенных настроек |
Пример:
uv run ipi-signal-probe collect \
--suite workspace \
--attack direct \
--injected \
--max-cases 4 \
--results-dir results/probe_traces/v2
uv run ipi-signal-probe label \
--root results/probe_traces/v2/<run-name> \
--labeling-protocol risk_faced
uv run ipi-signal-probe featurize \
--root results/probe_traces/v2/<run-name> \
--model Qwen/Qwen3-8B \
--backend transformers_hook \
--model-family qwen3 \
--selected-position -1
uv run ipi-signal-probe partition \
--root results/probe_traces/v2/<run-name> \
--dataset broad
# Training consumes a JSON config. The Qwen example below generates the
# train/eval configs used for its full run.
Поддерживаемые протоколы разметки: risk_faced, risk_visible и risk_actual.
Каталог examples/qwen3_5_0_8b/ содержит воспроизводимый пример на небольшой модели и тест пригодности к использованию open-source модели Qwen/Qwen3.5-0.8B.
Запустите восемь vLLM-серверов по одному GPU:
examples/qwen3_5_0_8b/serve_qwen3_5_0_8b_8x.sh start
Запустите смоук-тест:
QWEN3_5_0_8B_MODE=smoke \
examples/qwen3_5_0_8b/run_probe_pipeline.sh start
Запустите полный пример:
QWEN3_5_0_8B_MODE=full \
examples/qwen3_5_0_8b/run_probe_pipeline.sh start
Полный пример использует 8 независимых vLLM-серверов с TP=1, 8 процессов-коллекторов, 256 воркеров на процесс/сервер, 8 шардов извлечения признаков и шарды обучения зондов на одном GPU. Все переменные окружения, режимы возобновления, настройки кэша и команды статуса/остановки см. в examples/qwen3_5_0_8b/README.md.
Бэкенд извлечения признаков по умолчанию — transformers_hook. Для прямого захвата скрытых состояний через vLLM требуется прилагаемый оверлей vLLM 0.19.0:
uv sync --frozen --extra dev --extra vllm
uv run python scripts/apply_vllm_ipi_aware_patch.py --check
Перед использованием ознакомьтесь с docs/vllm_patches_v0.19.0.md:
uv run ipi-signal-probe featurize \
--root results/probe_traces/v2/<run-name> \
--model Qwen/Qwen3-8B \
--backend vllm_direct \
--model-family qwen3 \
--selected-position -1
Этот репозиторий поставляет пропатченную версию AgentDojo в каталоге vendor/agentdojo. Оригинальный AgentDojo изначально не предоставляет длительные атаки, необходимые для статьи, поэтому команды сбора следует запускать из этой копии исходников либо с каталогом vendor/agentdojo/src, размещённым в PYTHONPATH перед любым установленным оригинальным AgentDojo.
IPI-exposure-signal/
├── ipi_aware/
│ ├── data_collection/ # AgentDojo traces and decision points
│ ├── message_content.py # Chat-message normalization used by collection/features
│ └── probes/ # labels, features, partitions, training, eval
├── examples/
│ └── qwen3_5_0_8b/ # 8-GPU Qwen/Qwen3.5-0.8B reproduction scripts
├── patches/ # vLLM 0.19.0 hidden-state capture overlay
├── vendor/agentdojo/ # patched AgentDojo source for long-horizon attacks
├── docs/ # vLLM patch notes
├── scripts/ # utility scripts
└── tests/ # CPU-friendly regression tests
| Переменная | Назначение |
|---|---|
IPI_AWARE_UPSTREAM_BASE_URL | OpenAI-совместимая конечная точка модели, используемая при сборе |
IPI_AWARE_UPSTREAM_API_KEY | API-ключ для вышестоящей конечной точки или EMPTY для локального vLLM |
PYTHONPATH | Укажите vendor/agentdojo/src первым при использовании пропатченного исходного кода AgentDojo вне этого репозитория |
QWEN3_5_0_8B_MODEL | Переопределяет путь к контрольной точке Qwen/Qwen3.5-0.8B по умолчанию в примерах скриптов |
QWEN3_5_0_8B_CACHE_DIR | Перенаправляет модель и локальные кэши в файловую систему данных |
QWEN3_5_0_8B_FEAT_BACKEND | Установите в vllm_direct после применения оверлея vLLM |
Этот проект распространяется под лицензией Apache-2.0. См. LICENSE.