Dafomu96/ai-incident-response

GitHub: Dafomu96/ai-incident-response

基于 LangGraph 的多 Agent 协作系统,通过并行数据采集、RAG 诊断推理和分级人机协同,自动化 IT 生产事件的分类、诊断、处置与复盘。

Stars: 0 | Forks: 0

# AI 事件响应系统 ## 目录 1. [动机](#1-motivation) 2. [架构](#2-architecture) 3. [5 个 Agent](#3-the-5-agents) 4. [技术栈](#4-technical-stack) 5. [架构决策记录 (ADRs)](#5-architecture-decision-records-adrs) 6. [评估结果](#6-evaluation-results) 7. [仓库结构](#7-repository-structure) 8. [环境配置](#8-setup) 9. [使用方法](#9-usage) 10. [可观测性](#10-observability) 11. [路线图](#11-roadmap) ## 1. 动机 SRE 团队平均花费 40-60 分钟来识别 P1 事件的根本原因。在这段时间内,生产系统可能会产生数万欧元的损失并影响数千名用户。人工处理流程存在三个结构性问题: **上下文碎片化。** 日志在 Loki 中,指标在 Prometheus 中,最近的提交在 GitHub 中,而 pod 状态在 Kubernetes 中。值班 SRE 必须在压力下手动关联这些信息源。 **非持久化知识。** Runbook 和历史复盘报告虽然存在,但并没有被系统地查阅。每次事件都从零开始解决,而没有利用积累的知识。 **在缺乏完整上下文的情况下做出高风险决策。** 凌晨 3 点批准回滚的工程师并不总是能获得促成该建议的完整诊断信息。 本系统解决了这三个问题:并行收集上下文,自动查询历史知识库,并在展示高风险决策时提供知情批准所需的所有上下文。 ## 2. 架构 ### 完整流程 ``` Prometheus/PagerDuty Alert | v +-----------------+ | Agent 1 | Groq Llama 3.3 70B -- P1/P2/P3 classification | Monitor & | Target latency: <500ms | Triage | +--------+--------+ | [P1/P2: escalate] ----------- [P3 trivial: auto-resolve] v +-----------------+ | Agent 2 | asyncio.gather -- parallel collection | Data | Loki (logs) + Prometheus (metrics) + | Collector | GitHub API (commits) + K8s API (pods) +--------+--------+ | v +-----------------+ | Agent 3 | Groq Llama 3.3 70B (dev) / Claude Sonnet (prod) | Diagnostic | RAG over runbooks + historical postmortems | Reasoner -----+--[low confidence]--> Agent 2 (retry, wider window) | (Core) | Chain-of-thought + Pydantic structured output +--------+--------+ | [confidence >= threshold] v +-----------------+ | Agent 4 | Classifies actions by risk (LOW/HIGH) | Remediation | LOW: auto-executable | Planner | HIGH: generates HITLRequest for Slack approval +--------+--------+ | +----+----+ | | v v [HIGH] [LOW / auto] HITL Auto Slack --> execution approval | +--------+ | v +-----------------+ | Agent 5 | Generates structured postmortem | Postmortem | Ingests into ChromaDB <-- Learning loop | Writer | +-----------------+ ``` ### LangGraph 图属性 **持久化状态。** `IncidentState`(类型化的 TypedDict)通过 checkpointing 在每个节点持久化。如果系统在处理事件期间崩溃,它会从中断的地方准确恢复。 **原生循环。** 如果 Diagnostic Reasoner 确定需要更多数据(`requires_more_data=True`),图会自动返回到 Data Collector 并扩大时间窗口。最多重试 2 次以防止无限循环。 **条件边。** 图中有三个显式的决策点:升级或自动解决(分流后)、重新诊断或制定计划(诊断后)、HITL 或执行(规划后)。 **错误恢复。** 专用的 `error` 节点可捕获异常,将其记录到 LangSmith,并防止图进入不一致的状态。 ## 3. 5 个 Agent ### Agent 1 -- 监控与分类 (`agents/monitor_triage.py`) **角色:** 系统入口点。与告警的第一次接触。 **模型:** Groq Llama 3.3 70B -- 选择它是为了低延迟(<500ms),而不是推理能力。 **职责:** 接收来自 Prometheus 或 PagerDuty 的 `IncidentAlert`,对严重程度进行 P1/P2/P3 分类,提取受影响的组件和时间窗口,决定是否升级到全图流程。 **输出:** `IncidentReport` -- 严重程度、受影响组件、升级标志、分类理由。 ### Agent 2 -- 数据收集器 (`agents/data_collector.py`) **角色:** 调查员。并行收集完整上下文。 **模型:** 无 LLM -- 仅直接通过 tool-calling 调用 API。 **职责:** Loki 日志(过去 N 小时)、Prometheus 指标(错误率、p99 延迟、CPU、内存)、GitHub 提交和 PR、Kubernetes pod 状态。 **并行机制:** `asyncio.gather` -- 同时查询所有 4 个来源。当未配置 URL/token 时,所有工具都有自动的 mock 回退机制。 ### Agent 3 -- 诊断推理器 (`agents/diagnostic_reasoner.py`) **角色:** 项目的核心。系统中最为复杂的 agent。 **模型:** Groq Llama 3.3 70B (开发) / Claude Sonnet (生产)。 **职责:** 基于收集到的完整上下文进行推理,查询包含 runbook 和历史复盘报告的 RAG 知识库,生成按概率排序并附带证据的根本原因假设,在置信度较低时设置 `requires_more_data=True`。 **输出:** 包含假设、`overall_confidence`、完整 `reasoning_chain` 的 `DiagnosisResult`。 ### Agent 4 -- 补救规划器 (`agents/remediation_planner.py`) **角色:** 将诊断转化为具体行动。 **模型:** Groq Llama 3.3 70B (开发) / Claude Sonnet (生产)。 **权限矩阵:** - **LOW (可自动执行):** 重启 pod、清理缓存、重载配置、扩缩容副本数 - **HIGH (需要批准):** 回滚部署、删除数据、修改防火墙规则 **输出:** 带有分类操作的 `RemediationPlan` + 用于高风险操作的 `HITLRequest`。 ### Agent 5 -- 总结报告编写器 (`agents/postmortem_writer.py`) **角色:** 闭环。生成复盘报告并反馈到系统中。 **模型:** Groq Llama 3.3 70B (开发) / Claude Sonnet (生产)。 **关键区别:** 将生成的复盘报告导入 ChromaDB,以便未来的诊断能从积累的知识中受益。形成闭环学习。 **输出:** `PostmortemDraft` + 自动导入 RAG 知识库。 ## 4. 技术栈 ### Agent 编排 | 组件 | 技术 | 决策原因 | |---|---|---| | Agent 框架 | LangGraph | 循环状态、checkpointing、条件边 | | 图状态 | Typed TypedDict | 静态类型,兼容 mypy | | Checkpointing (开发环境) | MemorySaver | 内存中,无依赖 | | Checkpointing (生产环境) | SqliteSaver | 跨重启持久化 | ### LLM 模型 | Agent | 模型 (开发) | 模型 (生产) | 标准 | |---|---|---|---| | Agent 1 (Triage) | Groq Llama 3.3 70B | Groq Llama 3.3 70B | 延迟 <500ms | | Agent 3/4/5 | Groq Llama 3.3 70B | Claude Sonnet | 深度推理 | | RAG 上下文化 | Groq Llama 3.3 70B | Claude Haiku | 每个分块的最低成本 | | 全局回退 | GPT-4o | GPT-4o | 弹性与容错 | ### RAG -- 知识库 | 组件 | 技术 | 决策原因 | |---|---|---| | 向量存储 | ChromaDB | 本地持久化,易于设置 | | Embeddings | sentence-transformers (all-MiniLM-L6-v2) | 开源,无单次调用成本 | | Chunking | RecursiveCharacterTextSplitter | 512 tokens,50 重叠 | | 上下文化 | Contextual Retrieval (Anthropic) | 为每个分块增加 50-100 个上下文 token | | 重排序 (Reranking) | Cohere Rerank v3 | 提升检索精度(可选) | ### Schema 与验证 全部使用 **Pydantic v2** 实现 -- 严格验证、原生 JSON Schema、解析错误重试逻辑:`IncidentAlert`、`IncidentReport`、`DiagnosisResult`、`RemediationPlan`、`HITLRequest`、`PostmortemDraft`。 ### 基础设施 | 组件 | 技术 | |---|---| | API 后端 | FastAPI + WebSockets | | 容器化 | Docker + docker-compose | | CI/CD | GitHub Actions | | 可观测性 | LangSmith | | HITL | 带有交互按钮的 Slack bot | ## 5. 架构决策记录 (ADRs) ### ADR-001 -- 选择 LangGraph 而非 crewAI **背景:** 评估了 LangGraph、crewAI 和 AutoGen 作为编排框架。 **决策:** LangGraph。 **原因:** 事件具有复杂的、非线性的状态。如果诊断置信度较低,Diagnostic Reasoner 可能需要返回到 Data Collector。crewAI 针对具有固定角色的线性 pipeline 进行了优化,且原生不支持条件循环。LangGraph 恰好提供了该系统所需的模式:带有类型化状态的循环图、用于故障恢复的 checkpointing,以及用于实现显式、可测试决策逻辑的条件边。 **权衡:** 代码比 crewAI 更冗长,学习曲线也更陡峭。为了换取细粒度的流程控制,这是可接受的。 ### ADR-002 -- 三个基于特定任务标准的模型 **背景:** 可以对所有 agent 使用单个模型。 **决策:** 根据任务类型使用不同的模型。 **原因:** Agent 1 需要低于 500ms 的延迟 -- 搭载 Llama 3.3 70B 的 Groq 响应时间约为 300ms。Agent 3、4 和 5 需要深度推理和可靠的结构化输出 -- 生产环境中使用 Claude Sonnet。对于会生成数百次小规模调用的 RAG 分块上下文化,使用 Claude Haiku。GPT-4o 作为全局回退方案。 **权衡:** 运维复杂度更高(需要多个 API key)。但通过针对每个任务进行的成本-延迟-质量优化得以抵消。 ### ADR-003 -- 选择 Contextual Retrieval 而非传统 RAG **背景:** 最初实现的是传统 RAG(分块 -> embedding -> 检索)。 **决策:** Contextual Retrieval(Anthropic,2024 年 9 月)。 **原因:** 当被切分为 512 token 的分块时,运维 runbook 会失去原有的语义。Contextual Retrieval 在进行 embedding 之前,会为每个分块添加 50-100 个由 LLM 生成的上下文 token。根据 Anthropic 的基准测试,与传统 RAG 相比,这能将检索错误减少多达 67%。 **权衡:** 额外的导入成本(每个文档一次性产生,而非每次检索产生)。但通过提升的诊断精度得以抵消。 ### ADR-004 -- 基于操作风险而非事件严重程度进行 HITL **背景:** 是否对所有事件还是仅对部分事件实施 HITL。 **决策:** 基于操作类型的权限矩阵,独立于事件严重程度。 **原因:** 严重程度描述的是事件的影响。操作风险描述的是修复措施的影响。它们是正交维度。即使是 P1 事件,执行可逆操作(重启 pod)也可安全地自动执行。即使是 P2 事件,破坏性操作(回滚部署)也需要人工批准。 **权衡:** Agent 4 的 LOW/HIGH 分类在极端情况下可能出错。所有决策的不可变审计日志允许识别并纠正这些情况。 ### ADR-005 -- 自定义评估而非 RAGAS **背景:** RAGAS 是 RAG 系统评估的标准框架。 **决策:** 使用 LangSmith 和自定义指标直接针对基准真值进行评估。 **原因:** RAGAS 在 Python 3.11 中与 LangGraph 0.2+ 存在依赖冲突,并且每次评估都会增加 LLM 成本。使用包含 8 个带有真实根本原因的历史事件数据集进行直接评估,比抽象的忠实度指标更具相关性。 ## 6. 评估结果 基于具有真实基准真值(根本原因、严重程度、正确操作)的 **8 个历史事件**进行的评估。模型:Groq Llama 3.3 70B(开发环境)。 | 指标 | 结果 | 生产环境目标 | |---|---|---| | 严重程度准确率 | 62% | >85% | | Top-1 诊断准确率 | 38% | >70% | | Top-3 诊断准确率 | 62% | >90% | | 平均关键词得分 | 23% | >50% | | 平均置信度 | 84% | -- | | HITL 触发率 | 100% | -- | | 复盘报告生成率 | 100% | -- | | 平均诊断尝试次数 | 1.0 | -- | | 诊断时间 (平均) | ~7s | <30s | **分析:** 该系统能够正确诊断在日志和提交中具有明确信号的事件(DB 连接池、N+1 查询、Elasticsearch)。在处理缺乏代码信号的基础设施事件时(SSL 过期、磁盘已满)则显得吃力。开发环境与生产环境之间的差距会随着使用 Claude Sonnet 而缩小,因为后者在处理模糊信号方面具有更好的推理能力。 ## 7. 仓库结构 ``` ai-incident-response/ |-- agents/ # The 5 LangGraph agents | |-- monitor_triage.py # Agent 1: P1/P2/P3 classification with Groq | |-- data_collector.py # Agent 2: parallel collection with asyncio | |-- diagnostic_reasoner.py # Agent 3: RAG + chain-of-thought (core) | |-- remediation_planner.py # Agent 4: remediation plan + HITL trigger | `-- postmortem_writer.py # Agent 5: postmortem + RAG ingestion | |-- graph/ # LangGraph orchestration | |-- state.py # IncidentState -- typed TypedDict | |-- workflow.py # StateGraph + conditional edges | `-- checkpointer.py # MemorySaver (dev) / SqliteSaver (prod) | |-- tools/ # Tool-calling to external APIs | |-- prometheus.py # Historical metrics (service-specific mock) | |-- loki.py # Logs for last N hours (service-specific mock) | |-- github_api.py # Recent commits and PRs (service-specific mock) | |-- kubernetes_api.py # Pod status (with mock) | `-- slack_hitl.py # Slack bot HITL with Approve/Reject buttons | |-- rag/ # RAG pipeline with Contextual Retrieval | |-- ingestion.py # Chunking + contextualization + embedding | |-- retriever.py # Dense search + optional Cohere reranker | |-- chroma_store.py # ChromaDB singleton | `-- seed_runbooks.py # 5 example runbooks for initial ingestion | |-- schemas/ # Pydantic v2 -- typed structured outputs | |-- incident.py # IncidentAlert + IncidentReport | |-- diagnosis.py # DiagnosisResult + RootCauseHypothesis | |-- remediation.py # RemediationPlan + HITLRequest | `-- postmortem.py # PostmortemDraft + to_rag_document() | |-- evals/ # Evaluation with LangSmith + ground truth | |-- datasets/ | | `-- historical_incidents.json # 8 incidents with real root causes | |-- run_evals.py # Evaluation runner | |-- metrics.py # Top-1/3 accuracy, keyword score, severity accuracy | `-- results_latest.json # Latest evaluation results | |-- api/ # FastAPI backend | `-- main.py # REST + WebSocket + /slack/actions callback | |-- frontend/ # React + Vite dashboard | `-- src/App.jsx # Live pipeline log, HITL queue, eval metrics | |-- infra/ # Infrastructure | |-- Dockerfile | `-- docker-compose.yml | |-- .github/workflows/ | `-- ci.yml # Tests + lint + Docker build on each push | |-- docs/ # Architecture Decision Records | |-- ADR-001-langgraph.md | |-- ADR-002-models.md | |-- ADR-003-contextual-retrieval.md | |-- ADR-004-hitl.md | `-- ADR-005-evaluation.md | |-- tests/ # 71 tests -- schemas, routing, tools, HITL, API, integration | |-- test_schemas.py | |-- test_state.py | |-- test_tools_mock.py | |-- test_hitl.py | `-- test_data_collector.py | |-- demo.py # Single-command demo script |-- run_incident.py # End-to-end test script |-- pyproject.toml |-- .env.example `-- README.md ``` ## 8. 环境配置 ### 依赖要求 - Python 3.11+ - Docker Desktop(用于容器化执行) - Node.js 18+(用于前端 dashboard) ### 安装 ``` # 1. 克隆仓库 git clone https://github.com/Dafomu96/ai-incident-response.git cd ai-incident-response # 2. 虚拟环境与依赖 python -m venv .venv source .venv/bin/activate # Windows: .venv\Scripts\activate pip install -e ".[dev]" pip install langchain-text-splitters python-multipart # 3. 环境变量 cp .env.example .env # 编辑 .env -- 最低要求:GROQ_API_KEY # 4. 将 runbooks 导入 ChromaDB python -m rag.seed_runbooks # 5. 运行 demo python demo.py ``` ### 开发环境的最少环境变量 ``` GROQ_API_KEY=gsk_... # Required -- all agents LANGSMITH_API_KEY=lsv2_pt_... # Recommended -- observability LANGCHAIN_TRACING_V2=true LANGCHAIN_ENDPOINT=https://eu.api.smith.langchain.com LANGCHAIN_PROJECT=ai-incident-response SLACK_BOT_TOKEN=xoxb-... # Optional -- real HITL SLACK_HITL_CHANNEL=#incident-approvals ``` ### Docker ### 前端 dashboard ``` cd frontend npm install npm run dev # Dashboard 位于 http://localhost:3000 ``` ## 9. 使用方法 ### 单命令演示 ``` python demo.py ``` 使用一个 P2 事件示例运行完整 pipeline,展示全部 5 个 agent 的执行过程,在适用时向 Slack 发送 HITL,并以带颜色的输出展示结果。 ### 端到端测试 ``` from schemas.incident import IncidentAlert from graph.workflow import compile_graph alert = IncidentAlert( alert_id="inc-001", service="payment-service", metric="http_request_duration_seconds_p99", value=2.34, threshold=0.5, description="P99 latency spike -- possible DB connection pool exhaustion", labels={"env": "production", "region": "eu-west-1"}, ) graph = compile_graph() result = graph.invoke( {"alert": alert, "diagnosis_attempts": 0, "resolved": False, "messages": []}, config={"configurable": {"thread_id": alert.alert_id}}, ) print(result["incident_report"].severity) # P2 print(result["diagnosis"].top_hypothesis.hypothesis) # root cause print(result["diagnosis"].overall_confidence) # 0.90 print(result["remediation_plan"].requires_approval) # HIGH risk actions ``` ### REST API ``` # 触发 incident curl -X POST http://localhost:8000/incident \ -H "Content-Type: application/json" \ -d '{"alert_id": "inc-001", "service": "payment-service", "metric": "error_rate", "value": 0.45, "threshold": 0.05, "description": "Critical error rate spike"}' # 获取 incident 状态 curl http://localhost:8000/incident/inc-001 # 健康检查 curl http://localhost:8000/health ``` ### 评估 ``` # 评估单个 incident python -m evals.run_evals --incident hist-001 # 评估全部 8 个 incident python -m evals.run_evals # 结果保存至 evals/results_latest.json ``` ### 测试 ``` pytest tests/ -v # 71 tests pytest tests/ --cov=. # with coverage ``` ## 10. 可观测性 ### LangSmith 每次图执行都会生成一个完整的 trace,包括每个节点的输入/输出、每个 agent 的 token 使用量、延迟和错误。设置 `LANGCHAIN_TRACING_V2=true` 和 `LANGSMITH_API_KEY` 以启用此功能。 典型的 trace 指标: - 总计:~5.5s,~5.1K tokens - monitor_triage: 0.82s,643 tokens - diagnostic_reasoner: 1.77s,2.3K tokens - remediation_planner: 1.02s,879 tokens - postmortem_writer: 1.51s,1.3K tokens ### HITL -- Slack bot 当 Agent 4 生成 HIGH 风险操作时,bot 会向 `#incident-approvals` 发送: - 操作描述和风险级别 - 带有置信度得分的诊断摘要 - 要执行的确切命令 - **批准** / **拒绝** 按钮 - 10 分钟无响应后自动升级 ## 11. 路线图 ### 第 1 周 -- 核心骨架 [已完成] - [x] 仓库结构和 Pydantic v2 schemas - [x] `IncidentState` TypedDict 和带有条件边的 `StateGraph` - [x] 包含主要逻辑的全部 5 个 agent - [x] 特定于服务的 mock 工具 - [x] RAG pipeline (Contextual Retrieval) - [x] 71 个测试通过 ### 第 2 周 -- 真实集成 [已完成] - [x] 包含 5 个预置 runbook 的 ChromaDB - [x] 使用真实 Groq 进行的端到端测试 - [x] 带有真实 Slack bot 的 HITL -- 批准/拒绝按钮正常工作 - [x] 学习闭环:复盘报告 -> ChromaDB 验证完毕 - [x] 包含 REST 和 WebSocket endpoint 的 FastAPI ### 第 3 周 -- 评估 + CI/CD + Docker [已完成] - [x] 集成 LangSmith -- 每次执行都有完整的 trace - [x] 包含基准真值的 8 个历史事件数据集 - [x] 带有自定义指标的评估运行器 - [x] GitHub Actions CI/CD - [x] Docker 端到端运行成功 ### 第 4 周 -- 前端 + 文档 [已完成] - [x] React + Vite dashboard,带有实时 pipeline 日志 - [x] 支持从 dashboard 进行批准/拒绝的 HITL 队列 - [x] 评估指标标签页 - [x] `/docs/` 中包含 5 个完整的 ADR - [x] 已配置 Railway 部署 ## 项目总结 **致招聘人员:** AI 驱动的事件响应系统,可自动化生产基础设施中断的诊断和修复。5 个专门的 AI agent 协同工作,自动检测、调查、诊断、修复并记录事件。高风险操作在执行前需要通过 Slack bot 获得人工批准。将诊断时间从 40-60 分钟缩短到 10 秒以内。在 8 个真实的历史事件上进行了评估,包含 71 个自动化测试,已使用 Docker 部署。 **致技术面试官:** 5 个 LangGraph agent,具有循环状态和条件边 -- 当置信度较低时,Diagnostic Reasoner 会循环回到 Data Collector。基于内部 runbook 并结合 Contextual Retrieval 的 RAG(检索错误比传统 RAG 减少 67%)。Pydantic v2 结构化输出,LangSmith tracing,带有批准/拒绝按钮的 Slack HITL。在开发环境中使用 Groq 的 Top-3 诊断准确率为 62%;该架构已为在生产环境中使用 Claude Sonnet 做好准备。 ## 作者 **David Font Munoz** -- AI/ML 工程师 [GitHub](https://github.com/Dafomu96) · [GitLab](https://gitlab.com/Dafomu96) · [LinkedIn](https://www.linkedin.com/in/davidfontmunoz/) *第 1-4 周已完成。*
标签:IT事件响应, LangGraph, PyRIT, 多智能体系统, 子域名突变, 自动化运维, 自定义请求头, 请求拦截, 逆向工具