swagger3x/art-hub
GitHub: swagger3x/art-hub
一个基于 Django 的 AI 红队安全意识培训平台,通过模拟的提示词注入和对抗性 ML 实验室帮助学员学习 AI 安全知识。
Stars: 0 | Forks: 0
# ART-Hub
一个用于 AI 红队和对抗安全意识培训的平台。
学员将通过一系列简短的模块进行学习 —— 一门课程、一个提示词注入实验室,以及一个对抗性 ML 实验室 —— 所有的尝试都会被记录下来,以便讲师可以在 Django 管理后台审查进度。
本仓库是 MVP 脚手架:一个单一的 Django 项目,使用带有 HTMX 的服务端渲染模板来实现交互部分,没有单独的前端构建。
## 目录
- [概述](#overview)
- [架构](#architecture)
- [环境要求](#requirements)
- [本地配置](#local-setup)
- [配置说明](#configuration)
- [项目结构](#project-layout)
- [实验室引擎](#the-lab-engine)
- [数据模型](#data-model)
- [测试](#testing)
- [部署](#deployment)
## 概述
ART-Hub 内置了三个预置模块:
| 模块 | 类型 | 学员需要做什么 |
| --- | --- | --- |
| AI 安全意识 | `awareness` | 阅读课程并将其标记为已完成 |
| 提示词注入实验室 | `injection` | 提交提示词,尝试让模拟的助手泄露机密 |
| 对抗性 ML 实验室 | `adversarial_ml` | 调整扰动强度并观察模拟分类器的性能退化 |
一旦用户针对某个模块记录了一次通过的提交,该模块即被视为已完成。仪表板会反映每个用户的该状态。
**实验室是模拟的。** 没有调用任何语言模型或分类器。实验室的行为由小型的确定性规则集生成,这使得 MVP 运行快速、免费,且能够安全地暴露给不受信任的输入。替换为真实执行的接口已在[实验室引擎](#the-lab-engine)中记录。
## 架构
```
Browser ──HTTP/HTMX──▶ Django views ──▶ run_lab() ──▶ rules module
▲ │ │
└────── HTML fragment ───┘ │
└──▶ Submission (Postgres) ◀──┘
```
- **Django 5** 单体应用 —— 认证、模块、实验室和管理后台集成在一个可部署单元中。
- 生产环境使用 **PostgreSQL**,本地开发默认使用 SQLite。
- **HTMX**(从 CDN 加载)发送实验室尝试请求,并将渲染的结果片段替换到页面中。没有 SPA,没有构建步骤,也没有打包工具。
- **WhiteNoise** 用于从应用进程中提供压缩且带有哈希值的静态文件。
## 环境要求
- Python 3.11+
- PostgreSQL(仅限生产环境 —— 本地开发默认使用 SQLite)
## 本地配置
```
python -m venv venv
source venv/bin/activate # Windows: venv\Scripts\activate
pip install -r requirements.txt
cp .env.example .env # then edit SECRET_KEY
python manage.py makemigrations # no migrations are committed yet
python manage.py migrate
python manage.py loaddata modules/fixtures/modules.json
python manage.py createsuperuser
python manage.py runserver
```
| URL | 用途 |
| --- | --- |
| http://127.0.0.1:8000/ | 学员仪表板(需要登录) |
| http://127.0.0.1:8000/accounts/signup/ | 自助注册 |
| http://127.0.0.1:8000/admin/ | 管理后台 —— 模块、用户、提交记录 |
## 配置说明
所有配置均通过 `django-environ` 从环境变量中读取,在开发环境下会自动加载 `.env` 文件。请参阅 `.env.example`。
| 变量 | 默认值 | 备注 |
| --- | --- | --- |
| `SECRET_KEY` | 仅用于开发的备用值 | 在生产环境中必须设置为随机值 |
| `DEBUG` | `False` | 仅在本地开发时设置为 `True` |
| `DATABASE_URL` | `sqlite:///db.sqlite3` | 任何 `django-environ` 支持的 URL,例如 `postgres://…` |
| `ALLOWED_HOSTS` | `localhost,127.0.0.1` | 以逗号分隔 |
## 项目结构
```
art_hub/ Django project — settings, URLs, WSGI/ASGI entrypoints
accounts/ Custom User model with a role field, signup and auth URLs
modules/ Module catalogue, learner dashboard, seed fixtures
labs/ Lab engine, rule sets, Submission model and admin
templates/ Base layout, dashboard, one template per lab type
static/css/ Stylesheet (no build step)
tests/ Test suite
render.yaml Render.com blueprint (web service + Postgres)
```
路由:
| 路径 | 应用 |
| --- | --- |
| `/` | `modules` —— 仪表板 |
| `/labs//` | `labs` —— 实验室详情和提交 |
| `/accounts/` | `accounts` —— 注册、登录、登出 |
| `/admin/` | Django 管理后台 |
## 实验室引擎
`labs/engine.py` 只公开了一个公共函数:
```
run_lab(module: Module, user_input) -> dict
```
它返回 `{"matched_rule": str | None, "output_shown": str, "passed": bool}`。
所有的视图、管理操作和报告都会经过这个函数,没有例外。它会根据 `module.type` 分发到 `labs/rules/` 中的规则模块:
- **`prompt_injection.py`** —— 将输入与一系列已知的注入模式进行匹配(指令覆盖、角色重分配、角色扮演越狱、提示词探测、编码技巧)。如果匹配成功,则返回预设的“已泄露”机密并通过测试;其他情况则返回预设的拒绝。
- **`adversarial_ml.py`** —— 将扰动强度(0–100,包含边界值)映射到四种预设的分类器输出之一,用于演示置信度下降和最终的错误分类。通过的条件是达到错误分类状态。
`awareness` 模块没有引擎;视图会直接将其标记为已完成。
**扩展。** 要添加一种实验室类型:添加一个 `Module.Type` 选项,添加一个包含 `run(user_input) -> dict` 方法的规则模块,在 `ENGINES` 中注册它,最后在 `labs/views.py` 的 `TEMPLATE_MAP` 中添加对应的模板。如果要用真实的模型执行替换模拟逻辑,只需更改 `run_lab()` 的内部实现即可 —— 调用方和存储的结果结构保持不变。
## 数据模型
- **`accounts.User`** —— 继承自 `AbstractUser`,扩展了 `role`(`user` | `admin`)字段和一个 `is_admin_role` 辅助方法。
- **`modules.Module`** —— 包含 `slug`、`title`、`type`、`order`、`lesson_content`。按 `order` 排序;三个 MVP 模块作为 fixture 预置。
- **`labs.Submission`** —— 每次尝试对应一条记录:包含 `user`、`module`、`input_data`、`matched_rule`、`output_shown`、`passed`、`created_at`。这是审计轨迹,也是仪表板完成状态的数据来源。支持在管理后台中按模块和结果进行筛选。
## 测试
```
python manage.py test
```
`tests/test_engine.py` 涵盖了两个规则集的引擎契约:检测到的注入模式与良性输入的对比,以及高扰动强度与低扰动强度的对比。
## 部署
`render.yaml` 是一个 Render 蓝图,用于同时配置 Python Web 服务和 Postgres 实例:
- **构建(Build)** —— 安装依赖,然后执行 `collectstatic`
- **部署前(Pre-deploy)** —— 执行 `migrate`(在流量切换到新版本之前运行)
- **启动(Start)** —— 执行 `gunicorn art_hub.wsgi:application`
- **环境变量(Env)** —— 由 Render 生成的 `SECRET_KEY`,`DEBUG=false`,以及从配置的数据库注入的 `DATABASE_URL`
在首次部署之前,请将 `ALLOWED_HOSTS` 设置为服务的主机名,并提交生成的 migrations。
标签:AI红队, Django, HTMX, 安全培训平台, 测试用例, 逆向工具