asorari09/Incident-Rootcause-Copilot
GitHub: asorari09/Incident-Rootcause-Copilot
一个人机协同的事件响应 Copilot,通过确定性异常检测与有预算限制的 LangGraph 诊断工作流帮助工程师在服务中断时定位根因并起草修复方案,同时不执行任何自动变更。
Stars: 0 | Forks: 0
# IR-Copilot
**以数据统计进行检测。以 AI agents 进行诊断。由人类进行干预与修复。**
IR-Copilot 是一个人机协同(human-in-the-loop)的事件响应(incident-response)copilot。一个确定性的检测器会决定合成的指标异常是否真实;随后,一个固定且有预算上限的 LangGraph workflow 会检索 runbook 上下文,生成结构化假设,并为人工审查起草 GitHub issue 或本地试运行(dry-run)产出物。
它有意避免成为一个自动修复工具、Datadog 的替代品,或是一个自由格式的 multi-agent 演示。
## 为什么开发它
在服务中断期间,工程师必须在时间压力下将各项指标、近期变更、已知 runbook 以及事件沟通记录关联起来。IR-Copilot 展示了一种更安全的职责划分:由统计学决定某些东西是否异常,而模型则帮助解释基于工具的事实证据(tool-grounded evidence),同时不执行任何基础设施变更。
## 架构
```
React/Vite dashboard → FastAPI → detector gate → fixed LangGraph
├→ local MiniLM + Chroma runbooks
└→ draft-only GitHub client / local outbox
```
完整的图表和时序图请参见 [docs/ARCHITECTURE.md](docs/ARCHITECTURE.md)。
## 快速开始
环境要求:Python 3.12+,[uv](https://docs.astral.sh/uv/) 以及 Node/npm。
```
make install
make test
make run-api
```
在第二个终端中:
```
make run-web
```
打开 `http://127.0.0.1:5173`,选择 `sc_db_pool`,点击 **Inject**,然后点击 **Run incident**。本地开发会使用离线的 Fake LLM 路径,Vite 会将 API 调用代理到 `http://127.0.0.1:8000`。API 的 OpenAPI UI 位于 `http://127.0.0.1:8000/docs`。
使用本地 MiniLM 模型索引 runbook(当已缓存或可用时):
```
make index-runbooks
```
## 演示场景
| 场景 | 预期结果 |
|---|---|
| `sc_db_pool` | `db_connection_pool_exhaustion` |
| `sc_memory_leak` | `memory_leak_after_deploy` |
| `sc_bad_deploy` | `regressive_deploy` |
| `sc_dependency_outage` | `upstream_dependency_outage` |
| `sc_noise_false_alarm` | 跳过;无根本原因 |
## 评估与可观测性
```
make eval
```
最新测得的离线结果:
```
evals PASS: 5/5 exact, noise_skip=True, mean_cost=$0.0000
```
此结果使用了 `FakeLLM`,因此零成本仅为离线测试结果,并不代表实际产生的 OpenAI 账单。实时运行被限制为仅使用 `gpt-4o-mini`、temperature 为 0 且 LLM 尝试次数不超过三次;标准的实时预算为 `$0.03/run`。本地 MiniLM embeddings 不产生任何 API embedding 成本。
Langfuse 是可选的。在未提交的 `.env` 中设置 `LANGFUSE_ENABLED=true`、`LANGFUSE_PUBLIC_KEY`、`LANGFUSE_SECRET_KEY`,以及可选的 `LANGFUSE_HOST`,即可发送配置好的 traces。若未提供密钥,相关的回调将变为空操作(no-op)。
## 防护栏
- 异常拦截机制可以直接跳过图结构;噪声场景下会进行零次 LLM 调用。
- 工作流图是固定的,没有 supervisor 或自主的 agent 循环。
- Prompts 基于紧凑的检测器/RAG/GitHub 事实证据,并使用 Pydantic 进行结构化。
- 仅允许使用 `gpt-4o-mini`;严格执行 `MAX_LLM_CALLS_PER_RUN <= 3`。
- GitHub 的写入仅限草稿模式。不存在 auto-merge、部署、删除、kubectl 或云端环境变更工具。
- `GITHUB_DRY_RUN=true` 默认会将 Markdown 产出物写入 `data/outbox/`。
## 实时演示 / 部署 (Render 免费版)
托管演示使用 **一个** Render 免费 Web Service (Docker)。该服务在空闲约
15 分钟后会休眠,唤醒可能需要约 1 分钟。请保持 `ALLOW_FAKE_LLM=true` 和
`ENABLE_RUNBOOK_INDEX=false`,这样演示就不需要付费的 API 密钥,并且能维持在
免费层的内存限制内。
**实时演示:** [https://ir-copilot.onrender.com](https://ir-copilot.onrender.com)
在空闲停机后的第一次请求可能需要大约一分钟,等待 Render
唤醒该免费实例。一旦唤醒,控制面板将提供与本地演示相同的无密钥
FakeLLM + GitHub 试运行(dry-run)流程。
分步指南:[docs/DEPLOY.md](docs/DEPLOY.md)。部署蓝图:[`render.yaml`](render.yaml)。
本地单服务对等配置:
```
cp .env.example .env
docker compose up --build
```
然后打开 `http://127.0.0.1:8000/` 访问内置控制面板,并访问
`http://127.0.0.1:8000/health` 查看健康检查。
## 可用于简历的要点
- 构建了一个混合式事件响应 copilot,将确定性异常检测与 LLM 诊断分离开来,以降低产生幻觉的风险。
- 实现了一个固定的 LangGraph 工作流,包含本地 runbook 检索、Pydantic 结构化输出、严格的单次运行调用上限,以及仅限草稿模式的 GitHub 修复策略。
- 添加了五个标准测试场景和一个离线评估测试套件,测得 5/5 精确匹配,且针对误报路径实现了零次 LLM 调用。
- 实现了 FastAPI、React/Vite、SQLite 持久化、可选的 Langfuse 回调,并提供了支持缩容的免费 Render Docker 托管环境以进行无密钥演示。
## 延伸阅读
- [部署 (Render 免费版)](docs/DEPLOY.md)
- [架构](docs/ARCHITECTURE.md)
- [决策记录](docs/DECISIONS.md)
- [演示脚本](docs/DEMO_SCRIPT.md)
- [面试指南](docs/INTERVIEW_GUIDE.md)
- [构建回顾](docs/RETROSPECTIVE.md)
- [权威实施计划](END_TO_END_PLAN.md)
标签:AI助手, LangGraph, RAG, 库, 应急响应, 异常检测, 请求拦截, 运维监控, 逆向工具