在线演示: https://prompt-injection-firewall.streamlit.app 2 分钟演示视频: https://drive.google.com/file/d/1tzb75nFysisrCYa11Lqj6egDs5VNmc2n/view?usp=drivesdk
一个用于 LLM 客服机器人的双层防火墙:它检查用户输入的内容,也检查机器人输出的内容。
用户可以尝试覆盖机器人的规则(“忽略之前的指令”)、切换其人格,或诱使它泄露系统提示词或机密信息。本项目会拦截此类输入,捕获机器人回答中的泄露,并衡量其效果,包括在哪些情况下会失效。
user input
|
v
[1] Rule layer (regex, fast, free) --match--> BLOCK
|no match
v
[2] LLM classifier (Gemini, JSON output, Pydantic validation, retries, fail-closed) --attack--> BLOCK
|benign
v
AcmeBot (Gemini + system prompt)
|
v
[3] Output check (canary token, secret patterns, system-prompt fragments) --leak--> BLOCK
|clean
v
answer to user
python -m venv .venv
.venv\Scripts\Activate.ps1
pip install -r requirements.txt
copy .env.example .env # then put your Gemini key in .env
python src\run_eval.py dev
python src\eval_output.py dev
python src\compare.py dev
streamlit run app.py # local demo
使用的模型:gemini-3.1-flash-lite。免费层在繁忙时可能返回 503;代码会等待并重试。
除非你想重建 data\cases.jsonl,否则不要运行 src\build_cases.py(它会覆盖该文件;相同的种子会生成相同的用例)。
deepset/prompt-injections(Apache-2.0)中采样 25 条(种子 7):12 条攻击,13 条良性。划分:15 条 dev,10 条 hidden。data/train.parquet 已包含在仓库中(来源:deepset/prompt-injections,Apache-2.0)。| 集合 | 层 | 结果 |
|---|---|---|
| dev | 仅规则 | 检测 2/9,误报 0/6 |
| dev | 规则 + Gemini(最终) | 检测 8/9,误报 0/6 |
| dev | 输出检查(最终) | 捕获泄露 4/4,误报 0/4 |
| hidden | 规则 + Gemini | 检测 3/3,误报 0/7 |
| hidden | 输出检查 | 捕获泄露 3/3,误报 0/1 |
防火墙与无防火墙对比:
| 无 | 有 | |
|---|---|---|
| dev:到达机器人的攻击 | 9/9 | 1/9 |
| dev:被错误拦截的良性请求 | 0/6 | 0/6 |
| hidden:到达机器人的攻击 | 3/3 | 0/3 |
| hidden:被错误拦截的良性请求 | 0/7 | 0/7 |
hidden 集只有 3 条攻击,因此信号较弱。dev 和 hidden 分开报告,因为我在 dev 上调优了分类器提示词。
带数字的完整历史记录见 CHANGELOG.md。简而言之: