Mohit-Dhawan98/sre-incident-env
GitHub: Mohit-Dhawan98/sre-incident-env
一个用于训练和评估 AI Agent 在多服务架构中进行生产事故根因分析的强化学习仿真环境
Stars: 0 | Forks: 0
## SRE Incident Response 环境
emoji: 🔧
colorFrom: red
colorTo: gray
sdk: docker
app_port: 8000
# SRE Incident Response 环境
一个模拟值班 Site Reliability Engineering (SRE) 的 OpenEnv RL 环境。AI Agent 接收生产事故警报,通过查询多服务架构中的服务日志和指标进行调查,在误导信息和级联故障中追踪因果链,并提交根因诊断。该环境自动评分 —— 运行时零 LLM 调用,完全确定性。
## 快速入门
```
pip install git+https://huggingface.co/spaces/Maverick98/sre-incident-env
```
```
from client import SREIncidentEnv
async with SREIncidentEnv(base_url="https://Maverick98-sre-incident-env.hf.space") as env:
await env.reset(difficulty="medium")
tools = await env.list_tools()
result = await env.call_tool("list_services")
result = await env.call_tool("read_logs", service="api-gateway", window_minutes=10)
result = await env.call_tool("submit_diagnosis",
affected_service="product-cache",
failure_type="cache_node_failure",
root_cause="product-cache node failed causing checkout fallback",
causal_chain="product-cache,checkout-service,api-gateway",
confidence=0.85)
```
## Agent 如何交互
该环境暴露 4 个 MCP 工具:
| Tool | Description |
|------|-------------|
| `list_services` | 返回事故拓扑中的服务名称 |
| `read_logs(service, window_minutes, level_filter)` | 返回某个服务的日志条目 |
| `check_metric(service, metric, window_minutes)` | 返回指标时间序列(30秒分辨率) |
| `submit_diagnosis(affected_service, failure_type, root_cause, causal_chain, confidence)` | 提交诊断,返回奖励,结束 episode |
Agent 拥有充足的查询预算(100)—— 难度源于场景内容,而非资源限制。
## 难度分级
| Tier | Count | Avg Score (frontier models) | What Makes It Hard |
|------|-------|---------------------------|-------------------|
| **Easy** | 5 | ~0.64 | 熟悉的故障模式,清晰的信号,需要一定调查 |
| **Medium** | 5 | ~0.52 | 多个嫌疑对象,误导性的 Red Herrings(干扰项),模糊的指标 |
| **Hard** | 5 | ~0.35 | 深层链条,晦涩的机制,多个 Red Herrings |
| **Expert** | 2 | ~0.19 | 不可见的根源,无指标线索,晦涩的内核/基础设施故障 |
17 个场景基于 o4-mini 和 gemini-2.5-flash 的联合共识进行了校准。Hard/Expert 包含真实的生产故障:NUMA 跨插槽延迟、CPU TSC 漂移、JVM metaspace 耗尽、Kafka 分区重平衡风暴。
## Reward Function (V5)
7 个组件,全确定性。无嵌入模型。
**Tier 1 —— 是否解决?(0.65):**
| Component | Weight | Method |
|-----------|--------|--------|
| Service identification | 0.25 | 根服务完全匹配(+ 0.08 邻接部分分) |
| Failure type | 0.15 | 20 类分类法完全匹配 |
| Causal chain | 0.15 | 与黄金传播链的 F1 分数 |
| Explanation keywords | 0.10 | 黄金关键词清单(每场景 5 个术语) |
**Tier 2 —— 如何解决?(0.35):**
| Component | Weight | Method |
|-----------|--------|--------|
| Query efficiency | 0.20 | 实际查询 vs 每场景最优查询 |
| Investigation waste | 0.08 | 惩罚重复查询、隧道视野 |
| Investigation breadth | 0.07 | 调查过的因果链服务占比 |
**防博弈:** 组件 2-4 以正确的服务识别为前提。错误的服务 = Tier 1 得 0 分。无免费分数。
## 基线分数
来自 `inference.py` 的可复现分数(每个难度 1 个 episode):
| Model | Easy | Medium | Hard | Expert | Overall |
|-------|------|--------|------|--------|---------|
| gpt-5.4 | 0.71 | 0.62 | 0.35 | 0.19 | 0.48 |
| o4-mini | 0.65 | 0.48 | 0.38 | 0.27 | 0.46 |
| gemini-2.5-flash | 0.57 | 0.45 | ~0.30 | ~0.15 | 0.40 |
Hard/Expert 场景真正挑战了前沿模型。Easy 场景可通过基本的日志跟踪解决。
## Action & Observation Spaces
**Action** (`CallToolAction`):Agent 每步调用 4 个 MCP 工具之一。每个工具都有类型化参数。
**Observation** (`SREObservation`):
- `done: bool` — episode 是否结束?
- `reward: float` — 0.0-1.0(仅在 submit_diagnosis 时非零)
- `logs: List[LogEntry]` — `{timestamp, service, level, message}`
- `metric_series: List[MetricPoint]` — `{timestamp, value}`
- `services: List[str]` — 服务名称(来自 list_services)
- `message: str` — 重置时的警报文本,状态消息
**State** (`SREState`):`episode_id`、`step_count`、`scenario_id`、`difficulty`、`services`、`queries_used`、`query_budget`、`diagnosis_submitted`、`current_reward`
## Episode 流程
```
Agent Environment
│ │
│──── reset(difficulty="hard") ──────>│ Pick scenario, generate logs/metrics
│<─── alert message ─────────────────│
│ │
│──── list_services() ───────────────>│ (free)
│<─── ["api-gw","cache","db",...] ────│
│ │
│──── read_logs("api-gw", ERROR) ────>│
│<─── [{ts, svc, level, msg},...] ────│
│ │
│──── check_metric("db","latency") ──>│
│<─── [{ts: .., value: 22}, ...] ─────│
│ │
│ ... investigate until confident ... │
│ │
│──── submit_diagnosis(cause,svc) ───>│ Compute reward, end episode
│<─── reward=0.72, done=True ─────────│
```
## 本地运行
```
git clone https://huggingface.co/spaces/Maverick98/sre-incident-env
cd sre-incident-env
uv sync
uvicorn server.app:app --host 0.0.0.0 --port 8000
```
## 运行 Inference
```
# 设置所需的 env vars
export API_BASE_URL="https://api.openai.com/v1"
export MODEL_NAME="gpt-4o-mini"
export HF_TOKEN="your-api-key"
# 运行 baseline (所有 4 种难度,每种 2 个 episodes)
python inference.py
# 对抗 HF Space
python inference.py --space https://Maverick98-sre-incident-env.hf.space
# 单一难度
python inference.py --difficulty hard --episodes 3
```
## 使用真实 Incident 数据进行 Training
该环境是一个**可插拔框架**,而不仅仅是 17 个固定场景。任何组织都可以将其过去的故障转化为训练数据:
```
export OPENENV_CUSTOM_REGISTRY=/path/to/your_incidents.jsonl
```
JSONL 中的每个事故定义了:服务拓扑、日志模板、指标模式、黄金根因、因果链和解释关键词。奖励函数无需更改即可工作 —— 它根据每个事故中的黄金数据进行评分。
**这对 RL 训练的意义:**
- 拥有 500 个过往 P0/P1 事故的公司 = 500 个训练 episodes
- Agent 从**你**特定的基础设施中学习模式
- 难度自然扩展 —— 真实事故的范围从显而易见到晦涩难懂
- 确定性奖励确保稳定的 RL 梯度
- 部分分数(Tier 2:调查质量)即使在错误诊断时也提供信号
参见 [`scenarios/schema.md`](scenarios/schema.md) 了解 JSONL 格式,以及 [`scenarios/difficulty_calibration.md`](scenarios/difficulty_calibration.md) 了解 4 维难度框架。
## 架构
- **Environment server**:MCPEnvironment (FastMCP),含 4 个工具
- **Reward**:完全确定性,7 个组件,无模型依赖
- **Scenarios**:17 个内置(5 easy + 5 medium + 5 hard + 2 expert)+ 自定义 JSONL 注册表
- **Client**:MCPToolClient(async/sync),可通过 pip 安装
- **Inference**:原生 OpenAI function calling,智能上下文摘要
标签:AIOps, AI智能体, API集成, CISA项目, Docker, Hackathon项目, HuggingFace Spaces, MCP工具, OpenAI Gym, Python, PyTorch, RL环境, SRE, 偏差过滤, 凭据扫描, 分布式系统, 可观测性, 响应大小分析, 因果链追踪, 大模型Agent, 安全防御评估, 异常检测, 强化学习, 微服务架构, 指标监控, 故障排查, 无后门, 根因分析, 生产事故, 确定性环境, 站点可靠性工程, 自动化运维, 请求拦截, 逆向工具