你搬进新家,请了一位经验丰富的“厨房管家”来帮你盯住灶台。管家会持续观察厨房的温度、油烟、水汽、声音,并把当前状态和“日常正常状态”比较,打出一个 0 到 1 的“异常偏离分”:分数越高,说明厨房今天越不寻常。管家虽然勤快,但你得先告诉他:分数到多少才值得惊动你?如果把阈值拧到 0.2,炒个青菜他也拉警笛;拧到 0.95,锅都烧出明火了他还觉得“一切正常”。这就是漂移告警阈值设定要解决的问题。 厨房管家还能学会很多技巧:多个传感器交叉验证、看一段时间的平均状态、多个传感器同时审视时避免“碰巧超限”、拉过一次警笛后冷却几分钟、按严重程度分级通知。把这些技巧组合起来,就是一套完整的“误报抑制”流程。这篇文章会带你像布置厨房管家一样,为 AI 模型的数据漂移监控设计一套可靠、不闹腾、真出事时能及时发现的告警系统。

岗位关联

对 AI 从业者来说,阈值治理是把监控从“狼来了”变成“灭火系统”的关键能力;它直接决定你能否在模型悄悄变坏时第一时间发现,又不会让团队被告警噪音折磨到麻木。

目录
  1. 可视化演示
  2. 阈值作用与目标
  3. 多维度阈值组合
  4. 滑动窗口平滑
  5. Bonferroni校正
  6. 告警冷却期
  7. 分级路由
  8. 自适应阈值与工程落地
  9. AI 应用场景
  10. Python 演示
  11. 常见误区
  12. 面试题

可视化演示

展示公钥密码体制中加密解密和数字签名的工作流程,对比公钥加密保护机密性和数字签名保证真实性的机制。

本节配有交互动效(进入视口后自动加载,约 3KB)。

公钥加密(Public Key Encryption) 发送方用接收方公钥加密消息 接收方用私钥解密获取明文 加密:Enc(M,PK)→C; 解密:Dec(C,SK)→M 公钥加密保证机密性,只有私钥持有者能解密。

阈值作用与目标

厨房管家第一次上岗,你问他:“温度到多少算危险?”他反问你:“你更怕锅烧焦,还是更怕我被油烟呛到就乱叫?”如果阈值定得太低,管家每次炒辣椒都拉警笛;如果定得太高,锅都冒火了他还在旁边擦桌子。阈值本质上是在“灵敏度”和“误报率”之间找平衡。

在 AI 监控里,每个观测窗口都可以算出一个漂移分 $D_t$,表示当前数据分布与训练时正常分布的偏离程度。阈值 $\theta$ 就是“值得惊动人的偏离度”。当 $D_t$ 超过 $\theta$,系统产生告警。

想清楚这个问题,业务损失差异是核心:如果漂移导致推荐系统效果变差,可能只是少赚一点;如果漂移导致风控模型放走欺诈,损失就大得多。所以阈值不是拍脑袋定的,而是根据漏报代价和误报代价共同决定。好的阈值配置,还要用“查准率”和“查全率”等告警质量指标持续评估,就像管家需要记录:每次响警笛,究竟有几次是真的需要你冲进厨房。

At={1,Dt>θ0,Dt≤θ\displaystyle A_t = \begin{cases} 1, & D_t > \theta \\ 0, & D_t \le \theta \end{cases}
这个公式就是厨房管家的工作守则:漂移分超过阈值就响,没超过就继续观察。
  1. 漂移分$D_t$ 是第 $t$ 个观测窗口的漂移分,可以理解为管家给出的“厨房偏离日常菜谱的程度”。
    DtD_t
  2. 阈值$\theta$ 是告警阈值,代表你愿意被惊动的最低偏离程度;$\theta$ 越小越敏感,越大越迟钝。
    θ\theta
  3. 告警指示$A_t$ 是“是否报警”的开关,取值为 1 时拉响提醒,取值为 0 时保持安静。
    AtA_t
  4. 边界判断只有当漂移分严格大于阈值时才触发,等于阈值时不响,避免在边界处来回抖动。
    Dt>θD_t > \theta

多维度阈值组合

厨房管家不能只盯着温度。夏天厨房本来就热,冬天开暖气也会让温度偏高;单看一个传感器,很容易被环境干扰。更聪明的做法是让管家同时看温度、油烟、水汽、声音等多个信号,每个信号都打一个“偏离分”,再按重要程度加权合成一个综合分。

在模型监控里,一个模型可能涉及几十个特征:数值型特征分布、类别型特征频率、模型输出分布、预测不确定性等都应纳入监控。每个维度先算自己的漂移分 $d_{j,t}$,再组合成综合漂移分 $S_t$。

不过,综合分也不能完全兜底。比如权重较低的一个维度突然出现特别严重的异常,加权后可能被其他正常维度掩盖。所以还要保留“分项阈值”:任何单一维度超过自己的严重阈值时,也可以直接告警。这种“综合判断 + 单项兜底”的组合,就像管家不会因为整体看起来还行,就忽略角落里已经冒出的明火。

St=∑j=1mwjdj,t,∑j=1mwj=1\displaystyle S_t = \sum_{j=1}^{m} w_j d_{j,t}, \qquad \sum_{j=1}^{m} w_j = 1
综合分相当于管家把多个传感器的报告汇总成一句话:今天厨房整体上有多不像往常。
  1. 维度漂移分$d_{j,t}$ 表示第 $j$ 个监控维度在第 $t$ 个窗口的漂移程度,比如油烟维度的超标情况。
    dj,td_{j,t}
  2. 权重$w_j$ 表示第 $j$ 个维度的可信度和重要程度;权重越大,这个维度的异常对最终判断的影响越大。
    wjw_j
  3. 综合分$S_t$ 是所有维度漂移分的加权和,用来代替单一温度或单一特征做最终告警判断。
    StS_t
  4. 权重归一化所有权重加起来等于 1,确保综合分仍然落在合理的分数范围里。
    ∑j=1mwj=1\sum_{j=1}^{m} w_j = 1

滑动窗口平滑

厨房里的油烟本来就是一秒大、一秒小。如果管家每秒都拿瞬时值跟阈值比,那炒一盘青菜都能报警十几次。真实世界里,单次观测往往带着大量随机噪声。管家真正该看的是“最近一段时间的平均水平”。

滑动窗口的思想,就是不再用窗口内最后一个点做判断,而是用最近 $K$ 个点的平均值或指数加权值。若 $K$ 越大大,曲线越平滑,但反应越慢;若 $K$ 太小,噪声又被放大了。除了窗口均值,还可以用 EWMA 给更近的样本更高权重:

窗口长度需要按业务节奏选择。如果模型每 5 分钟推理一批,窗口可以取最近 10 到 30 批;如果每天才跑一次批量推理,窗口就要覆盖若干天。窗口的核心目标,是让管家既能忽略颠勺时的一缕青烟,又不会把锅里已经烧糊的焦味也平均成“普通油烟”。

Dˉt=1K∑i=0K−1Dt−i,Et=αDt+(1−α)Et−1\displaystyle \bar{D}_t = \frac{1}{K}\sum_{i=0}^{K-1} D_{t-i}, \qquad E_t = \alpha D_t + (1-\alpha)E_{t-1}
窗口均值像是管家看“最近十秒平均油烟”,EWMA 像是让管家对刚发生的异常记得更清楚、对久远的事慢慢淡忘。
  1. 滑动窗口均值$\bar{D}_t$ 是第 $t$ 个时刻往前 $K$ 个漂移分的平均值,用于过滤单点噪声。
    Dˉt\bar{D}_t
  2. 窗口长度$K$ 是窗口大小,代表管家回头看多少个监测点;窗口越大越平滑,但也越迟钝。
    KK
  3. EWMA 平滑值$E_t$ 是新的指数加权平均值,它由当前漂移分和上一时刻平滑值共同决定。
    EtE_t
  4. 平滑系数$\alpha$ 表示新信息占的权重,$\alpha$ 越大,对最新状态的响应越快,但噪声也更容易进来。
    α\alpha

Bonferroni校正

厨房里装了 20 个传感器。如果每个传感器都用 5% 的误报率单独判断,那么即便厨房完全正常,一天之内某个传感器“碰巧”超过阈值的概率也会变得很大。管家不能因为 20 个传感器里偶尔有一个跳表,就认定厨房出了问题。这就是多重比较带来的“碰运气”问题。

Bonferroni 校正的方法是:把整体允许的误报率 $\alpha$ 平均分给所有同时监控的维度,让单个维度用更严格的显著性标准。如果某个维度的 $p$ 值经过放大后仍然小于整体 $\alpha$,才判定为真正异常。

Bonferroni 的代价是更严格,可能导致某些真实异常被忽略。但在告警场景里,它最大的价值是“守住整体误报率不失控”。就像管家虽然不会对单个传感器的抖动大惊小怪,但多个传感器异口同声说“出事了”,他一定会认真对待。

Alert  ⟺  m⋅p(1)≤α,p(1)=min⁡1≤j≤mpj\displaystyle \text{Alert} \iff m \cdot p_{(1)} \le \alpha, \quad p_{(1)}=\min_{1\le j\le m} p_j
这相当于管家设了一条规矩:20 个传感器必须有一个“特别反常”到让大家都服气,才会拉警笛;只是稍微越限不算数。
  1. 维度数量$m$ 是同时参与比较的监控维度数,例如 20 个传感器或 50 个特征监控项。
    mm
  2. 单个维度的 p 值$p_j$ 表示第 $j$ 个维度在当前窗口出现当前偏离程度属于随机波动的概率;$p$ 越小,越不像巧合。
    pjp_j
  3. 最小 p 值$p_{(1)}$ 是所有维度中最小的那个 p 值,代表管家看到的最可疑线索。
    p(1)p_{(1)}
  4. 校正后判断如果 $m \times p_{(1)}$ 仍然小于等于整体 $\alpha$,说明这个最可疑的线索不是 20 个传感器里“碰巧”跳出来的,值得告警。
    m⋅p(1)≤αm \cdot p_{(1)} \le \alpha

告警冷却期

管家刚刚拉了一次警笛,你冲进厨房,发现只是辣椒炒得太猛。三分钟后,又一阵相似的油烟飘起来,管家是不是要再拉一次警笛?如果每次相同原因都重复报警,你很快就会把警笛声当成背景音乐。冷却期的作用,是让系统在告警发生后的一段时间内,不再因为同类程度的波动反复打扰人。

冷却期并不是把耳朵堵上。严重告警可以绕过冷却期:如果普通油烟可以不响,但管家看到明火,必须立刻再拉警笛。另外,同一时段内来自同一根因的重复告警,还应该合并成一条,而不是每 5 分钟刷一次屏。

冷却期的本质,是把连续重复的“同一件事”压缩成一次有效提醒。管家不是不负责,而是把有限的注意力留给真正需要你冲进厨房的瞬间。

Suppress=1(t<tlast+Tc∧Dt≤θcrit)\displaystyle \text{Suppress} = \mathbb{1}\left(t < t_{\text{last}} + T_c \wedge D_t \le \theta_{\text{crit}}\right)
冷却期的意思是:刚响过警笛,几分钟内先别重复喊;除非情况升级到严重阈值,否则给主人一点处理时间。
  1. 上次告警时间$t_{\text{last}}$ 是最近一次真正告警发生的时刻,记录下来的目的是计算冷却结束时间。
    tlastt_{\text{last}}
  2. 冷却时长$T_c$ 是冷却时间窗,比如 5 分钟;在 $t_{\text{last}} + T_c$ 之前,同类程度的告警被抑制。
    TcT_c
  3. 严重阈值$\theta_{\text{crit}}$ 是严重告警阈值;只要漂移分超过它,即使还在冷却期也要立即告警。
    θcrit\theta_{\text{crit}}
  4. 抑制条件只有当“当前时间仍在冷却期内”且“严重程度没有升级”时,系统才压制本次告警。
    1(t<tlast+Tc∧Dt≤θcrit)\mathbb{1}(t < t_{\text{last}} + T_c \wedge D_t \le \theta_{\text{crit}})

分级路由

如果管家只有“响”和“不响”两个按钮,你就永远不知道这次到底是要去看一眼,还是要立刻关火。更合理的做法是设置三档阈值:普通偏离、明显偏离、严重偏离,分别路由到不同通知渠道。这样既能保证重要事情及时触达,又不会让小问题占据你的全部注意力。

P3 级别的偏离可以写进监控看板或周报,P2 级别推送到团队群,P1 级别直接打值班电话。分级路由是告警疲劳治理的关键:如果所有级别的告警都在半夜打电话,值班人很快会把手机静音,真正的 P1 也就没人响应。

分级路由不能替你把所有阈值调好,但它能改变告警系统的“性格”:从一惊一乍变成有分寸。一个成熟的告警系统,不只是会报警,更要会分级说话。

Level={P1,St>θ3P2,θ2<St≤θ3P3,θ1<St≤θ2None,St≤θ1\displaystyle \text{Level} = \begin{cases}P_1, & S_t > \theta_3 \\P_2, & \theta_2 < S_t \le \theta_3 \\P_3, & \theta_1 < S_t \le \theta_2 \\\text{None}, & S_t \le \theta_1\end{cases}
分级路由就是给管家配了三档“说话方式”:普通问题留便签,重要问题发消息,生死问题直接摇人。
  1. 三档阈值$\theta_1 < \theta_2 < \theta_3$,分别对应关注、重要、严重三类告警门槛。
    θ1<θ2<θ3\theta_1 < \theta_2 < \theta_3
  2. P3 关注当综合分介于 $\theta_1$ 和 $\theta_2$ 之间,只记录到看板,不打扰人。
    θ1<St≤θ2\theta_1 < S_t \le \theta_2
  3. P2 重要当综合分介于 $\theta_2$ 和 $\theta_3$ 之间,推送到工作群,提醒团队关注。
    θ2<St≤θ3\theta_2 < S_t \le \theta_3
  4. P1 严重当综合分超过 $\theta_3$,立即电话通知值班人,要求人工介入。
    St>θ3S_t > \theta_3

自适应阈值与工程落地

厨房管家不能永远用同一个温度阈值。夏天厨房平均温度高,冬天相对低;如果阈值固定不变,冬天容易漏报,夏天容易误报。管家需要先学习“最近一段时间正常状态”的基线和波动范围,再让阈值跟着基线移动。这就是自适应阈值。

最常用的公式是:阈值等于基线均值加上若干个标准差。如果近期正常状态发生了变化,阈值也会跟着上移或下移。更稳健的做法是用历史正常样本的分位数,比如 99 分位数,作为动态阈值,避免个别离群点把阈值拉偏。自适应阈值不是自动放任,它仍然需要正常的观测窗口,也不能让异常样本污染基线。

要把这套方法落地,还需要工程流程:先小流量验证阈值参数,再把监控维度、窗口大小、冷却期、分级规则沉淀成可复用的配置模板。每次误报或漏报都是一次复盘素材,就像管家每次判断失误,你都要告诉他是“下次别管辣椒”还是“看到焦味立刻打 119”。只有把经验固化到系统里,告警治理才能真正稳定下来。

θt=μ^t+kσ^t\displaystyle \theta_t = \hat{\mu}_t + k\hat{\sigma}_t
这相当于管家心里有一套“今天这个季节、这个时段,厨房正常应该是多少度”的参考,再留出合理波动空间。
  1. 基线均值$\hat{\mu}_t$ 是根据最近一段正常观测估计出的平均漂移水平,代表管家心中的“日常状态”。
    μ^t\hat{\mu}_t
  2. 基线标准差$\hat{\sigma}_t$ 是最近一段正常观测的波动幅度,代表管家心中的“日常波动范围”。
    σ^t\hat{\sigma}_t
  3. 灵敏度系数$k$ 是倍数,相当于管家愿意容纳几个标准差的波动;$k$ 越大越迟钝,$k$ 越小越敏感。
    kk
  4. 动态阈值$\theta_t$ 是随时间更新的阈值,基线变了,阈值也会跟着变,避免固定阈值在季节性场景下失效。
    θt\theta_t

AI 应用场景

大规模模型集群的告警治理

阶段:模型部署后监控与告警

解决的问题:一个平台同时服务几十个模型,每个模型都有几十个特征需要监控。传统方式给每个特征设固定阈值,结果特征一多,每天产生几百条告警,SRE 团队直接麻木。通过多维度加权综合漂移分、滑动窗口平滑、冷却期抑制重复告警、分级路由按 P1/P2/P3 分发,告警量能下降 80%,而真正的严重漂移仍然能第一时间找到人。

具体案例:某推荐系统团队对 50 个特征做漂移监控,把 P3 告警写入周报、P2 推送到值班群、P1 直接电话。上线后每周有效告警从 300 条降到 12 条,其中真正需要人工处理的只有 2 到 3 条。

季节性零售模型的动态阈值

阶段:模型输入质量监控

解决的问题:电商模型在双十一、节假日、每周促销期间,用户行为分布天然会变化。固定阈值会把促销造成的正常波动当成漂移,不断误报。使用自适应阈值后,系统先学习最近 7 天的正常基线,用均值加标准差生成动态阈值,促销期阈值自动抬高,日常波动也不会轻易告警。

具体案例:某电商平台在周末大促期间,模型离线评估分数略有下降,自适应阈值识别出这是历史同期也出现过的正常模式,只发了 P3 看板提示;而周一大促结束后数据分布未能恢复,才触发 P2 告警,提醒团队检查训练数据链路。

金融风控模型的特征质量门禁

阶段:模型上线前的输入质量门禁与上线后持续监控

解决的问题:风控模型有几百个特征,如果逐个特征做 5% 误报率的告警,整体误报率会被拉得很高。使用 Bonferroni 校正后,系统在多个特征同时出现可疑波动时才触发告警,避免了“总有一个特征碰巧超限”的假警报。

具体案例:某信贷风控团队对 200 个特征做漂移监控,发现单个特征 p 值 0.02,但 Bonferroni 校正后未达到联合告警条件,最终没有打扰值班人;第二天数据修复后,异常消失,证明了这是一次随机波动。

Python 演示

python76 行
import math  class DriftAlarm:    def __init__(self, warmup=20, dims=8, cooling=5):        self.warmup = warmup        self.dims = dims        self.cooling = cooling        self.history = []        self.recent = []        self._last_alarm = -99999        self.alarm_log = []     def _std(self, values):        if not values:            return 0.0        mean = sum(values) / len(values)        variance = sum((x - mean) ** 2 for x in values) / len(values)        return variance ** 0.5     def _baseline(self):        if not self.history:            return 0.5, 0.05        mean = sum(self.history) / len(self.history)        sigma = self._std(self.history) or 1e-6        return mean, sigma     def check(self, now, score, p_values):        self.recent.append(score)        if len(self.recent) > 5:            self.recent.pop(0)        smooth_score = sum(self.recent) / len(self.recent)         adjusted_alpha = 0.05 / self.dims        if min(p_values) > adjusted_alpha:            self.history.append(score)            if len(self.history) > 100:                self.history.pop(0)            return "normal"         if len(self.history) < self.warmup:            self.history.append(score)            return "normal"         mean, sigma = self._baseline()        warn = mean + 2 * sigma        critical = mean + 3 * sigma         if smooth_score > critical and now - self._last_alarm >= self.cooling:            self._last_alarm = now            self.alarm_log.append((now, "p1", round(smooth_score, 3)))            return "p1"         if smooth_score > warn:            self.alarm_log.append((now, "p2", round(smooth_score, 3)))            return "p2"         return "p3"  def main():    alarm = DriftAlarm(warmup=20, dims=8, cooling=5)    for t in range(1, 61):        score = 0.5 + 0.12 * math.sin(t * 0.5)        p_values = [0.2, 0.3, 0.1, 0.4, 0.2, 0.3, 0.2, 0.3]        if t > 40:            score = 0.9            p_values = [0.2, 0.3, 0.002, 0.4, 0.2, 0.3, 0.2, 0.3]        level = alarm.check(t, score, p_values)        if level != "normal":            print("t=%d level=%s" % (t, level))    print("alarm_log", alarm.alarm_log)  if __name__ == "__main__":    main()
目的:这个例子把自适应阈值、Bonferroni 校正、滑动窗口、冷却期和分级路由放在同一个告警类里;前 20 个观测用于学习正常基线,之后出现显著漂移时按 P3/P2/P1 分级告警。
  1. self.history.append(score)正常样本进入基线,让管家记住“日常状态”该是什么样。
  2. smooth_score = sum(self.recent) / len(self.recent)用最近 5 个漂移分的平均值做判断,过滤单点噪声。
  3. adjusted_alpha = 0.05 / self.dims这是 Bonferroni 校正:把整体 5% 的误报预算平分给 8 个监控维度。
  4. mean, sigma = self._baseline()从历史正常样本估计基线均值和波动幅度,生成自适应阈值。
  5. warn = mean + 2 * sigma普通告警阈值,超过后进入 P2。
  6. if smooth_score > critical and now - self._last_alarm >= self.cooling:只有超过严重阈值且过了冷却期,才触发最高优先级的 P1 告警。

常见误区

误区我以为阈值调低一点,系统就会更早发现漂移,越灵敏越好。

正解阈值过低会让大量正常波动也触发告警。告警系统依赖人的信任,如果管家每次炒菜都拉警笛,你很快就会把警笛声当成背景噪音,真正着火时反而没人跑。阈值应该由漏报代价和误报代价共同决定,而不是“越低越好”。

为何常见:新手往往只看到“灵敏度”,忽略了人的注意力是有限资源,过度告警同样会让系统失效。

误区窗口越大,噪声过滤得越干净,所以窗口长度应该尽量调大。

正解窗口过大会把真实突变也平均掉。好比你让管家只看过去一小时的平均油烟,锅已经烧穿了,平均值可能看起来还是不高。窗口长度应该覆盖正常噪声周期,但又要短于最小值得关注的漂移时长。

为何常见:看到平滑能降噪,就误以为“越平滑越好”,实际上检测速度也是告警系统的重要指标。

误区用了 Bonferroni 校正后,误报率降低,告警系统就完美了。

正解Bonferroni 校正只控制整体误报率,代价是检测能力下降。维度很多时,真实异常若只是“中等程度显著”,也可能被压成不告警。所以还需要结合严重阈值、业务损失和人工复核,不能把校正当成万能保险。

为何常见:人们容易把“统计上更严格”等同于“效果更好”,忽略了统计方法总是在误报和漏报之间做交换。

误区冷却期能把重复告警压住,所以设置得越长越省心。

正解冷却期过长会掩盖连续发生的真实异常。冷却期应该短于大多数真实故障的恢复周期,并且必须允许严重阈值绕过冷却。否则问题没有解决,系统却因为冷却而沉默,比误报更危险。

为何常见:冷却期的目标本来是“减少重复打扰”,但一旦过度,就变成了“屏蔽问题”。

误区自适应阈值可以自动学习环境变化,设置好之后就不用再管了。

正解自适应阈值依赖“正常样本”来学习基线。如果异常样本混入基线,它会慢慢把异常当成新常态,阈值被抬高,真实漂移被漏掉。工程上需要加一些保护:先用正常数据预热,检测到显著异常时不更新基线,并定期人工复盘阈值配置。

为何常见:把“自动”两个字想得太美好,忽略了自适应算法同样需要数据和规则的保护。

面试题

Q1. 阈值设置过低最可能带来哪种问题?

单选题 · easy

  • A.真实漂移更容易漏报
  • B.误报频率升高、告警疲劳← 正确答案
  • C.训练耗时明显缩短
  • D.监控维度自动减少

答案:B。阈值越低,系统越敏感,正常波动也会触发告警,导致误报率上升。告警一旦过多,值班者就会麻木,反而会漏掉真正的危险,就像厨房管家每炒一次菜都拉警笛。

Q2. 滑动窗口平滑的核心作用是什么?

单选题 · easy

  • A.消除短期随机噪声扰动← 正确答案
  • B.增加原始采样频率
  • C.提升模型预测准确率
  • D.减少输入特征数量

答案:A。滑动窗口通过观察最近一段时间的平均值,避免单次采样噪声造成误报。它不改变采样频率,也不提升模型本身,只是让告警判断更稳定。

Q3. 若同时监控 20 个维度,整体误报率设为 5%,Bonferroni 校正后单个维度应使用约多少?

单选题 · mid

  • A.5%
  • B.0.25%← 正确答案
  • C.2.5%
  • D.50%

答案:B。Bonferroni 校正把整体误报率平均分给每个维度,5% 除以 20 等于 0.25%。如果不校正,20 个维度各自有 5% 误报率,很容易出现“碰巧超限”的假告警。

Q4. 告警冷却期主要用于解决什么问题?

单选题 · mid

  • A.同一原因反复触发重复告警← 正确答案
  • B.模型训练时梯度消失
  • C.数据漂移被窗口平滑
  • D.特征维度数量不足

答案:A。冷却期让系统在一次告警后暂时停止同类程度的重复告警,就像管家拉过一次警笛后,给了你进屋检查的时间,不会因为同一阵油烟连续刷屏。

Q5. P3 级别告警通常应该怎么处理?

单选题 · mid

  • A.立即给值班人打电话
  • B.写入看板或周报观察← 正确答案
  • C.触发 Kubernetes 自动扩容
  • D.删除对应监控任务

答案:B。P3 是关注级,说明有轻微偏离但不需要紧急响应,适合记录到看板或周报。只有 P1 级别才需要立即打电话,否则告警疲劳会让值班人麻木。

Q6. 自适应阈值 θ=μ+kσ 中,若把异常数据混入基线,会出现什么情况?

单选题 · hard

  • A.基线被污染,阈值被抬高← 正确答案
  • B.基线更稳定,阈值下降
  • C.误报率一定降到零
  • D.监控任务自动暂停

答案:A。基线是用历史数据估计的 μ 和 σ。异常数据进入基线后,μ 被拉高,σ 也可能变大,阈值随之抬高,后续真实异常反而不会被发现。这相当于管家看多了糊锅味,慢慢觉得糊锅味也正常。

Q7. 冷却期内发生哪种情况应允许立即再次告警?

单选题 · hard

  • A.漂移分超过严重告警阈值← 正确答案
  • B.漂移分略高于普通阈值
  • C.滑动窗口均值小幅回升
  • D.监控页面被频繁刷新

答案:A。冷却期抑制的是“同类同程度”的重复告警,但情况升级时不能被压制。严重告警阈值代表可能需要立刻人工介入,例如看到明火,管家必须马上再拉警笛。

Q8. 降低告警疲劳的常用策略包括哪些?

多选题 · mid

  • A.多维度加权构成综合分← 正确答案
  • B.冷却期抑制重复告警← 正确答案
  • C.按级别路由到不同渠道← 正确答案
  • D.把阈值设为无限大

答案:ABC。多维度加权能减少单维度误判,冷却期能去掉重复消息,分级路由让不同级别用不同渠道通知。把阈值设为无限大虽然关闭了告警,但也关闭了监控,是不可行的。

Q9. 关于 Bonferroni 校正,下列说法正确的是?

多选题 · hard

  • A.可降低整体误报率← 正确答案
  • B.漏报率可能上升← 正确答案
  • C.把α均分到多次检验← 正确答案
  • D.能消除所有误报

答案:ABC。Bonferroni 把整体 α 平均分给 m 次检验,从数学上控制整体误报率;但更严格的阈值会漏掉一些中等强度的真实异常,所以它会增加漏报风险。它无法消除所有误报。

Q10. 自适应阈值在工程落地时需要注意什么?

多选题 · mid

  • A.用正常样本估计基线← 正确答案
  • B.窗口长度要权衡稳定性← 正确答案
  • C.异常样本不应进入基线← 正确答案
  • D.阈值固定后不能调整

答案:ABC。自适应阈值需要用正常样本学习基线,窗口太短不稳、太长反应慢,且异常样本会污染基线。自适应阈值本身就意味着阈值会动态调整,固定不变不符合它的设计初衷。