文章

让 AI 接手系统运维

将散乱业务资料、源码、DDL 与运维经验沉淀为一套可路由、可执行、可验证的 AI Agent 运维能力包,让 Agent 能按固定链路排障、查数并给出可追溯结论。

让 AI 接手系统运维

本文的其他标题:《让 Agent 接手系统运维》《EVT-HIS-ops:从想法到实战》《让 AI 接手业务运维:EVT-HIS-ops 从想法到实战》

摘要:本文记录了一套面向真实业务系统的 AI Agent 运维能力包的完整构建过程。通过将散乱的历史文档、源码、DDL 和运维经验,组织成路由分发、SOP 流程、受控工具、证据等级和安全护栏协同工作的结构化环境,让 AI Agent 能够按固定链路排查故障、查询数据、给出可追溯的结论,而不是泛泛地解释概念。文章覆盖了从资料治理到架构设计、从三次关键演进到实战验证的完整路径,并提炼了一套可供复刻的方法论。核心结论是:对可总结、可复用、可验证的重复性运维工作,个人经验可以通过持续引导 AI,沉淀为一套可被 Agent 稳定加载和执行的业务支持系统。

引言

离职前,我得把手里几套业务系统交接出去。这套系统有近十年历史,二十多个服务,文档散落在 doc、ppt、xlsx 里,格式七八种,其中甚至还有一些互相矛盾的地方。按惯例,我得写交接文档、跟同事逐服务走一遍流程、回答他们踩坑后陆续抛过来的问题——这个周期拉得很长,还很难保证面面俱到。

后来我冒出一个想法:交接给同事和交接给 AI,要做的事情其实差不多——都得把业务背景讲清楚、把操作流程写明白、把能力边界和安全红线划出来。那我为什么不直接交给 AI?带着这个念头,我用 Cursor、Claude Code、Codex、Gemini 几个工具,花了几周时间,把自己脑子里的那些业务经验整理成了一套 AI Agent 可以直接加载使用的运维能力包。反复迭代几轮之后,我把它交给同事们试用。他们的反馈很好:Agent 加载这个包之后,能按固定流程排查 bug、查询真实数据、给出有据可查的结论;在已经覆盖的场景中,也比直接使用通用 Agent 更少出现无依据推断和越界操作。

同事们受震撼之余,也开始思考更远的问题:自己手上那些重复性的业务支持,是不是也可以做成这样的包?能不能搭一个更通用、更持久化的 Agent 平台?AI 还能从什么角度参与日常工作?这篇文章,就是对这些问题的一份工程级回答。我会从资料治理、架构设计、三次关键演进、实战验证、方法论提炼一直写到可执行的复刻指南,尽可能还原每一个决策背后的考虑。某种意义上说,我用 AI 把自己的一部分工作接走了——如果你手上也有那些可以总结、可以复用、可以验证的重复性工作,或许这篇文章能让你少走一些弯路。

一、项目概述

EVT-HIS-ops 是一个可被 AI Agent 直接加载的 EVT/HIS 运维能力包,将分散的业务知识、SOP、动态工具和安全护栏整合为结构化的 Agent 工作环境。

目标 是帮助用户完成:EVT、HIS 等系统的查询理解、诊断排障、操作指南、变更建议、源码分析、服务编译、接口调用、脚本运行、包本身的迭代等内容。

设计核心思路 是:把分散在业务知识、源码、DDL、SOP、运维经验里的信息,组织成 AI Agent 可以直接按规则使用的结构化工作环境,高效快捷帮助用户完成需求。

EVT-HIS-ops 当前更准确的定位,是一套面向特定业务域的 Agent 运维能力包,而不是通用运维平台。它重点解决知识检索、排查流程、只读查询和变更建议问题;生产写操作仍由人工审核和执行。

设计原则:

  • 证据等级驱动。 Agent 的结论必须标注来源等级:源码确认 > DDL 确认 > 工具查询确认 > 知识文档推断 > 待运维确认。工具失败时降级证据,不允许把推断写成线上事实。
  • 就近路由,按需加载。 不把全部文档塞进上下文。Agent 先判断问题类型,再进入对应模块,减少噪音、提高命中率。
  • 静态知识与动态工具分离。 knowledge/ 存静态理解,tools/ 管动态查询,两者之间有明确的契约边界。Agent 不能跨越工具层直接访问线上环境。
  • 只读护栏,变更输出方案。 所有写操作由人工执行。Agent 的完整输出格式是:目标 + 具体命令/SQL + 风险评估 + 验证步骤 + 回退方案。
  • 单源权威。 表结构以拆分 DDL 为准,业务知识与源码冲突时以源码为准,配置信息以外网为准,内网信息仅做对照或降级时使用。在信息分散、经验口口相传的运维场景里,每条信息都有明确的权威锚点。
  • 不为概念牺牲实效。 对外叫 Skill 是为了降低加载成本,内部不按任何外部概念定义约束自己。后续演进只服务一个目标:更可靠、更安全、更高效地协助 EVT/HIS 的真实业务工作。

二、项目架构

EVT-HIS-ops 是一套 面向真实业务问题的 Agent 工作结构。在实际建设过程中,它参考了分层、路由、工具适配、契约约束和降级处理等软件设计思路,用来划分知识、流程、工具和安全检查的职责。这里使用这些概念是为了说明结构,并不意味着它已经是一个通用的 Agent 运维平台。

它要解决的核心问题是:用户提出一个 EVT/HIS 相关问题后,Agent 如何知道自己该从哪里开始、该读哪些资料、该调用哪些工具、该如何判断证据是否足够,以及在答案不确定时如何停下来。

2.1 总体架构图

用户提出问题后,Agent 先通过入口层确定工作边界,再由路由层选择最近处理入口,随后调用静态知识库、SOP 和工具层完成回答、诊断或操作建议,最后由证据、安全和反馈迭代机制保证结论可信、过程可控、能力可持续维护。

2026-06-10_EVT-HIS-ops_总体架构关系图

2.2 入口层

入口层由 AP_MANIFEST.mdAGENT.md 和环境检查三部分组成。

AP_MANIFEST.md 是整个包的 一级入口,是让新来的 Agent 读取的第一个文件,Agent 会通过这个文件的内容建立对这个包的基本认识,以及后续的路由。

AGENT.md行为规则。它定义 Agent 的角色、服务范围、证据等级、安全红线和回答边界。

换句话说,对一个新来的 Agent,AP_MANIFEST.md 负责告诉他 “接下来干啥”,AGENT.md 负责告诉他 “接下来的你的角色”。

环境检查 是一个额外的工作,负责确认当前机器的环境,是否具备必要路径、依赖和工具条件。这样做的意义是防止 Agent 直接假设环境可用,结果在实际查询或编译时才失败,既浪费 token,又可能给出错误的结论。

2.3 路由层

路由层要解决的问题很具体:用户提出问题后,Agent 该先去哪里

这个包里沉淀了历史知识、源码索引、DDL、SOP、工具、测试和维护规则,没有路由的话,Agent 只能在各类文档里盲目搜索,既浪费上下文,也容易把概念解释、字段定义、工具结果和业务流程混在一起。

所以路由层不直接回答问题,只做一件事:先判断问题类型,再把 Agent 导向离答案最近的入口。

0. 就近原则

路由层的核心策略是就近原则:先去最可能产生答案的位置,而不是一上来读取所有资料。

比如用户问字段含义,就先查 DDL;用户问业务机制,就先查知识库;用户问 “怎么排查”,就先进入 SOP;用户问某个 ID 当前线上状态,就先看工具层有没有受控查询能力。

这样做的目的有两个。第一,减少无效上下文,Agent 不需要把所有相关文件都读一遍。第二,降低误判概率,字段问题不会被扩大成故障排查,概念问题也不会被误处理成工具查询。

1. 一级路由:判方向

一级路由只做 大类判断,把用户问题归入六个方向之一,不展开细节:

问题类型 去向
故障排查、操作变更 SOP 方向
概念、架构、服务机制 知识库方向
表结构、字段含义 DDL 方向
动态数据查询、工具能力查询 工具层方向
包本身维护 维护规则方向
多事实、多链路问题 并行事实收集方向

2. 二级路由:找入口

一级路由确定了方向(比如 “进 SOP 方向”),但方向本身不是终点,sops/ 目录下有十几份 SOP,Agent 需要知道具体读哪一份。

二级路由做的就是这件事:在方向内部找到离问题 最近 的入口文件

用户问题类型 二级入口 解决的问题
故障排查、操作变更 sops/ROUTE_QUICK.md 判断应该走哪个 SOP
概念解释、架构设计、服务机制、协议说明 knowledge/biz/ROUTE_QUICK.md 判断应该读哪类业务知识
表结构、DDL、字段含义查询 knowledge/tables/_INDEX.md 定位具体表结构和字段定义
API、工具能力、IP 查询、规则查询 tools/index.md 判断应该调用哪个受控工具
维护这个包本身 MAINTAINING.md 判断修改时应该同步哪些文件
多 ID 关联分析、跨服务排查、多事实确认 workflows/parallel-fact-collection.md 拆分多个事实面并行确认

3. 路由未命中

路由层不是为了让 Agent 什么都能答,而是让 Agent 知道 什么时候该继续查,什么时候该停下来

一级、二级路由都没有命中,说明这个问题暂时不在包的稳定覆盖范围内。此时 Agent 应该说明当前没有明确入口,只给出可验证的候选方向,必要时向用户补充确认信息。

如果问题涉及多个 ID、多个服务或多条事实链,不应该强行塞进一个入口,而应该拆成多个事实面分别确认,再汇总判断。

核心规则:

  • 能命中,就按最近入口处理。
  • 不能命中,就承认边界。
  • 问题复杂,就拆开取证。

4. 一个例子

比如用户问:“xxx 表的字段 aaa 是什么意思?”

路由层会先判断:这不是故障排查,也不是线上数据查询,而是字段含义问题。

所以它会进入 DDL 入口,先查 xxx 这张表的结构定义,确认 aaa 的字段类型、字段注释和它在表中的位置。

如果字段含义还需要业务背景,再补充读取静态知识库;但它不会一开始就进入 SOP,也不会直接调用工具查线上数据。

只有当用户继续问 “某条数据为什么没有按这个时间过期” 时,问题才会从字段解释升级为真实排查,再进入工具、日志或 SOP 链路。

这个链条的价值在于:先判断问题本质,再决定处理链路,避免把一个简单字段问题扩大成无关的复杂排查。

2.4 静态知识库

静态知识库层是这个包的 认知底座。它不是单一类型的文档,而是把几类稳定事实放在一起,让 Agent 在回答问题前先建立对系统的基本认识。

静态知识库的内容分为三大类:

  • 知识文档:包含系统背景、业务机制等信息。
  • DDL 信息:包含 EVT/HIS 两个系统用到的所有表结构、字段信息。
  • 源码索引和源码本身:提供服务源码的常用信息,及源码的索引,以支持快速准确定位。

线上事实不归静态知识库管,需回到工具或日志去查。比如某个用户的某个积分值的问题,这就超出静态知识库的范围了。

另外有一条原则横跨这三条线:不要把设计文档、规划文档、代码注释直接当成已经发生的事实。它们只能说明”设计上如何”、”曾经计划过”、”代码里写了什么注释”,不能替代线上的真实状态。

下面按三大类依次展开。

1. 历史文档知识库

第一类内容是从上百篇历史文档中总结出来的 系统知识库

EVT/HIS 有多年的发展历史,资料格式从 doc、pdf、ppt 到 xlsx、md、sql,覆盖多个服务。

这部分帮助 AI 理解系统背景:服务是怎么拆出来的、上下游关系怎么演化的、哪些概念是历史遗留下来的、哪些旧方案已经废弃。它解决的是 “这个系统是什么”、”为什么发展成现在这样”、”某个服务在整体链路里承担什么角色”。

2. MySQL 的 DDL

第二类是拆分后的 DDL,也就是 数据库表结构

DDL 是理解用户问题、接口返回、配置含义和数据流转的刚需。很多业务问题表面上是在问 “为什么没生效”、“为什么查不到”、“这个字段是什么意思”,本质上都绕不开表结构、字段类型、字段注释、主键索引和数据生命周期。

DDL 按表拆成了独立的 SQL 文件,集中在 knowledge/MySQL_INFO/tables/ 目录下,每张表一个文件,通过 _INDEX.md 按表名或字段名快速定位,每文件 30~170 行,远小于原始全库脚本的上千行。用 DDL 回答字段问题时,Agent 能确认的是字段设计含义和约束条件,不是该字段在线上某条数据里的实际值。

比如运维人员问:“xxx 表中的字段 aaa 是什么意思”,Agent 会进 _INDEX.md 命中 xxx.sql,读到 aaa 的类型、注释和它与其它字段的配合关系。如果用户继续追问 “那为什么某条数据的过期时间不对”,问题就升级为线上排查,需要进入工具层或查日志,这就是 DDL 的边界。

3. 源码萃取与索引

第三类是 源码索引和源码分析文档

历史文档能解释 “曾经如何设计”,DDL 能解释 “数据怎么组织”,但当前代码实际怎么运行,只能靠源码确认。

源码索引把每个服务的关键文件、关键函数、入口协议、出口协议、数据写入点、任务执行链路提前梳理出来。普通问题可以直接依据源码分析文档回答,复杂问题则可以根据索引快速定位到源码位置继续追。这是 Agent 在源码级问题上表现稳定的原因:它不是临时在代码海里乱翻,而是先通过索引找到方向,再按需深入。

4. LLM wiki

这套静态知识库搭完之后,我才知道现在有一个概念叫 “LLM wiki”,一个专门给大语言模型使用的 wiki,追求结构清晰、入口明确、概念不歧义、事实可追溯、拆分粒度适合上下文窗口,和给人看的 wiki 在侧重点上不同。

回头看,这套静态知识库,就是把历史文档、DDL 和源码索引整理成 AI 更容易检索和复用的结构,本质上就是一个面向 EVT/HIS 领域的 LLM wiki。

2.5 SOP:固定运维流程

1. SOP 定义

SOP 是为了告诉 Agent:面对真实问题,你应该先做什么、再做什么、怎么做、查什么、不能跳过什么、证据不够时应该停在哪里

SOP 是这个包里非常核心的一层。它把系统维护人员平时会做的常规业务操作、排障动作和判断顺序固定下来,把每一种 运维流程 都凝练成一份方便 AI 快速理解的说明文档。过去运维人员凭经验手动处理,SOP 把这条经验路径显式化了。

从这个角度看,AI Agent 通过 SOP 已经能承担一部分原本需要 数据中台 逐步沉淀的业务支持任务:过去这些操作由运维人员凭经验手动执行,随着系统演进也可能被开发人员提炼成 API、前端页面或 Flink 任务,但 SOP 提供了另一条路径——先把可复用运维流程固定下来,让 Agent 按流程判断该查什么、验证什么、返回什么,不必等到完整平台建设完成就能先获得接近数据中台的支持效果。

目前 sops/ 目录下覆盖了以下 场景

类型 覆盖场景
排障类 积分未到账、ETL 规则不生效、历史数据查不到、日志未采集、MySQL 配置未生效、Flink 任务失败
操作类 新增原子事件、新增 API / 能力、新增服务机器、编译服务、新增监控桩点
查询类 账单字段含义、积分修改历史、权限管理、域 ID 反查业务分类

单个 SOP 文档结构示意

ig_009471122eebd15d016a29a356c20081918572dbb89e071cd9

2. SOP 的例子

用户问:”客户端反馈修改 xxx 积分失败,麻烦帮忙查一下”。

没有 SOP 的话,Agent 可能先去解释服务含义、权限、MySQL 字段等一堆相关概念,反而偏离核心问题。

有 SOP 之后,Agent 会沿着一条 固定的处理链路 往下走:确认最小必要信息 → 判断是客户端改不了还是服务端写失败 → 是客户端问题则查目标 ID 是否在客户端接入层白名单号段内 → 不在号段内则直接给出”客户端无法修改”的结论 → 在号段内则继续查权限和配置下发 → 权限和配置都没问题则升级查日志或源码。

链上的每一步只依赖上一步的结论,不会跳到无关方向。每一步也有明确的证据要求:有的需要看静态知识库,有的需要查 DDL,有的需要调用工具,有的需要用户补充截图。证据在哪一步断了,就停在哪一步,告诉用户还缺什么,这就是 SOP 的核心:不是零散的知识点,而是一条有顺序、有判断节点、有刹车点的处理链。

复杂问题时,SOP 这条链上的某些环节可能需要并行收集多个事实面(比如同时确认 DDL、配置和源码),这种场景在 workflows/ 下另有编排规范,但并行结果最终仍回到 SOP 的主链路中,由主流程按证据规则统一输出结论。

3. SOP 与 workflow 的异同

SOP 和 workflow 很像,但也不完全一样。

相同点:它们都把一件事拆成若干步骤,都强调顺序、输入、输出和异常处理,都希望让不同执行者按同一套流程完成任务。

不同点:SOP 解决的是:某类业务问题应该按什么顺序处理。Workflow 解决的是:当一个问题跨多个服务、多个 ID、多个事实面时,怎么把调查任务拆开并行收集。

2.6 工具层

如果说静态知识库让 Agent 理解系统,SOP 告诉 Agent 按什么流程处理问题,那么工具层就是给 Agent 提供 “手脚”:让它不只是根据文档推断,而是能 在受控范围内查询真实数据、接口、配置、机器信息和协议结果

过去,这些查询动作通常由系统维护人员手动完成:先判断问题需要查什么,再找脚本、拼参数、执行查询,最后整理数据、解释结果。现在,这些能力被统一整理到工具层中,Agent 可以根据 SOP 或用户问题,调用对应工具完成同类查询。

1. 总入口

tools/index.md 是工具层的总入口。

这个入口会告诉 Agent:当前有哪些工具能力、每个工具能解决什么问题、数据源来自哪里、当前实现状态是什么(已验证/已实现/部分可用/计划中),以及失败时如何降级。

更重要的是,tools/index.md 向外部屏蔽了工具的内部实现细节。

对 SOP 来说,它只依赖 tools/index.md 中声明的工具能力,不关心底层是 Python CLI、HTTP API、TCP 协议还是未来的 MCP。

这背后是工具层的三条 设计约束

  • 高内聚:工具能力、契约、适配器、运行时和校验都集中在 tools/ 内部维护。对外只暴露 tools/index.md 一个入口,内部怎么拆、怎么变,外部感知不到。
  • 低耦合:SOP 不直接依赖某个脚本文件或实现方式,只依赖 tools/index.md 中声明的工具能力。工具改文件名、换实现语言、从 CLI 迁到 MCP,SOP 一行不用动。
  • 易替换:同一个工具能力,今天可以是 Python CLI,明天可以换成 API 或 MCP,只要对外契约不变,上层 SOP 就不需要大改。

工具层内部按职责拆成了几个子目录:

路径 作用
tools/index.md 工具能力总索引,上层唯一入口
contracts/ 定义每个工具能做什么、输入输出、数据源优先级、降级语义
adapters/ CLI / API / MCP 等具体实现,上层不直接依赖
runtime/ 公共库、配置模板、临时产物
validation/ 静态校验脚本,防止旧入口和跨层泄漏
hooks/ 安全护栏的执行脚本(见 2.7)

2. 能力类型

工具层不限定实现形态。只要是 Agent 可以在受控范围内调用、并能返回可验证结果的能力,都可以纳入。目前 tools/index.md 中注册的工具按用途分为四类:

类别 覆盖范围
DB 配置类 MySQL 配置表查询、原子事件查询、自助 API 配置查询、服务监控查询
HTTP API 类 中台使用的 HTTP 接口、外网 MySQL 配置、外网积分运行时值、调试条件日志
TCP 协议类 基于 C++ 服务二进制协议直连后端服务,覆盖多个消息类
运维支撑类 IP 归属和责任人批量查询

工具层关注的核心不是 “底层是什么形式”,而是这个能力是否已经被定义、是否受控、是否能稳定返回可验证证据。

3. 工具层的受控

工具层虽然给 Agent 提供了查询能力,但它 不能 变成无限制的执行入口。

这个包明确要求:动态数据只能通过 tools/index.md 中定义的受控工具获取。Agent 不能自己临时拼 SQL、直连数据库、绕过工具索引调用接口,也不能执行写库或生产变更。

工具层的受控主要 体现在

  • 参数受控:工具只接受预定义参数,不接受随意 SQL。
  • 能力受控:工具能力必须先在 tools/index.md 中声明。
  • 数据源受控:工具要说明数据来自外网、内网、API、TCP 还是本地环境。
  • 结果受控:工具要返回可解释的结果和证据等级。
  • 失败受控:工具不可用时要降级,不能伪造线上事实。

所以工具层不是简单的脚本目录,而是这个包的 执行接口层。它一方面给 Agent 提供查询能力,另一方面又通过统一入口、能力契约、参数约束和失败降级,保证这些能力不会失控。

4. 与 SOP 的关系

SOP 负责规定 “应该查什么、按什么顺序查、查到什么结果后怎么判断”。工具层负责提供 “真的怎么查”。

这也是为什么工具能力不能散落在各个 SOP 里。如果每份 SOP 都直接写脚本、嵌 SQL、写死接口地址,后期维护会非常混乱,且会给 AI 引入大量无关上下文。统一收到 tools/index.md 后,SOP 只描述业务流程和处理链路,工具层统一管理执行能力。

ig_00947

5. 与 MCP 的关系

工具层和 MCP 都是 把外部能力封装成 AI 可以调用的工具,但侧重点不同。

MCP 是一种通用工具接入协议,让 AI 以标准方式调用外部工具或数据源。

EVT-HIS-ops 的工具层则是一个 面向 EVT/HIS 业务现场的工具能力目录,围绕具体业务问题把常用的查询动作、脚本能力、接口能力和协议能力统一收口。未来某些工具改造成 MCP 形式,也只是工具层内部的实现方式变化,对 SOP 来说,它关心的始终是这个工具能力是否存在、是否可靠、是否返回可验证证据。

2.7 证据与安全层:使用过程中的保障

前面的静态知识库、SOP 和工具层,让 Agent 具备了理解系统、按流程排查、调用工具查询的能力。但 能力越强,风险也越高:如果 Agent 把推断当事实,把字段注释当线上结果,或者绕过工具层直接查库,就可能给出错误结论,甚至带来操作风险。

这一节包含两块独立但目标一致的内容:证据规则 让回答区分事实和推断,Guard/Hook 在运行时检查部分越界动作和不规范回答。

1. 证据层

同一句回答,在不同证据来源下,可信程度截然不同。读过源码、查过 DDL、通过工具查过真实数据,和仅凭知识文档推断,不能混成同一种结论。

AGENT.md证据来源 分为五个等级,Agent 回答时必须标注:

证据等级 含义
源码确认 已读取实际源码,或带源码位置的源码知识文档
DDL 确认 已读取拆分 DDL
工具查询确认 已通过 tools/index.md 导向的受控工具获得动态数据
知识文档推断 仅依据知识文档或 SOP 推导
需要运维确认 缺少线上数据、日志、权限或工具能力

五级分层的目的是把 “已确认事实” 和 “推测方向” 分开。

同时方便使用者反向排查:如果 Agent 回答错了,根据引用的证据来源可以快速判断是知识文档有问题、DDL 理解有问题、工具查询有问题,还是 Agent 推断过头了。

因为证据层的存在,现在 Agent 通过这个包回答问题后,会主动说明自己的证据来源:

image-20260611175452707

image-20260612094251837

2. Guard / Hook:安全检查机制

AGENT.md 定义了行为规则,但那是软约束,Agent 在 “想给出答案” 的压力下仍可能绕过。Guard / Hook 尝试把其中一部分可程序化判断的规则转成运行时检查:在动作和回答发出去之前,检查是否命中已知的越界模式

Guard 是 检查规则(查什么),Hook 负责 触发时机(什么时候查)。在已经正确接入原生 Hook 的平台上,Agent 即将执行文件编辑或脚本命令、即将输出 EVT/HIS 最终结论时,Hook 会把当前内容交给 Guard 检查;不支持原生 Hook 的平台,则需要通过 guard_cli.py 或等价机制显式调用。

Hook 通过三条脚本实现,各守一个节点:

脚本 角色
pre_tool_guard.py 动作前检查:拦截越界编辑、数据库写入、绕过工具层、绕过协议层、Shell 高危操作
response_guard.py 回复前检查:拦截证据等级缺失、不确定表达未标注推论、证据等级滥用、敏感信息泄露
guard_cli.py 手动入口:不支持原生 Hook 的平台通过 pre-edit / pre-shell / response 三个子命令手动触发同一套检查

在自动接入 Hook 的运行环境中,Agent 会在两个节点上接受检查:

  • 高危动作前 → Hook 触发 → Guard 检查 → 通过则执行,不通过则阻断
  • 输出结论前 → Hook 触发 → Guard 检查 → 通过则输出,不通过则退回修改

2026-06-10_EVT-HIS-ops_Guard-Hook安全检查机制

Guard / Hook 不是在重复 AGENT.md 的规则,而是把其中最关键、最容易被越过的几条——只读边界、工具层准入、证据标注——从文字变成程序化检查点。它能降低已知越界模式发生的概率,但不是不可绕过的安全沙箱,也不能替代网络隔离、只读凭证、最小权限和服务端审计。

2.8 后期维护规则

这个包后续会被不同 Agent、不同对话框反复使用,如果没有统一维护规则,每次缺什么就随手加文件、改路由、复制说明,短期看着像在增强,长期会导致入口混乱、内容重复、事实冲突。会让这个包逐渐变成一坨屎山,影响整个包的可用性,同时也失去可维护性。

为了避免这种情况发生,MAINTAINING.md 把 “持续进化” 收束到一个标准流程 里:


flowchart LR
    A["发现问题"] --> B["定位层级"]
    B --> C["按维护规则修改"]
    C --> D["同步入口索引"]
    D --> E["验证后沉淀"]

它不直接回答业务问题,只负责保证这个包在持续使用和持续补充的过程中,仍然保持结构清晰、边界稳定、可长期维护。

内容上,MAINTAINING.md 做了三件事:

  • 告诉你改什么该去哪。 新增 SOP 走 sops/ROUTE_QUICK.mdsops/index.md;新增工具走 tools/index.mdtools/contracts/、调整 Guard 走 guards/README.mdtools/hooks/。每一种修改都有唯一入口,避免新来的 Agent 蒙头到处打补丁。
  • 定了几条硬规则。 例如:就近索引、不在多处复制同一张大表、SOP 不依赖工具内部实现只引用能力 ID、真实配置不提交 Git、删除文件前先扫全仓引用并同步入口和测试。
  • 改完验证。 通过三条 py 命令覆盖测试、静态校验和场景回归:

所以 2.8 在整个架构章里是一个”兜底”的存在:前面的每一层都有自己的职责,而维护规则保证无论怎么改、补充多少内容,每一层都还能继续各司其职。

三、构建演进

本章节由 Codex 和 ClaudeCode 通过历史对话内容与我的个人笔记总结生成。

将我从0到搭建完成这个包的全过程总结。

整个构建过程跨越了四个 AI 平台(Gemini、Cursor、Claude Code、Codex Desktop)、数百轮对话、三次关键转折。按时间顺序平铺会丢失因果链,真正重要的不是 “先做了什么、后做了什么”,而是上一个阶段的难点如何催生了下一步的决策

因此,这一章不按时间写,而按三次关键演进来组织。每次关键演进都遵循同一条叙事逻辑:当时遇到了什么难点,做了什么关键决策,形成了什么新能力,这种能力又带来了什么新问题,推动进入下一次关键演进。

flowchart LR
    A["散乱资料<br/>AI 看不懂"] -->|第一次关键演进| B["可导航的工作环境<br/>知识多但不会用"]
    B -->|第二次关键演进| C["值得信赖的运维能力包<br/>能用但不够可靠"]
    C -->|第三次关键演进| D["实战验证<br/>在真实压力下收敛"]

章末附了一张构建阶段快速对照表,方便按时间或关键词检索。

3.1 第一次演进:知识体系

面临的难点

EVT 和 HIS 是两个有近十年历史的系统,服务数超过 20 个,积累的技术文档分布在 .doc.pdf.ppt.xlsx.md.txt.sql 等七八种格式中,总量约 70 多个文件。

这些文档的质量参差不齐,有的是概要设计,有的是操作手册,有的是项目规划,有的是过时的配置说明。更麻烦的是,文档之间存在冲突:旧文档描述的状态码在新文档里已经废弃,规划文档里写的”预计三个月完成”到了实际可能只做了一半。

面对这样一堆资料,AI 如果直接”通读并总结”,几乎必然出问题,它会把规划当成已完成事实,会把旧方案当成当前方案,会在文档互相矛盾时为了自圆其说而编造解释。

这是整个项目要解决的第一个问题:如何让 AI 从混乱的历史资料中,提取出一套准确、可用的系统知识。

关键决策 1:先定治理原则,再让 AI 读文档

当时给 AI 的 prompt 里有一段话,后来被反复引用:

“我提供的是系统多年发展过程中的所有文档。这些文档可能会有冲突,也可能会有更新。请你自己梳理清楚最新、最正确、最合理的内容。不要把旧文档、规划文档直接当成当前事实。”

这段话定下了静态知识库最早的四条治理原则:

  • 时间戳优先:识别文档中的时间线索(文件名日期、版本号 V1/V2),以最新为准。
  • 逻辑演进推断:没有明确时间的,通过技术演进方向判断(如单体拆分为多服务是新架构)。
  • 废弃标记:已废弃的旧表、旧状态码不进入主逻辑,但标注 [Legacy/已废弃] 以备历史数据排查。
  • 不确定就标注边界:对不能确认的地方,标明”此处需要运维确认”,不替用户臆测。

这些原则看似简单,但它们是整个包的第一块基石。后来演化出的”证据等级”、”DDL 单源权威”、”工具失败必须降级”,追溯回去,都在这四条里埋了种子。

关键决策 2:多 AI 交叉生成,不让一个 AI 做到底

历史文档清洗完之后,项目没有走”一个 AI 读完全部文档,输出最终知识库”的直线路径。相反,同一个知识域被至少三个 AI 分别生成,然后再让其中一个 AI 做综合和优选。

当时的 prompt 是:

“针对同一套知识库,我分别让三个 AI 生成了三套 skill 的 md 文档,请你自己验证一下哪个更适合做你的 skill 文档。或者你再在这三个 skill 的基础上重新生成一份你认为最合理的 skill。”

例如某个服务,产出了三个版本:Claude Code 版、Cursor 版、Gemini 版。最终由 Gemini 综合三个版本,输出一份最优版本。

这种做法的价值不是”多数投票”,AI 不是民主选举。它的真正价值在于:不同 AI 有不同的盲区。Cursor 可能在结构组织上更好,Claude Code 可能在细节覆盖上更全,Gemini 可能在综合判断上更强。让它们互相暴露问题,比让一个 AI 反复迭代更不容易陷入”顺着错误方向一路深挖”的风险。

这个阶段涉及四个 AI 平台的分工:

AI 平台 角色 关键产出
Gemini 架构设计 + 总编 三层架构初稿、prompt 模板起草、多版本合并优选、EVT/HIS 总览最终版
Cursor 文档分析 + 源码分析 读取历史文档生成总览、读取 C++ 源码生成各服务知识文档
Claude Code 文档分析 + 源码分析主力 批量 18 服务源码逆向、元框架设计、知识库整合
Codex Desktop 交叉审查 检查兼容性、补充必需文件

关键决策 3:源码逆向校准,历史文档说”曾经如何设计”,源码说”现在怎么运行”

静态知识库完成后,面临一个根本问题:文档解释的是”曾经如何设计”,但系统当前实际怎么运行,只有源码知道。

于是进入逐服务源码逆向阶段。这里有一个容易被忽略但至关重要的设计选择:生成的不只是”代码摘要”,而是”给未来 Agent 使用的源码索引和排障知识”

当时给 Claude Code 的 prompt 明确说了这一点:

“你是一名精通 C++ 的首席架构师和 AI 知识库工程师。请先阅读 EVT/HIS 总览文档,再分析当前服务源码。输出要服务于后续 Agent 排障和查题,而不是普通代码摘要。请按架构角色、协议字典、业务场景、异常排查、内部架构、源码索引来组织。”

这个 6 模块结构(Gemini 帮助起草的模板)后来成为所有 18 个服务知识文档的统一骨架。每个文档必须包含:

  • 服务在整体链路里的角色。
  • 入口协议、出口协议和关键字段。
  • 关键函数、关键文件和调用链。
  • 常见异常、日志特征和排障入口。
  • 哪些结论来自源码,哪些只是根据源码推断。

这 18 个服务的源码逆向不是一次性完成的,而是分三批推进:第一批覆盖了配置中心和规则引擎等 5 个 C++ 核心服务,用了约 1 天;第二批覆盖了历史数据系统的 6 个 C++ 服务,用了约 1 天;第三批覆盖了管理后台和批量运维等 7 个 Python 服务,用了约 1 天。总计约 3 天完成全部 18 个服务的源码级知识文档。

成果

这个阶段结束时的产出是一套历史背景 + 源码索引的复合知识体系:

  • EVT/HIS 两个系统的总览文档(系统演进、状态机、核心概念)
  • 18 个服务的源码级知识文档(6 模块结构)
  • 复杂服务的附属专题文档(如双跑机制、Redis 数据模型、路由分发等)

它后来成为整个包的认知底座,第二章里静态知识库层的三大内容(历史文档知识库、DDL、源码索引),根都在这里。

这个阶段的深层认识

第一,喂给 AI 的资料必须准确,而且要标注性质。 错误、矛盾和时间错位都可能被 AI 整理成看似完整的结论。解决办法是在处理前标明当前事实、历史背景、规划和已废弃内容,并规定冲突时的裁决顺序。

第二,告诉 AI “未来谁会怎么用这些文档”,比”帮我总结这些文件”重要。 面向开发者的代码摘要会解释功能和模块;面向 Agent 的排障索引则需要入口函数、日志特征和源码位置。产出物的使用场景,直接决定 Prompt 和文档结构。

第三,多模型交叉审阅的价值不是”选最好的那个”,而是让不同 AI 从不同角度暴露彼此的盲区。说一个具体例子:同一个服务,Cursor 版本组织了清晰的分段结构,Claude Code 版本记录了更完整的协议字段,Gemini 版本在综合两个版本后增加了一层”为什么这个服务的配置要依赖配置中心”的架构解释。最后保留下来的不是任何一个原始版本,而是综合后的版本。需要注意的是,这种对照主要提高信息覆盖度、帮助发现矛盾,并不能代替源码、DDL 和业务人员对事实的确认。


3.2 第二次演进:工作环境

面临的难点

第一个阶段结束时,知识文档已经相当丰富:18 个服务的主文档、多个附属专题、DDL 目录、编译知识。但一个新的、更棘手的问题出现了:

文档已经很多了,但 Agent 怎么知道该读哪一份?

这个问题在第一次实战尝试中暴露得很直接。Agent 加载了知识库之后,用户问了一个具体问题,Agent 没有先去读索引,而是在知识库里随机搜索,读了一堆相关但不精确的文档,最后给的答案绕了远路。

问题不是知识不够,而是知识没有组织成”可导航”的结构。就像一个图书馆藏书百万但没有目录,书都在,但找不到需要的。

关键决策 1:用”确定性路由”替代”语义搜索”

这个决策是整个包设计中最关键的判断之一。

对大多数 AI 应用来说,”语义搜索”是默认选择,用户问一个问题,系统在所有文档中检索最相似的片段,然后拼接答案。这种方法在开放域问答中表现不错,但在高风险业务排障中有一个关键缺陷:相似不等于准确

用户问”积分没到账怎么办”,语义搜索可能返回”积分系统概述”、”规则引擎配置说明”、”积分存储服务字段含义”,这些文档都和”积分”相关,但都不是处理”没到账”这个问题的正确入口。

所以这个包选择了一条不同的路:确定性路由。不是让 Agent 在所有文档中搜索,而是先让 Agent 判断问题类型(故障排查?概念解释?字段含义?工具查询?),然后直接进入离答案最近的入口。

具体做法是两层路由:

一级路由,判方向:把用户问题归入六个大类,不展开细节。

问题类型 去向
故障排查、操作变更 SOP 方向
概念、架构、服务机制 知识库方向
表结构、字段含义 DDL 方向
动态数据查询、工具能力查询 工具层方向
包本身维护 维护规则方向
多事实、多链路问题 并行事实收集方向

二级路由,找入口:在方向内部定位到具体的文件。比如”SOP 方向”下有十几份 SOP,二级路由通过症状关键词(积分未到账路由到积分异常排查流程,规则不生效路由到规则排查流程)精准命中。

这一层的设计有一个容易被忽略的细节:路由不直接回答问题,只负责把 Agent 送到离答案最近的位置。路由层自己不包含任何业务知识,它只做一件事,判断问题类型然后指向入口。这样路由层才能保持轻量,不会变成另一个需要维护的知识库。

关键决策 2:用 SOP 把运维经验固化为”操作链路”

有了路由之后,第二个问题出现了:Agent 到了正确的入口,但入口文件如果只是”知识介绍”,Agent 仍然不知道具体该怎么排查。

SOP 解决的就是这个问题。它不是告诉 Agent “这个服务是什么”,而是告诉 Agent “遇到这个问题,你应该先做什么、再做什么、查什么、不能跳过什么、证据不够时应该停在哪里”。

以”数据未到账”为例,没有 SOP 的时候,Agent 可能会先去解释相关存储、规则引擎、事件代理各自是什么,再逐服务讲机制,用户等了半天,得到的是一堆概念,而不是排查结论。有了 SOP 之后,处理链路就固定了:

  1. 确认用户描述的现象属于哪种类型(修改失败?触发失败?写入失败?)
  2. 确认涉及的目标标识和所在环境
  3. 查配置确认目标定义是否正常
  4. 查记录确认是否有相关操作痕迹
  5. 以上步骤都排除后,再进入更深层的链路排查

每一步都有自己的证据要求:有的需要静态知识库,有的需要 DDL,有的需要工具查询,有的需要用户补充截图或日志。证据足够时输出结论;证据不足时说明还缺什么,而不是继续猜。

从实践效果看,SOP 让 Agent 从一个”能回答概念问题”的助手,变成了一个”能按固定流程排查故障”的运维协作者。它把原本需要系统维护人员手动执行的判断顺序和排查动作,固定成了可被 Agent 重复执行的工作流程。在很多场景下,不必等到完整平台建设完成,也能先获得接近数据中台的支持效果。

关键决策 3:分层治理,给每类信息一个权威锚点

路由和 SOP 搭起来之后,包开始被频繁使用。用多了,架构层面的问题就暴露出来了:

  • 索引过多,Agent 需要跳很多层才能到达目标文件。
  • 链接断裂,文档之间的引用不稳定。
  • 文件名和文档 name 不一致,同一个文件在不同地方被不同名称引用。
  • 大 SQL 文件难以局部加载,原始 DDL 是一个上千行的全库脚本,Agent 查一个字段需要读完整个文件。
  • 长知识文档全量加载浪费上下文,例如某服务知识文档约 500 行,但排查特定问题只需要读其中 100 行。
  • SOP 直接依赖工具实现细节,工具一旦改底层实现,SOP 也要跟着改。

这些看起来是”细节问题”,但它们叠加在一起的效果是:包虽然能工作,但维护成本高、每次修改都可能引入新问题、Agent 有时会走错路径。

分层治理的目标不是推翻现有结构,而是给每类信息找一个”权威锚点”,同一种事实只在一个地方维护,其他地方通过链接引用。

几个具体的动作:

DDL 拆表。 将上千行的全库 DDL 脚本按表拆分为 17 个独立的 SQL 文件,每文件 30 到 170 行。建立索引文件按表名或字段名快速定位。这个改动的价值不只是”文件变小了”,它确立了一个原则:字段语义以拆分 DDL 为权威源头。以后任何人(包括 Agent)需要查字段含义时,先查 DDL,而不是去知识文档里找二手描述。

长文档分段加载。 在长文档的顶部增加”分段读取指南”,按问题类型标注对应行号范围。Agent 可以通过 offsetlimit 参数只加载相关小节,不需要全量读取。

工具层从知识层和 SOP 层中剥离。 知识文档只描述”这个服务是什么”,SOP 只描述”应该查什么、按什么顺序”,工具层负责”真的怎么查”。SOP 不再直接依赖某个脚本文件或实现方式,只依赖工具索引中声明的工具能力。这样工具底层实现变了(比如从 Python CLI 改成 API 或 MCP),SOP 不需要改动。

建立文档标准和源码导航。 确保后续不同 AI、不同会话产出的文档遵循统一规范,减少格式漂移。

成果

这个阶段结束时,包从”一堆有组织的文档”变成了一个可导航、可维护、可降级的工作环境

  • 路由层(一级 + 二级)让 Agent 知道从哪里开始。
  • SOP 层让 Agent 知道按什么流程处理。
  • 拆分的 DDL 让字段语义有权威锚点。
  • 分离的工具层让动态查询有统一入口。
  • 文档标准和源码导航让后续维护不会越改越乱。

这个阶段的深层认识

第一,文档多不是能力。没有入口、路由和加载规则,文档越多,Agent 越容易迷路。 路由的价值不是体现在架构图上,而是在 Agent 反复走错路径、读取无关文档之后才真正显现。

第二,确定性路由更适合问题有限、流程明确的高风险排障。 开放域问答可以依赖语义搜索;积分未到账、规则不生效、配置未下发等可枚举场景,则更适合直接进入固定入口。

第三,同一种事实要有单一权威源头。 这是分层治理阶段最核心的认知。字段语义放 DDL,业务流程放 SOP,工具能力放工具索引,行为规则放入口规则(AGENT.md),源码位置放源码导航。不同的信息类型不应该混在同一个文件里,否则改一处就要同步多处,最终一定会出现不一致。


3.3 第三次演进:可信系统

面临的难点

分层治理完成后,包已经能处理大部分 EVT/HIS 问题。但一个新的、更根本的问题浮现了:

包能给出答案了。但答案可能是错的。而且 Agent 在”给出答案”的压力下,可能会做一些不该做的事。

具体表现包括:Agent 把知识文档里的推断说成”源码确认”;Agent 在工具查询失败时仍然给出了看起来很像成功结果的回答;Agent 在某个场景中绕过工具层,直接 import 协议内部库手写脚本查询线上数据。

这些问题不是”包的设计有问题”,而是更深层的:一个能理解系统、能调用工具的 Agent,如果没有结构和规则的约束,它的能力越强,风险越大。

这个阶段要解决的,不是让包能做更多事,而是让包在做事的过程中不出格,结论有据可查、动作有边界约束、质量有测试守护。

关键决策 1:证据等级,强制区分”确认的事实”和”合理的推断”

同一句回答,在不同证据来源下,可信程度完全不同。读过源码、查过 DDL、调用工具查过真实数据,和只根据知识文档推断,不能混成同一种结论。

证据等级 含义 使用条件
源码确认 已读取实际源码,或带源码位置的源码分析文档 明确引用了源码路径和行号
DDL 确认 已读取目标表的结构定义 确认了字段类型、注释、约束
工具查询确认 已通过受控工具获得动态数据 工具返回了实际数据,标注了数据源和查询时间
知识文档推断 仅依据知识文档或 SOP 推导 不能直接作为线上根因,需要标注”推断”
需要运维确认 缺少线上数据、日志、权限或工具能力 必须列出待补查内容,不能把推断写成事实

证据等级不只是贴在回答末尾的标签。它改变了 Agent 的整个回答结构:Agent 必须把”已确认事实”和”推测方向”分开写,不能把三段推断拼成一段笃定的结论。这也方便使用者反向排查,如果 Agent 回答错了,可以根据它引用的证据等级,快速判断是知识文档有问题、DDL 理解有问题、工具查询有问题,还是 Agent 自己推断过头了。

这套机制在实战中被进一步强化。有一次(见 3.4 案例 B),用户明确提供了积分ID 和积分域ID,但 Agent 没有先查实际数据就直接基于知识文档推断根因。这次教训催生了证据规则中一条重要的补充:

当用户已提供精确 ID(积分ID、积分域ID、规则ID 等)且对应工具可用时,必须通过工具层查询实际数据后才能给出根因结论,不得停在知识文档推断层面。

这条规则看似只加了一段话,但它改变了一个关键行为:精确 ID 场景下,Agent 的证据义务升级了。 用户给了 ID,Agent 就不能只讲机制,必须先查数据。

关键决策 2:Guard/Hook 安全检查,不只写在规则里,而是在运行时拦截

文字规则能被读到,但不一定能被遵守。Agent 在”想给用户答案”的压力下,有时会绕过规则,比如在一个案例中(见 3.4 案例 D),Agent 为了查到用户的实际数据,直接 import C++ 服务二进制协议内部库、手写临时脚本连接内网生产环境,完全跳过了工具层的参数白名单和契约约束。

Guard/Hook 机制就是为这种情况设计的。

Guard 定义安全检查规则。主要检查两类风险:

  • 动作风险:是否要修改包目录之外的文件、是否出现数据库写入倾向、是否绕过工具层直连数据库或协议、是否通过 shell 进行高风险文件写入或删除。
  • 回答风险:EVT/HIS 领域的确定性回答是否缺少证据等级、是否使用模糊表达却未标注”推断”、是否把文档示例误标成”源码确认”、是否泄露敏感信息。

Hook 负责在合适的时机触发 Guard 检查。当 Agent 准备调用工具、执行 shell、编辑文件或输出最终结论时,Hook 把当前动作或回答交给 Guard 检查。检查通过继续执行;检查不通过则拦截、降级或要求改写。

guard 目录定义平台无关的安全护栏规则,hooks 目录下的脚本负责执行:

脚本 作用
动作检查脚本 在工具、shell 或文件编辑前检查动作风险
回答检查脚本 在最终回答前检查回答风险
手动检查脚本 在平台不支持自动 Hook 时,手动触发同一套检查逻辑

这里有一个重要的设计选择:Guard 不像 SOP 一样只给 Agent “建议”,而是尝试在执行入口增加程序化阻断。 在已经正确接入 Hook 的平台上,命中规则的动作不会继续执行;没有原生 Hook 的平台仍需显式调用检查。它是应用层的补充防线,不是生产环境的最终安全边界。

关键决策 3:架构收敛,摆脱概念束缚,回归”解决真实问题”

随着能力越来越多,包的名字成了一个需要认真对待的问题。它被叫过 BaseSkill、evt-his-ops-skill、Agent Package、AP、EVT-HIS-ops。名字背后是定位的摇摆。

有一段时间,项目确实被”Agent Package”这个名字影响过:既然叫 AP,是不是应该有更完整的 manifest、更多的 adapter、更标准的元目录、更多的 workflow?这个方向上走了一段之后发现不对劲:包的复杂度在增加,但对 EVT/HIS 真实问题的解决能力没有同步提升。

关键认知变化出现在这个节点:

这个包不应该为了符合某个外部概念而设计,而应该为了 EVT/HIS 真实工作怎么被 AI 稳定完成而设计。

于是做了一次系统的架构减法:

  • 对外叫 skill,降低沟通和加载成本。
  • 内部入口使用 AP_MANIFEST.md,但不强行套外部 AP 标准。
  • 行为规则集中到 AGENT.md,不再分散在多个文件中。
  • workflow 只保留真正有价值的并行事实收集流程,删除多余的元说明和重复内容。
  • 强化 MAINTAINING.md,让后续维护有统一标准。
  • 删除多套重复索引,确保每种信息只有一个权威入口。

最终架构收敛为:

flowchart LR
    MANIFEST["AP_MANIFEST.md<br/>入口文件"] --> AGENT["AGENT.md<br/>行为规则"]
    AGENT --> ENV["环境检查"]
    ENV --> ROUTE["按问题类型<br/>选择最近入口"]
    ROUTE --> K["知识库"]
    ROUTE --> S["操作流程"]
    ROUTE --> D["表结构"]
    ROUTE --> T["工具层"]
    ROUTE --> W["并行收集"]
    ROUTE --> M["维护规则"]

关键决策 4:测试体系,让”容易改坏”变成”不容易改坏”

测试体系不是事后补的,而是和架构收敛同步建立的。目标很明确:包要持续迭代,但不能每次迭代都在修复旧问题的同时引入新问题。

测试分为三层:

路由测试:验证常见问题能不能命中正确入口。比如”积分没到账”是否指向积分异常排查流程,”规则不生效”是否指向规则排查流程。路由测试只能证明”找得到入口”,不能证明”入口后面的处理是对的”。

场景测试:验证真实问题是否按正确链路处理。不只是验证最终答案对不对,而是验证完整的行为链路:路由是否正确、是否需要追问、是否选择了正确的 SOP、是否选择了正确的工具、是否标注了证据等级、工具失败时是否降级、是否越过了安全边界。

工具契约测试:验证每个工具是否按约定返回,成功时返回什么结构、失败时返回什么错误码、数据源是否正确标注、证据等级是否正确附带。

此外还有一层治理测试:验证包结构是否被随意破坏,入口文件是否还在、索引链接是否断裂、目录职责是否越界。

这批测试在实际运行中推动修复了多个问题:工具失败却报告成功的 bug、SOP 示例中工具错配的问题、权限管理缺少正式 SOP、某些场景证据不足却回答过满、API 查询缺少校验模式、示例值被误当成事实。

成果

这一阶段结束时,包从”能用的工具集”变成了一个可持续维护、不容易被改坏的可信系统

flowchart TD
    A["证据等级"] --> E["可信的系统"]
    B["Guard/Hook"] --> E
    C["架构收敛"] --> E
    D["测试体系"] --> E

这个阶段的深层认识

第一,名字是为了沟通,不是为了服从概念。 不要为了对齐 skill、AP、workflow、RAG 这些词而增加无用层。这个包的最终目标是”帮助用户解决 EVT/HIS 问题”,不是”成为一个完美的 Agent Package”。任何不服务这个目标的结构,都应该被砍掉。

第二,Agent 的纠错机制必须是一个”系统”,不能只靠文字规则。 文字规则(AGENT.md 的安全红线)+ 应用层检查(Guard/Hook)+ 持续验证(测试体系)+ 人工监督(用户审核写操作方案),需要共同发挥作用。除此之外,生产环境仍应依靠网络、凭证和系统权限建立基础安全边界。

第三,路由测试只能证明找得到入口;场景测试、工具契约、Guard 和 Hook 可以进一步检查处理链路是否符合预期。 这是在测试体系建设过程中逐渐清晰的认识:不能只测”结构在不在”,还要继续补充真正执行 Agent 问答和工具调用的端到端验证。


3.4 实战验证:真实问题如何推动迭代

背景

前三轮关键演进之后,包在自测题上表现已经不错。但自测题有一个根本局限:你自己出的题,你自己知道答案。你设计的结构,你出的题自然会按这个结构来。

真实的同事问题完全不同,问法不标准、概念混用、缺少关键信息、一个句子里同时包含业务需求和技术报错。这些”不标准的真实问题”会从各个角度暴露包的弱点。

于是有了实战验证阶段。做法是把钉钉群里同事历年咨询过的 EVT/HIS 问题整理成题库,让 Agent 逐题回答,然后检查:

  • 路由是否命中。
  • SOP 是否足够具体。
  • 静态知识库是否缺概念。
  • DDL 是否能支撑字段解释。
  • 工具是否覆盖真实查询。
  • 安全边界是否挡住了危险动作。
  • 维护流程是否能把问题补回正确位置。

关键是:答案对不代表链路对。 答案对了但过程绕了远路,也要复盘,为什么绕路?路由哪一步走错了?这一步怎么修?

以下四个切片只聚焦它们分别推动了什么修改;第四章再展示完整的处理链路,避免把案例数量本身当成效果证明。

案例 A:知识缺口型:域 ID 反查业务分类

同事询问“某个域 ID 对应哪个 EVT 业务分类”时,Agent 虽然找到了业务分类表,却不知道积分域、业务域、一级业务和二级业务之间的关系,也缺少按积分域反查业务分类的工具与流程。最终补充了两条交叉查询路径、相关 DDL、工具字段白名单和标准处理流程。这个案例说明,真实业务语言会暴露自测题很难发现的隐性概念缺口。

案例 B:路由设计型:方案可行性确认被当成数据查询

用户只是确认“修改白名单结束时间是否可行”,Agent 却把它当成动态数据查询,读取了多份资料并调用工具。答案虽然正确,处理链路却过重。最终只在快速路由中增加一条语义规则:询问“这样做对不对、直接修改是否可行”时,优先按机制确认处理,不自动进入数据搜索。这个案例说明,答案正确不代表链路合理,修复也应尽量贴近根因、保持最小改动。

案例 C:权威源头型:配置字段之间的关系该写在哪里

同事询问“当日触发”类型积分是否需要设置过期时间时,Agent 只回答“不是强制”,没有说明不配置可能导致旧 key 无法清理。问题不在路由,而在 DDL 从未说明周期单位和过期时间两个字段的关系。最终只在过期时间字段注释中补充:

1
2
3
-- 周期单位只负责按周期切 key,不删除旧 key。
-- 过期时间控制 key 的 TTL,决定数据保留多久。
-- 若只配置周期单位而不配置过期时间,旧 key 不会被清理,可能导致存储内存持续增长。

字段语义问题应回到 DDL 这一权威源头,而不是在路由或上层知识里反复打补丁。这次修改也再次验证了“最小改动优先”。

案例 D:安全边界型:Agent 为了给出答案越过了红线

为了查询某个 UID 是否有数据,Agent 绕过受控工具层,直接导入内部协议库、手写脚本并连接生产环境。正确做法本应是说明能力缺口,保留已确认的配置结果,再把查询方法交给运维执行。这个案例不仅推动了 Guard/Hook 的建设,更暴露出当时网络和凭证权限边界不足:应用层检查可以阻断部分已知模式,但生产安全仍应由网络隔离、只读凭证、最小权限和服务端审计提供。

其他重要迭代

以上四个案例只是代表性的切片。完整约 20 轮实战验证中还产出了多项重要迭代,这里简要列出:

  • 客户端修改积分失败:同事问”某个积分 ID 客户端改不了”。检查发现该积分不在客户端号段白名单内。推动了快速路由表新增”客户端修改积分失败”直达路由。
  • 积分异常衰减排查:同事反馈积分莫名衰减,最终根因是外部排行榜服务的定时任务在修改数据,而不是系统自身的衰减机制。推动了路由层新增”积分莫名减少/衰减”关键词,并补充了外部调用方异常修改的排查指南。
  • 权限概念歧义:同事申请规则权限时,Agent 混淆了两套权限系统,业务功能权限(数字标识)和规则权限名单字段(姓名缩写格式)。推动了歧义消除表的建立和权限专门文档的创建。
  • 工具适配器外网优先重构:Agent 多次在处理精确 ID 查询时只查内网、不查外网。问题根因是适配器命令表扁平排列,Agent 容易先命中内网命令。最终将命令表按查询目标分组、外网命令和内网兜底成对排列、外网在前,从结构层面保证”外网优先”不再被绕过。
  • 精确 ID 必须查数据的规则:在配置校验失败排查中,用户明确指出,”积分 ID 和积分域 ID 都提供给你了,你为什么不自己查了再告诉我?” 这次复盘直接催生了 AGENT.md 证据规则的补充:精确 ID 场景必须查询实际数据后才能下结论。
  • 管理后台新增积分报错源码排障:同事在管理后台新增积分时报错”模版信息初始化异常”。Agent 通过源码追踪定位到配置解析模块的代码 bug,守卫条件判断的是一个字段,实际访问的却是另一个字段,当模板有前者但缺后者时触发异常。这是包在源码级排障能力上的一次典型验证。

这些迭代的共同特征是:每一轮都遵循”最小改动”原则,只改最贴近问题根源的那一处,可能是路由一行、DDL 一处注释、证据规则一条、或工具命令表的重排。

这个阶段的深层认识

正确答案也要看链路。 答案对但绕路,也要复盘;答案对但过程越过了安全边界,不是成功而是事故。实战验证的最大价值不是”题答对了多少”,而是暴露了包的哪些结构会诱导 Agent 走错路、走远路、或越过不该越过的线。

每一道实战题都是一个验证循环:Agent 回答,用户检查答案和链路,再针对绕路、遗漏、证据不足或安全越界做最小修复并重新测试。约 20 轮探索性验证逐渐形成了“发现、定位、修复、复测”的迭代方式。

3.1 到 3.3 讲的是能力包从无到有的构建过程;3.4 的真实问题验证则持续暴露知识、路由、工具和安全方面的薄弱点。

3.5 构建方法论

这一节不是重复第五章(方法论、经验和避坑)的给读者的建议清单,而是从构建者视角,回顾全程之后最想强调的几条,更偏”如果重来一次我会怎么做”。

第一,先定义”怎么用”,再定义”怎么做”。 给 AI 布置任务时,最关键的 prompt 不是”做什么”,而是”做完的产物以后会被怎么用”。同样是对源码生成文档,”给开发者看的代码摘要”和”给 Agent 排障时快速定位用的索引”是完全不同的两种产物。每次给 AI 提 prompt 之前,先想清楚这个问题,产出质量会高很多。

第二,核心内容值得进行多模型交叉审阅。 不同 AI 有不同的盲区,而且它们都倾向于”顺着你的话走”。让两个 AI 分别生成或审阅,可以帮助暴露遗漏和矛盾;但审阅结果仍需要回到权威资料和人工判断,不能把模型间的一致当成事实证明。

第三,不要把”文档多”当成”能力强”。 文档多而没有路由,就像图书馆没有目录。路由设计的关键不是”把所有可能的问题都列出来”,而是”Agent 能判断自己不知道的时候该停下来”。这个包的路由之所以能保持轻量,正因为它允许”未命中”,没命中就说不知道,不强行回答。

第四,最小改动优先。 找最权威、最近、最小的修改点。3.4 的四个案例,最终的有效修复都极其精简:一行路由别名、一处 DDL 注释、一条证据规则、一个工具命令表的重排。如果每个小问题都搞大范围重构,包会被自己的修复拖垮。

第五,安全规则必须尽可能落实到执行层,不能只是可阅读。 文字规则再清晰,Agent 在”想给用户答案”的压力下也可能绕过。Guard/Hook、持续测试和人工审核能够降低应用层风险;网络隔离、最小权限凭证和服务端审计则负责更根本的安全边界。案例 D 暴露的正是这两层都需要建设。

第六,不要追求完美,先覆盖 20% 高频场景。 这个包第一次可用时的版本远远不完美,很多边缘场景没覆盖、工具层只有基础查询、SOP 只覆盖了最高频的几个问题。但它能用。能用之后,真实问题会自然地告诉你下一个该补什么。如果一开始追求完美,很可能到现在还在设计文档里讨论架构。

第七,名字是为了沟通,不要让名字决定架构。 最危险的时候,是项目被”Agent Package”这个名字牵着走,开始为了符合 AP 的架构概念而添加元目录和元说明。认识到”这个包的目标是解决 EVT/HIS 真实问题,不是成为一个完美的 AP”之后,架构反而更清晰了,砍掉了所有不服务这个目标的结构。

附:构建阶段快速对照表

此表供按时间、关键词或事件检索时使用。主体叙事应从前面的 3.1 到 3.4 进入,那里解释了”为什么”;此表只提供”做了什么、用了多长时间”的快速映射。

阶段 对应章节 用时 核心事件 对应架构层 关键认知产出
架构设计 3.1 约半天 Gemini 提出三层架构设计 入口层、路由层(概念) 三层分离的架构思想
知识库建设 3.1 约 3 天 历史文档清洗(10 年 / 70+ 文件);多 AI 交叉生成 EVT/HIS 总览;18 服务源码逆向(6 模块 prompt 模板);元框架设计(路径变量系统,替换数百处绝对路径) 静态知识库(历史文档 + 源码索引 + DDL) 资料治理四原则;多模型交叉审阅;”规划不等于事实”;”告诉 AI 未来怎么用”比”帮我总结”重要
初版成型 3.2 约 1 周 初版形成:入口文件、SOP 索引、知识库索引;分层治理:DDL 拆 17 个文件、长文档分段、文档标准、源码导航、工具层拆分(索引/契约/适配器分离) 入口层、路由层、SOP 层、静态知识库层、工具层 文档多不是能力;入口和路由是刚需;单源权威;确定性路由优于语义搜索
架构加固 3.3 约 1 周 架构收敛:命名争论后摆脱概念束缚,回归”解决真实问题”;删除多余结构,只保留并行事实收集;测试体系建设(路由/场景/契约/治理四层);Guard/Hook 安全机制 证据与安全层、反馈迭代层 “名字是为了沟通,不是为了服从概念”;应用层检查不能替代基础设施权限边界
实战收敛 3.4 约 2 天 钉钉题库实战:约 22 个真实会话,多轮 git 提交,覆盖知识/路由/工具/安全/DDL 多维度迭代 全部八层 答案对也要看链路;工具缺口时不能绕过,必须暴露能力边界

四、实战验证

说明:以下案例来自真实业务群聊和 Agent 回答记录。由于其中包含公司内部系统截图、真实 UID、积分 ID、规则 ID、源码路径和人员信息,正式发布到个人博客时不直接展示原始截图。本文只保留经过匿名化处理后的问题描述、Agent 的处理链路、结论和案例价值。原始截图仅作为本地写作素材留存,路径为 doc//assets/images/四-*

这一章不再用截图证明“Agent 回答过什么”,而是用纯文本复盘每个案例:用户怎么问、Agent 应该如何理解、它查了什么证据、最后给出什么结论,以及这个案例验证了 EVT-HIS-ops 包的哪一层能力。

这样的写法有两个好处:

  • 对外发布时不会泄露内部截图、真实 ID、人员姓名或源码路径。
  • 读者更容易看到框架能力本身,而不是被截图里的局部信息干扰。

4.1 CVS 校验失败:积分加入积分域为什么失败

匿名后的原始问题:

1
积分 A 添加到积分域 B 后,导致 CVS 校验失败,为什么?

这个问题看起来像一个普通配置失败,但真正的难点在于:用户已经给出了精确对象,Agent 不能只按知识文档解释“积分域校验机制”,而必须查询积分 A 和积分域 B 的实际配置,再对照校验规则判断。

Agent 的处理链路可以拆成四步:

  1. 先通过受控工具查询积分 A 的线上配置。
  2. 再查询积分域 B 的线上配置。
  3. 对照 NOS / CVS 校验规则,逐项比较关键字段。
  4. 用 DDL 或源码规则解释为什么这些字段不一致会导致校验失败。

最终定位到的问题不是单个字段异常,而是多个关键配置不一致:

字段 积分 A 积分域 B 影响
cluster Redis 集群 A Redis 集群 B 不一致
namespace 命名空间 A 命名空间 B 不一致
hasindex 未开启 开启 不一致
lifecycle_period 1 不一致
lifecycle_switchhour 12 不一致

结论是:积分 A 和积分域 B 不属于同一套业务线和 Redis 集群,直接把积分 A 加入积分域 B 会破坏 NOS Tag 校验规则。修正方向不是简单“强行加入”,而是先确认业务归属,再决定是迁移积分配置,还是新建匹配的积分域。

这个案例验证的能力:

  • 精确 ID 场景下,Agent 必须升级证据要求,不能只靠机制推断。
  • 工具查询结果、DDL 规则和源码规则需要合并判断。
  • 框架能把“配置失败”还原成可验证的字段差异。

案例价值:

当用户给出具体积分、Tag、SID 等精确对象时,Agent 的第一反应应该是查真实配置,而不是解释概念。

4.2 MIS 新增积分报错:placeHolder 从哪里来

匿名后的原始问题:

1
2
在 MIS 上新增积分时报错:
新增积分失败,模板信息初始化异常:'placeHolder'

这个问题不是配置查询,而是源码级排障。用户只看到前端报错,但错误信息里出现了 placeHolder,说明异常很可能来自后端配置模板解析过程。

Agent 的处理链路是:

  1. 根据错误关键字 placeHolder 搜索源码。
  2. 定位新增 / 修改积分请求的后端入口。
  3. 沿调用链追踪模板字段初始化逻辑。
  4. 找到守卫条件和实际访问字段不一致的问题。

核心代码逻辑可以抽象成:

1
2
if 'defaultValue' in sysModel[nowindex]:
    moduleDict[field.col]['placeHolder'] = sysModel[nowindex]['placeHolder']

这里的问题在于:守卫条件判断的是 defaultValue 是否存在,但真正读取的是 placeHolder。当模板里存在 defaultValue、但没有 placeHolder 时,就会触发 KeyError,最后被包装成前端看到的“模板信息初始化异常:’placeHolder’”。

Agent 给出的修复方向是:把守卫条件改为检查 placeHolder,或在读取前补充默认值保护。同时还指出同类缺陷可能存在于同文件其他位置,需要一并检查。

这个案例验证的能力:

  • Agent 能从业务报错进入源码链路,而不是停留在错误文案解释。
  • 源码排障需要给出触发路径、根因代码和修复建议。
  • 证据等级应标注为“源码确认”,而不是“知识文档推断”。

案例价值:

对源码类问题,包的价值不只是“知道系统是什么”,而是能快速把用户看到的现象追到具体代码行为。

4.3 语义澄清:用户说“加账单”,到底要加什么

匿名后的原始问题:

1
2
3
UID A
原子事件:事件 A、事件 B
帮忙加下账单

这个问题最容易误判。用户说“加账单”,但从上下文看,它未必是真的要修改用户账单,也可能是为了排查问题,临时增加 CLS 条件日志,用来观察某个 UID 是否触发了指定原子事件。

Agent 没有直接输出 SQL,而是先做语义澄清:

可能含义 实际动作 后续处理
加 CLS 日志 为事件 A/B 添加条件日志点,追踪 UID A 的触发上下文 生成日志规则方案
查询积分修改记录 查看 UID A 在这些事件下的历史账单或流水 进入查询链路
其他范围 用户可能指业务侧补偿、规则调整或临时观察 继续追问

后续 Agent 进入并行事实收集:

  • 查询事件 A/B 的定义和来源。
  • 确认 ESP / HEB 两条入口是否有可采集字段。
  • 检查目标环境、to_clusterstakecondition 等参数。
  • 判断是否已有相同规则,避免重复插入。

最后输出的是“可由人工审核后执行”的方案,而不是直接执行写库动作。真实 UID、SID、SQL 取值和内部表名在博客中全部省略,只保留处理原则。

这个案例验证的能力:

  • Agent 能识别用户口语里的业务歧义。
  • 在可能涉及写库或生产变更时,Agent 应先澄清意图。
  • 包能把“用户一句话”拆成查询、确认、方案、验证、关闭几个阶段。

案例价值:

很多业务问题不是“知识不够”,而是“用户说法太口语”。Agent 必须先判断用户真正想完成的动作,而不是急着给答案。

4.4 安全边界:UID + 原子事件查询不能越过工具层

匿名后的原始问题:

1
UID A 看下这个原子事件 X 有没有数据吗?

这个案例最有警示意义。表面上看,用户只是想查一个 UID 是否触发了某个原子事件。但 Agent 在第一次处理时,为了尽快给出结果,曾尝试绕过工具层,直接调用内部协议库、手写脚本连接生产环境查询数据。

这类行为的问题不在于“能不能查到”,而在于它破坏了框架的安全边界:

  • 动态数据必须通过 tools/index.md 中登记的受控工具查询。
  • 工具层没有提供能力时,不能临时 import 内部协议库补能力。
  • 不能绕过参数白名单、工具契约和审计边界。
  • 工具能力不足时,应说明能力边界,并给出人工验证方案。

正确处理方式应该是:

  1. 先确认原子事件 X 是事件模板,不等价于某个积分值。
  2. 说明仅凭 UID + 原子事件无法直接判断“有没有数据”。
  3. 请用户补充游戏产品、比赛场次、具体积分或 CLS rule_id。
  4. 如果已有受控工具,就通过工具查;如果没有,就停止在能力边界。

这个案例验证的能力:

  • 安全规则不能只写在文档里,还必须能被测试和拦截。
  • Agent 在“想给出答案”的压力下会越界。
  • Guard / Hook 的价值不是限制能力,而是防止能力失控。

案例价值:

没有边界的 Agent 很危险。真正可用的业务 Agent,不是“什么都能查”,而是知道什么必须通过受控工具查,什么不能自己绕过去查。

4.5 机制确认:ESP 白名单结束时间能不能直接改

匿名后的原始问题:

1
这个 ESP 规则明天发布,现在改白名单结束时间能行吧?

这个问题的难点不在结论,而在路由。用户问的是“这样做行不行”,本质是机制确认,不是要求 Agent 立即查全量配置。

Agent 最终给出的机制解释是:

  • 规则级过期时间、组件 filter 时间、灰度 / 白名单时间,是三层不同控制。
  • 白名单结束时间只影响“谁命中白名单”,不决定规则是否上线。
  • 如果当前时间不在白名单时间窗口内,结果可能不是“规则失效”,而是“白名单失效,所有人放行”。
  • 因此单纯改白名单结束时间通常不足以判断规则是否会按预期生效,还要确认 filter 组件时间和规则发布时间。

这个案例后来推动路由增加一类规则:

1
2
“这样做对不对 / 直接改这个就行吧 / 是不是改这个”
→ 优先按机制确认处理,不自动进入全量数据搜索。

这个案例验证的能力:

  • Agent 能区分“机制确认”和“数据查询”。
  • 用户只是问可行性时,不应该过度检索。
  • 路由不仅决定查什么,也决定不查什么。

案例价值:

答案对但链路过重,也是一种问题。好的 Agent 不只是能查,还要知道什么时候不该查。

4.6 字段语义:当日触发积分是否需要有效时长

匿名后的原始问题:

1
积分 A 这种“当日触发”的积分,需要设置有效时长吗?

这个问题看起来像经验判断,但真正的权威源头应该是 DDL 字段语义和线上配置。

Agent 先查询积分 A 的配置,确认它属于按天切换 key 的类型,且已经配置了有效时长。随后回到 DDL 字段说明,解释 lifecycleexpiretime 的区别:

  • lifecycle_unit=day 只表示按天切换 key。
  • lifecycle_switchhour 决定每天什么时候切换到新 key。
  • lifecycle 机制不会自动删除旧 key。
  • expiretime 控制 Redis TTL,决定旧 key 什么时候被清理。

因此结论不是“必须设置”,而是:

对“当日触发”类积分,虽然不是强制,但强烈建议配置有效时长;否则 Redis 旧 key 可能长期保留,带来内存增长风险。

这个案例最终推动 DDL 注释收敛:把 lifecycle 只负责切 key、不负责删除旧 key 的语义写到权威源头里,而不是只在某个 SOP 或回答里打补丁。

这个案例验证的能力:

  • 字段语义问题要回到 DDL,而不是凭经验回答。
  • 线上配置只能证明“当前值是什么”,DDL 才能解释“字段为什么这样设计”。
  • 最小修改往往比新增一堆文档更有效。

案例价值:

能沉淀到 DDL 的规则,不要散落在经验文档里。权威源头越清晰,Agent 后续越不容易答偏。

4.7 小结:文本案例比截图更适合公开传播

如果这篇文章只在内部分享,截图当然更直观;但发到个人博客时,截图会带来三个问题:

  • 真实 ID、人员、路径、系统名很难彻底脱敏。
  • 大面积打码会破坏可读性,读者反而看不清案例价值。
  • 截图容易把注意力带到局部细节,而不是框架设计本身。

所以第四章建议统一采用“文本化案例复盘”的写法:

1
2
3
4
5
6
匿名问题
→ Agent 处理链路
→ 关键证据
→ 结论
→ 这个案例验证了什么能力
→ 它反过来推动包做了什么迭代

这比展示截图更克制,也更适合本文的主题:介绍 EVT-HIS-ops 的框架、结构和思想,而不是复现某一次内部排障的全部细节。

验证口径说明

本文提到的约 20~22 轮验证,主要是基于真实业务会话进行的探索性测试和迭代,并不是预先冻结测试集的标准化评测。当时没有统一记录首轮通过率、平均耗时、人工介入比例,以及不同模型之间的量化差异。因此,这些案例能够说明能力包在部分真实场景中已经可用,也确实帮助我发现了知识、路由、工具和安全方面的问题,但不足以证明它在全部已适配场景中都达到了人工同等水平。

仓库中后续补充的场景测试,主要检查入口、路由、SOP、工具契约和安全规则是否发生回归。其中一些属于结构和规则校验,并没有真正执行一次完整的模型问答或生产工具调用,所以也不能直接等同于端到端回答正确率。更严格的效果评估,还需要固定题集、评分标准、模型与版本信息,以及耗时和人工介入记录。


五、方法论

在构建这个 Agent 功能包的时候,踩了一些坑,也逐渐学习到了很多东西。总结了一些经验,这一章就是让 AI 根据我的个人笔记进行整理生成的方法论:一套业务资料要变成 Agent 能稳定使用的工作系统,关键不在于文档堆得有多厚,而在于事实如何归位、问题如何路由、动作如何受控、结果如何验证。

5.1 资料不是越多越好,关键是标注性质

AI 很擅长整理资料,也很擅长把不完整的资料串成一个看起来完整的故事。如果资料本身有错,它可能把错整理得更像真的;如果资料之间互相矛盾,它可能为了自圆其说,把几个版本揉成一个并不存在的结论;如果资料只是规划,它也可能推断成已经落地的事实。

所以第一步不是把所有资料直接喂给 AI,而是先标注资料性质:哪些是当前事实,哪些是历史背景,哪些是规划,哪些已经废弃,哪些来自源码,哪些来自 DDL,哪些只是线上观察。资料性质不清楚,后面的总结、路由、SOP 和工具判断都会带着风险。

这也是为什么 EVT-HIS-ops 一开始就强调证据等级和权威顺序。历史文档可以解释系统为什么发展成这样,但不能单独证明当前行为;源码能确认当前代码怎么运行,但不能替代线上数据;DDL 能解释字段设计,但不能说明某条数据当前值是多少。每类资料都有自己的边界。

使用 AI 时,也不能只问“是不是这样”。更可靠的方式是让它列证据、找反例、区分事实和推断,并让不同 AI 交叉验证。AI 越会顺着问题组织答案,越需要我们在资料入口就把事实边界讲清楚。

多模型交叉审阅是这一步里很有用的方法,但它的价值不是“投票选答案”。不同模型会有不同盲区:有的擅长结构,有的擅长细节,有的更适合做反向审查。真正有效的做法,是让多个 AI 分别生成、互相质疑,再由人按使用场景综合取舍。最终保留的是覆盖更完整、边界更清晰的结构;其中的事实仍需回到权威来源确认。

5.2 路由优先于搜索,流程优先于解释

业务支持包不是普通知识库。普通知识库只要能搜到相关内容就算有用,但运维排障不一样:用户问“积分没到账”,Agent 不能随机搜出几篇包含“积分”的文档后开始解释系统概念,它必须先判断这是故障排查、字段含义、动态查询还是机制确认。

这就是确定性路由的价值。路由不是回答问题,而是把 Agent 送到离答案最近的位置。故障进 SOP,概念进知识库,字段进 DDL,动态状态进工具层,包自身维护进维护规则。先判方向,再找入口,能减少无效上下文,也能降低误判。

SOP 则解决另一个问题:到了正确入口之后,Agent 应该按什么顺序处理。知识文档回答“这个系统是什么”,SOP 回答“遇到这个问题先查什么、再查什么、证据不够时停在哪里”。没有 SOP,Agent 容易把排障写成系统介绍;有了 SOP,它才能沿着固定链路取证。

所以这套包里最重要的不是“文档很多”,而是“问题能被路由,动作能被编排”。文档多但没有入口,Agent 会迷路;入口对但没有流程,Agent 会绕路。

5.3 每类事实都要有自己的权威源头

EVT-HIS-ops 能持续迭代,一个关键原因是它没有把所有内容混在同一个大文档里。字段语义、源码行为、线上状态、操作流程、Agent 行为边界、包自身维护规则,都有各自的权威源头。

信息类型 权威源头 Agent 应该怎么用
字段类型、字段含义 DDL 先查表结构,再解释字段
当前代码行为 源码 / 源码分析文档 源码优先于历史文档
线上动态状态 受控工具 工具失败必须降级
运维处理顺序 SOP 按步骤取证,不跳步
Agent 行为边界 AGENT.md 不确定时停止或降级
包自身维护 MAINTAINING.md 找最贴近的修改点,并同步验证

单源权威的意义是,问题出现时能找到最该改的地方。字段解释不准,就回到 DDL;路由走错,就改快速路由;操作链路不完整,就补 SOP;动态查询缺口,就补工具契约或明确降级;安全越界,就加 Guard/Hook 或测试。

如果不这样做,每次发现问题都在上层文档里补一句,短期看快,长期一定会变成新的混乱。Agent 以后可能从不同入口进入同一个问题,如果权威事实散落在多个地方,它迟早会读到不一致的信息。

5.4 工具必须受控,安全必须可执行

静态知识只能解释机制,真实排障经常需要动态数据。工具层让 Agent 能查询配置、接口、日志、协议和机器信息,这是它从“会解释”走向“能协助排障”的关键一步。

但工具能力越强,边界越重要。Agent 不能因为想给出完整答案,就绕过工具层去写临时脚本、直连数据库、直连协议或调用未受控接口。工具层必须有参数白名单、能力契约、失败语义和证据等级。工具不可用时,正确做法是暴露缺口,给出人工补查方案,而不是临时发明一条路。

安全也不能只写在文档里。文字规则能提醒 Agent,但不能保证它在上下文压力下永远遵守。真正可靠的边界需要多层共同作用:AGENT.md 写清红线,Guard/Hook 做运行时拦截,测试体系持续回归,生产写操作由人工审核。

换句话说,安全规则必须可执行。只可阅读的安全规则,最终会在某次“我想帮用户把答案查全”的冲动里被绕过去。

5.5 答案对不代表链路对

实战验证里最重要的认识是:答案对了,不代表这次处理就是成功的。

如果答案对,但 Agent 读了太多无关文档,说明路由或意图判断有问题;如果答案对,但没有标注证据等级,说明结论不可追溯;如果答案对,但工具失败时仍然说得很确定,说明降级语义有问题;如果答案对,但越过了受控工具层,那不是成功,而是事故。

真正可维护的 Agent 系统,看的不是某一次有没有蒙对,而是它的链路能不能重复、证据能不能复核、风险能不能阻断、错误能不能反向沉淀回包里。每次真实问题暴露缺口后,都应该问一句:从修改这个包的角度,怎么保证以后不再犯?

这个问题会逼着你寻找最小、最近、最权威的修改点。可能是一行路由别名,一处 DDL 注释,一条证据规则,一个工具命令表的重排,或者一个场景测试。小改动如果改在正确位置,比大范围重构更可靠。

5.6 最值得避免的坑

  • 把历史文档当当前事实。
  • 把规划当执行结果。
  • 文档很多但没有路由。
  • 路由按技术模块设计,不按用户问法设计。
  • 字段语义写在上层文档里,没有回到 DDL。
  • 工具缺口时临时写脚本绕过工具层。
  • 工具失败仍返回成功。
  • 只看答案,不看链路。

六、复刻指南

本章由 AI 通过分析包的当前架构和生成过程中的所有历史对话总结生成。

如果你看完前面的 EVT-HIS-ops,想照着做一套自己的业务支持包,不要一开始就复刻完整架构。

EVT-HIS-ops 现在看起来有入口、路由、SOP、知识库、DDL、工具层、Guard、测试和维护规则,但这些不是第一天就应该全部做完的东西。第一次做这类包时,更稳的做法是先做一个最小可行版本:让 Agent 能围绕一个小业务域,稳定回答 3 到 5 个高频问题。

第一版的目标很简单:

  • Agent 知道自己负责什么。
  • Agent 知道先读哪个入口。
  • Agent 能按路由找到资料。
  • Agent 能按 SOP 处理几个典型问题。
  • Agent 知道哪些结论有证据,哪些需要人工确认。
  • Agent 不会越过安全边界乱查、乱改、乱执行。

先把这条最小链路跑通,再慢慢补知识、补工具、补测试。不要第一步就追求“完整平台”,那样很容易还没跑起来就被架构复杂度拖住。

6.1 先选一个足够小的问题域

复刻业务支持包的第一步,不是建目录,而是选范围。

范围一定要小。不要一上来就说 “我要做一个覆盖整个部门的 AI 运维系统”。更好的选择是一个你熟悉、重复、可验证的小领域。

比如:

不建议一开始选 更适合第一版选择
整个运维体系 某一类配置不生效排查
整个客服知识库 某一类高频用户问题
整个数据平台 某几张核心报表口径解释
整个代码仓库 某个服务的编译和常见报错
整个业务后台 某几个固定操作流程

判断一个问题域适不适合,有三个标准:

标准 含义
经常出现 你已经重复解释过很多次
有资料可查 有文档、代码、表结构、日志、截图、历史记录
能验证对错 可以通过源码、配置、接口、日志、人工经验判断答案是否正确

如果一个问题每次都完全不一样,也没有稳定资料,那暂时不要把它作为第一版目标。第一版要挑 “重复、明确、能验证” 的问题,这样才容易做出效果。

6.2 先搭一个最小目录,不要照搬完整架构

第一次复刻时,第一版目录越简单越好。

可以先从这几个文件开始:

1
2
3
4
5
6
7
8
9
10
11
12
13
my-business-pack/
├── README.md
├── AGENT.md
├── knowledge/
│   ├── INDEX.md
│   └── basic.md
├── sops/
│   ├── ROUTE_QUICK.md
│   └── first_problem.md
├── tools/
│   └── index.md
└── tests/
    └── golden_questions.md

这些文件各自承担的职责是:

文件 第一版作用
README.md 给人看,说明这个包是什么、怎么加载、能解决什么问题
AGENT.md 给 Agent 看,定义角色、范围、证据规则和安全边界
knowledge/INDEX.md 知识索引,告诉 Agent 业务资料在哪里
knowledge/basic.md 第一批核心业务知识
sops/ROUTE_QUICK.md 快速路由,用户问什么先读哪个 SOP
sops/first_problem.md 第一个高频问题的处理流程
tools/index.md 工具能力索引,第一版可以先写“暂无自动工具,人工查询方式如下”
tests/golden_questions.md 真实问题样例,用来反复测试 Agent 是否走对链路

这套目录不复杂,但已经有了一个业务支持包的最小骨架:

1
2
3
4
5
6
7
入口说明
→ Agent 行为规则
→ 知识索引
→ SOP 路由
→ 具体处理流程
→ 工具或人工查询说明
→ 测试问题

等第一版跑顺了,再考虑拆 DDL、加工具契约、加 Guard、加自动化测试。不要一开始就把 EVT-HIS-ops 的完整目录全部复制过去,否则很容易出现很多空目录、空规则和没人维护的结构。

6.3 把资料先分成三类:知识、流程、动态数据

很多人做业务知识包时,第一步就会把所有资料丢给 AI,让它 “总结成文档”。这很危险。

更稳的做法,是先把资料分成三类:

类型 放哪里 说明
静态知识 knowledge/ 系统是什么、概念含义、背景、字段解释、源码结论
处理流程 sops/ 遇到某类问题时,先做什么、再查什么、什么时候停
动态数据 tools/ 当前配置、线上状态、接口返回、日志查询、人工查询方式

这三类不要混在一起。

比如 “某个字段是什么意思”,应该放在知识或表结构里;“配置不生效怎么排查”,应该放在 SOP 里;“怎么查当前线上配置”,应该放在工具索引或人工查询说明里。

这样做的好处是:后面出错时容易定位。

  • 概念讲错了,改 knowledge/
  • 排查顺序错了,改 sops/
  • 查询方式错了,改 tools/
  • Agent 进错入口,改 sops/ROUTE_QUICK.md 或知识索引。

第一版整理资料时,还要特别标注资料性质:

1
2
3
4
5
6
这是当前事实。
这是历史背景。
这是规划方案。
这是已废弃逻辑。
这是源码确认。
这是人工经验,未完全验证。

AI 很容易把 “计划要做” 写成 “已经完成”,也容易把 “旧文档里的行为” 写成 “当前系统行为”。资料性质标清楚,后面 Agent 才不容易说过头。

6.4 用多个 AI 交叉生成和审查

这里早期使用过“多 AI 交叉验证”的说法,更准确的含义其实是 多模型交叉生成与审阅。多个模型给出相似答案,只能说明它们可能发现了相同结构,也可能是同时受到了同一份错误资料影响。多模型适合暴露遗漏、矛盾和组织偏差;事实是否成立,最终仍应由源码、DDL、受控线上查询或业务人员确认。

资料分好类之后,就可以让 AI 帮你生成第一版知识文档、路由和 SOP。但这里有一个关键点:不要让同一个 AI 一路从生成、审查到定稿全部做完。

比较稳的做法是把多个 AI 当成不同角色使用:

角色 任务 产出
AI A:初稿生成 根据资料生成第一版知识文档或 SOP 初稿
AI B:独立生成 不看 AI A 的版本,基于同一批资料再生成一版 对照稿
AI C:审查对比 对比 AI A / AI B,找冲突、遗漏、过度推断 审查意见
人:最终裁决 判断哪些内容可信,合并成正式版本 定稿

这个过程不是 “投票”。不是两个 AI 都这么说就一定对,也不是哪个 AI 写得漂亮就用哪个。多 AI 的价值在于暴露盲区:一个 AI 可能结构清楚但漏了字段,另一个 AI 可能覆盖细节但把规划当事实,第三个 AI 可能能看出两份稿子之间的矛盾。

0. 什么时候适合用多个 AI

不是所有步骤都需要多 AI。下面几个节点最值得用:

节点 为什么适合交叉验证
处理大量历史资料 容易把旧文档、规划文档、当前事实混在一起
生成核心知识文档 一旦知识底座错了,后面路由、SOP、工具都会受影响
生成 SOP 容易漏步骤,或者把背景知识写成操作流程
设计证据规则和安全边界 容易写得太松,Agent 后续会说过头或越界
真实问题复盘后改包 容易过度修改,需要另一个 AI 帮你找最小改动点

第一版可以不用每个文件都走多 AI 流程,但核心知识文档、核心 SOP 和安全边界,最好至少让两个 AI 交叉看一遍。

1. 让 AI A 生成初稿

给 AI A 的任务是 “生成”,但要明确告诉它资料性质和未来用途。

可以用这个 prompt:

1
2
3
4
5
请把下面资料整理成供 Agent 排障和问答使用的知识文档。
先区分当前事实、历史背景、规划和可能过时的信息,不要把规划或旧行为写成当前事实。
按“范围、核心概念、常见问题、关键字段/配置、证据来源、风险边界、关联入口”组织;无法确认的内容标注“需要人工确认”,不要补充资料中没有的结论。

资料:【粘贴资料】

如果是生成 SOP,可以换成:

1
2
3
4
请根据下面资料,为“XXX 问题”生成一份供 Agent 执行的 SOP。
写清最小必要信息和分步处理链路;每一步说明确认目标、证据来源和证据不足时的处理方式。区分已确认事实、候选原因和待补信息,不自动执行写操作,只输出人工审核方案。

资料:【粘贴资料】

2. 让 AI B 独立生成一版

AI B 不要看 AI A 的结果。它要基于同一批资料独立生成一版,这样才有对照价值。

prompt 可以基本相同,但加一句:

1
2
请独立生成,不要参考其他 AI 的版本。
你的重点是:发现资料里的事实边界、冲突点、遗漏信息,并生成你认为最适合 Agent 使用的版本。

这一步的目的不是多写一份文档,而是制造差异。差异越明显,越说明这里需要人工裁决。

3. 让 AI C 做对比审查

拿到两份稿子后,再让第三个 AI 做审查。这个 AI 的任务不是重写,而是挑问题。

可以用这个 prompt:

1
2
3
4
5
请审查下面两个版本,不要直接重写。找出事实冲突、把规划或历史写成当前事实的内容、缺少证据的确定性结论,以及入口、边界或步骤不清的结构。
输出:冲突点、过度推断、缺失证据、建议保留内容和必须人工确认的问题。

版本 A:【粘贴 AI A 结果】
版本 B:【粘贴 AI B 结果】

审查结果里,最重要的不是 “推荐合并结构”,而是 “冲突点” 和 “必须人工确认的问题”。这些地方不能让 AI 自己拍脑袋决定,必须由熟悉业务的人裁决。

4. 由人合并定稿

最后一步一定要由人来定。

人的任务不是逐字润色,而是做三件事:

  1. 确认事实:哪些结论确实可信,哪些只能写成推断。
  2. 确认边界:哪些内容不属于第一版覆盖范围。
  3. 确认入口:Agent 以后遇到什么问题应该读这份文档。

合并时可以让 AI 帮忙整理,但必须要求它只按人工确认的保留、删除和待确认清单处理,不新增事实结论,并保留“需要人工确认”标记。

5. 把交叉验证结果反向沉淀

多模型交叉审阅不是一次性的写作技巧,而是后续迭代方法。

每次真实问题暴露出错误,都可以用同样方式处理:

1
2
3
4
一个 AI 复盘为什么错。
另一个 AI 检查这个复盘是否过度修改。
第三个 AI 帮你找最小改动点。
最后由人决定改路由、改 SOP、改知识、改工具,还是改安全规则。

尤其要警惕一种情况:Agent 第一次答错后,往往会倾向于 “大改一堆文件” 来显得重视问题。这时可以专门让另一个 AI 审查:

1
2
3
4
请从维护者角度审查下面的修复方案:它是否过度修改?有没有更小、更贴近根因的改动?应优先改路由、SOP、知识、DDL、工具还是安全规则?哪些修改可以暂缓?

错误现象:【错误回答和用户反馈】
原方案:【Agent 的修改方案】

这样做的目标是让业务支持包持续收敛,而不是越修越膨胀。

6.5 写入口规则:先让 Agent 知道自己是谁

第一版最重要的文件之一是 AGENT.md

它不需要很长,但必须说清楚四件事:

  1. 这个 Agent 负责什么范围。
  2. 它不负责什么范围。
  3. 回答时怎么区分证据等级。
  4. 哪些事情绝对不能做。

可以按这个模板写:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
# XXX 业务支持包 Agent 规则

## 角色与范围

你是 XXX 业务助手,负责 XXX 场景下的查询理解、排障建议、操作说明和知识检索。

覆盖范围包括:
- A 系统
- B 服务
- C 类配置
- D 类常见问题

范围外问题可以提供通用建议,但必须说明“不属于本包稳定覆盖范围”。

## 证据规则

回答关键结论时,必须区分:
- 源码确认
- 配置/表结构确认
- 工具或人工查询确认
- 知识文档推断
- 需要人工确认

不能把推断写成事实。

## 安全边界

默认只读。
不能自动执行写操作、删除操作、生产变更、权限变更。
需要变更时,只能输出人工审核方案,包括目标、命令、风险、验证和回退。

有了这个文件,Agent 至少知道 “我是谁”、“我能管什么”、“我不能乱做什么”。这比一开始写很多知识文档更重要。

如果一个包没有角色和边界,Agent 很容易变成泛泛回答:用户问什么都答,证据不够也答,工具没有也想办法绕过去答。业务支持包要避免的正是这种状态。

6.6 写路由和 SOP:先覆盖 3 到 5 个高频问题

入口规则写完之后,就可以写路由和 SOP。

第一版不要写十几个 SOP。先选 3 到 5 个最常见的问题,写清楚就够了。

比如一个内部配置系统的业务支持包,第一版可以只覆盖:

  • 配置改了没生效。
  • 某个字段是什么意思。
  • 新增配置需要哪些步骤。
  • 查询某条配置当前状态。
  • 常见报错怎么处理。

sops/ROUTE_QUICK.md 可以先写成这样:

1
2
3
4
5
6
7
8
# SOP Quick Route

| 用户问题 | 首读文件 | 说明 |
| --- | --- | --- |
| 配置改了没生效 | config_not_effective.md | 按发布、下发、缓存、服务加载顺序排查 |
| 字段是什么意思 | ../knowledge/INDEX.md | 先查字段定义,再看业务说明 |
| 新增配置怎么做 | add_config.md | 输出人工操作步骤和风险检查 |
| 报错 XXX | error_xxx.md | 按错误码和日志排查 |

具体 SOP 不要写成知识介绍,要写成处理链路。

一个 SOP 可以按这个结构写:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
# 配置改了没生效 SOP

## 最小必要信息

- 配置名
- 环境
- 修改时间
- 预期效果
- 当前现象

## Step 1:确认配置是否真的修改

需要用户提供截图或通过工具/人工方式确认配置记录。

## Step 2:确认是否发布

如果未发布,结论是“配置未进入生效链路”。

## Step 3:确认服务是否加载

查看服务日志或缓存刷新记录。

## 输出要求

- 已确认事实
- 可能原因
- 缺失证据
- 下一步动作

这就是一个最小可用 SOP。它不需要一开始就特别完美,只要能让 Agent 面对同类问题时不乱跑,就已经有价值。

6.7 工具层先占位,能人工查就先人工查

很多人会卡在工具层:没有 MCP、没有 API、没有自动查询脚本,就觉得业务支持包做不起来。

其实第一版可以没有自动工具。

tools/index.md 可以先写人工查询方式:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# 工具索引

## 当前状态

第一版暂无 Agent 可直接调用的自动工具。
涉及线上数据时,Agent 只能输出人工查询请求,等待用户回填结果。

## 人工查询模板

### 查询配置当前状态

请运维人员在 XXX 平台查询:
- 配置名:
- 环境:
- 修改时间:

回填字段:
- 当前状态:
- 发布时间:
- 生效机器:
- 错误信息:

这已经比没有工具层强很多。因为 Agent 至少知道:

  • 当前不能自己查。
  • 应该让人查什么。
  • 人回填什么字段后才能继续判断。
  • 没有查询结果时不能下确定结论。

等第一版稳定后,再把最常用的人工查询逐步改成受控工具。

接工具时也要从只读开始,而且要有白名单参数。不要一上来就让 Agent 能执行任意 SQL、任意 HTTP 请求、任意生产脚本。工具层的目标不是让 Agent 权限最大,而是让它在可控范围内拿到真实证据。

6.8 用真实问题测试,而不是只用自己想象的问题

最小版本写完后,不要急着继续扩目录。先拿真实问题测试。

可以从这些地方收集:

  • 群聊里同事问过的问题。
  • 历史工单。
  • 客服记录。
  • 事故复盘。
  • 自己过去反复解释过的问题。
  • 新人经常问的问题。

把这些问题放进 tests/golden_questions.md

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
# Golden Questions

## Q1

用户原话:
配置 A 改了为什么没生效?

期望路由:
sops/config_not_effective.md

期望行为:
- 先索要配置名、环境、修改时间
- 不直接判断根因
- 提醒确认发布和服务加载状态

## Q2

用户原话:
字段 expire_time 是什么意思?

期望路由:
knowledge/INDEX.md 或 DDL

期望行为:
- 先解释字段含义
- 区分设计含义和线上实际值

测试时不要只看答案对不对,还要看链路对不对。

如果答案对了,但 Agent 绕了很多无关文档,也要改路由。如果 Agent 没有证据就下结论,要改证据规则。如果 Agent 遇到工具缺口还继续猜,要改工具索引或 SOP。

每次出错后,不要只纠正这一次回答,而要问:

1
从修改这个包的角度,怎么保证以后不再犯?

然后把修复落到最贴近根因的位置:

问题 优先修改位置
进错入口 路由
缺少概念 知识文档
排查顺序错 SOP
字段解释错 字段定义或 DDL
缺少查询能力 tools/index.md
证据说太满 AGENT.md 证据规则
出现危险动作 安全边界和工具规则

6.9 第一版完成后,再逐步长成完整能力包

一个业务支持包的第一版,不需要第一天就变成 EVT-HIS-ops 这样完整。

第一版只要做到下面这些,就算成功:

1
2
3
4
5
6
7
8
有入口说明。
有 Agent 角色和边界。
有一份知识索引。
有一份快速路由。
有 3 到 5 个 SOP。
有工具层占位或人工查询模板。
有 10 到 20 个真实问题样例。
Agent 能按正确链路回答一部分高频问题。

之后再按真实问题慢慢补:

演进方向 什么时候补
拆分更多知识文档 单个知识文件太长、Agent 经常读多余内容时
增加 DDL / 字段权威源 字段含义经常被问、经常答错时
接入自动工具 某个人工查询反复出现、参数稳定时
增加测试 某类问题反复回归、容易改坏时
增加 Guard / Hook Agent 可能执行高风险动作时
增加维护规则 多个人或多个 AI 开始一起改这个包时

也就是说,不是先设计一个完美系统,再开始使用;而是先做一个能跑的最小版本,再用真实问题一点点把它压实。

EVT-HIS-ops 最值得复刻的,不是某个目录名,也不是某个工具脚本,而是这个循环:

1
2
3
4
5
6
7
8
9
10
选一个小问题域
→ 建最小目录
→ 写入口和边界
→ 整理知识
→ 多 AI 交叉生成和审查
→ 写路由和 SOP
→ 工具层先占位
→ 用真实问题测试
→ 出错后改最贴近根因的位置
→ 慢慢补成完整能力包

只要这个循环跑起来,一个新人也可以从很小的版本开始,把自己的业务经验一点点沉淀成 Agent 能稳定协作的能力包。

七、个人思考

做 EVT-HIS-ops 的背景其实很简单:我要在离职前把工作交接出去。

在把工作交接给同事的时候,我发现把工作交接给同事与交接给 Agent,要做的事情很相近:都需要把业务一步一步描述清楚,甚至是落成操作文档。那既然这样,我为什么不直接交接给 Agent 呢?当这个想法刚冒出来的时候,我感到很兴奋,因为这是一件多方获利的事:

既能让自己通过实际项目深入学习 Agent,也能减轻同事的交接压力,甚至还能转化为领导的业绩。

于是,我先付费了 cursor、gemini、codex、claudecode、DeepSeek,然后开始着手做这件事。

一步一步,一点一点,正如这篇文章前面描述的那样,我最终把这个包实现成了我想象中的样子。

做完之后回头看,AI Agent 通过使用这个包,已经能达到很棒的效果了:

  • 在若干已经适配的高频业务场景下,AI 已经能够复现我日常处理这类问题时的主要路径和结论。
  • 在源码追溯、字段排查和多份资料汇总这些问题上,AI 有时比我手工处理更快,覆盖的线索也更多。
  • 在低频业务场景下,AI 会因为知识库内容缺失、SOP 未覆盖而回答不上来(其实一开始这种场景下它会瞎编,但补充安全策略后,AI 已经能诚实地说自己不知道了)。随着更多真实问题被纳入,能力包的覆盖范围还会继续扩大;但低频异常、跨系统故障和需要现场判断的问题,仍然需要人参与。

这样看来其实很震惊,因为通过这个包,AI 已经可以接手我过去承担的一部分重复性业务支持了。

说得再直白一点:我亲手用 AI 把自己的一部分重复工作代替了。这里的“代替”,主要指高频、可描述、可验证的工作,不包括复杂判断、生产变更和最终责任。

那从此之后,所有人都把自己重复性、有规则、可描述的工作提炼成一个这样的包,那岂不是所有人就都可以被代替然后下岗了?

可能不久的将来真的会这样,但至少现在会有难度,因为 公司推 Agent 工作流,阻力不在技术,在人。

这次我能完整快速的做出来这样一个包,有一个很重要的前提:我是在离职交接,没有 ”被替代” 的恐惧,只有纯粹的对技术的探索,我在实现这个包的过程中获得了很大的成就感。

但如果在一个正在平稳运行的公司中,事情就不一样了。

懂 AI 的人不懂业务,懂业务的人担心 Agent 跑通后自己失去价值,想推行 AI 的领导既不懂业务也不懂技术。

一个可用的业务包需要真正懂业务的员工手动定制,而这个懂业务的员工恰恰是最担心被替代的人。复杂链路还需要懂技术的程序员开发 API、MCP、权限和审计,而程序员自己也在被替代的焦虑里。

公司如果只盯着裁员降本,推进一定会被卡住,尤其是当其他员工看到第一个因为 AI 而被裁掉的同事之后,阻力一定会产生。

所以公司正确的做法不是裁掉那些懂业务的人,而是让懂业务的人主导流程自动化,把省出来的时间投到创新和新业务上,这样公司的业务方向能够得到拓展,员工也能获得更大的成就感和积极性。而如果选择把人都裁掉的话,短期成本可能下降,但长期来看,公司会失去应对突发情况的处理能力,也会逐渐失去对环境市场的嗅觉和适应能力,成为一家失去活力的公司。

如果 Agent 只是玩具,没人会害怕它。但它现在真的能接手一部分人的工作,所以才触发了大家的焦虑、恐惧和抵触。

但换个角度想:恐惧反而证明了价值

对我们个人而言,越早用 AI 越好。这里说的 “用 AI ”,不是简单的跟豆包聊天问问题,而是让 AI 帮助你在工作生活中提速,帮助你解放出生产力,好让你有时间和精力做自己的事情。

这也是我产出这个 Agent 包之后的最大感悟:把重复劳动交给 Agent,我有更多时间去做需要判断力的事。用 AI 不会让你被替代。不用 AI,反而会被困在重复劳动里,然后被会用 AI 的人替代。

AI 不是来抢工作的,是来重新分配时间的。查资料、初步排查、结构化整理,交给 AI。判断、创造、设计、探索新业务,留给人。

要发挥 Agent 的优势,就要学会怎样限制他。

AI 拥有专业的思维方式、成熟的技术方案、广泛的知识资源,这是他的优点,也是他在面对定制化场景时的缺点,比如说行业技术软件,如果不建设自己的知识库和 MCP,任由 AI 回答,那 AI 只会回答的一团糟糕;比如说我这次建设的 EVT-HIS 运维技能包,如果没有这个包,AI 不仅不能理解啥是 EVT/HIS,也不能根据实际线上情况解答同事的实时问题。

所以为了能让 AI 在定制化场景中,充分发挥他的优势,我们就需要对 Agent 进行限制。

本文前半部分讲的路由、SOP、Guard/Hook、安全护栏,其实都可以算是对 Agent 的限制:路由减少走错入口的概率,SOP 约束处理步骤,Guard 在正确接入的平台上检查并阻断部分已知越界模式。再配合独立的网络和权限边界,Agent 才可能在受控范围内稳定地接手重复劳动。

在 Agent 运维包建设初期的测试中,Agent 在没有 Guard 拦截的情况下,为了查一条数据直接绕过工具层、手写脚本直连生产环境。我盯着他的思考过程,当看到他真的连上外网生产环境时,没有任何犹豫我直接中止了这个任务。被 Agent 能力上限震惊到的同时,我只感到后怕。

Agent 如果没有充分限制,就会带来隐患。反过来看,也正是因为逐步补充了规则、工具准入、应用层检查和人工审核,我才敢交出去更多任务。这里仍需强调:生产安全不能只依赖这个包本身,还要由网络、凭证和系统权限提供更底层的保障。这个 Agent 包的设计思想看起来是在限制 AI,但目标恰恰相反:通过约束提高可信,通过可信扩大可委托的范围。

放到更大的背景里看,AI 不只是某个公司、某个岗位的工具变化。

国内对 AI 的推动已经持续了很多年。从 2017 年的《新一代人工智能发展规划》,到这几年政府工作报告反复提 “人工智能 + ”,今年上半年三大运营商争相推出 token 套餐。方向很清楚:AI 会被铺成新的基础设施。

回到个人身上,AI 浪潮来了,能做什么。我的看法是不要悲观。历史上每次技术变革都有冲击,但每次也都有人找到新的路。

如果生产力真的被大量释放,人的选择可能会回到兴趣本身。

这是我在做 Agent 运维包的过程中慢慢冒出的一个想法。

这个包经历了多轮真实问题验证之后,我发现一个有意思的现象:最消耗时间的,不是那些需要判断力的复杂问题,而是 “这个字段是什么意思”、“这个配置为什么没生效”、“帮忙查一下这个 ID 的数据”。答案明确、链路固定,但每次都占用十几分钟。Agent 接管这部分之后,我可以把更多时间花在架构设计和探索新业务上。这就是生产力释放在个人身上最具体的版本。

把这种体验放大来看:如果大量这类工作能被 Agent 稳定承接,人的时间就会从重复劳动向判断和创造倾斜。当然,这不只取决于技术。分配机制、教育体系、社会保障能不能同步演进,同样重要。技术提供了可能性,制度和社会共识决定了 “可能性” 能不能变成 “现实”。

如果这些条件陆续成熟,中华文化可能会迎来一次非常蓬勃的发展。当更多人不再完全为了工资选择职业,书法、非遗、文学、音乐、教育、社区组织这些领域就可能获得大量此前被 “没时间” 困住的人才。

再往前想一步,这也许就是我们实现大同社会的一把钥匙。当然,这不是明天就会发生的事,中间一定经历很多冲击、调整和变化。

这次的 Agent 运维包虽然只是一个具体业务的支持包,但它让我看到了这件事在微观层面是怎么发生的。或许在不久的将来,这些梦想都会走进现实。

八、总结

EVT-HIS-ops 最初只是一个很朴素的想法:能不能让 AI 接手一部分 EVT/HIS 的业务运维工作。

做完之后,它证明的不是 “AI 可以读很多文档”,而是另一件更具体的事:

对可总结、可复用、可验证的重复性业务工作,人的经验可以被组织成一套 Agent 能稳定加载、按规则执行、按证据回答、按边界停止的业务支持系统。

这套能力包最值得保留的,不是某个目录名或某个工具脚本,而是把业务经验重新整理成几类可执行问题:哪些是事实,哪些是推断;遇到问题先查哪里;什么能自动查询,什么必须人工审核;证据不足时何时停止;回答出错后应该修正路由、SOP、知识、DDL 还是工具。过去写交接文档主要是为了让后来的人看懂,现在还需要让 Agent 能按明确入口、证据等级和安全边界接着工作。

EVT-HIS-ops 已经跑通了一条从个人经验到结构化资料、可路由知识、SOP、受控工具和持续迭代的路径,但它还没有证明 Agent 能独立覆盖全部运维工作。低频场景仍需要补资料,端到端效果还缺少统一评测,Guard 的自动执行依赖运行平台,生产安全最终仍要依靠网络和权限体系。这些边界不削弱项目的价值,反而说明后续应该把力气用在哪里。

如果未来要在别的业务域复刻,也不需要照搬完整目录或一开始就做复杂平台。先选一个小问题域,整理资料,写入口规则,做三五个 SOP,建立只读工具或人工查询边界,再用真实问题持续测试和修正,就能逐步长出自己的 Agent 能力包。

最后回到最开始的问题:AI 能不能接手一部分业务运维?

我的答案是:可以,但前提不是 “AI 足够聪明”,而是人把经验整理成了它能可靠使用的结构。

AI 本身不会天然理解一个公司的历史系统、隐性规则和风险边界。真正有价值的工作,是由熟悉业务的人把这些东西梳理出来,让 AI 在明确的规则中工作。这个过程中,人不是被简单替代,而是在把自己的经验升级成一种可复制、可扩展、可持续运行的能力。

本文由作者按照 CC BY 4.0 进行授权