运维转大模型:Agent 上线后,权限和日志比调 API 更难

📅 2026/8/5 22:36:55
运维转大模型:Agent 上线后,权限和日志比调 API 更难
聊《运维转大模型实战第一道门槛可能不是算法》之前先说一句实在的别急着背概念先看它在真实项目里到底解决什么问题。摘要 从自动化脚本到 AIOps Agent运维工程师最容易犯的错误是以为搞定 LLM API 调用就万事大吉。真实生产环境里卡住项目的从来不是模型推理而是权限边界和可观测性。本文复盘一次内部 AIOps Agent 从 Demo 到上线的完整过程重点讲权限、日志和审批机制的设计取舍。目录一、运维能力的迁移从脚本思维到 Agent 思维二、日志分析LLM 不是万能的但比脚本聪明三、告警归因从规则匹配到因果推理四、自动处置 Agent工具调用的边界在哪里五、安全与审批Demo 到生产最大的坑六、总结运维转大模型的真正门槛---一、运维能力的迁移从脚本思维到 Agent 思维半年前我们团队接到一个需求把现有的告警处理流程升级成智能化的 AIOps Agent。业务方原话是现在告警太多了人工处理不过来能不能让 AI 帮我们自动归类、归因、处置。说实话这个需求听起来简单做起来才发现坑比想象中多很多。我们团队之前做过不少自动化工具Zabbix 告警规则、Ansible 批量执行、各种 Python 脚本。这些工具的共同特点是确定性输入确定性输出。你写好了规则跑起来就不会变。但 LLM 不一样它是概率性的同一个输入可能给出不同的输出而且你很难精确控制它的行为边界。运维工程师转做大模型应用最大的优势是对系统架构的理解和对故障的敏感度。你知道什么情况下服务会挂、什么指标异常意味着什么、哪些日志是关键线索。这些经验可以直接迁移到 Agent 的 prompt 设计和工具链设计中。但最大的挑战在于你需要从写规则变成写边界。以前你告诉脚本如果 CPU 超过 90%执行重启现在你要告诉 Agent监控 CPU 指标当异常时分析可能原因必要时建议处置方案。这个转变说起来简单实际工程中涉及大量的边界条件处理。我见过很多运维同事转大模型项目时第一步就犯了一个错误把所有逻辑都塞进 prompt 里指望模型自己理解。结果就是输出不稳定今天能跑通明天就翻车。正确的思路是让模型做它擅长的推理、分类、总结让工具做它擅长的精确执行、边界控制。---二、日志分析LLM 不是万能的但比脚本聪明日志分析是 AIOps Agent 的第一个落地场景。我们最初的想法很简单把告警相关的日志喂给模型让它分析原因。但第一个问题就来了日志量太大直接塞进去成本扛不住。我们做过一个对比实验。同一个告警场景服务响应时间异常涉及三个微服务的日志。我们分别测试了三种方案方案一原始日志全量输入日志量约 50MB200 万行LLM 输入 token约 80 万成本单次分析约 0.15 元效果模型能给出大致方向但关键信息被淹没经常遗漏真正的问题点方案二规则预处理 LLM 分析先用脚本过滤出关键日志错误码、异常堆栈、关键时间戳日志量缩减到 2MB 左右LLM 输入 token约 3 万成本单次分析约 0.005 元效果分析质量明显提升但预处理规则维护成本高新场景需要重新写过滤逻辑方案三分层摘要 LLM 综合分析先按服务维度做局部摘要每个服务输出一段关键信息再用 LLM 做跨服务关联分析LLM 输入 token约 5000成本单次分析约 0.001 元效果分析质量最好且成本最低但需要设计合理的摘要模板我们最终选择了方案三核心原因是可维护性。运维团队的日志格式经常变规则预处理的方式需要跟着变而摘要模板相对稳定。而且分层架构天然支持扩展——新增服务只需要加一个摘要模块不用改核心分析逻辑。代码层面我们实现了一个简单的日志摘要器import re from typing import List, Dict import tiktoken class LogSummarizer: 日志摘要器按服务维度提取关键信息 def __init__(self, model_name: str gpt-4): self.encoder tiktoken.encoding_for_model(model_name) # 关键日志模式匹配 self.patterns { error: re.compile(rERROR|FATAL|Exception|Traceback, re.IGNORECASE), timeout: re.compile(rtimeout|timed out|deadline, re.IGNORECASE), connection: re.compile(rconnection refused|reset|lost, re.IGNORECASE), resource: re.compile(rOOM|out of memory|disk full, re.IGNORECASE), } def extract_key_lines(self, log_content: str, max_lines: int 100) - List[str]: 提取关键日志行 lines log_content.strip().split(\n) key_lines [] for line in lines: if len(key_lines) max_lines: break # 优先匹配错误模式 for pattern in self.patterns.values(): if pattern.search(line): key_lines.append(line) break # 没有匹配时按顺序补充 if len(key_lines) max_lines and len(key_lines) len(lines): key_lines.append(line) return key_lines def summarize_service_log(self, service_name: str, log_content: str) - str: 生成单个服务的日志摘要 key_lines self.extract_key_lines(log_content) token_count len(self.encoder.encode(\n.join(key_lines))) # 如果 token 数过多进一步截断 if token_count 2000: key_lines key_lines[:50] summary f【{service_name}】关键日志片段共 {len(key_lines)} 行:\n summary \n.join(key_lines) return summary def build_analysis_prompt(self, service_summaries: Dict[str, str]) - str: 构建综合分析 prompt prompt 以下是多个服务的日志摘要请分析可能的根因\n\n for service, summary in service_summaries.items(): prompt f{summary}\n\n prompt 请按照以下格式输出分析结果 1. 最可能的根因一句话 2. 关键证据列出 2-3 条 3. 建议的排查方向 4. 置信度高/中/低 return prompt这段代码看起来简单但背后有几个关键设计决策1. Token 预算控制每个服务的摘要限制在 2000 token 以内防止某个服务的异常日志撑爆上下文。2. 优先级匹配错误模式优先于普通日志确保关键信息不被淹没。3. 分层架构摘要层和分析层分离方便后续替换不同的 LLM 或调整摘要策略。实际跑起来后我们发现在日志格式不规范的场景下这个摘要器的效果会明显下降。有些服务的日志没有标准格式甚至混入了大量调试信息。这时候需要加一个日志清洗层或者针对特定服务写专门的解析规则。这是运维经验能直接发挥价值的地方——你熟悉各个服务的日志特点知道哪些是噪音、哪些是关键信息。---三、告警归因从规则匹配到因果推理告警归因是 AIOps 的核心价值所在。传统做法是基于规则CPU 高→检查进程磁盘满→清理日志内存溢出→扩容。这些规则在稳定环境下效果不错但一旦涉及多服务关联、复杂依赖场景规则就管不过来了。LLM 的优势在于能做因果推理。它不依赖于你预设的规则而是根据日志、指标、拓扑关系来推断可能的原因链。但我们很快发现一个问题模型有时候会过度推理。有一次一个数据库连接池耗尽的告警模型给出来的分析是可能是上游服务 A 的某个定时任务导致连接泄漏建议检查服务 A 的代码。听起来很有道理但实际排查后发现真正的原因是数据库本身有一个慢查询锁住了连接池。模型的推理方向没错但具体归因偏了。这个案例让我们意识到LLM 做归因需要约束条件1. 拓扑约束只分析有实际依赖关系的上下游不能凭空联想2. 指标约束归因结论必须有对应的指标异常支撑3. 时间约束异常发生时间必须在告警时间窗口内我们在 prompt 中加入了这些约束同时引入了验证机制模型给出归因建议后系统会自动检查是否有对应的指标异常来支撑这个结论。如果没有会降低该结论的置信度。def validate_attribution(attribution: Dict, metrics_data: Dict) - Dict: 验证归因建议是否有指标支撑 validated attribution.copy() evidence_list [] for claim in attribution.get(key_evidence, []): metric_name claim.get(metric) service claim.get(service) # 检查对应指标是否存在异常 if service in metrics_data and metric_name in metrics_data[service]: metric_values metrics_data[service][metric_name] # 简单判断最近 5 个时间点是否有异常 recent_values metric_values[-5:] if len(metric_values) 5 else metric_values is_anomaly any(v metric_values[0] * 1.5 for v in recent_values) if recent_values else False else: is_anomaly False if is_anomaly: evidence_list.append(claim) else: # 没有指标支撑降低置信度 validated[confidence] 低 validated[key_evidence] evidence_list return validated这个验证逻辑很轻量但效果很明显。加了验证之后模型的归因准确率从约 60% 提升到了 85% 左右。更重要的是验证失败的情况会被记录到日志中这些失败案例反过来帮助优化 prompt 和约束条件。---四、自动处置 Agent工具调用的边界在哪里自动处置是 AIOps Agent 最有价值的场景也是最危险的场景。我们最初设计了一个简单的处置流程告警触发→分析原因→调用处置工具→执行操作→验证结果。听起来很顺畅但实际跑起来问题一大堆。第一个问题是工具调用的安全性。我们接入了 Ansible 做批量执行接入了 K8s API 做扩缩容接入了自定义脚本做配置修改。这些工具本身都有风险如果 Agent 调用错了参数可能造成大面积故障。第二个问题是处置结果的验证。Agent 执行完操作后如何确认问题真的解决了我们最初的做法是让模型自己判断但模型经常误判——有时候告警是因为监控阈值设得太低模型认为处置成功但实际服务并没有变好。第三个问题是处置策略的可逆性。有些操作是不可逆的比如删除日志、终止进程。如果 Agent 判断错误后果很严重。我们的解决方案是分级处置策略| 级别 | 操作类型 | 审批要求 | 验证方式 ||------|----------|----------|----------|| L1 | 查询类查看日志、获取指标 | 无需审批 | 自动验证 || L2 | 低风险操作重启服务、清理临时文件 | 自动审批 | 执行后自动验证 || L3 | 中风险操作修改配置、扩缩容 | 人工确认 | 执行后人工复核 || L4 | 高风险操作删除数据、重启集群 | 双人审批 | 执行后人工复核 回滚预案 |代码层面我们实现了一个简单的权限检查器from enum import Enum from typing import Optional class RiskLevel(Enum): L1_QUERY L1 L2_LOW_RISK L2 L3_MEDIUM_RISK L3 L4_HIGH_RISK L4 class ActionPermission: 操作权限检查 RISK_MAP { log_query: RiskLevel.L1_QUERY, metric_query: RiskLevel.L1_QUERY, service_restart: RiskLevel.L2_LOW_RISK, temp_file_clean: RiskLevel.L2_LOW_RISK, config_modify: RiskLevel.L3_MEDIUM_RISK, scale_up: RiskLevel.L3_MEDIUM_RISK, scale_down: RiskLevel.L3_MEDIUM_RISK, data_delete: RiskLevel.L4_HIGH_RISK, cluster_restart: RiskLevel.L4_HIGH_RISK, } classmethod def check(cls, action: str, user: str, context: Dict) - tuple[RiskLevel, str]: 检查操作权限返回 (风险级别, 审批状态) risk_level cls.RISK_MAP.get(action, RiskLevel.L4_HIGH_RISK) if risk_level RiskLevel.L1_QUERY: return risk_level, auto_approved elif risk_level RiskLevel.L2_LOW_RISK: return risk_level, auto_approved elif risk_level RiskLevel.L3_MEDIUM_RISK: # 中风险需要人工确认 return risk_level, needs_human_approval else: # 高风险需要双人审批 return risk_level, needs_double_approval这个设计的关键在于把权限检查从模型逻辑中剥离出来。模型只负责生成操作建议权限检查由独立的组件执行。这样即使模型被骗了也不会执行危险操作。实际运行中我们发现 L2 级别的自动审批比较可靠L3 级别的人工确认流程也还算顺畅。但 L4 级别的操作我们最终没有完全交给 Agent而是保留了Agent 建议 人工执行的模式。这是出于安全考虑也是因为我们团队对高风险操作的容错率很低。---五、安全与审批Demo 到生产最大的坑这是本文最想强调的部分。很多运维同事转做大模型项目时会把精力集中在模型调用、prompt 优化、工具链集成上。但 Demo 跑通之后真正卡住上线的是权限管理和审计日志。我们当时就吃了这个亏。第一个版本的 Agent 在测试环境跑得很好但一上生产就出问题1. 权限过大Agent 的 API Key 权限设得太宽理论上可以执行所有操作。虽然我们有分级审批但测试环境的权限配置直接复制到了生产环境。2. 审计缺失Agent 执行了哪些操作、调用了哪些工具、输入输出是什么没有完整的日志记录。出问题后根本查不清楚。3. 审批流程形同虚设L3、L4 级别的操作需要人工审批但审批流程是通过企业微信消息触发的很多人没及时看到或者看到了直接点同意没有认真核对。这些问题看似是流程问题但实际上是工程化能力的欠缺。运维团队擅长写代码、配规则但往往不擅长设计权限模型和审计机制。这些都是大模型应用上线前必须补齐的能力。我们后来的改进措施权限最小化给 Agent 单独的 API Key只开放必要的服务权限。每个操作类型都有独立的权限控制不能因为一个权限开了其他权限也跟着开。完整审计日志记录每次 Agent 调用的完整上下文包括输入、输出、执行的 tool、审批记录、执行结果。日志保留 180 天方便事后追溯。审批流程固化把审批流程从企业微信消息改为独立的审批系统审批人必须填写审批意见审批记录不可篡改。import json import logging from datetime import datetime from typing import Any, Dict, Optional # 配置审计日志 audit_logger logging.getLogger(agent_audit) audit_handler logging.FileHandler(agent_audit.log) audit_handler.setFormatter(logging.Formatter( %(asctime)s | %(levelname)s | %(message)s )) audit_logger.addHandler(audit_handler) audit_logger.setLevel(logging.INFO) class AuditRecorder: Agent 操作审计记录器 def __init__(self, agent_id: str): self.agent_id agent_id def record(self, action: str, input_data: Any, output_data: Any, risk_level: str, approval_status: str, user: str): 记录一次 Agent 操作 log_entry { timestamp: datetime.utcnow().isoformat(), agent_id: self.agent_id, action: action, input: self._sanitize(input_data), output: self._sanitize(output_data), risk_level: risk_level, approval_status: approval_status, user: user, } audit_logger.info(json.dumps(log_entry, ensure_asciiFalse)) def _sanitize(self, data: Any) - Any: 脱敏处理移除密码、token 等敏感信息 if isinstance(data, str): # 简单脱敏替换常见敏感字段 for pattern in [password, token, secret, key]: data re.sub( rf({pattern}\s*:\s*)[^], r\1[REDACTED], data, flagsre.IGNORECASE ) return data审计日志看似是额外工作但实际上是生产环境的刚需。没有审计日志出了问题是查不清楚的没有权限控制Agent 可以做出不可逆的操作。这两样东西比模型调用本身重要得多。---六、总结运维转大模型的真正门槛回顾这次 AIOps Agent 的完整实践我有一个比较明确的判断运维转大模型第一道门槛不是算法而是工程化能力。具体来说以下几个能力是决定项目能否上线的关键1. 权限设计能力知道什么操作可以给 Agent什么操作必须人工审批什么操作根本不能给 Agent。这需要你对系统架构有深入理解知道哪些是高风险操作。2. 日志和可观测性设计Agent 的每一次调用、每一个决策、每一次工具执行都需要有完整的记录。这不只是审计需求也是问题排查的基础。3. 边界控制能力知道 LLM 的边界在哪里哪些事情应该让模型做哪些事情必须用传统方式做。不要把模型当成万能工具也不要因为模型有缺陷就全盘否定。4. 灰度和回滚能力Agent 的决策可能出错必须有灰度发布机制和快速回滚能力。我们当时的做法是先让 Agent 只输出建议不自动执行确认稳定后再逐步放开自动处置的权限。对于想从运维转大模型的同事我的建议是先从一个小的、低风险的场景切入比如日志摘要、告警分类不要一上来就做自动处置。重视权限和审计设计这是 Demo 和生产环境的最大差距。利用你的运维优势对系统架构和故障模式的理解是别人没有的。保持工程化思维不要因为用了 LLM 就放弃测试、监控、灰度这些基本功。大模型不是银弹但它确实能提升运维自动化的上限。关键在于怎么用以及在哪里设限。---写在最后这次实践让我们团队对 AIOps Agent 有了比较清晰的认识。Demo 跑通很容易但上线需要补齐的能力很多。如果你也在考虑从运维转向大模型应用开发建议先从权限设计和审计日志入手这两样东西做好了项目才能真的跑起来。总结本文完成了关键概念、工程实践和落地建议的梳理。资料展示下面是我整理的AI大模型学习资料和工具包预览适合收藏后按主题逐步学习。如果你想看完整资料目录可以在评论区留言「资料」也欢迎告诉我你更关注AI大模型里的哪类内容。