ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

基于本体语义网络与Agent的智能故障定位系统

基于本体语义网络与Agent的智能故障定位系统

线上支付服务突然告警,错误率在十分钟内从 0.2% 飙升到 12%,监控面板上几十条告警同时亮起:订单服务 P99 延迟升高、数据库连接池使用率过高、网关 5xx 增多、容器重启次数异常。如果你处理过线上故障,一定知道这种场面意味着什么——不是没数据,而是数据太多了。日志分散在几十个服务里,链路追踪只能看到调用路径,指标图只能告诉你“哪个值不正常”,但谁也说不清谁是根因。这个场景正是我写这篇文章的出发点:把运维领域里的实体和关系组织成一张本体语义网络,再让一个具备规划和工具调用能力的Agent在这张网络里自动做故障定位。它不是简单地把问题丢给大模型“猜”,而是让 Agent 沿着知识图谱一条条路径收集证据、验证假设、剪枝排除,最终收敛到根因。适合正在做 AIOps、稳定性平台建设,或者被线上故障搞到心力交瘁的 SRE 和平台工程师参考。

我会从四个层面来讲:为什么传统的告警、日志、链路追踪不够用;什么是运维领域的本体语义网络,以及它怎么支撑推理;Agent 的工作循环怎么设计;最后给出一个最小可落地实现和一个完整的故障排查演示。顺便也会聊一些我在实际搭建中踩过的坑,比如 Agent 跑偏、图数据缺失、LLM 幻觉导致误判这些事。

1. 传统故障定位的困境:告警、日志、链路都看到了,但拼不出真相

1.1 告警是症状,不是原因

监控告警的本质是“某个指标越过了阈值”。CPU 使用率超过 90%、错误率超过 5%、队列深度超过 1000,这些信号本身只是症状描述。麻烦在于,一次根因故障会沿着调用链和资源依赖关系层层放大,最后触发几十条甚至上百条告警。你看到的是一堆红点,但红点之间没有因果联系。数据库连接池打满会引发下游服务超时,下游超时会引发重试风暴,重试风暴又会抬高 CPU 和网络指标,于是所有告警看起来都像根因。

传统做法是人在脑子里做“告警降噪”和“根因关联”——靠经验把看起来相关的告警分组,再顺着架构图一层层往下找。这套方法对资深工程师有效,但有两个问题:一是经验沉淀在个人脑子里,团队无法复制;二是线上系统拓扑经常变,微服务拆分、容器调度、配置变更都会让经验快速失效。

1.2 日志和链路追踪只覆盖局部视角

日志是单节点的自述,能告诉你“这个服务里发生了什么”,但无法告诉你“这个服务和周边系统的关系是什么”。比如日志里出现了大量数据库超时,你只能推断数据库可能有问题,但为什么数据库有问题?是不是连接池配置被改了?是不是某个慢 SQL 把资源耗尽?是不是上游流量突增?这些都需要跳到另一个系统去看。

链路追踪解决的是调用路径的问题,能告诉你一次请求经过哪些服务、每一跳耗时多少。但它有一个隐含假设:故障的传播路径等于调用路径。实际上很多故障是通过共享资源传播的,比如多个服务共用同一个数据库、同一台物理机、同一个 Redis 集群。链路追踪看不到“两个服务因为同一资源而互相影响”这种非调用依赖。此外,变更、发布、配置修改这类“人为事件”在链路追踪里完全没有位置,而多数故障恰恰是由变更触发的。

1.3 故障定位的本质:在依赖网络里找根因节点

把监控指标、日志事件、服务实体、基础设施资源、变更记录放在一起看,会发现它们天然构成一张图。一个服务部署在某个 Pod 上,Pod 运行在 Node 上,服务调用另一个服务,服务产生指标和日志,配置变更影响服务,资源耗尽影响性能。故障定位本质上就是在这张巨大的、实时变化的图里找到那个最可能的根因节点,并且给出从根因到症状的完整传播路径。

人肉排查之所以有时候效率很高,是因为资深工程师脑子里已经有一张类似的知识网。看到“订单服务超时”会自然想到“查数据库连接池、查依赖服务、查最近发布、查配置变更”,这些其实都是在图上的邻居扩展和路径搜索。如果能把这张网显性化、结构化成机器可读的形式,再交给 Agent 去执行,就有机会把专家经验变成可复制的自动化能力。这也是我后面要说的本体语义网络出现的原因。

2. 本体语义网络:给 Agent 一张可以推理的运维知识地图

2.1 本体没那么神秘,就是“概念 + 关系”的显式约定

“本体语义网络”这个词听起来很学术,容易劝退人。拆开看,本体(Ontology)就是一组对领域概念的显式约定:有哪些实体类型、每个类型有哪些属性、实体之间有哪些关系。语义网络则是把这些实体和关系组织成一张带语义标签的图。放在运维场景里,就是定义清楚系统里有哪几类对象、它们之间怎么连接。

举个例子,运维核心对象可以归纳为这些类型:集群、节点(Node)、命名空间、工作负载(Deployment/StatefulSet)、服务(Service)、实例(Pod/Container)、中间件实例(数据库、Redis、MQ)、指标(Metric)、日志(Log)、告警(Alert)、变更(Change)、配置(Config)。关系则是:DEPLOYED_ON(服务部署在节点上)、RUNS_IN(实例运行在 Pod 内)、CALLS(服务调用服务)、GENERATES(服务产生指标/日志)、TRIGGERS(指标触发告警)、IMPACTS(变更影响服务/配置)、DEPENDS_ON(服务依赖数据库/消息队列)。这些关系都带有明确方向,后面 Agent 做路径搜索时就会非常有用。

2.2 为什么“语义网络”比“随便让大模型猜”更靠谱

直接让大模型看一堆告警和日志让它们判断根因,可能成功,但很看运气。原因是大模型没有稳定的实时拓扑约束,不知道你的服务 A 到底部署在哪台机器上、当前是否还在运行、最近一次变更是什么时候。它只是在做模式匹配和概率推断。一旦系统架构略复杂、日志文本有噪声,它就容易给你一个“看似合理但完全不可验证”的答案。

而本体语义网络给了 Agent 一个可验证的推理边界:Agent 每一步都从当前节点出发,沿着图中真实存在的关系边移动,查询某条边另一端的实体状态。这样它的推理过程就和真实系统结构绑定在一起了。就好比问路时,一张是手绘地图,上面写着“大概在东北角,看到银行右转”,另一张是高德导航,有完整路网、路口和距离。Agent 显然更适合在精度更高的路网上做规划,而不是在大致方向上碰运气。

2.3 一个精简的运维本体示例

先看一个最小可用的本体模型。不需要一开始就做得很全,覆盖最常见的对象和关系就能支撑大部分故障排查。

实体类型关键属性主要关系
Cluster/K8s集群名称、区域、版本CONTAINS → Node
NodeIP、状态、规格RUNS → Pod
Service名称、命名空间、负责人CALLS → Service; DEPENDS_ON → Middleware
Pod/InstancePod名、IP、状态、镜像版本RUNS_IN → Node; BELONGS_TO → Service
Middleware类型、地址、状态DEPENDED_BY → Service; HAS_METRIC → Metric
Metric名称、值、时间戳EVALUATED_BY → Alert
Log内容、级别、时间戳GENERATED_BY → Service/Pod
Change单号、时间、类型、目标对象IMPACTS → Service/Config/Middleware
Alert级别、内容、时间TRIGGERED_BY → Metric

这张表就是 Agent 推理的地图。比如“Service A CALLS Service B”,A 出问题时会同时查询 B 的状态;“Change IMPACTS Service B”,B 出问题时一定会去看最近的变更记录。所有排查动作都可以翻译成对这张图的查询和邻居扩展。

3. Agent 的工作方式:从“读日志”升级到“在图上做假设-验证”

3.1 Agent 不是“更强的 ChatGPT”,而是“LLM + 工具 + 图”

很多人对 Agent 的理解就是给它一个提示词,然后大模型自己“思考”。但在故障定位这个场景里,这个思路远远不够。真正的定位 Agent 应该是三层结构:大模型担任规划和总结大脑,工具层负责执行具体的数据系统查询,本体语义网络作为长期记忆和行为边界。

大模型在这里不直接做算术,也不直接凭记忆回答“数据库有没有问题”。它要做的是:理解当前已知症状,生成下一步探索动作,比如“查询 OrderService 的依赖服务”“获取 DBService 最近一小时的变更记录”“检查 AdmissionReview 日志中的连接池报错”。这些动作会被翻译成一次函数调用,通过工具层去 CMDB、监控系统、日志平台、APM、变更系统里拉真实数据,拉回来后大模型再根据证据决定下一步动作。

这里的关键点是:大模型的每一步动作都被限定在图和工具的框架内。它不能凭空断言“根因是缓存穿透”,除非它能指出这是从哪个节点、哪条边、哪份日志证据推理出来的。这种约束看起来是“限制了大模型的自由度”,但恰恰是它能稳定工作的原因。

3.2 核心循环:Plan → Search → Evidence → Verify

我在实际搭建中把 Agent 的故障定位过程提炼成一个循环,每个环节都很具体。

Plan(规划):拿到初始告警或症状信息,把告警映射到本体图中的节点。例如“order_error_rate 高”,找到指标节点,再找到生成这个指标的实体节点 OrderService。然后生成候选排查方向:向上游查调用依赖,向下游查资源依赖,同时查最近时间窗内的变更事件。规划器的输出不是一段话,而是一组“候选图路径”或“待执行查询动作”。

Search(搜索):沿候选路径在图里扩展邻居节点。比如 OrderService 有出边 CALLS → PaymentService、CALLS → InventoryService、DEPENDS_ON → DBService,那就把这三个节点和它们的状态一起拿出来。图搜索不是无限制扩散,要控制深度,否则几步就到整个集群所有节点,搜索爆炸。经验值是初始从症状节点出发扩展到 2~3 层,再结合证据做剪枝。

Evidence(收集证据):对候选节点绑定具体证据。这一步下沉到数据系统:查指标趋势、查日志关键字、查错误码分布、查最近变更时间线。证据要能回答三个问题:这个节点是否异常?异常时间点和主症状是否吻合?它有没有可能影响相邻节点?证据有强弱之分,比如“变更发生时间正好在故障前两分钟”是超强证据,“某个日志出现 ERROR”是弱证据,需要和其他证据交叉验证。

Verify(验证与剪枝):把证据汇总到图路径上,判断哪条路径能够从头到尾解释症状。解释不通的路径直接剪掉,解释通的路径保留。每次循环都更新一个“假设图谱”,标注已确认、已排除、待验证节点。循环终止条件通常是:某个节点同时满足异常指标、故障时间吻合、存在变更或明显异常事件三个条件,并且从该节点沿依赖关系能推导出所有下游症状。

下面是简化的循环逻辑,我用伪代码写一下流程,方便你直接对着实现:

def locate_root_cause(initial_metric): graph = load_ontology_graph() start_node = metric_to_entity(initial_metric) # 症状 -> 实体节点 candidates = expand_graph(graph, start_node, depth=2) evidence = {} for node in candidates: evidence[node] = collect_evidence(node) # 查指标/日志/变更 API paths = enumerate_paths(start_node, candidates, evidence) ranked = rank_paths_by_evidence(paths) return explain_top_path(ranked[0], evidence)

这段伪代码隐含了故障定位的核心逻辑:不是让 LLM 直接给答案,而是让它在图路径上做证据累积。LLM 的作用体现在两个地方:一是从非结构化文本里抽取关键信息,比如从日志中识别出“connection pool exhausted”;二是把路径和证据组织成人能快速理解的根因解释。这比“让 LLM 直接输出根因”要稳得多。

3.3 Agent 的记忆设计:为什么图本身就是长期记忆

Agent 做一次排查,如果每次都是从零开始,没有对“这个系统历史上出过什么问题”的认知,效率会很低。所以记忆设计很重要。短期记忆用来保存当前故障场景的上下文:已经查过哪些节点、哪些证据、哪些路径被排除。这可以在一次 Agent 会话内通过一个大 JSON 或私有上下文来管理。长期记忆则应该沉淀两类东西:一类是故障模式,比如“连接池打满通常会导致下游超时和 CPU 升高”;另一类是系统特有的因果经验,比如“每次 DBService 发版后,InventoryService 都会出现慢日志”。

本体语义网络本身其实就是一个天然的记忆载体。每次故障复盘后,把新学到的因果边和维护经验写回图里,比如给两个节点之间加一条“常随故障”的关联关系,或者给某个类型加上“需要重点检查变更”的标签。图越用越“懂”你的系统,Agent 的定位准确率也会随之提升。这比把历史故障记录塞进大模型的上下文里更可控,也更省 token。

如果系统规模再大一点,可以引入多 Agent 协作:一个规划 Agent 负责主循环,一个搜索 Agent 专门做图查询和路径扩展,一个证据 Agent 负责并行拉取指标和日志,最后由一个报告 Agent 汇总。但多 Agent 会增加调试复杂度,我的建议是新手先跑通单 Agent,再逐步拆分。

4. 实操:搭一个最小版本,并在故障场景里跑通完整定位

4.1 数据建模:用 NetworkX 快速原型,用 Neo4j 落地生产

第一步是把本体语义网络建起来。原型阶段我推荐 NetworkX,它是 Python 的图计算库,写起来快、调试方便,适合验证思路。生产环境再用 Neo4j 这类图数据库,因为它支持索引、事务、并发和类 SQL 的 Cypher 查询,能直接暴露给 Agent 作为查询工具。

下面是一个构建最小图模型的示例,只包含核心节点和关系:

import networkx as nx G = nx.MultiDiGraph() # 服务节点 G.add_node("OrderService", type="service", namespace="trade", owner="team-a") G.add_node("DBService", type="middleware", kind="mysql", version="8.0") G.add_node("PaymentService", type="service", namespace="payment") # 资源节点 G.add_node("Pod-order-7f9c99", type="pod", status="Running") G.add_node("Node-pool-1", type="node", ip="10.0.0.12") # 变更节点 G.add_node("change-220401-01", type="change", time="2025-04-01 10:31", target="DBService") # 关系 G.add_edge("OrderService", "DBService", relation="CALLS") G.add_edge("OrderService", "PaymentService", relation="CALLS") G.add_edge("Pod-order-7f9c99", "Node-pool-1", relation="RUNS_ON") G.add_edge("DBService", "Pod-order-db-9d624", relation="RUNS_ON") G.add_edge("change-220401-01", "DBService", relation="IMPACTS") G.add_edge("OrderService", "metric-order-error-rate", relation="GENERATES") # 查询示例:找 OrderService 的所有出边邻居 for _, nbr, data in G.out_edges("OrderService", data=True): print(nbr, data["relation"])

看到没?当图模型建好后,“找 OrderService 依赖了什么”“哪个变更影响过 DBService”“OrderService 的指标挂在哪”这些问题都变成了简单的图查询。Agent 不需要会 SQL 或理解 PromQL,它只需要学会调用“查询某节点的邻居”和“查询某节点最近变更”这两个通用工具,就能完成大部分排查动作。

生产落地时,要注意图数据的实时性。服务实例是动态变化的,Pod 重建、扩缩容、新版本发布都会让图结构改变。我建议把图数据作为“只读视图”维护,底层数据源仍然用 CMDB、服务注册中心、K8s API,通过定时同步任务把拓扑快照写入图数据库。Agent 查询的是图数据库,但不能要求图数据库主动感知所有变化,同步延迟控制在 30 秒以内对故障定位就够用了。

4.2 Agent 的工具层:把图查询和数据系统查询封装成统一接口

Agent 不能直接连数据库,也不能直接在终端跑命令,它需要通过工具调用。工具层设计得好不好,直接决定 Agent 的上限。我建议把工具分成两组:

第一组是图查询工具,负责回答“谁和谁有关”。核心 API 可以设计成这些:get_node(entity_name)获取节点详情,get_neighbors(node, relation_type)获取指定关系的邻居,find_path(start, end, max_depth)查询两条路径,get_recent_changes(node, time_window)获取最近的变更记录。Agent 通过这些工具建立全局视野。

第二组是数据系统工具,负责回答“这个节点现在到底什么状态”。核心 API 包括:get_metric(entity, metric_name, time_range)拉取指标,query_logs(entity, keyword, time_range)查日志,get_alert_history(entity, time_range)查告警历史,get_trace_summary(service, time_range)查链路追踪摘要。每一个工具背后对接的都是现有的监控系统、日志平台和 APM。关键点是返回给 Agent 的数据要紧凑。比如日志工具不要返回 1000 条原始日志,而应该先做一次聚合,返回“错误码分布 TOP 5,各错误码出现次数,典型日志样本”这样的结构化结果。

我用一个简化例子展示 Agent 调用工具的过程:

def query_metric(entity, metric_name, start, end): # 对接 Prometheus / Grafana 等 return aggregator.get(entity, metric_name, start, end, points=20) def query_logs(entity, keyword, start, end): # 对接 ELK / Loki / SLS 等 return log_platform.search(entity, keyword, start, end, limit=50) def get_neighbors(node, relation=None): if relation: return [{"node": n, "relation": r} for _, n, r in G.out_edges(node, data="relation") if r == relation] return [{"node": n, "relation": r} for _, n, r in G.out_edges(node, data="relation")]

这些工具函数会让大模型通过函数调用机制来执行。以 OpenAI 风格为例,就是把每个工具定义成一个 function schema,模型根据当前需要选择调用哪一个。也就是说,Agent 本体其实就是一个带工具的 ReAct 循环:思考 → 调用工具 → 观察结果 → 再思考。大模型负责决定调什么工具、传什么参数、怎么解读结果;工具层负责保证数据可信、实时、有界。

4.3 故障场景演练:订单服务错误率飙升,Agent 如何一步步定位到根因

光讲架构不够直观,我跑一个完整场景给你看。假设当前时间点出现了order_error_rate指标告警,已知信息只有这一个指标,Agent 开始工作。

第 1 轮:从症状节点出发

Agent 先调用get_node("metric-order-error-rate"),发现它由 OrderService 生成。然后调用get_neighbors("OrderService"),得到三个依赖:CALLS → PaymentService、CALLS → InventoryService、DEPENDS_ON → DBService。同时 Agent 并行调用get_recent_changes("OrderService", 1h),发现没有与该服务直接相关的变更。

第 2 轮:检查依赖节点状态

Agent 对三个候选依赖分别调用get_metric(..., "error_rate/延迟/活跃连接数", 近1小时)和get_recent_changes(..., 近1小时)。返回结果:PaymentService 指标平稳,无变更;InventoryService 指标平稳,无变更;DBService 的活跃连接数从 10:20 开始缓慢上升,在 10:35 达到峰顶并触顶;查询到一条变更记录change-220401-01,作用对象是 DBService,时间恰好是 10:20,内容为“连接池参数调整”。这个证据很强:时间吻合、目标吻合、资源指标吻合。

第 3 轮:验证因果路径

Agent 在图上找一条从 DBService 到 OrderService 的传播路径,发现路径是:change → IMPACTS DBService → DEPENDED_BY OrderService。接下来验证这个路径是否自洽:DBService 连接池触顶会导致 OrderService 访问数据库失败或超时;OrderService 的日志中出现“wait connection timeout”关键字。Agent 调用query_logs("OrderService", "timeout|connection", 10:30-10:45),返回了大量连接超时日志。至此,因果链完整,Agent 得出结论:根因是 10:20 的连接池参数变更导致 DB 连接池过小,高流量触发连接等待超时,进而导致 OrderService 错误率飙升。

这个场景最核心的一点是:Agent 全程没有靠猜,每一步都有图上的节点和真实数据证据支撑。对应的输出结果也应该是结构化解释,而不是一句“我觉得是数据库连接池问题”。根因报告至少应该包含三部分:根因节点、从根因到症状的完整路径、支撑结论的关键证据(变更时间、指标曲线、日志样本)。

4.4 落地过程中的工程要点

这层工程细节很容易被忽略,但它决定了原型能否上生产。首先是工具层的数据权限。Agent 会自动查询日志和变更系统,这意味着它可能读到敏感信息,必须有严格的访问控制,可以通过只读账号、敏感字段脱敏、允许查询的时间范围白名单等方式限制。

其次是审计与可解释性。Agent 在排查时做的每一步动作都要记录:调用过哪些工具、查了哪些节点、基于什么证据排除或确认。这既是故障报告的重要组成部分,也是出问题后人工复核的依据。我给 Agent 加过一个“动作日志”,每次工具调用都追加一行,最后生成的根因报告自动附上动作序列,复盘时非常省力。

第三个要点是设置执行上限。Agent 不能无限搜下去。我通常设置最大步数(比如 20 步)、最大搜索深度(比如 3 层)、单次工具调用的超时时间(比如 10 秒)。如果步数耗尽还没收敛,就返回“证据不足,需要人工介入”而不是强行给结论。这种“承认不确定”的设计很重要,因为故障定位的 false positive 比 no answer 危险得多。

5. 常见问题与排查技巧实录

5.1 Agent 开始“胡思乱想”了怎么办

我踩过最深的坑是 Agent 在证据不足时强行解释。现象是它刚查到一半,就直接输出“根因可能是缓存穿透”,然后后续所有工具调用都变成验证这个不靠谱的假设。本质问题是大模型在没有足够约束时,会倾向于补齐一段“看似合理的故事”。

解决思路有两层。第一层是做结构约束:强制 Agent 每一步只能发出一个工具调用,不能直接把结论写入报告;结论必须在所有工具调用结束后统一生成,且必须引用至少两个独立证据。第二层是做证据门槛:某一假设要被最终采纳,至少要满足“异常时间吻合”和“图上存在可达路径”两个条件。如果时间点不对,立即剪掉。

5.2 本体语义网络建不全,担心漏掉关键对象

一开始就建一个完整无缺的运维本体是不现实的。我的思路是“从高频故障反推本体范围”。先拉出过去三个月最严重的 20 次故障,看每次故障复盘时人肉排查都查了哪些系统、哪些关系、哪些变更记录。把这些高频对象和关系沉淀下来,通常不超过 20 种实体类型、30 种关系,就能覆盖大多数线上故障。

另一条捷径是复用现有的 CMDB 和监控拓扑。很多公司已有服务依赖关系、容器调度关系、中间件实例列表,这些数据稍做清洗就能导入图数据库,不需要从零开始建。先用起来,后续再根据 Agent 的误判补充缺失的边。比如我遇到过一次 Agent 查不到“Service A 依赖 Kafka topic”这种关系,就在本体里补了一个数据流关系,之后相关场景的定位准确率立刻上来了。

5.3 日志和指标数据不完整,Agent 会不会被误导

这是真实系统里最麻烦的问题。如果数据库节点没有历史指标,Agent 就看不到“连接数持续上升”这个关键证据,很可能沿着调用链一路查到最底层,白白浪费步数。我建议在工具层就要处理数据缺失:查询工具返回结果时要带上“数据完整性”元信息,比如coverage=90%、missing_range=["10:20-10:25"]。Agent 看到完整度不足时,应该降低对这个证据的置信度,而不是把它当成“指标正常”。

更进一步,可以把“无数据”和“数据正常”明确区分开。无数据不等于是正常的,Agent 的推理引擎在设计时就要理解这两种状态。否则它很容易在缺失关键证据的情况下给出一个自信的错误结论。

5.4 性能太差,Agent 排查一次要十分钟

故障定位的场景对时效要求很高,Agent 不能慢悠悠地一步步查。我用了几个优化手段。第一是并行工具调用:同一轮里依赖状态查询和变更记录查询可以同时发出去,不必一个个串行等待。第二是限制搜索范围:从症状节点出发只扩展到 2 层,并优先检查“最近有变更”的节点,因为大多数故障由变更引发。第三是结果精简:让日志平台返回聚合结果而不是原始日志,减少大模型处理 token 的时间和成本。

优化后的效果:一个中等规模微服务系统的典型故障,Agent 通常在 6 到 10 步内完成定位,耗时从数分钟降到了 30 秒左右。这个表现已经接近一个熟练工程师带着监控工具排查的速度。

5.5 怎么评估一个故障定位 Agent 好不好用

评估不能只看“有没有说中根因”,还要看定位过程是否稳定、解释是否可靠。我建议做一套评测集,从历史故障中挑选 50 个样本,每个样本记录:初始症状、真实根因、故障时间点、涉及的关键组件。然后让 Agent 离线回放这些样本,统计几个核心指标。

指标说明目标值
根因命中率最终结论是否包含真实根因≥ 80%
平均定位步数从开始到收敛花费的图搜索步数≤ 15 步
平均耗时实际执行全部工具调用的时间≤ 3 分钟
错误率误导率给出错误结论的次数占比≤ 10%
可解释性评分路径和证据的完整性,人工评估≥ 4/5

评测集要随着新故障持续补充,特别是那些第一次没定位出来的案例。每补充一个失败案例,就去分析是图的关系缺失、工具数据不完整,还是 Agent 规划策略不对,然后针对性修复。这个过程和传统模型迭代很像,只是迭代的不只是参数,还包括本体图和工具链本身。

我个人在实际搭建这套系统时最大的体会是:Agent 能不能用,关键不在大模型有多强,而在本体这张图是不是真实反映了系统的因果结构。图建好了,Agent 是有纪律的侦探;图建不好,Agent 就是一只虽然跑得快但到处乱撞的无头苍蝇。最后分享一个我坚持到现在的习惯:每次故障复盘后,把新学到的因果边补充进本体图里——比如“某个变更类型和某个服务故障存在强关联”——时间一长,这张图会越来越贴近系统的真实脾性,Agent 的定位能力也会跟着水涨船高。如果你正在做类似的事,不妨先从小范围高频故障切入,不要追求大而全,跑通一个闭环再逐步扩张,这个方向后续能拓展到容量预测、风险分析,但那是另一个故事了。

返回列表