Twilight-13/devops-incident-response

GitHub: Twilight-13/devops-incident-response

一个符合OpenEnv标准的强化学习环境,用于训练AI智能体在模拟微服务架构中诊断并修复生产故障。

Stars: 0 | Forks: 0

tags: - openenv - devops - incident-response - real-world - reinforcement-learning - reward-shaping license: apache-2.0 pipeline_tag: reinforcement-learning sdk: docker # DevOps 故障响应 — OpenEnv 一个符合 OpenEnv 标准的强化学习环境,AI 智能体在此学习 诊断并修复模拟微服务架构中的生产软件故障。 智能体读取日志、指标和运维手册 —— 然后执行精确操作,如 回滚、重启和升级 On-call。奖励函数对信息收集、正确诊断和精确 修复给予密集的部分奖励,同时惩罚附带损害和盲目操作。 **四项难度递增的任务:** - **简单** — 单服务 OOM 崩溃循环(具体服务随 seed 变化) - **中等** — 错误部署导致的级联故障,伴随干扰警报 - **困难** — 静默数据损坏,无错误率警报,仅有业务指标异常 - **附加** — 两个同时发生的独立故障,必须全部修复 ## 动机 现有的智能体基准测试主要集中在软件工程 (SWE-bench)、 网页导航 (WebArena) 或通用工具使用 (AgentBench)。没有一个 模拟 **运维智能** —— 即在不确定性下对 实时生产系统进行推理的能力。 然而,故障响应是软件组织中风险最高、频率最高的 任务之一。每一家运行微服务的公司每天都会面临这个问题。所需的技能正是区分 强大 AI 智能体与弱智能体的关键: - 时间压力下的 **多步骤信息收集** - 对依赖系统的 **因果推理** - **精确的动作选择**,错误的操作会导致额外损害 - **信号与噪声区分**(干扰警报、静默故障) 本环境填补了这一空白。这是第一个专为基准测试智能体在 生产故障响应上的表现而设计的符合 OpenEnv 标准的 RL 环境。 ### 与现有基准测试的对比 | Benchmark | Domain | Multi-step | Real-world | Partial obs | Dense reward | |---|---|---|---|---|---| | SWE-bench | Code repair | ✓ | ✓ | ✗ | ✗ | | WebArena | Web navigation | ✓ | ✓ | ✓ | ✗ | | AgentBench | General tools | ✓ | Partial | ✗ | ✗ | | **DevOps-IR (ours)** | **Incident response** | **✓** | **✓** | **✓** | **✓** | ### Episode 架构 ``` graph TD A[Agent] -->|Action| B[DevOpsIncidentEnv] B -->|Observation| A B --> C[ServiceStatus x N] B --> D[AlertList] B --> E[EvidenceLog] B --> F[DependencyMap] B --> G[SLAStatus] H[Grader] -->|score 0-1| I[Episode Analytics] B -->|done=True| H I --> J[steps_to_diagnosis] I --> K[info_gathering_ratio] I --> L[collateral_damage_events] ``` ### 为什么这很难 这四项任务旨在要求性质不同的 推理策略: - **简单**: 直接信号读取 —— 日志清楚地显示 OOM,修复方法显而易见 - **中等**: 依赖追踪 —— 必须跟随调用链找到根源 - **困难**: 异常关联 —— 零错误警报,信号隐藏在 WARN 日志和跨越 6 个服务的业务指标中 - **附加**: 并行诊断 —— 两个不相关的故障,智能体必须 分解并独立修复 ## 环境描述 该环境模拟一个微服务电商集群。根据 任务不同,有 3–6 个服务处于活动状态。可能出现的服务: | Service | Stack | Role | |---|---|---| | `api-gateway` | Go | 路由外部请求 | | `payment-service` | Java (Spring) | 处理支付 | | `order-service` | Python | 创建并跟踪订单 | | `inventory-service` | Java | 管理产品库存 | | `user-service` | Node.js | 认证和配置文件 | | `notification-service` | Python | 邮件和推送警报 | | `data-pipeline-service` | Python | 从事件流写入目录数据 | | `product-catalog-service` | Go | 存储并提供产品数据 | | `price-validation-service` | Python | 验证价格一致性 | | `analytics-service` | Python | 聚合业务指标 | | `ml-inference-service` | Python | 提供推荐模型服务 | | `log-aggregator` | Go | 收集并存储日志 | 每个 Episode 会以此初始化一个随机场景。相同的 seed 总是产生相同的 Episode。不同的 seed 会轮换哪个服务故障、哪个版本是坏的, 以及具体的指标数值。 ## 动作空间 | Action | Parameters | Description | |---|---|---| | `diagnose` | `root_cause` (str) | 记录你的根本原因假设 | | `read_logs` | `service` (str) | 获取某个服务的近期日志行 | | `read_metrics` | `service` (str) | 获取 CPU、内存、错误率、P99 延迟 | | `read_runbook` | `runbook` (str) | 阅读运维手册 | | `search_logs` | `service`, `query` | 搜索匹配关键字的日志行 | | `restart_service` | `service` (str) | 重启服务(清除内存/连接) | | `rollback` | `service`, `version` | 回滚到先前的构件版本 | | `scale_up` | `service` (str) | 增加副本数量 | | `alert_oncall` | `reason` (str) | 呼叫 On-call 工程团队 | | `acknowledge` | `service` (alert id) | 确认活动警报 | | `noop` | — | 不采取任何行动 | ## 观察空间 每一步返回一个 Pydantic `Observation`,包含: ``` Observation ├── step, max_steps, task_id, task_description ├── services: List[ServiceStatus] │ ├── name, status, cpu_percent, memory_percent │ ├── error_rate, latency_p99_ms │ ├── replicas_running, replicas_desired │ ├── current_version, last_deployed │ ├── sla_breach, minutes_degraded ← NEW: SLA tracking ├── active_alerts: List[Alert] ├── recent_logs: Dict[str, List[str]] ├── service_dependencies: List[ServiceDependency] ← NEW: call topology │ ├── service, calls, called_by ├── evidence_log: List[EvidenceEntry] ← NEW: accumulated reads │ ├── step, source, summary, raw ├── sla_status: Dict[str, str] ← NEW: ok/warning/breached ├── available_runbooks: List[str] ├── last_action_result, last_action_error ├── incident_start_time, elapsed_minutes ``` ## 任务 ### 任务 1 — 单服务 OOM (简单) **最大步数:** 15 | **预期强 LLM 得分:** 0.85–1.00 一个服务因内存不足 (OOM) 错误而崩溃循环。受影响的服务 按 seed 轮换 (payment-service / order-service / user-service),并具有 不同的日志格式 (Java / Python / Node.js)。api-gateway 上会触发 次级熔断器警报。 **奖励明细:** read_logs (+0.15), read_metrics (+0.10), runbook (+0.05), 正确诊断 (+0.30), 重启正确服务 (+0.40)。 惩罚: 重启健康服务 (−0.10), 过多 noop (−0.04/步)。 ### 任务 2 — 多服务级联故障 (中等) **最大步数:** 20 | **预期强 LLM 得分:** 0.55–0.75 一次错误的部署导致 `inventory-service` 出现连接池耗尽或 NullPointerException, 进而导致 `order-service` 级联超时以及 `api-gateway` 上的 错误率升高。`notification-service` 上触发高 CPU 警报 (干扰项 —— 计划中的批处理作业)。依赖图揭示了这条链: `api-gateway → order-service → inventory-service`。 **奖励明细:** 调查 inventory (+0.20), 追踪级联 (+0.05), runbook (+0.05), 正确诊断 (+0.25), 回滚根源服务 (+0.30–0.40)。 惩罚: 追踪干扰项 (−0.05), 在根源之前处理症状 (−0.10)。 ### 任务 3 — 静默数据损坏 (困难) **最大步数:** 25 | **预期强 LLM 得分:** 0.30–0.50 所有服务显示健康状态 —— 零错误率、正常延迟、无标准 警报。信号隐藏在 `price-validation-service` 的 WARN 日志(15% 的价格 不匹配率 vs 0.2% 基线)和 `analytics-service` 的异常(平均订单 价值 $847 vs $89 基线)中。两者都与 2 分钟前 `data-pipeline-service` 的部署相关联。 三个噪声警报会分散注意力:TLS 续订、分析积压、副本延迟。 获得满分需要 **同时** 执行 rollback 和 alert_oncall。 **奖励明细:** 读取微弱信号 (+0.15–0.20), 检查 pipeline 指标 (+0.10), runbook (+0.05), 正确诊断 (+0.20), rollback pipeline (+0.25), alert_oncall (+0.15)。 惩罚: 任何 restart/scale (−0.15)。 ### 任务 4 — 同时双重故障 (附加) **最大步数:** 25 | **预期强 LLM 得分:** 0.35–0.55 两个完全独立的故障同时发生: 1. `log-aggregator` 磁盘 100% 满(每分钟丢失 48k 条日志消息) 2. `ml-inference-service` 卡在模型校验和重载循环中(CPU 99%+) 修复其中一个对另一个没有帮助。获得满分需要解决两者: alert_oncall 进行磁盘清理 以及 rollback/restart ml-inference。 ## 奖励函数设计 ``` Score = Σ(step rewards) + efficiency_bonus + diagnosis_bonus - collateral_damage_penalty - blind_action_penalty - noop_penalty ``` 关键属性: - **密集信号** — 除非真的是随机操作,否则整个 Episode 的奖励永远不会为零 - **信息优先** — 奖励先读取后操作的行为 - **要求精确** — 错误的服务会导致 0 分或负分 - **时间压力** — SLA 状态每一步都会恶化;效率奖励鼓励速度 - **双重要求** — 困难和附加任务需要多个正确操作 所有奖励限制在 **[0.0, 1.0]** 范围内。 ## 设置说明 ### Docker (推荐用于评测) ``` docker build -t devops-incident-env . docker run -p 7860:7860 devops-incident-env curl http://localhost:7860/health ``` ### 本地 Python ``` pip install -r requirements.txt uvicorn api:app --host 0.0.0.0 --port 7860 ``` ### 直接导入 ``` from env import DevOpsIncidentEnv from models import Action, ActionType env = DevOpsIncidentEnv(task_id="easy", seed=42) obs = env.reset() # 服务依赖关系图位于 obs.service_dependencies # 证据日志在阅读时累积于 obs.evidence_log result = env.step(Action(action_type=ActionType.READ_LOGS, service="payment-service")) print(result.reward) # 0.15 print(result.observation.evidence_log[-1].summary) ``` ### 验证 ``` python validate.py # 22 automated checks, exit 0 = all pass ``` ## 运行推理基线 ``` export API_BASE_URL="https://router.huggingface.co/v1" export MODEL_NAME="meta-llama/Llama-3.3-70B-Instruct" export HF_TOKEN="hf_your_token_here" python inference.py ``` ## 基线分数 使用 `meta-llama/Llama-3.3-70B-Instruct` 运行,seed=42,temperature=0.1: | Task | Score | Resolved | Steps | |---|---|---|---| | easy | 1.0000 | ✓ | 5 | | medium | 0.6800 | ✓ | 9 | | hard | 0.3500 | ✗ | 25 | | bonus | 0.3800 | ✗ | 25 | | **average** | **0.6025** | — | — | *分数随模型和 temperature 变化。使用 seed=42 运行以确保可复现性。* ## API 参考 | Endpoint | Method | Body | Description | |---|---|---|---| | `/health` | GET | — | 返回 `{"status": "ok"}` | | `/reset` | POST | `{"task_id": "easy", "seed": 42}` | 开始新 Episode | | `/step` | POST | `Action` JSON | 执行一个动作 | | `/state` | GET | — | 完整状态 + 基本事实 + 分析数据 | | `/tasks` | GET | — | 列出所有 4 个任务 | | `/validate` | GET | — | 所有任务的自我验证报告 | ## OpenEnv 合规性 ``` openenv validate . ``` 所有 Endpoints 均符合 OpenEnv 规范。`openenv.yaml` 包含完整的 元数据,包括 4 个任务定义、动作/观察空间描述、 预期分数范围以及 Docker 配置。 ## 许可证 Apache 2.0
标签:AIOps, AI智能体, Docker, OpenEnv, Ops智能, 仿真环境, 因果推理, 多步决策, 奖励塑形, 安全防御评估, 强化学习, 故障自愈, 故障诊断, 数据管道, 智能运维, 生产事故, 请求拦截, 软件工程, 逆向工具