本系列共 6 篇,本文为第 1 篇。
原始链接(含完整代码块、9 节 ASCII 流程图、Giscus 评论、点赞互动):
https://andersthorvald.github.io/projects/sre-ai-agent/build-from-open-source-aiops/
项目仓库:https://github.com/andersthorvald/sre-lab-doctor
本系列在个人站 SRE Wiki 同步更新。
一句话定位
项目代号 SRE Lab Doctor ,仓库 andersthorvald/sre-lab-doctor,tag v0.1.0(2026-07-02),8/8 主功能完成。已开源,Apache 2.0。
把学员的实验问题贴进来,AI 按主机拆分给出排障步骤、修复建议、验证命令和复盘笔记。严格只诊断不执行命令------所有命令由学员手动复制粘贴,避免 v0.1 出安全问题。
为什么做这个
我在做 SRE 课程实验的过程中,反复踩同一批坑:
- 防火墙没放行:服务配完发现 80 端口被拦
- BIND9 配
listen-on { 127.0.0.1; };:slave 当然连不上 master - Docker 容器内
curl 127.0.0.1:是容器自己,不是宿主机 - 自定义 NAT 网段宿主机没路由:ping 都 ping 不通
每次都当场查、查完忘、下次再踩一遍。
把这些坑整理成知识库,让 AI 帮我按「踩过的坑」针对性诊断------这是最初的动机。
顺便选了 fork 自 NightMend(Apache 2.0)的开源 AIOps 平台做底座------账号、权限、审计、夜莺原生告警这些基础设施都现成,省得从零造。
明确不做的:不是通用 ChatGPT 替代品、不会自动 SSH 到学员机器、不会自动改配置文件。走 Diagnosis-only Mode。
架构 + 关键代码
诊断流程:
[学员填 7 字段表单] → 基础清洗 → 知识库匹配(top-2)
↓
Markdown 输出 ← 17 条高危命令检测 ← Markdown 渲染
↑
LLM 调用(MiniMax-M2.7,30--50 秒) ← Prompt 构造
技术栈:NightMend(fork 自上游) + FastAPI + Python 3.11 + React + Ant Design + PostgreSQL + Redis + MiniMax-M2.7 + Docker Compose(5 容器)。
知识库匹配简化版:
python
def match_knowledge(lab_type, error_text):
"""按 lab_type + 关键词给 10 个内置案例打分,取 top-2"""
candidates = [c for c in ALL_CASES if c.lab_type == lab_type]
if error_text:
keywords = extract_keywords(error_text)
for c in candidates:
c.score = sum(1 for kw in keywords if kw in c.tags)
return sorted(candidates, key=lambda x: x.score, reverse=True)[:2]
三个有意思的坑
坑 1:双场景 Prompt 的形式错位
prompt 写死「按 7 节排障模板输出」,学员输「DNS 服务器是什么」这种概念性问题,LLM 强行套模板输出「## 1. 当前现象总结」,内容是维基百科腔的科普文------形式错位。
改成「先判断场景再选模板」:故障场景含「报错 / 失败 / refused / timeout / denied」等关键词走排障模板,其他走知识模板。
本质:prompt 是给模型的合同,合同对不上场景就乱套。
坑 2:Reasoning 思考块 + 三层超时
MiniMax-M2.7 是 reasoning 模型,输出里有 <!-- ... --> 思考块,占最终输出长度的 40%。加 _strip_thinking() 剥离。
复杂 prompt 要 30--50 秒,链路里默认有三个超时,都要动:
| 层 | 默认 | 调到 |
|---|---|---|
| httpx | 45s | 180s |
nginx proxy_read_timeout |
60s | 180s |
| 前端 axios | 15s | 用 aiApi(60s) |
坑 3:17 条高危命令「帮倒忙」
最初想「检测到危险命令直接替换成 [已过滤]」------结果帮倒忙:学员照着敲命令出来发现字段没了、不知道哪步被吃了、LLM 还会换个写法重新塞进去。
改成「只警告不阻挡」:命中后追加「🚨 高危命令警告」块,命令原文保留,学员知情决策。
17 条覆盖:rm -rf /、mkfs、dd if=... of=/dev/sdX、iptables -F、nft flush ruleset、systemctl stop sshd|network|firewalld、chmod -R 777 /、chown -R、curl ... | sh、wget ... | bash、kill -9 1、shutdown、reboot、setenforce 0 等。
v0.1 数据
| 维度 | 数据 |
|---|---|
| v0.1 主功能 | 8 / 8 完成 |
| 回归测试场景 | 5 / 5(100% 通过) |
| 内置知识库案例 | 10 个(Nginx×2 / DNS×2 / iptables×2 / SSH×2 / rsync×1 / Docker×1) |
| 高危命令正则 | 17 条 |
| LLM 平均响应 | 30--50 秒 |
🔴 Diagnosis-only 三条红线:不 SSH、不 systemd、不存凭据。
路线图
v0.2(2--3 周后开搞):LLM 兜底(MiniMax 超时切 DeepSeek)+ 流式响应 SSE + 多轮对话 + 知识库扩 K8s/Prom/Zabbix + 👍/👎 反馈
v0.3:知识库后台 UI + Prompt A/B 测试 + 导出 PDF
v1.0:多租户 SaaS + 与 NightMend 告警联动 + 主动学习
写在最后
最大收获不是「我会做 AI Agent」,是体会到 LLM 产品跟传统软件不一样------prompt 改了全链可能全变、超时没调够体感像挂、安全设计偷懒产品都不可信。
下一篇会讲选型对比------为什么没从零写、为什么选 NightMend、对比过哪几个开源 AIOps 项目。
原文(含完整代码示例、9 节 ASCII 流程图、Diagnosis-only 红色警告块):
👉 https://andersthorvald.github.io/projects/sre-ai-agent/build-from-open-source-aiops/
系列主页(6 篇目录):
https://andersthorvald.github.io/projects/sre-ai-agent/
项目仓库:
https://github.com/andersthorvald/sre-lab-doctor
作者:Thorvald · 2026-07-02 · SRE AI Agent 系列 · 第 1 篇