MuhammadZaidSaqib/SentinelX-Real-Time-Fraud-Intelligence
GitHub: MuhammadZaidSaqib/SentinelX-Real-Time-Fraud-Intelligence
一个端到端的实时AI欺诈检测系统,结合机器学习、图分析与可解释性,解决高并发场景下的风险识别与透明评分问题。
Stars: 16 | Forks: 0
# 任务4 — 实时AI欺诈检测平台
端到端演示:**FastAPI** API,**React** 仪表板,**Kafka** 流式处理,**PostgreSQL**,集成 **ensemble + Keras autoencoder** 堆栈,**NetworkX** 图风险分析,**SHAP** 解释,以及可选的 **OpenAI-compatible** 叙事端点。
**默认登录(生产环境请修改):** `admin` / `admin123`(JWT)。
## 目录
- [功能](#功能)
- [仓库结构](#仓库结构)
- [前置条件](#前置条件)
- [快速启动(Docker)](#快速启动docker)
- [配置(环境变量)](#配置环境变量)
- [数据库迁移(Alembic)](#数据库迁移alembic)
- [本地开发(无 Docker)](#本地开发无-docker)
- [API 概览](#api-概览)
- [风险引擎](#风险引擎)
- [安全注意事项](#安全注意事项)
- [性能](#性能)
## 功能
- REST + WebSocket 实时更新;JWT 认证
- Kafka 生产者/消费者管道写入 Postgres
- 混合评分:ML 集成、重构误差、图风险
- 基于 SHAP 的解释;可选 LLM “分析师” 副本(通过兼容 API)
## 仓库结构
```
task4/
├── backend/ # FastAPI, ML, Kafka, Alembic, scripts
│ ├── app/
│ ├── migrations/ # Alembic (avoids shadowing pip `alembic`)
│ ├── scripts/
│ ├── alembic.ini
│ └── requirements.txt # pinned Python deps (included from repo root)
├── frontend/ # Vite + React + Tailwind + Recharts + D3
├── docker-compose.yml
├── requirements.txt # pip install -r requirements.txt → backend pins
└── README.md
```
## 前置条件
| 领域 | 要求 |
|------|------|
| **Docker 路径** | [Docker Desktop](https://www.docker.com/products/docker-desktop/) |
| **本地后端** | Python **3.11+**,在仓库根目录执行 `pip install -r requirements.txt`(或进入 `backend/` 执行 `pip install -r requirements.txt`) |
| **本地前端** | Node.js **20+**,在 `frontend/` 目录执行 `npm install` |
| **完整本地流式处理** | PostgreSQL、Kafka(KRaft 或 ZooKeeper),如使用经典 Kafka 脚本需 Java 17+ |
## 快速启动(Docker)
1. 安装 [Docker Desktop](https://www.docker.com/products/docker-desktop/)。
2. 进入 `task4` 目录:
```
docker-compose up --build
```
3. 启动后,后端会运行 **`alembic upgrade head`**(详见 `scripts/entrypoint.py`),如果缺少模型工件则首次运行时会训练模型。首次启动可能需要几分钟,**模型训练**(若 `creditcard.csv` 不存在则使用合成数据)并将工件写入共享的 `modelshare` 卷。
4. 打开 **http://localhost:3000**(仪表板)和 **http://localhost:8000/docs**(OpenAPI)。
5. 使用 **`admin` / `admin123`** 登录。部署前请设置强 **`JWT_SECRET`** 并轮换演示凭据。
### 服务
| 服务 | 主机端口 | 角色 |
|------|----------|------|
| backend | 8000 | REST + WebSocket + ML 推理 |
| frontend | 3000 | 静态 UI(Nginx) |
| postgres | 5432 | `transactions`、`predictions`、`graph_edges` |
| kafka | 9092 | 外部 PLAINTEXT_HOST 监听器 |
| zookeeper | 2181 | Kafka 依赖 |
| consumer | — | Kafka → 数据库管道 |
| producer | — | 模拟交易流 |
容器内部 Kafka 监听地址:**`kafka:29092`**(在 Compose 中自动设置)。
### 可选:使用真实信用卡 CSV
将 [Kaggle creditcard.csv](https://www.kaggle.com/datasets/mlg-ulb/creditcardfraud) 放置到 `backend/data/creditcard.csv` 并重建,或挂载卷到 `/app/data/creditcard.csv` 后运行训练:
```
docker-compose exec backend python scripts/train_models.py --csv /app/data/creditcard.csv
```
### 可选:AI 叙事(OpenAI-compatible)
在 `.env` 或当前 Shell 中设置(参见[配置](#配置环境变量))。`POST /ai/insight` 返回简短的分析师风格摘要;无密钥时则使用 SHAP + 评分的**模板**摘要。
## 配置(环境变量)
变量从环境或可选 `.env` 读取(详见 `backend/app/config.py`)。Docker Compose 为 `backend` 设置主要变量;可通过根目录 `.env` 覆盖敏感信息。
| 变量 | 用途 | 示例 / 默认值 |
|------|------|----------------|
| `DATABASE_URL` | Postgres 连接 | `postgresql://fraud:fraud@localhost:5432/fraud_db` |
| `KAFKA_BOOTSTRAP_SERVERS` | 代理列表 | `localhost:9092`(本地);Compose 中为 `kafka:29092` |
| `JWT_SECRET` | HS256 签名密钥 | **生产环境必须设置** |
| `JWT_ALGORITHM` | 算法 | `HS256` |
| `JWT_EXPIRE_MINUTES` | 令牌有效期 | `60` |
| `MODELS_DIR` | 保存的模型工件 | `models` 或 Docker 中的 `/app/models` |
| `DATA_DIR` | CSV / 数据文件 | `data` |
| `OPENAI_API_KEY` | 可选 LLM 洞察 | 空值 → 仅模板 |
| `OPENAI_BASE_URL` | 兼容 API 基础地址 | `https://api.openai.com/v1` |
| `OPENAI_MODEL` | 模型 ID | `gpt-4o-mini` |
**前端:** `VITE_API_URL` 指向 API(例如 `http://127.0.0.1:8000` 用于 `npm run dev`)。
## 数据库迁移(Alembic)
架构**不会**在运行时通过 `Base.metadata.create_all()` 创建。迁移文件位于 `backend/migrations/`,在 API 启动前于 Docker 中应用。
**常用命令**(在 `backend/` 中,设置 `DATABASE_URL`):
```
# 应用所有挂起的迁移
python -m alembic upgrade head
# 从模型更改创建新修订(提交前审查差异)
python -m alembic revision --autogenerate -m "describe change"
# 一步降级
python -m alembic downgrade -1
```
**已存在的数据库**(若之前使用 `create_all` 构建且表结构一致):可先在全新卷上应用迁移,或告知 Alembic 数据库已是最新版本而跳过 DDL:
```
python -m alembic stamp head
```
`migrations/env.py` 优先读取 `DATABASE_URL`,否则回退到 `app.config.Settings.database_url`。
## 本地开发(无 Docker)
### 完整栈:本地运行 PostgreSQL + Kafka
依次运行 **PostgreSQL**、**Kafka**(以下记录使用 KRaft,无需 ZooKeeper;经典 ZooKeeper + Kafka 也适用)、后端、**consumer**、**producer** 和 Vite 开发服务器。
**Kafka(Windows / KRaft)** — 前提条件:**Java 17+**、**Python 3.11+**、**Node.js 20+**、[Apache Kafka](https://kafka.apache.org/downloads) 解压到**无空格路径**(例如 `C:\kafka\kafka_2.13-3.7.0`),并设置 `KAFKA_HOME`。
**一次性 KRaft 初始化**
1. 编辑 `%KAFKA_HOME%\config\kraft\server.properties`:
- `listeners=PLAINTEXT://localhost:9092`
- `advertised.listeners=PLAINTEXT://localhost:9092`
- `log.dirs` 指向已存在的文件夹(例如 `C:/kafka-data/kraft-combined-logs`)
2. 格式化存储(每个新的 `log.dirs` 仅需一次):
```
cd $env:KAFKA_HOME
.\bin\windows\kafka-storage.bat random-uuid
.\bin\windows\kafka-storage.bat format -t PASTE_UUID_HERE -c .\config\kraft\server.properties
```
3. 启动 Broker(保持运行):`.\bin\windows\kafka-server-start.bat .\config\kraft\server.properties`
4. 创建主题 `transactions`:
```
& "$env:KAFKA_HOME\bin\windows\kafka-topics.bat" --create --if-not-exists --topic transactions --bootstrap-server localhost:9092 --partitions 1 --replication-factor 1
```
**启动顺序:** PostgreSQL → Kafka → topic → 后端 → consumer → producer → 前端。
**后端**(在 `backend/` 中,建议使用新虚拟环境):
```bash
python -m venv .venv
.\.venv\Scripts\activate
pip install -r requirements.txt
```
**Consumer**(第二个终端,使用相同虚拟环境和 `DATABASE_URL` / `KAFKA_BOOTSTRAP_SERVERS`):
```bash
python -m app.kafka_appconsumer
```
**Producer**(第三个终端,设置 `KAFKA_BOOTSTRAP_SERVERS`):
```bash
python -m app.kafka_app.producer
```
**前端:**
```
cd ..\frontend
npm install
$env:VITE_API_URL = "http://127.0.0.1:8000"
npm run dev
```
打开 Vite 打印的地址(例如 **http://localhost:5173**)。登录:**`admin` / `admin123`**。
**常见问题**
- `NoBrokersAvailable` → Kafka 未运行或 `KAFKA_BOOTSTRAP_SERVERS` 与 Broker 的 `listeners` 不匹配。
- Consumer “models not loaded” → 运行 `python scripts\train_models.py`。
- 旧版 Kafka + ZooKeeper 同样适用:先启动 ZooKeeper 再启动 Broker,并创建相同主题。
- **`Activate.ps1` 未找到** → 在 `backend/` 中创建虚拟环境:`python -m venv .venv`。若 PowerShell 限制脚本,执行 `Set-ExecutionPolicy -Scope CurrentUser RemoteSigned`,或直接调用 `.\.venv\Scripts\python.exe -m app.kafka_app.consumer`。
- **`No module named 'kafka'`** → 确保在虚拟环境中执行 `pip install -r requirements.txt`(根目录)或 `pip install -r backend/requirements.txt`。
### 仅后端(无 Kafka)
适用于 UI 与 API 调试;可省略 producer/consumer。仪表板模拟器仍可在无 Broker 情况下驱动流程。
```
cd backend
python -m venv .venv
.venv\Scripts\activate # Windows
# macOS/Linux:source .venv/bin/activate
pip install -r requirements.txt
set DATABASE_URL=postgresql://fraud:fraud@localhost:5432/fraud_db
python -m alembic upgrade head
python scripts/train_models.py
uvicorn app.main:app --reload --port 8000
```
### Kafka 消费者 / 生产者(Broker 已运行)
```
# 来自 backend/,venv 已激活,KAFKA_BOOTSTRAP_SERVERS 已设置
python -m app.kafka_app.producer
python -m app.kafka_app.consumer
```
### 前端(自定义 API 地址)
```
cd frontend
npm install
set VITE_API_URL=http://localhost:8000
npm run dev
```
## API 概览(JWT 认证,除 `/health`、`/auth/login` 外均需)
| 方法 | 路径 | 描述 |
|------|------|------|
| POST | `/auth/login` | JSON `{ "username", "password" }` → JWT |
| POST | `/predict` | 评分并持久化交易 |
| GET | `/transactions` | 带预测结果的最近记录 |
| GET | `/fraud-graph` | D3 所需的节点/边与指标 |
| GET | `/explain/{transaction_id}` | 随机森林的 SHAP 关键特征 |
| POST | `/ai/insight` | SHAP + 评分 → 模板或 LLM 叙事 |
| POST | `/ai/score-preview` | 评分特征(不包含图上下文) |
| WS | `/ws/stream?token=...` | 新交易(轮询 DB 并推送) |
| GET | `/health` | 活跃状态 + `models_loaded` |
## 风险引擎
最终评分(0–1):
`0.5 × ML_ensemble_prob + 0.35 × autoencoder_norm + 0.15 × graph_risk`
等级:**LOW** / **MEDIUM** / **HIGH**,基于最终评分的阈值划分。
## 安全注意事项
- 部署前请替换 `JWT_SECRET` 和演示凭据。
- 开发环境 CORS 设置为 `*`,生产环境应限制来源。
- 使用网络策略保护 Kafka 与 Postgres,并设置强密码。
## 性能
推理针对 **单条交易** 在 CPU 上优化至 **低于 200 毫秒**;SHAP 与可选 LLM 调用为**按需执行**,不计入流式 SLA。
标签:AI欺诈检测, Apex, AV绕过, DNS解析, FastAPI, JWT认证, Kafka流处理, PostgreSQL, React, SHAP可解释性, Syscalls, Web仪表盘, 图分析, 图神经网络, 实时欺诈检测, 开源项目, 异常检测, 数据监控, 机器学习, 流式处理, 测试用例, 深度学习, 特权检测, 网络安全, 自编码器, 请求拦截, 逆向工具, 隐私保护, 风险评分