raveendra-7/PromptGuard

GitHub: raveendra-7/PromptGuard

PromptGuard 是一个部署在 LLM 前端的多层 prompt 注入检测中间件,通过正则匹配、语义搜索和 LoRA 分类器三层联合检测来拦截对抗性输入。

Stars: 0 | Forks: 0

# PromptGuard 一个围绕 LLM 集成 pipeline 构建的多层 prompt injection 检测系统。它部署在 LLM (Ollama) 的前置位置,在对抗性输入到达模型之前将其拦截。 ## 工作原理 每个传入的 prompt 都会经过三个层级的检测: **第一层 — Regex** 模式匹配,覆盖指令覆盖、系统 prompt 提取尝试、越狱、编码技巧和 agent 操纵等类别。速度快,零延迟,无需模型。 **第二层 — 语义搜索**,针对填充了已知攻击和良性 prompt 数据集的 ChromaDB vector store 进行搜索。使用攻击向量和良性向量之间的加权相似度投票来计算 injection 概率得分。 **第三层 — LoRA 分类器**,基于微调的 Qwen3-0.6B 模型 (`abedegno/prompt-injection-classifier-qwen3-0p6b`),对每个 prompt 进行不安全/安全分类。此层为可选——如果禁用或不可用,将平滑回退到双层 pipeline。 所有三个得分将被合并为最终的风险得分。如果某个 prompt 超过了阈值,它会在 Ollama 接收到之前被拦截。 ## 技术栈 - **FastAPI** — 检测 API 和 middleware 防护栏 - **Ollama** (`qwen2.5:0.5b`) — 受保护的 LLM - **ChromaDB** — 用于语义搜索的 vector store - **Streamlit** — 用于实时监控和分析的 SIEM 风格 dashboard - **sentence-transformers** (`all-MiniLM-L6-v2`) — 用于语义搜索的 embeddings - **peft + transformers** — LoRA adapter 加载 一切均在 Docker 中运行。 ## 前置条件 在开始之前,请确保您具备以下条件: - 已安装并正在运行 [Docker Desktop](https://www.docker.com/products/docker-desktop/) - 本地已安装 Python 3.10+(运行 `populate_db.py` 时需要) - 一个带有 read token 的 HuggingFace 账户(说明见下文) ## 设置说明 ### 1. 克隆代码库 ``` git clone https://github.com/Sejal-Siddapuram/PromptGuard.git cd PromptGuard ``` ### 2. 获取 HuggingFace token 部分数据集和 LoRA 模型在 HuggingFace 上是受限的,需要身份验证。 1. 访问 https://huggingface.co/settings/tokens 2. 点击 **New token**,选择 **Read** 权限,生成并复制它 3. 接受以下两个数据集的访问权限(只需点击每个页面上的按钮): - https://huggingface.co/datasets/hackaprompt/hackaprompt-dataset - https://huggingface.co/datasets/lmsys/lmsys-chat-1m ### 3. 配置您的 GPU 默认的 `docker-compose.yml` 是为 NVIDIA GPU 配置的。请查看哪种情况适用于您: **如果您有 NVIDIA GPU** — 无需更改,系统会自动使用它。 **如果您有其他 GPU 或没有 GPU** — 打开 `docker-compose.yml` 并从 `ollama` 服务中删除 `deploy` 块: ``` # 如果你没有 NVIDIA GPU,请从 docker-compose.yml 中删除这些行 deploy: resources: reservations: devices: - driver: nvidia count: 1 capabilities: [gpu] ``` Ollama 会自动回退到 CPU。一切仍然可以正常工作,只是推理速度会变慢。 ### 4. 将您的 HuggingFace token 添加到 docker-compose.yml 打开 `docker-compose.yml` 并找到 `fastapi` 服务。将您的 token 添加到 environment 部分: ``` environment: - OLLAMA_URL=http://ollama:11434/api/generate - HF_TOKEN=your_token_here # replace this with your actual token ``` ### 5. 启动容器 ``` docker compose up --build -d ``` 这将构建 FastAPI 镜像并启动所有三个容器(Ollama、PromptGuard、Dashboard)。请等待其完成后再继续下一步。 ### 6. 拉取 LLM ``` docker exec ollama ollama pull qwen2.5:0.5b ``` 这会将语言模型下载到 Ollama 中。根据您的网络情况,大约需要几分钟 (~400MB)。 ### 7. 在本地安装 Python 依赖项 Vector store 是从您的本地机器填充的,而不是在容器内部。请先安装所需的包: ``` pip install sentence-transformers chromadb datasets huggingface_hub ``` ### 8. 填充 vector store 这是一次性设置步骤。它将下载几个攻击和良性 prompt 数据集,并构建语义搜索层使用的 ChromaDB 索引。 首先登录 HuggingFace,以便访问受限数据集: ``` python -c "from huggingface_hub import login; login('your_token_here')" ``` 然后运行: ``` python populate_db.py ``` 这需要几分钟时间。`chroma_db/` 文件夹作为 Docker volume 挂载,因此它会在容器重新构建后保留 — **您只需执行一次此操作**。唯一需要重新运行它的情况是您使用 `docker compose down -v` 明确清除了您的 volumes。 ## 大功告成 在浏览器中打开以下地址: | 服务 | URL | |-----------|------------------------| | Dashboard | http://localhost:8501 | | FastAPI | http://localhost:8000 | | Ollama | http://localhost:11434 | 使用良性 prompt 进行测试: ``` curl -X POST http://localhost:8000/chat \ -H "Content-Type: application/json" \ -d '{"prompt": "What is the capital of France?"}' ``` ## 环境变量 这些都可以在 `docker-compose.yml` 的 `fastapi` 服务下进行设置: | 变量 | 默认值 | 描述 | |----------------------|--------------------------------------|--------------------------------------------------------| | `OLLAMA_URL` | `http://ollama:11434/api/generate` | Ollama endpoint | | `OLLAMA_MODEL` | `qwen2.5:0.5b` | 要使用的模型 | | `LORA_ENABLED` | `true` | 设置为 `false` 可禁用第三层并仅运行双层检测 | | `LORA_DEVICE` | `cpu` | `cpu` 或 `cuda` | | `LORA_THRESHOLD` | `0.10` | LoRA 不安全分类的概率截断值 | | `CHROMA_COLLECTION` | `prompts` | ChromaDB collection 名称 | | `HF_TOKEN` | — | 您的 HuggingFace read token | ## 禁用 LoRA(低资源环境) 如果您在没有 GPU 的情况下运行或希望更快的启动速度,请在 `docker-compose.yml` 的 `fastapi` environment 部分下设置 `LORA_ENABLED=false`。系统将回退到仅使用第一层 + 第二层。检测仍然有效,只是没有神经分类器层。 ## 代码更改后重新构建 ``` # 代码更改后仅重建 FastAPI 容器 docker compose up --build -d fastapi # 包括 volumes 在内的完全重置 — 之后你需要重新填充 DB docker compose down -v docker compose up --build -d ``` ## 项目结构 ``` . ├── main.py # FastAPI app, /chat, /status endpoints ├── populate_db.py # Builds the ChromaDB vector store (run once) ├── dashboard.py # Streamlit SIEM dashboard ├── detectors/ │ ├── decision.py # Combines all three tiers into a final verdict │ ├── middleware.py # FastAPI middleware — intercepts /chat requests │ ├── regex_detector.py # Tier 1: pattern matching │ ├── semantics.py # Tier 2: ChromaDB vector search │ └── lora_classifier.py # Tier 3: LoRA fine-tuned classifier ├── tests/ │ ├── realworld_benchmark.py # 90/10 split benchmark on jayavibhav test set │ └── threshold_tuner.py # Sweeps risk thresholds to find optimal cutoff ├── requirements.txt ├── requirements_dashboard.txt ├── Dockerfile └── docker-compose.yml ```
标签:AI内容安全, AI风险缓解, AV绕过, FastAPI, Kubernetes, LLM应用防火墙, Prompt注入检测, 向量数据库, 大语言模型安全, 机密管理, 版权保护, 请求拦截, 逆向工具