Jayant2304/incident-response-env
GitHub: Jayant2304/incident-response-env
一个基于OpenEnv的强化学习环境,用于训练AI代理诊断生产事故场景,包含12个不同难度的事故案例和确定性评分系统。
Stars: 0 | Forks: 0
# 生产事故响应 — OpenEnv 环境
一个**OpenEnv兼容的**强化学习环境,用于训练AI代理诊断生产事故。为Meta x PyTorch OpenEnv黑客松(Scaler技术学院)构建。
## 概述
AI代理会收到一个真实的生产事故场景——告警摘要、多个服务的按时间顺序排列的日志、关键指标和服务依赖关系图——需要诊断根本原因、识别受影响的服务、提出修复方案并评估爆炸半径。环境会使用[0.0, 1.0]范围内的连续奖励信号对响应进行评分。
## 主要特性
- **12个事故场景**,分为3个难度等级(简单/中等/困难)
- **真实故障模式**:HikariPool耗尽、OOMKill、Redis驱逐风暴、数据库死锁、Kafka schema不匹配、副本延迟级联、TLS证书过期、特性标志配置错误、数据管道静默失败
- **4项标准加权奖励**,支持梯度友好的强化学习训练,部分得分
- **确定性评分**——无需LLM评判,完全可重现
- **34个自动化测试**,覆盖评分器、环境生命周期和HTTP端点
- **一键Docker部署**到HuggingFace Spaces
## 快速开始
### 本地开发
```
# 安装依赖项
pip install -r requirements.txt
# 启动服务器
uvicorn server.app:app --host 0.0.0.0 --port 8000
# 测试端点
curl http://localhost:8000/health
curl -X POST http://localhost:8000/reset -H "Content-Type: application/json" -d '{}'
curl -X POST http://localhost:8000/reset -H "Content-Type: application/json" -d '{"task_id":"easy_001"}'
# 运行测试
pip install pytest httpx
pytest tests/ -v
```
### Docker
```
docker build -t incident-env .
docker run -p 7860:7860 incident-env
curl http://localhost:7860/health
```
### 运行推理
```
export API_BASE_URL=https://api.openai.com/v1
export MODEL_NAME=gpt-4o-mini
export HF_TOKEN=sk-your-key
export ENV_BASE_URL=http://localhost:8000
python inference.py
```
## API端点
| 端点 | 方法 | 描述 |
|---|---|---|
| `/health` | GET | 健康检查 |
| `/metadata` | GET | 环境名称、描述、版本、作者 |
| `/schema` | GET | Action、Observation、State的JSON schema |
| `/reset` | POST | 开始新episode(JSON body: `{"task_id":"easy_001"}` 或 `{"difficulty":"easy"}`) |
| `/step` | POST | 提交诊断结果(JSON body: `{"action": {…IncidentAction…}}`) |
| `/state` | GET | 当前episode元数据 |
| `/tasks` | GET | 按难度分组的所有任务ID |
| `/mcp` | POST | MCP JSON-RPC 2.0端点 |
## 奖励系统
| 标准 | 权重 | 评分方式 |
|---|---|---|
| 受影响服务 | 0.25 | 精确字符串匹配 |
| 根本原因 | 0.35 | 关键词匹配(0/0.5/1.0) |
| 修复方案 | 0.30 | 关键词匹配(0/0.5/1.0) |
| 爆炸半径 | 0.10 | 精确匹配 |
## 任务描述
| 任务ID | 难度 | 场景 |
|---|---|---|
| `easy_001` | 简单 | 支付服务HikariPool连接池耗尽(503峰值) |
| `easy_002` | 简单 | 认证服务OOMKilled——会话缓存增长导致内存限制超出 |
| `easy_003` | 简单 | Redis maxmemory驱逐风暴——缓存命中率降至2% |
| `medium_001` | 中等 | 级联故障——inventory-db死锁传播到order、inventory、notification服务 |
| `medium_002` | 中等 | Elasticsearch JVM GC压力导致搜索超时(p99 > 15s) |
| `medium_003` | 中等 | 推荐模型工件从registry下载失败(404/权限拒绝) |
| `medium_004` | 中等 | Kafka schema版本不匹配导致消费者反序列化失败(2.1M延迟) |
| `hard_001` | 困难 | Session-db副本延迟级联——6个服务出现误导性症状 |
| `hard_002` | 困难 | 特性标志实验错误配置价格乘数——40%结账下降,无应用错误 |
| `hard_003` | 困难 | cert-manager续期重试风暴耗尽config-db连接——延迟激增8倍 |
| `hard_004` | 困难 | 单个pod(payment-svc-pod-c)TLS证书过期——间歇性5xx,近期无部署 |
| `hard_005` | 困难 | 静默数据管道分区跳过——Airflow DAG显示SUCCESS但写入0行 |
**简单**任务有单一受影响服务,日志信号明显。**中等**任务涉及级联故障或依赖图推理。**困难**任务包含干扰项、误导性症状和深藏的根本原因。
## 基线分数
使用**Qwen/Qwen2.5-72B-Instruct**通过HuggingFace Inference Router针对实时HF Space的基线运行:
| 任务 | 难度 | 分数 |
|---|---|---|
| `easy_001` | 简单 | 0.75 |
| `easy_002` | 简单 | 1.00 |
| `easy_003` | 简单 | 1.00 |
| `medium_001` | 中等 | 1.00 |
| `medium_002` | 中等 | 1.00 |
| `medium_003` | 中等 | 0.75 |
| `medium_004` | 中等 | 0.65 |
| `hard_001` | 困难 | 1.00 |
| `hard_002` | 困难 | 1.00 |
| `hard_003` | 困难 | 0.65 |
| `hard_004` | 困难 | 0.75 |
| `hard_005` | 困难 | 1.00 |
| 难度 | 任务数 | 平均分数 |
|---|---|---|
| 简单 | 3 | **0.9167** |
| 中等 | 4 | **0.8500** |
| 困难 | 5 | **0.8700** |
| **总体** | **12** | **0.8792** |
困难任务故意设计了误导性症状。例如,`hard_002`呈现结账转化率下降但无应用错误——根本原因是特性标志实验,而非日志指向的定价服务。`hard_003`显示所有服务延迟激增8倍——实际根本原因是cert-manager的续期重试风暴,而非其压垮的config-db。
## 项目结构
```
incident_response_env/
├── Dockerfile
├── openenv.yaml
├── pyproject.toml
├── requirements.txt
├── constants.py
├── models.py
├── inference.py
├── conftest.py
├── server/
│ ├── app.py
│ ├── domain.py
│ ├── incident_environment.py
│ ├── tasks.py
│ ├── graders.py
│ └── mcp.py
└── tests/
└── test_environment.py
```
## 许可证
MIT
标签:AI人工智能, API服务, API集成, AV绕过, Docker, FastAPI, HuggingFace Spaces, Meta, OpenEnv, Python, PyTorch, SRE, 事件管理, 偏差过滤, 凭据扫描, 可观测性, 奖励函数, 安全规则引擎, 安全防御评估, 容器化部署, 开源框架, 强化学习, 持续集成, 指标监控, 故障诊断, 无后门, 服务网格, 机器学习环境, 根因分析, 环境模拟, 生产事件响应, 监控告警, 请求拦截, 逆向工具