如果你正准备往大模型方向转,《别急着换赛道:运维经验在 AI 项目里到底值多少?》这类问题别只看热度。更重要的是判断自己该补哪块能力,以及怎么证明你真的会。
摘要
先把这篇文章的目标说清楚:看完之后,你应该能判断这件事值不值得做,以及从哪里动手。
很多运维兄弟最近焦虑,觉得不会写个 Agent 就过时了。我也曾这么想,直到我接手了一个“全自动故障自愈”的内部 Demo。那个 Demo 在 Jupyter Notebook 里跑得像个魔术:日志一报错,LLM 分析原因,自动敲命令重启服务,完美。
结果呢?上线第一天就炸了。不是因为模型笨,而是因为权限没兜底,日志没留痕。一旦 LLM 幻觉出一个不存在的命令rm -rf /data,或者权限配置给了执行组而非只读组,整个集群就没了。
这就是我从运维转大模型工程(AIOps)最大的教训:在大模型应用里,“智能”是锦上添花,“可控”才是入场券。 如果你还抱着“脚本+正则”的思维去搞 Agent,忽略权限隔离和全链路日志,那你不仅无法转型成功,还会成为团队里的风险源。
目录
- 运维能力的迁移:从“确定性”到“概率性”
- 日志分析:让 LLM “读懂” 非结构化混沌
- 告警归因:别只让 LLM 猜,要给它“查表”的工具
- 自动处置 Agent:权限隔离是最高优先级
- 安全与审批:留痕比智能更重要
- 总结
运维能力的迁移:从“确定性”到“概率性”
传统的 SRE 和运维工程师,核心能力是确定性。脚本 A 输入必得输出 B,Crond 任务准时触发,Prometheus 告警阈值严格匹配。我们擅长的是边界清晰、逻辑严密的状态机。
但 LLM 的本质是概率性。它给出的答案永远存在噪声。
当你从“写脚本”转向“调 Agent”时,思维模式必须切换:
1. 不再追求 100% 正确的推理路径,而是追求 100% 安全的执行边界。
2. 不再只关注“是否报错”,而是关注“为什么报错”以及“谁来背锅”。
3. 工具链升级:从 Shell/Python 脚本升级为 Tool Definition + Guardrails(护栏)。
我的团队在重构 AIOps 平台时,最先砍掉的不是 Prompt 优化环节,而是所有“无监督执行”的功能。我们强制要求:所有 Agent 的动作,必须经过“预检-模拟-审批”三道关卡。这听起来很笨,但这正是运维经验的价值所在——对生产环境的敬畏感。
日志分析:让 LLM “读懂” 非结构化混沌
在运维时代,我们习惯用 ELK 或 Loki 检索结构化日志。但在大模型场景下,日志不仅是排查工具,更是 Agent 的“记忆体”。
很多新手写 Agent,直接把最新的 error log 丢给 LLM。这是大错特错。LLM 的上下文窗口有限,且对噪声极度敏感。我们需要做的是日志的向量化预处理和关键事件抽取。
比如,在一个微服务故障场景中,单纯丢出 500MB 的日志文件,模型会崩溃。我们需要先通过传统脚本提取出“时间戳-服务名-异常堆栈”三元组,再进行 Embedding 存入向量数据库。Agent 检索时,只召回 Top-K 最相关的片段。
# 伪代码示例:如何在 Python Agent 框架中集成结构化日志过滤 import logging from datetime import datetime class StructuredLogger: def __init__(self): self.logger = logging.getLogger("AIOps_Agent") # 强制要求输出 JSON 格式,便于后续解析 formatter = logging.Formatter('{"timestamp": "%(asctime)s", "level": "%(levelname)s", "message": "%(message)s"}') def log_error_with_context(self, service_name, error_code, traceback): """ 运维视角的日志增强:不仅记录错误,还记录当前环境状态 """ context_data = { "service": service_name, "cpu_load": get_system_load(), # 注入系统指标 "recent_deployments": get_last_5_versions() # 注入发布历史 } msg = f"Error {error_code} occurred. Context: {context_data}" self.logger.error(msg) return msg这段代码看似简单,但它解决了两个痛点:
1. 上下文丰富度:LLM 不知道CPU Load是多少,手动注入后,它能判断是高负载导致超时还是代码 Bug。
2. 可追溯性:所有的决策依据都被序列化保存,一旦 Agent 误判,你可以回溯当时的“感知数据”。
告警归因:别只让 LLM 猜,要给它“查表”的工具
以前我们做告警收敛,靠的是规则引擎。现在用 Agent,很多团队试图让 LLM 直接根据告警信息推断根因。
千万别这么做。 LLM 不知道你们公司内部哪个微服务依赖哪个中间件,除非你把拓扑图喂给它。
正确的做法是构建一个 RAG(检索增强生成)式的知识库查询接口。
1. 静态知识:将服务拓扑图、SLA 定义、历史故障手册转化为文档 chunk。
2. 动态知识:实时查询 Metrics API(如 Prometheus Query)。
3. 归因逻辑:LLM 不直接回答“为什么挂了”,而是回答“根据拓扑图,A 服务依赖 B 和 C,当前 B 服务 CPU 飙升,C 服务响应正常,建议优先排查 B”。
这种“推理辅助”而非“直接决策”的模式,才符合运维专家的工作流。你是在利用 LLM 做信息聚合,而不是让它替你做决定。
自动处置 Agent:权限隔离是最高优先级
这是我最想强调的部分。在 Demo 阶段,你可能直接让 Agent 调用kubectl delete pod来测试效果。但在生产环境,这是自杀行为。
运维转大模型,最大的护城河就是权限管理(RBAC/ABAC)。
我们需要设计一个 Policy Engine(策略引擎) 放在 Agent 和执行器之间。Agent 生成意图,策略引擎检查意图是否符合安全规范。
例如,定义一条规则:“只有 Senior On-Call 人员审批过的请求,才能执行数据库写操作”或“禁止在非维护窗口期执行重启操作”。
# 简单的策略配置示例 (YAML) policies: - id: prevent_production_restart_during_peak condition: time_range: "09:00-21:00" environment: "production" action: "restart_service" effect: "DENY" - id: require_approval_for_db_write condition: action: "execute_sql" requirement: "human_approval_token" effect: "ALLOW_IF_APPROVED"Agent 的代码逻辑应该是这样的:
1. LLM 生成初步修复方案(如:重启 Nginx)。
2. 方案被提交给 Policy Engine。
3. Policy Engine 返回APPROVED,DENIED, 或NEED_APPROVAL。
4. 如果需要人工审批,Agent 发送 IM 通知给值班人员,等待 Token 回调。
这样,即便 LLM 产生幻觉,乱生成高危命令,也被拦截在了执行层之外。这才是运维工程师的价值:用工程化的手段框定 AI 的自由度。
安全与审批:留痕比智能更重要
最后,谈谈可观测性中的“审计”环节。
在旧运维体系中,操作日志是写给“事后追责”用的。在大模型体系中,操作日志是写给“模型迭代”用的。
你需要记录:
- Input: 用户的问题或告警原文。
- Thought Chain: LLM 的思考过程(如果开启了 CoT)。
- Action Plan: 最终生成的命令或 API 调用参数。
- Result: 执行后的返回值。
- Feedback: 人类是否纠正了 Agent 的行为?
这些数据构成了你未来微调模型(Fine-tuning)的黄金数据集。很多转行的大模型工程师忽视这一点,导致模型越用越歪,因为没有反馈闭环。
记住,没有日志和审批流程的 Agent,只是一个昂贵的聊天机器人,而不是运维工具。
总结
从运维转大模型,不要急着去学复杂的 LangGraph 状态机,也不要沉迷于 Prompt 的修辞技巧。回归本质,看看你能否用运维的严谨,去约束 AI 的发散。
1. 心态转变:从追求“自动化”转向追求“可信自动化”。
2. 技能迁移:将你对系统架构的理解,转化为 LLM 的知识库和工具定义。
3. 核心壁垒:搭建好权限网关、日志审计和策略引擎。这些脏活累活,传统开发者不愿做,但这是生产环境稳定的基石。
当你能向面试官展示:“我设计的 Agent 系统在一年内零误操作,且通过日志回溯提升了 30% 的故障定位速度”时,你就真正完成了转型。别只看光鲜的 ChatBot 界面,去看看那些隐藏在后台的日志流和权限锁,那才是 AIOps 的真实战场。
资料展示
下面是我整理的AI大模型学习资料和工具包预览,适合收藏后按主题逐步学习。
如果你想看完整资料目录,可以在评论区留言「资料」;也欢迎告诉我你更关注AI大模型里的哪类内容。