授权与合规声明
本文全部操作对象均为自建隔离环境与已获授权的目标,涉及安全测试或以他人系统为对象的环节,必须以取得合法授权为前提。未经授权的测试违反《中华人民共和国网络安全法》与《刑法》相关条款,须承担相应法律责任。本文只讲可复现的技术实操与工程落地,不含任何攻击步骤、利用载荷与绕过手法,请勿将文中任何内容用于非自有、未获授权的系统。
第1章 为什么传统方法在多变量相关/语义异常上吃力
1.1 单变量阈值法为什么不够
移动平均、3σ 这类方法本质上是"在一维数值上找离群点"。它们对平稳、单序列、异常表现为明显数值跳变的场景很有效,但现实里的指标往往不是孤立的。
1.2 多变量相关性让"孤立"失效
当多个指标之间存在强相关(如"请求量"和"成功量"通常同步变化),单独看每个序列都"在正常区间",但二者背离时才暴露问题。IsolationForest 这类树模型把每个窗口当作一条特征向量来孤立,但它在特征高度相关时分隔面会变得模糊,对"组合型异常"的召回并不稳定。Prophet / ARIMA 则是典型单变量建模,天然不擅长刻画跨序列关系。
1.3 语义型异常无法用数值直接刻画
还有一类异常:数值上"看起来正常",但业务含义已经错了。比如某服务错误率骤降,统计方法会判定为"好转",实际可能是因为进程挂掉、流量根本没进来。这种"语义异常"需要把指标和上下文(上线、依赖变更、业务时段)一起理解,传统数值方法没有这个通道。
| 方法 | 多变量相关 | 语义异常 | 少样本 | 备注 |
|---|---|---|---|---|
| 移动平均 / 3σ | 弱 | 弱 | 强 | 单序列、数值跳变友好 |
| IsolationForest | 中 | 弱 | 中 | 特征高度相关时分隔面模糊 |
| Prophet / ARIMA | 弱 | 弱 | 中 | 单变量建模为主 |
| 大模型(混合) | 强 | 强 | 中 | 需配合规则与传统模型 |
第2章 选型判据:看数据特征,不看模型热度
选方法的依据不该是"谁火",而是数据本身长什么样。下面给出一组可操作的判据。
2.1 三个让大模型"有戏"的信号
- 少样本:历史标注的异常样本很少,监督模型无从训练,而大模型可以靠 prompt 里的先验知识与上下文推理。
- 多变量强相关:异常表现为"几个指标一起背离",需要跨序列的联合理解。
- 异常带语义:异常的本质是业务含义错乱,而非单纯数值越界,需要把指标和上下文一起读。
2.2 反过来,传统方法更划算的场景
当数据量大、延迟敏感、异常模式稳定可枚举时,规则与统计方法在成本和确定性上明显占优。大模型不该替代它们,而是补上"规则看不懂的那部分"。
| 数据特征 | 推荐路径 | 理由 |
|---|---|---|
| 单序列、阈值清晰、量大 | 规则 / 统计 | 确定性强、成本低、延迟小 |
| 多变量但关系可枚举 | 树模型 / 相关性规则 | 可解释、易部署 |
| 少样本 + 语义型 | 大模型(混合) | 需要上下文推理 |
| 多变量强相关 + 语义 | 大模型 + 传统模型混合 | 各取所长 |
| 实时强延迟要求 | 规则优先,大模型异步补检 | 避免阻塞链路 |
第3章 落地路径:从特征到混合
一条可复现的落地链路是:特征构造 → 抽窗口 → 拼 prompt → 与传统模型/规则混合。
3.1 特征构造与窗口切片
先把原始时序切成固定长度的窗口,并补充派生特征(同比、环比、滑动统计),让大模型在单条输入里就拿到足够上下文。
⚠️ 代码待验证
importpandasaspddefbuild_windows(series:pd.Series,window:int=24,step:int=1):# series 按时间升序;window 为窗口长度,step 为滑动步长rows=[]forstartinrange(0,len(series)-window+1,step):chunk=series.iloc[start:start+window]rows.append({"window_id":f"item{start:04d}","mean":chunk.mean(),"std":chunk.std(),"delta":chunk.iloc[-1]-chunk.iloc[0],"values":chunk.tolist(),})returnpd.DataFrame(rows)3.2 Prompt 模板与上下文注入
prompt 里要明确:角色、窗口数据、给定上下文(是否刚上线、依赖是否变更)、以及期望的输出结构。把"规则判定为正常"的窗口交给大模型,只让它解释"为什么可能仍是异常",能显著压低调用量。
⚠️ 代码待验证
defmake_prompt(window_row,ctx:dict)->str:returnf"""你是一名时序异常分析助手。 上下文:{ctx.get('note','无')}窗口数据(最近一段):{window_row['values']}窗口统计量:均值={window_row['mean']:.2f},标准差={window_row['std']:.2f}请判断该窗口是否异常,并给出原因与风险等级。 只输出符合给定 schema 的 JSON。"""第4章 把输出锁成结构化:schema 约束
大模型的自由文本不可直接进告警系统,必须用 schema 约束输出,方便下游消费与校验。
4.1 用 JSON Schema 框定字段
| 字段 | 类型 | 说明 |
|---|---|---|
| is_anomaly | boolean | 是否判定为异常 |
| score | number | 风险分,范围 0–1 |
| reason | string | 人类可读原因 |
| level | string | 风险等级:low/mid/high |
| evidence | array | 支撑证据(指标名列表) |
下面是一份可复用的 schema 草稿(具体字段名以你下游系统为准,待验证)。
⚠️ 代码待验证
{"type":"object","properties":{"is_anomaly":{"type":"boolean"},"score":{"type":"number","minimum":0,"maximum":1},"reason":{"type":"string"},"level":{"type":"string","enum":["low","mid","high"]},"evidence":{"type":"array","items":{"type":"string"}}},"required":["is_anomaly","score","reason","level"]}第5章 验收:规则校验 + 人工抽检
大模型输出不能直接"信任即上线",需要两层把关。
5.1 规则校验兜底
先对大模型输出做结构化校验:字段是否齐全、score 是否在合法区间、level 是否枚举内。校验不过的样本一律转人工,避免脏数据污染告警。
⚠️ 代码待验证
defvalidate_output(obj:dict)->bool:ifnotisinstance(obj.get("is_anomaly"),bool):returnFalsescore=obj.get("score")ifnotisinstance(score,(int,float))ornot0<=score<=1:returnFalseifobj.get("level")notin{"low","mid","high"}:returnFalsereturnTrue5.2 人工抽检与回流
按固定比例抽一部分结果由人复核,把"误报/漏报"回写成样例,逐步沉淀成规则或 few-shot 示例。抽检比例与节奏按团队人力而定,待验证。
配套资料:这一章讲到的实操要点,我整理成了可运行的示例与对照表,放在资料包里,扫码即可获取:
第6章 成本账:按窗口计费,混合流程压量
大模型通常按 token / 调用计费,全量窗口都丢进去会是明显的成本负担。工程上要靠"混合"把量压下来。
6.1 三层过滤压量
- 第一层:规则与统计先过滤掉明显正常的窗口,这部分占大头。
- 第二层:传统模型(树模型/相关性规则)再筛一遍"疑似"。
- 第三层:只有前两层拿不准的窗口,才交给大模型做语义级判断。
这样大模型实际处理的窗口数量是整体的一小部分,成本和延迟都可控。
| 阶段 | 处理对象 | 主要成本 | 目标 |
|---|---|---|---|
| 规则 / 统计 | 全量窗口 | 极低 | 过滤明显正常 |
| 传统模型 | 疑似窗口 | 低 | 缩小候选集 |
| 大模型 | 难例窗口 | 中 | 语义级判定 |
6.2 缓存与批处理
对相似窗口做去重缓存,对离线场景用批处理拼批,都能进一步摊薄单次成本。具体能省多少与数据分布强相关,待验证。
第7章 与告警、RAG 结合
大模型判定出的异常,最终要接回工程系统才能产生价值。
7.1 接告警
把 schema 输出直接映射成告警事件的字段:level 决定告警级别,evidence 决定通知内容,reason 作为工单备注。这样值班同学看到的就是"可读的结论"而不是"一串数字"。
7.2 接 RAG 做根因辅助
把历史告警、变更记录、运维文档建成检索库,大模型在给出异常结论时顺带检索相关上下文,能给出"可能和哪次上线/哪个依赖相关"的线索,辅助根因定位。检索效果取决于知识库的覆盖与质量,待验证。
| 结合方式 | 输入 | 输出价值 |
|---|---|---|
| 接告警 | schema 输出 | 可读告警、工单备注 |
| 接 RAG | 异常 + 知识库 | 根因线索、变更关联 |
| 异步补检 | 规则漏判样本 | 提高召回、不过阻塞链路 |
配套资料:这一章讲到的实操要点,我整理成了可运行的示例与对照表,放在资料包里,扫码即可获取:
附表 A:本文引用事实与出处对照表
| 事实 | 出处 | 本文位置 |
|---|---|---|
| 移动平均 / 3σ 属于单变量统计异常检测,适用于平稳序列的离群识别 | 经典统计异常检测方法(通用技术常识) | 第1章、第2章 |
| IsolationForest 通过随机分割孤立样本来识别异常,对高维相关特征区分力下降 | Isolation Forest 原论文(Liu 等,2008,通用引用) | 第1章、第2章 |
| Prophet / ARIMA 为单变量时序建模方法 | 经典时序预测方法(通用技术常识) | 第1章 |
| 大模型可通过 prompt 注入上下文做少样本推理 | 大模型提示工程通用实践(以官方最新公布为准,截至 2026-10-28) | 第2章、第3章 |
| 用 JSON Schema 约束大模型结构化输出是常见做法 | 主流大模型平台结构化输出能力(以官方最新公布为准,截至 2026-10-28) | 第4章 |
| 混合检测(规则+模型+大模型)用于压量与分层 | 工程落地通用实践(待验证) | 第5章、第6章 |
附表 B:术语速查表
| 术语 | 含义 |
|---|---|
| 3σ 法 | 以均值±3 倍标准差为阈值识别离群点的统计方法 |
| IsolationForest | 孤立森林,基于随机分割的树模型异常检测算法 |
| 窗口(window) | 把时序按固定长度切出的连续片段,作为模型输入单元 |
| schema 约束 | 用结构定义限制大模型输出字段与类型,便于下游消费 |
| few-shot | 在 prompt 中给出少量示例以引导模型行为的提示方式 |
| RAG | 检索增强生成,先检索知识再生成,缓解模型幻觉 |
写在最后:这篇用到的资料
写这篇文章时,我把里面对应的实操示例和踩坑记录顺手整理了几份配套的东西:
- 全套 AGI 大模型学习路线:从基础到实战的系统性路径,避免零散摸索
- Claude Skills 全指南:把重复性工程动作沉淀成可复用技能
- LangGraph+MCP 智能体实战视频:跟着敲一遍就能跑通的智能体项目
资料是我自己整理的,放在下面这个码上,扫码即可获取:
资料较多,建议先看「全套 AGI 大模型学习路线」,再挑一个实战项目跟练。