Qunar技术沙龙公众号文章

AI 大模型如何重构数据库根因分析:从"人找原因"到"AI 找原因"

Qunar技术沙龙

公众号 · 1 篇文章

e7aea0b2-cb9f-4322-b3ce-66271860cbe5.png

文章概览



图片
  • 告警排查的真相:不是找不到原因,而是每次都要重新找一遍

  • 整体架构:六层协同的智能诊断引擎
  • 架构选型:为什么是 LangGraph 而不是 LangChain 或 Dify

  • 意图识别:LLM 做理解,代码做计算

  • RCA 根因诊断:从 Pearson 到 Granger 的五层关联度分析

  • 智能问答:三速响应的分层策略

  • 对抗 LLM 的不确定性:速度与准确性的全局优化

  • 人机交互:让 AI 学会"等一等"

  • 安全与并发控制:AI 落地的生产级工程防线

  • 落地效果:DBA 的日常发生了什么变化

  • 总结


作者介绍:

杨赞,2023年加入去哪儿旅行,现任数据库管理员(DBA),负责 MySQL、Redis 的运维与稳定性治理,并主导慢查询分析系统、数据库智能巡检平台的设计与开发。近年来持续关注 AI for DB 领域,聚焦大模型在智能诊断、慢查询根因分析、异常检测等场景的落地实践,探索数据库运维从"经验驱动"走向"数据与智能驱动"。

告警排查的真相:不是找不到原因,而是每次都要重新找一遍

  日常巡检中,当接收到一条告警:"MySQL 实例活跃线程数飙高"。DBA 打开监控面板,开始逐项排查——先看扫描行数变化异常,再看有没有慢查询,再看 TOPSQL 有没有执行次数突增,接着查有没有 DDL 在执行、有没有发布变更……

  这个过程短则几分钟,长则几十分钟。如果同时来多个告警,排查压力会成倍放大。更关键的是,同样的排查思路,每次都要从头执行一遍——问题不在于"有没有办法排查",而在于"排查的经验和知识无法沉淀为自动化的能力"。

  而且,有些低概率诱因在人工排查时极易被遗漏,例如网络瞬时抖动、个别客户端容器资源紧张等,这些隐蔽因素往往需要反复排查多轮才能定位,大幅拉长了问题定位时间。

  这正是 AI 数据库运维 Agent 要解决的核心问题:把 DBA 的专家经验和排查流程,沉淀为一条自动化流水线,让 AI 接管"故障诊断"的场景,从"人找原因"变成"AI 找原因"。我们构建了一个基于 LLM 大模型的数据库智能运维 Agent,它能够自动完成从意图识别、参数提取、数据采集、算法分析、LLM 推理、根因定位到人机交互确认的全链路闭环。这篇文章将深入拆解它的架构设计、核心算法原理和优化思路。

下面是一次真实的诊断对话结果——用户只描述了"哪个实例、什么时段、什么现象",Agent 自动走完上述全链路闭环,最终输出一份结构化的诊断结论。例如用户输入 "x-xxxx.dxx.xx xx 2026-08-05 00:10:35 有流控",Agent 返回:


整体架构:六层协同的智能诊断引擎

在深入具体的技术决策之前,先建立全局视角——这个 Agent 是怎么组织起来的。它的整体架构可以抽象为六个层次,各层职责清晰、松耦合协同。

第一层,用户交互层。负责接收用户的诊断请求和发送回复。用户通过飞书消息发起请求,支持自然语言输入(如"x-xxxx.xx.xx xx  从 18:10-18:30 并发高")和结构化参数输入(由告警模版携带指标、时间、主机等字段)。回复通过飞书流式卡片呈现,支持实时进度更新,让用户感知 Agent 正在执行哪一步。

  第二层,意图识别层。负责任务的入口解析——从用户的自然语言中提取诊断对象(集群名、端口)、时间窗口和诊断意图。采用"LLM 做理解、代码做计算"的理念:大模型只负责语义理解和参数提取,日期计算、范围校验、规则修正全部由代码完成。通过四层流水线(预处理 → LLM 提取 → 后处理计算 → 校验兜底)和轻量 Flash 模型加速,首 token 延迟控制在 0.5 秒以内。详细设计见下一章。

  第三层,编排调度层。这是整个 Agent 的大脑中枢,基于 LangGraph 的 StateGraph 构建了一个包含 10 多个节点的有向图。流程覆盖从初始化、意图识别、参数校验,到按意图类型和数据库类型分流至不同处理节点(MySQL RCA、Redis RCA、智能问答、Redis 内存增长分析等),再到确认回复、HITL 等待、反馈处理,直至结束。每个节点通过显式条件边串联,支持 halt 短路和 interrupt 中断暂停及恢复。

  第四层,算法分析层。这是数学计算的部分——从 Prometheus、ES、MySQL 等数据源拉取监控数据后进行多维度关联分析,产出结构化证据(哪些指标异常、谁和谁高度相关、谁导致谁、异常时间线事件),成为 LLM 推理的输入。这一层的核心思想是"计算与推理分离":数学计算由代码完成,秒级出结果,准确无幻觉;LLM 不做计算,只做逻辑推理。具体算法细节在后续 RCA 章节中展开。

第五层,LLM 推理层。采用两阶段 LLM 调用设计——诊断 LLM 负责根因定位,建议 LLM 负责生成优化建议,两者使用独立的 prompt 和模型配置。分离的考量详见下文 RCA 章节。

第六层,数据采集层。Prometheus(监控时序数据)、Elasticsearch(慢查询日志)、MySQL(实例元数据)、DBA 运维平台 API(发布记录、工单、集群信息、硬件信息)等多源数据统一采集,供给算法层和 LLM 层使用。

这六层架构中,编排调度层是最关键的"大脑"——它决定了各层怎么协同、数据怎么流转、用户怎么参与。这就引出了本项目最核心的架构决策:编排调度层的引擎应该选什么?LangChain 的 Chain?Dify 的可视化画布?还是 LangGraph 的 StateGraph?下一章展开分析这个决策背后的权衡。

架构选型:为什么是 LangGraph 而不是 LangChain 或 Dify

  这是整个项目最关键的架构决策之一。在选型时,我们评估了三种主流方案:LangChain、Dify 和 LangGraph。三者在流程编排上的理念差异巨大,直接决定了 Agent 能否支持"暂停-恢复"的人机交互模式。

对比维度

LangGraph (StateGraph)

LangChain (Chain)

Dify (可视化工作流)

流程编排

显式条件边,每个节点的路由逻辑完全可见可控

固定线性流程,各节点按预定义顺序依次执行,无法根据中间结果动态选择下一节点

拖拽式可视化画布,简单直观,但复杂条件分支难以维护

共享状态

State 中心化管理,TypedDict 定义所有字段,节点只读写自己关心的部分

需手动在节点间传参,参数多时函数签名越来越长

变量节点 + 会话变量,多分支间状态传递能力有限

人机交互

原生 interrupt() + Command(resume=),图暂停后自动落盘 checkpoint

无原生支持,可通过自定义中间件 + 外部状态存储实现,但需自行处理序列化/恢复/超时

原生不支持暂停/恢复,需自行实现轮询或 Webhook 回调

长时间等待

checkpoint 持久化到 Redis,用户几分钟甚至 2 小时后回复仍可断点恢复

线程阻塞不可行,需自己实现状态机

工作流有超时限制,无法直接实现

超时取消

基于 checkpoint 时间戳 + Redis TTL 自动过期清理

需自行实现定时器 + 清理逻辑

平台级超时配置,无断点恢复能力

可观测性

每个节点可打印耗时日志,可随时查看当前图状态

中间状态不透明,调试困难

内置追踪面板和日志,可视化程度高

LangChain 是 LLM 应用开发领域最早成熟的框架之一,生态丰富、社区活跃,在快速搭建原型方面表现优秀。但在数据库运维 Agent 这个场景下,它有三个明显短板。

第一,流程控制不透明。LangChain 的 Chain 把执行流程硬编码为不可打断的线性链路,用户在过程里只能看到"卡片沉默十几秒然后突然蹦出结果",中间发生了什么完全不可见。LangGraph 可以把全流程拆成多个独立节点,节点之间可以插入进度更新,让用户实时感知"正在做什么"。对于耗时较长的节点,还通过后台定时线程每 3 秒刷新飞书卡片,提供秒级进度反馈——这种细粒度的可见性,在 LangChain Chain 的固定流程里根本插不进去。

第二,人机协同中的长时间等待——这是 LangGraph 最核心的差异化能力。数据库诊断不是一次性跑完就结束的:AI 产出结论后需要暂停等用户确认,用户可能几秒回复,也可能二十分钟后才有空看一眼。LangGraph 通过 interrupt() 原生支持暂停-恢复(落地细节详见人机交互章);而 LangChain 的 Chain 本质是一次性执行到底的流水线,要实现同样效果,需要自己动手实现"暂停→序列化→反序列化→恢复"的完整状态机,还要处理超时清理、回复去重、服务重启一致性等工程问题——不是在用框架,而是在框架之上再造一个微型框架。

  第三,多节点间的状态传递。Agent 的共享状态包含 70 多个字段,横跨输入参数、意图路由、飞书卡片上下文、诊断结果等七大类。LangChain Chain 模式下需在节点间手工传递,任一中间节点新增字段,所有下游节点的函数签名都要改。LangGraph 的方案是:所有节点共享 AgentState(TypedDict),每个节点只读写自己关心的字段,新增字段只需在 TypedDict 里加一行,不碰任何调用代码。

  Dify 作为可视化 LLM 应用构建平台,优势在于拖拽式画布简单直观,但在这个场景下有两个短板。第一,复杂流程编排受限 —— 十几个节点加多级条件分支,在画布上连线的可读性和维护性直线下降。第二,也是最致命的—— 原生不支持"暂停-恢复"模式,Agent 的长时间等待确认需求无法直接满足。

  综合来看,LangGraph 的持久化、显式条件边、State 中心化管理和原生 interrupt 机制,同时解决了数据库运维 Agent 的三大核心需求:细粒度的流程可见性与进度反馈、人机协同中的长时间等待与任意时刻恢复、以及多节点间复杂状态的高效共享。

  编排引擎选定了,六层架构的骨架也搭好了。下面进入具体能力的展开—— 首先是 Agent 的第一道关口:意图识别。

意图识别:LLM 做理解,代码做计算

  意图识别是 Agent 的入口关卡 —— 入口不能慢,慢了后面的诊断链路再快也没有意义;入口不能错,错了后面的分析再准也是白费。作为六层架构的第二层,它的核心任务是从用户的自然语言输入中提取结构化参数:诊断对象(哪个集群、哪个端口)、时间窗口(从几点到几点)、诊断意图(RCA 根因分析还是智能问答)。

  这个环节的设计原则是"LLM 做理解,代码做计算":大模型只负责理解语意,从自然语言中提取结构化参数,所有日期加减、范围校验、规则修正全部由代码完成。为什么要这样分工?因为 LLM 在确定性计算上并不可靠 —— 跨午夜日期计算错误率高达 5% 到 10%,而代码做这些运算又快又准。让 LLM 做数学计算,等于用瑞士军刀拧螺丝。

四层流水线:把脏活挡在 LLM 门外

  为了实现精准的意图识别,我们设计了一条四层递进式流水线,每一层解决一类问题。

预处理层 —— 把"脏活累活"挡在 LLM 门外。空输入直接拦截,不浪费后续资源。LLM 在日期偏移计算上容易出错,中文星期表达(如"上上周二")用正则预解析为具体日期,不给 LLM 犯错的机会。

LLM 提取层 —— 结构化信息提取。Prompt 中包含了多个 Few-shot 示例,按意图优先级分层判断:先排除纯 IP、纯 AppCode 等特殊场景归为问答,再判断 RCA 诊断类意图,最后提取时间范围。关键优化是 Prompt 中动态注入当前系统日期,防止 LLM 借用训练数据中的旧日期产生幻觉。

后处理计算层 —— Python 接手所有确定性运算。时间窗口在原始范围基础上前后各扩展 90 分钟和 20 分钟(给异常检测留足上下文),时间跨度超限直接拒绝。端口范围强制校正数据库类型,集群名自动补全实例地址。

校验兜底层 —— 做最后的防线。意图返回空时降级为问答模式,确保用户无论发什么都能得到合理的响应。

速度优化:轻模型 + 关思考 + 零重试

  在四层流水线保证了意图识别的准确性之后,响应速度就成了下一个要优化的目标 —— 意图识别是用户感知到的第一道延迟,必须做到秒级以内出结果。

  从三个维度压榨延迟。

模型选型:小模型干小活。 采用轻量 Flash 模型而非重型 Pro 模型。意图识别本质是结构化信息提取,不需要深度推理,小模型完全够用 —— 用牛刀杀鸡反而是浪费。

关掉思考链:不生成无用的内部推理。 DeepSeek 的 thinking 模式会产生大量内部推理 token,对意图识别这类"提取型"任务毫无增益。直接关闭后,首 token 延迟从约 3 秒降到约 0.5 秒。

零重试策略:一次调用拿全结果。 temperature=0 确保确定性输出,不重试,单次超时兜底,一次调用返回全部结构化字段,防止单字段缺失触发二次调用。

  这四层流水线加三重速度优化的组合,让意图识别既准又快,为后续的编排调度和根因诊断打下可靠的基础。这个环节体现的"LLM 做理解、代码做计算"原则,在接下来的 RCA 算法和智能问答模块中还会以不同形式反复出现—— 它是贯穿全局的设计主线。

RCA 根因诊断:从 Pearson 到 Granger 的五层关联度分析

  意图识别将请求按目的和数据库类型分流后,最核心的一条路径进入 RCA —— Root Cause Analysis,根因分析。这是整个 Agent 最重的能力模块,按诊断对象分为四个层级,覆盖了 MySQL、Redis、主机和 AppCode 的常见异常场景。

  • MySQL 实例级:活跃线程数、并发数、行锁时间、PXC 流控队列、每秒查询数、各 DML 操作速率等。

  • Redis 实例级:内存增长分析、内存分布分析。

  • 主机级:CPU 利用率、内存空闲比例、ping 丢包率。

  • AppCode 级:分析某个 AppCode 请求日志报错和客户端容器压力分布,自动识别异常集中的维度。

  除了以上四类定向诊断,Agent 还提供了一个兜底机制——全量自动检测模式。当用户只反馈"有异常"但未指明具体指标时,Agent 自动遍历所有可检测指标,基于专家经验(指标角色分类、优先级、异常严重程度)选定最可能影响业务的指标,再按正常流程分析。

关联度算法原理:计算与推理分离

  在进入 LLM 推理之前,先由代码层完成数学计算,产出结构化证据。为什么不让 LLM 直接看原始监控数据?每次根因分析涉及几十条监控曲线,每条曲线在诊断窗口内上百个数据点,全量传入意味着上千个时间戳和数值对,token 量轻松破万,LLM 推理时间动辄十几分钟。更致命的是,LLM 的本质是语言模型而非计算引擎 —— 它在数值比较、趋势判断、统计显著性检验上并不可靠,把原始数据直接丢给它做数学运算,不是它的专长。

  反过来说,LLM 真正的优势是逻辑推理和数据库领域知识串联。它不需要自己去"算"两个指标是否相关,只需要根据我们告诉它的结论 —— "活跃线程数与慢查询扫描行数的 Pearson 系数为 0.92,Granger 因果检验 p 值 0.003" —— 结合 MySQL 内核原理去判断因果链:到底是慢查询拖累了活跃线程,还是活跃线程高只是并发压力的表象,根因另有其人。这种"代码做计算、LLM 做推理"的分工,让 token 量从十万级骤降到千级,推理时间从十几分钟降到分钟级,同时彻底消灭了数学计算中的幻觉风险。这正是"计算与推理分离"理念的集中体现,基于这个理念,我们采用了五层递进式的关联度分析策略。

  第一层,时间对齐与异常检测。多个指标的数据采集粒度可能不同(有的 30 秒一个点,有的 60 秒一个点),需要先对齐到统一的时间粒度。代码将每个指标的数据转为 pandas 中的时间序列,按时间戳对齐后,针对不同指标类型采用不同的缺失值填充策略:普通监控指标用前向填充(缺失点通常与上一个点值相近),慢查询和 TOPSQL 等稀疏指标用 0 填充(没有数据意味着值为 0,不应向前蔓延)。异常检测采用滚动中位数加 MAD(中位绝对偏差)的稳健统计方法,对每个点用其前 N 个点建立基线,若当前值显著偏离基线则判定为异常。判定条件为双重门限:稳健 z-score 超过 k 倍,且相对基线变化幅度超过阈值。支持同时检测上升沿和下降沿,便于后续关联异常的开始与结束。

  第二层,Pearson 相关系数(记作 r)。通俗地说,Pearson 适合衡量线性相关的指标——它要的是"两条曲线一起上下晃":指标 1 涨,指标 2 也跟着涨;指标 1 降,指标 2 也跟着降。这种场景下关联系数就高。从严谨的角度来说,它衡量的是两个指标变化趋势的线性相关程度,r 的取值范围是 [-1, 1],绝对值越接近 1 线性相关性越强。同时输出 p 值判断统计显著性,p < 0.05 认为显著。r 和 p 值衡量的是两个不同维度:r 的绝对值回答"关联强不强",p 值回答"关联可不可信"——即使 r 很高,如果 p 值很大,这个强关联也可能是巧合;反之 r 很低时 p 值显著,也只说明"确实存在微弱关联"。只有 r 绝对值大且 p 值小,才意味着既有实际意义又统计可靠。但 Pearson 在实际落地中有两个局限性:第一,它只能描述"同步变化",不能判断"谁导致谁";第二,对于稀疏型指标(如慢查询数量,大部分时间为零)和低基线突发型指标(如 TOPSQL 扫描行数,异常时暴涨几十倍但只持续几个数据点),全序列 Pearson 系数会被大量正常点稀释,趋近于零,原本存在因果关联的指标反而无法通过相关性阈值筛选,被错误排除。

  第三层,数据模式识别与补充关联。Pearson 计算是对所有指标一视同仁的,但第二层提到的问题意味着:部分指标无法通过阈值筛选,不是因为它们和报警指标真的无关,而是它们的全序列 Pearson 系数被正常点稀释了。这时候需要换一把尺子重新审视 —— 把那些被 Pearson "误杀"的指标捞回来,用另一种方式再关联一次。

  怎么识别?不是看指标名称,而是看数据本身。我们不预先规定"慢查询用时间关联、TOPSQL 用时间关联" —— 这种硬编码方式脆弱且无法泛化,新接入一个未知指标就失效了。实际做法是:对每个未通过 Pearson 阈值筛选的指标,自动分析其数值在时间窗口内的分布特征,归为以下三种模式:

  1. 稀疏型:大部分时间值为 0,偶有非零值出现。

  • 典型场景:每分钟的慢查询数量,在 240 个时间点中可能只有 2 到 3 个点有值,其余全是 0。

  • 自动判定:零值占比 ≥ 50%。

  • Pearson 失效原因:序列中 98% 以上的点都是 0,即使慢查询的每次异常瞬间都精准伴随着活跃线程数的暴涨,全序列相关系数也趋近于 0。

2. 低基线突发型:平时在小数值范围平稳波动,异常时数值暴涨几十倍,但只持续极短的时间。

  • 典型场景:TOPSQL 扫描行数,平时在 1000 左右浮动,异常瞬间飙到 100000 以上,只维持 3 到 5 个采集点后回落。

  • 自动判定:存在超过中位数 30 倍的值,且这类突发点占比 ≤ 10%。

  • Pearson 失效原因:序列中 90% 以上的点是"小范围正常波动",少数突发的剧烈变化信号被统计平均数吞没。

3. 普通型:不满足以上两种特征,数据呈现常规的连续波动。

  • 典型场景:并发数、CPU 利用率、InnoDB 扫描行数等标准监控指标。

  • 处理方式:Pearson 结果即最终结论,不再补充。这类指标的 Pearson 系数本身就能有效捕捉变化趋势的线性关联。

  归为稀疏型或突发型的指标,意味着 Pearson 这把尺子量不准它们,需要换一把尺子 —— 时间窗口关联分析。核心思路是降维:不再关心"整条曲线的数值是否同步变化",而是关心"异常事件是否在时间上接近"。具体来说:对相关指标的每个异常点,在报警指标的异常点中寻找时间差在 60 秒以内的最近匹配。时间窗口关联会产出两个方向上的匹配率,分别回答不同的问题 —— 下面以"CPU 利用率报警"为例,CPU 是报警指标,慢查询是相关指标。

相关指标匹配率,回答的问题是:"这个慢查询的突增,有多少引起了 CPU 异常?"具体来说,它是慢查询异常点中匹配上 CPU 异常点的比例。例如慢查询有 8 个异常点,其中 5 个在 CPU 异常附近出现,匹配率就是 5/8 = 0.625。这个比率高,说明慢查询的大部分突增都和 CPU 飙高时间接近,意味着"只要慢查询异常,CPU 就跟着异常",是强因果信号。

报警指标匹配率,回答的是另一个方向的问题:"CPU 的异常,有多少是这个慢查询导致的?"它是 CPU 异常点中匹配上慢查询异常点的比例。例如 CPU 有 5 个飙高点,其中只有 1 个和慢查询异常时间接近,匹配率就是 1/5 = 0.2。这个比率高,说明 CPU 大部分异常都能用这个慢查询解释,意味着慢查询可能是唯一原因。这个比率低(比如 0.2),说明 CPU 的异常可能还有其他来源 —— 其他 TOPSQL、系统负载、IO 瓶颈等,不全是这个慢查询导致的。

  两个比率从不同角度衡量关联性,对比来看很清晰:相关指标匹配率从"原因看结果",分母是慢查询异常点总数,高意味着慢查询是原因,低意味着不相关;报警指标匹配率从"结果看原因",分母是 CPU 异常点总数,高意味着慢查询是唯一原因,低意味着 CPU 异常有其他原因。

  这个设计的本质思想是:Pearson 打头阵全覆盖,模式识别做兜底补漏。对连续波动型指标,Pearson 的结论直接可用;对稀疏突发型指标,自动识别出来后用时间关联补上。整个过程中,指标是稀疏、突发还是普通,完全由数据分布特征决定,不依赖任何指标名称的硬编码规则 —— 这才是能规模化落地的方案。

  第四层,时间窗口关联的细节优化。上一层的补充关联逻辑看起来简单直接,实际落地时有一个容易踩的坑:异常点太多导致关联度被稀释。稀疏指标用滚动中位数加 MAD 做异常检测时,如果基线全为 0、MAD 也为 0,任何非零值都会被判定为异常 —— 一个慢查询指标有 43 个非零点,就会产生 43 个"异常",但真正有业务意义的峰值可能只有 3 个。大量微弱异常点参与时间匹配后,分母膨胀,匹配率被严重拉低。解决方法是峰值匹配:只取该指标非零值中最大的 N 个异常点参与时间窗口匹配,忽略其余微弱波动,确保关联度不会被无关紧要的小幅抖动稀释。

  第五层,Granger 因果检验。前面几层已经回答了两个问题:"这两个指标波动趋势像不像"(Pearson 相关性) 和"它们的异常时间点碰不碰得上"(时间窗口关联)。但还缺关键一环 —— "谁先动,谁后动"。慢查询先涨、CPU 后涨,和 CPU 先涨、慢查询后涨,处理方案完全不同。Granger 检验就是专门回答方向性问题的。

  怎么判断方向?一种直觉式的思路是"抢先看":如果慢查询的历史数据能帮我们更准地预测 CPU 的未来走势,就说明慢查询"抢跑"了。Granger 检验把这个直觉变成了严格的统计检验。具体做法是分两步走:

第一步,比预测能力。 先用 CPU 自己的历史数据预测 CPU 当前值,记下预测误差;再把慢查询的历史数据也加进来一起预测,看误差有没有显著缩小。如果加入慢查询后预测明显变准了,就说明慢查询的历史承载了 CPU 自己历史之外的信息 —— 这就是"慢查询 Granger-cause CPU"的统计证据。这个过程走一遍还不够,因为影响可能有延迟。比如慢查询突增,可能要过 3 个采样周期 CPU 才飙起来。所以我们不是只试一个滞后阶数,而是从 1 阶(只看上一个点)一直试到最大阶(比如 5 阶,意味着假设影响最多滞后 5 个周期),取所有阶数里 p 值最小的那个。p < 0.05 判定存在 Granger 因果,同时也就锁定了最佳滞后阶数。

第二步,算影响力和方向。Granger 检验告诉我们"有没有影响,但没告诉我们"影响有多大"和"正向还是反向"。这就要用 VAR(向量自回归)模型来量化。具体方法是:先对数据做一阶差分消除趋势干扰,确保序列平稳,再把差分后的慢查询和 CPU 序列一起扔进 VAR 模型,让模型自己"学"出慢查询每变化一个单位,CPU 会相应变化多少。具体来说,模型会给出每个滞后阶数对应的系数,比如慢查询 t-1 时刻的系数是 +0.3,t-2 时刻是 +0.2,把所有系数累加起来就是总效应。正数说明同向变化(慢查询涨,CPU 涨),负数说明反向变化(慢查询涨,CPU 反而降),绝对值越大影响越强。

  Granger 检验也不是万能的,它有一个重要局限需要清醒认识:它证明的是"统计上的预测因果",不是"物理上的实际因果"。举个例子:InnoDB 读取行数和活跃线程数可能通过 Granger 检验 —— 前者历史值确实能预测后者变化。但真实原因可能是某个慢查询同时导致了两者增长,它们之间并没有直接因果链,只是被同一个幕后黑手驱动。算法只能告诉你"它们看起来有关系",但"这关系是真的还是巧合"需要懂数据库内核原理的逻辑推理来判断。这就是为什么 LLM 在这个系统里不是用来跑数学公式的 —— 数学交给算法,LLM 拿到统计结论后,结合自己对 MySQL 内核的理解,判断这条因果链在数据库场景下是否说得通。

  回顾整个 RCA 算法流程,五层算法完整呈现了"计算与推理分离"的设计原则。代码计算层的五步 —— 时间对齐与异常检测、Pearson 相关系数、数据模式识别与补充关联、时间窗口关联优化、Granger 因果检验 —— 全部由代码完成,秒级出结果,准确无幻觉。算法产出的结构化证据 —— 哪些指标异常、谁和谁高度相关、谁导致谁 —— 成为 LLM 推理的输入。LLM 拿到这些证据后不做数学计算,只做逻辑推理,结合 DBA 专家知识判断因果链。

  在 LLM 推理环节内部,还有一个关键设计:诊断 LLM 与建议 LLM 职责分离。下面展开这个决策背后的考量。

诊断与建议的 LLM 职责分离

  五层算法产出了完整的结构化证据,接下来进入 LLM 推理环节。这里有一个关键的设计决策:为什么要把诊断和建议拆成两次 LLM 调用,而不是一次搞定?直接原因是两类任务对数据的需求严重不对称。诊断需要的是"信号" —— 哪些指标异常、关联度多高、事件时间线是怎样的,这些信息轻量且聚焦,追求的是推理速度和判断准确性。建议需要的是"上下文" —— 表统计信息、索引分布、硬件配置、历史变更记录,这些信息详尽但冗长,追求的是方案的专业性和可操作性。如果把两种数据全部塞进一次 LLM 调用,诊断推理会被大量"虽然有用但不是现在该看"的信息干扰,既拖慢速度又稀释注意力。拆开之后各取所需,两头的效率和质量才都能保住。

  更深层的原因是职责分离。诊断和建议是两个性质完全不同的任务:诊断是"医生看病",需要的是因果推理和领域知识,输入要精炼、推理要快、结论要确定;建议是"开药方",需要的是完整的上下文信息和优化规则,信息不全会导致建议不专业。如果混在一次调用中,LLM 既要处理大段表信息,又要做逻辑推理,注意力会被无关信息稀释 —— 就像让医生一边看病历一边翻砖头厚的教科书,诊断效率大打折扣。拆开后,诊断 LLM 的 prompt 长度缩减近一半,推理速度大幅提升;建议 LLM 拿到完整的表统计信息、工单信息、备份历史等数据,生成的建议也更专业可靠。两者使用独立的 System Prompt、独立的输出格式约束、甚至独立的模型配置,互不干扰。

  RCA 是 Agent 的"核心引擎",但 Agent 的能力不止于此。意图识别层还有另一条重要的分流路径 —— 当用户的目的不是诊断而是查询时,请求会进入智能问答分支。下面展开这条同样体现"计算与推理分离"设计理念的能力线。

智能问答:三速响应的分层策略

智能问答是意图识别层中与 RCA 并列的另一条分流路径。当意图被判定为"问答"时,请求进入智能问答节点 —— 这里追求的是"一问即答",响应速度是第一优先级。

日常运维中有大量高频查询:查 IP 归属、问操作流程、确认集群负责人。用 LLM 处理至少 4 到 6 秒,太慢;完全不用 LLM,硬匹配又无法覆盖千变万化的提问方式。于是我们设计了三速响应的分层策略:零延迟通道、快速通道、LLM 通道,按速度从快到慢逐级降级,在覆盖率与响应速度之间找到最优平衡。

零延迟通道:正则拦截,0 次 LLM

  纯 IP 查询是能在意图识别阶段就被拦截的通道 —— 入口处正则检测到纯 IP,直接跳过 LLM 意图识别和 QA 节点的 LLM 调用,全程 0 次。代码层正则提取 IP、去重、并行查询后端 API,秒级返回结果。


快速通道:子串 + Bigram,1 次 LLM

  零延迟通道拦住了格式上就能判断的请求,但"如何申请离线库"和"怎么申请离线库"格式不一样、问的却是同一件事 —— 高频 FAQ 场景。这类"确定性问题 + 确定答案"不需要 LLM 推理,用 LLM 反而有三个代价:慢、贵、不稳定。

  我们用两层确定性匹配拦截。子串匹配:输入归一化后,直接与 FAQ 知识库做子串包含检查,命中即返回。Bigram 匹配:处理近精确匹配 —— "怎么"和"如何"在子串上对不上,但字符级二元组的 Jaccard 相似度高达 0.67,远超阈值 0.55。这个阈值经过校准:太低会把"怎么申请"和"怎么查看"误匹配,太高则覆盖不了"怎么/如何/怎样"的变体。两层匹配命中后直接返回,既省 token 又保一致性。上游意图识别仍需 1 次 LLM。

LLM 通道:一次调用,两项任务,2 次 LLM

前两级都匹配不上的问题(如"查一下 xx.xx.xx.xx 这台机器"),LLM 才介入,但一次调用完成两件事:FAQ 语义匹配 + 工具调用决策。System Prompt 嵌入 FAQ 知识库和同义映射表,LLM 先判断是否命中 FAQ,命中直接返回答案;未命中再决策调用哪些工具(查 IP、查集群负责人等),在单次推理中走完"理解 → 匹配 → 决策",无需多轮交互。

三个工程优化保障稳定性。工具去重:代码层按工具名和参数签名去重,防止 LLM 重复调用同一工具。并行执行:线程池最多 5 并发,总耗时约等于最慢那一次调用。结果不二次加工:工具返回值直接展示,不经过 LLM 润色 —— 润色既无增值又可能篡改事实。

  与 RCA 意图识别不同,QA 场景的 LLM 调用开启 thinking 模式。意图识别属于结构化提取,不需要推理链;但 QA 语义匹配需要推理"这个问法和 FAQ 里哪条是同一个意思",不开 thinking 可靠性会大幅下降。同一模型,不同场景,差异化配置。

  智能问答的三级分层,与意图识别的"代码预计算 + LLM 语义理解"、RCA 的"算法计算 + LLM 推理"同出一源 —— 都是让确定性的事交给代码,不确定性才交给 LLM。下一章将这套理念背后的工程防线统一梳理。

对抗 LLM 的不确定性:速度与准确性的全局优化

前面三个模块分别展开了意图识别、RCA 算法和智能问答的设计细节。细心的读者可能已经注意到,这些模块中散落着大量同类的优化手段 —— 意图识别的"关思考、零重试",RCA 的"诊断建议拆分、字段裁剪",智能问答的"快速通道、结果不二次加工"。这些孤立的手段背后,其实有两条贯穿全局的优化主线:速度优化和准确性保障。这一章把它们统一梳理,形成一套可复用的方法论。

响应速度优化:对抗 LLM 的注意力漂移

  大模型有一个天生的弱点 —— 注意力漂移。当 prompt 越来越长,模型对关键信息的关注度会逐渐稀释,就像一个同时盯着十块屏幕的人,最终哪块都看不清。这个现象在学术上叫"Lost in the Middle",大段文本中间的信息往往被模型忽略。我们的速度优化策略,本质上就是给 LLM 做"信息减负":让它只看到必须看到的内容,屏蔽一切噪音。

  这个思路在前文各模块中已有多次落地的实例,这里不再复述细节,只点明它们背后的共性规律。意图识别的 Flash 模型选型和诊断节点的 thinking 关闭 —— 本质都是"不同任务匹配不同算力";诊断与建议的 LLM 职责分离和字段裁剪 —— 本质都是"当前阶段不看当前阶段不需要的信息"。把这些分散的手段放在一起回看,共性只有一个:LLM 的注意力是稀缺资源,每一段不必要的信息都是在跟真正重要的信号抢关注度。 下面展开几个未被前文覆盖、但同样贯彻这一原则的优化手段。

按需注入,而非全量投喂。 以行锁告警为例,LLM 需要理解 InnoDB 行锁的持有机制、锁等待队列、DML 与 SELECT 的行锁差异等内核原理,才能做出准确判断。但如果是 CPU 飙高或 QPS 突增,这些行锁知识就是纯粹的噪音 —— 不仅浪费 token,还会把 LLM 的注意力从真正的关键指标上引开。我们的做法是把行锁原理章节从 System Prompt 中抽离为独立模板,通过占位符动态替换。命中行锁告警时注入完整原理,非行锁告警时替换为空字符串,每次节省数百 token 的同时,让 LLM 的注意力始终聚焦在当前告警类型最相关的信息上。

指标名规范化,降低认知负荷。 所有速率类指标统一加后缀标记,让 LLM 一眼就能区分"每秒值"和"累计值",避免把 `Innodb_rows_read`(累计值)误解为瞬时速率。这看似是一个小优化,但实际效果显著 —— LLM 在长 prompt 中容易被相似名称误导,清晰命名能大幅降低误判概率。

链接拼接后置,不让 LLM 做填空题。 监控链接、工单链接等,本质上是模板拼接 —— 把 IP、端口、时间范围填入 URL 模板即可。如果让 LLM 来生成这些链接,需要在 prompt 中塞入 20 多种链接模板规则,轻松膨胀数千 token,而且 LLM 还可能拼错参数。我们的做法是代码层根据根因类型自动匹配链接模板并生成完整 URL,LLM 输出中只需放占位符,后处理阶段统一替换。不仅节省 token,链接格式也 100% 正确。

二次精简:算法产出几万字符,LLM 只需几百。 算法层产出的完整数据包含每个异常点的精确时间戳和数值,但 LLM 不需要知道"15:03:30 活跃线程数 = 172"这种细粒度明细。精简策略很明确:只传异常时间范围不传每个采样点、只传强相关指标忽略弱相关、只传有 Granger 因果关系的指标。精简后提示词从数万字符压缩到几千字符,减少 70% 到 80%,让 LLM 的注意力集中在真正有因果关系的候选指标上。

这些优化手段合在一起,从模型选择、推理策略、输入裁剪、输出后处理四个维度协同作用 —— 它们并非各自为战,而是围绕同一个目标:把 LLM 的注意力集中在当前任务最关键的信息上,其余一律靠边。 但快还不够 —— 快且错,等于零。下面展开另一个维度:怎么保证 LLM 不乱说。

准确性保障:多层防御对抗幻觉

LLM 的本质是概率模型,输出天然带有不确定性。在数据库故障诊断场景中,这种不确定性的代价可能是把 DBA 引向完全错误的方向。我们的策略不是让 AI 变得"确定" —— 它的本质决定了做不到 —— 而是在 AI 周围构建一圈确定性的工程防线,从输入端到推理过程再到输出端,层层设防。

第一道防线:输入防御性校验。 LLM 看到用户输入之前,代码层已经完成了多层校验。纯数字拦截——如果用户输入只有数字没有任何自然语言,直接跳过 LLM,避免 LLM 把裸数字幻想为 Redis 端口去发起分析。System Prompt 中的日期占位符在运行时动态替换为当前系统日期,防止 LLM 借用训练数据中的旧日期。

第二道防线:预检查前置,把事实和推理分开。 在 LLM 介入之前,代码层先做完一轮确定性检查:是否有 truncate/drop 等 DDL 命令、系统日志中是否有网卡 down 或 OOM 记录、MySQL 错误日志中是否有 PXC 事务超限。这些信息如果直接丢给 LLM 让它自己判断"有没有 DDL,LLM 可能遗漏或误判。但用代码做确定性检查后,结果以"已确认的事实"的身份传给 LLM,LLM 的工作从"判断有没有"变成"结合已知事实做推理" —— 前者是计算,LLM 不擅长;后者是推理,LLM 擅长。

第三道防线:关掉随机性。所有 LLM 调用统一设置 temperature=0,让模型每次面对相同输入时坚定选择概率最高的输出。这一点看似简单,但对诊断结论的一致性至关重要 —— 同样的异常指标组合,不应该因为随机采样而得到不同的诊断结论。数据库故障诊断不是创意写作,不需要"换个说法",需要的是"同一组症状,同一个结论"。

第四道防线:Pydantic 约束输出格式。 对于不支持 json_schema 的模型,无法在模型层面直接约束输出结构。我们用 Pydantic 在代码层做"外挂模具" —— 字段类型、必填/可选、中文别名全部预定义,LLM 输出后由 Pydantic 二次校验,脏数据不会流入下游。

第五道防线:硬性排除清单,规则压倒统计。 相关性算法会产生大量"高相关但非根因"的候选指标。比如活跃线程数飙高时,慢查询数量也会跟着涨 —— 但只是因为并发高了执行次数多,SQL 本身并不慢。如果 LLM 仅凭 Pearson 系数 0.95 和 Granger 因果显著就判定为根因,就会把"被影响的后果"误判为"原因"。

我们在 prompt 中植入了多条硬性排除规则,要求 LLM 在分析每个候选根因时必须逐一检查。例如扫描行数均值小于阈值的直接排除,即使 Pearson 为 1.0、Granger 因果显著、时间完全重合,也不得列为根因。DDL 命令执行时间与异常增高时间差超过 2 分钟直接排除。行锁告警时 SELECT 类型的慢查询必须排除 —— SELECT 不持有行锁,这是 MySQL 内核原理,数学关联不等于因果关系。

第六道防线:反例教学,堵住 LLM"找理由保留"的倾向。 LLM 有一种惯性 —— 当它看到某个指标的关联度很高时,会倾向于"找理由"把它保留为根因。仅仅告诉它"扫描行数不达标就排除"是不够的,它在推理链中会自己绕过去。我们在 prompt 中嵌入了具体数值的反例:"即使扫描行数总和 = 85836、即使 Pearson r = 1.0、即使时间滞后 0 秒,只要平均扫描行数 = 354(< 6000),就必须排除。sum 达标也救不回来。"用具体数字堵住 LLM 的"找补"空间,比抽象规则有效得多。

第七道防线:输出后校验与补全。 LLM 推理完成后,代码层还会做一轮后处理。LLM 可能漏填 sql_id、数据库名、AppCode 等可选字段,代码从原始指标名中自动提取并回填。LLM 输出的链接占位符,代码统一替换为真实 URL。智能问答章节中提到的问候语兜底检测也在此处统一拦截,确保 LLM 的"客气话"不会伪装成正式答案。

这七道防线的背后有两条贯穿始终的原则。第一,"确定性的事交给代码,概率性的事交给 LLM"。 判断字段该显示在主机维度还是实例维度、资源使用率的红色高亮阈值、跨午夜的时间加减运算、监控链接的拼接 —— 这些逻辑由代码硬编码,LLM 只管它擅长的推理,不碰它不擅长的计算。第二,"无数据,不编造"。 当报警指标是行锁耗时,但慢查询和 TOPSQL 中都没有 DML 语句(只有 SELECT)时,LLM 必须返回"未定位到原因",严禁推测"可能是某条 UPDATE"或"可能是某条 DELETE"。数据真实性是底线 —— 宁可说不知道,也不能编造一个看起来很合理的答案。

  七道防线加两条原则的本质理念是一致的:不要期望 LLM 变完美,而是设计一个能让不完美的 LLM 稳定产出的系统。 这才是 Agent 工程化的核心思维。

RCA 的算法、智能问答的分层、速度与准确性的防线 —— 这三章覆盖了 Agent "怎么分析"和"怎么保证质量"。但还有一个能力维度没有展开:AI 如何在需要用户参与决策时优雅地"停下来"和"等一等"。下一章,我们展开人机协同调度这一设计。

人机交互:让 AI 学会"等一等"

在大多数 AI 应用中,交互模式是"一问一答" —— 你发消息,AI 回复,对话结束。数据库运维场景则复杂得多。以 Redis 内存增长分析为例:用户问"xxx 集群 63xx 端口的内存为什么涨了",AI 不能直接给答案,因为它不知道用户想对比哪两个时间点。它必须先停下来问"我这里有 10 个备份时间点,请选起始时间",等用户选完,再问"结束时间点选哪个?可选当前时间"。两轮交互后,才能开始真正的工作。

  这种"工作到一半暂停,等用户回复后再继续"的模式,在工程上远比"一问一答"复杂。它需要的不是"无状态"的 API 调用,而是一个能够在任意时刻完整保存执行现场、并在用户回复后精确恢复的有状态执行引擎。这正是架构选型中 LangGraph 所具备的核心能力。

checkpoint:把 AI 的执行进度"存档"

  LangGraph 的 checkpoint 机制是支撑这一切的基石。当图执行到需要用户交互的节点时,调用 interrupt() 暂停,LangGraph 自动将完整的图状态(包括所有变量、当前节点位置)序列化为一个快照,写入 Redis。用户回复后,飞书回调触发恢复函数,图从快照中精确还原,interrupt() 返回用户的回复内容,后续节点继续执行,就像从未中断过一样。

  这个机制有三个关键优势。长时间等待容忍:用户可能几分钟回复,也可能两小时后才回复,checkpoint 持久化到 Redis 后,Agent 不会有任何内存开销。超时自动清理:checkpoint 设置 TTL 为 180 分钟,超时后 Redis 自动删除,无需额外定时任务,用户回复时系统提示"会话已过期,请重新发起诊断"。天然支持重试:如果恢复过程中某个节点执行失败,可以从最近的 checkpoint 重新恢复,而不是从头开始。

双存储:把"执行进度"和"会话索引"分开

HITL 机制涉及两个存储系统,各司其职。checkpointer(RedisSaver)存储完整的图执行进度 —— 每个节点执行后自动写一个快照,约 200KB。它给 LangGraph 内部恢复用,读写开销大,不适合频繁查询。HitlStore 存储轻量级的会话索引 —— 记录 thread_id 与用户的映射关系,约 0.5KB。它给飞书回调做快速定位用:用户回复时,飞书回调需要根据用户 ID 快速找到对应的 thread_id,然后才能从 checkpointer 中恢复图状态。

  两者分离的好处很明确:checkpointer 是"重型仓库",存的是一整箱完整的执行快照;HitlStore 是"目录索引",只存一行映射关系。飞书回调每秒可能触发多次,每次都去反序列化 200KB 的完整快照太浪费,区区 0.5KB 的索引查询就能完成定位。

多轮交互:一个节点内暂停两次

  Redis 内存增长分析最有意思的设计挑战是:同一个节点需要暂停两次。用户选择起始时间点是一轮交互,选择结束时间点是另一轮。这带来了一个棘手的问题—— LangGraph 的 interrupt() 在恢复时返回的是 Command(resume=...) 的值,但如果同一个节点内调用了两次 interrupt(),第二次调用时恢复传入的值可能被第一次的 interrupt() 错误消费。

  我们的解决方案是用 Redis 做"中间结果缓存"。每次 interrupt() 返回的用户选择值,立即写入一个 Redis 键,并设置防重入标志防止节点重执行时重复写入。这样即使节点因某种原因重执行,也不会重复向用户提问。同时,resume_rca_graph() 在恢复前会检查 checkpoint 是否处于暂停状态、HitlStore 是否存在对应记录,双重确认后才会执行恢复操作,防止用户误发消息触发无效恢复。

安全与并发控制:AI 落地的生产级工程防线

一个 AI Agent 从 Demo 到生产级,安全与并发是绕不开的两道坎 —— 权限设计决定"谁能用",并发控制决定"能用多久不倒"。

权限:意图驱动的分级授权

  传统的权限控制通常放在入口处 —— 用户发起请求,先校验权限,不通过直接拒绝。但我们的 Agent 同时服务两类场景:智能问答和根因诊断。如果入口统一拦截,问答用户连基础问题都查不了,体验很差。

我们的方案是权限校验后置到意图识别之后。LLM 先判断出意图类型,再做分级鉴权:问答意图零门槛放行;`rca` 及 Redis 内存分析仅限 DBA 和管理员;检查appcode覆盖 DBA 加研发,权限稍宽。问答用户零门槛,敏感操作在意图明确后才细粒度拦截 —— 既有安全感又不影响体验。

并发:两级锁加单任务限制

  并发控制分层解决三个不同层面的问题。

全局并发数限制管控系统容量。一次 RCA 诊断涉及 Prometheus、ES、LLM 等多源调用,同时跑太多后端扛不住。通过信号量限制并行诊断总数,超限排队等待,飞书卡片实时显示"前面还有 N 个任务",最长等待 90 秒后友好退出。

每用户并发限制保障状态一致性。同一用户同时只允许 1 个诊断执行,且锁在 HITL 暂停期间保持不释放 —— 否则用户在等 Redis 时间点选择时再发起 MySQL 诊断,两个状态会互相串。锁 TTL 设为 1 小时作为进程崩溃的兜底,同时设计了主动死锁检测:锁创建超过 30 分钟判定过期,自动清除重试;服务重启时清空残留锁。

单任务并发限制保护被管理的外部系统。例如 Redis RDB 文件下载,单主机最多 2 个并行任务,避免大流量冲击带宽。核心原则是:AI 不能为了完成任务而伤害被管理的系统本身。

到这里,我们从架构选型一路走到生产级防线 —— Agent 的骨架、大脑、能力和护甲都已经展开完毕。接下来,我们从一个告警的生命周期来看,这些设计最终给 DBA 的日常工作带来了什么变化。

落地效果:DBA 的日常发生了什么变化

排查速度:从"跑断腿"到"等结论"。 DBA 不再需要像开头描述的那样一个个系统挨个翻数据。现在只需要用自然语言说一句"这个实例从几点到几点并发高",剩下的交给 Agent:几十条监控曲线自动分析对比、慢查询自动关联、变更和工单自动匹配。Agent 平均耗时 1 到 2 分钟即可产出诊断结论。DBA 的工作从"到处翻数据"变成了"审视证据、确认结论"。

覆盖度:从"看经验"到"不会忘"。 以前,排查哪些指标、查哪些日志,全看 DBA 的个人习惯和当天状态 —— 时间一紧,隐蔽诱因极易被遗漏,导致告警反复、多轮排查。现在,每一条告警自动完成全量预检查,该扫的日志、该查的记录一个不落,排查覆盖度不再因人而异。

知识复用:从"看人下菜"到"标配上阵"。 以前,同一个告警在不同 DBA 手里结论可能天差地别 —— 差距不在工具,而在"先查什么、后查什么、什么情况该排除什么因素"的排查思路。现在,专家思路被固化为统一流水线,排查质量和效率不再因人而异。

准确率:从"碰运气"到"可参考"。 Agent 上线后,RCA 根因诊断的准确率达到 70%。即便未命中主因,产出的异常指标关联图谱和事件也能大幅缩小 DBA 的人工排查范围,让二次定位有据可依。

总结

  回顾整个 Agent 的设计,三条原则贯穿始终。

原则一:计算归代码,推理归 LLM。 Pearson 相关系数、Granger 因果检验、基于 MAD 的鲁棒异常检测 —— 这些有数学公式的东西,由代码精确完成,产出的结构化证据再喂给 LLM。LLM 不碰数值计算,只做它擅长的事:结合 MySQL 运维知识,从证据链中推断因果逻辑。各司其职,各取所长。这条原则在意图识别的"LLM 做理解、代码做计算"、智能问答的"零延迟通道和快速通道"、准确性防线的"预检查前置、链接拼接后置"中反复落地 —— 它不是某一章的结论,而是全文的工程主线。

原则二:给 LLM 足够正确的上下文。 这不是一句口号,而是工程实践。相关性低于 0.6 的指标直接过滤,DDL 时间距异常窗口超过 2 分钟的裁剪掉,慢查询的大段信息诊断阶段不传 —— 所有喂给 LLM 的输入都经过代码精心筛选。给 LLM 的信息里,有效信号占比越高,推理就越准。这一点和日常使用 AI 的道理相通:不要丢一堆杂乱内容指望它能猜中重点,你得替它把路铺好。

原则三:人机协同闭环,人始终持有最终决策权。 以 Redis 内存增长分析为例:AI 查询完 RDB 备份列表后不会自己拍板选时间点,而是列出选项、暂停执行、等待用户回复。用户选定起始和结束时间点后,AI 才继续工作。整个过程 AI 是"建议者",人是"决策者" —— 生产环境的每一步关键操作都由人确认后再执行,这不是对 AI 的不信任,而是对生产系统的敬畏。

  这三条原则背后是一个更本质的认知:做 AI 业务架构师,而非 AI 使用者。 判断哪些环节适合交给 AI、哪些必须人来做,设计人机协作的流程,评估 AI 输出的质量并做最终决策 —— 这才是 AI 时代工程师的核心竞争力。把重复劳动交给 AI,把精力留给需要判断力和经验的环节;每次协作后检查 AI 输出有没有错误和遗漏,发现问题及时纠正——这不是在"调试 AI",而是在持续训练它更好地配合你。

  从"人找原因"到"AI 找原因",这条路的核心不是 LLM 本身有多强,而是怎么把 LLM 用对地方 —— 该计算的计算、该推理的推理、该让人拍板的必须让人拍板。一个合格的 AI 业务架构师,懂得的不只是"AI 能做什么",更是"什么该让 AI 做,什么必须人来做"。

前往微信阅读全文

内容来自公众号,可前往微信查看原文。

查看作者的更多文章 →订阅更新、RSS 与阅读指南 →