起飞就起飞

因果推断与 AI-SRE 技术解析(一)

Posted on By baixiao

因果推断与 AI-SRE 技术解析(一)

从 Traversal 看因果推断基础与开源工具链

日期: 2026-03-05
关键词: 因果推断、AIOps、SRE、DoWhy、EconML、Traversal

系列说明: 本文是”因果推断与 AI-SRE 技术解析”系列的第一篇,主要介绍因果推断基础概念、核心原理,以及 DoWhy 和 EconML 两大开源工具链。后续文章将继续深入探讨 Traversal 的技术架构、与 LLM Agent 的集成、以及在实际工作中的应用。


本文背景

本文源于对微信公众号文章《当人读不懂 AI 代码,Traversal 如何做企业运维的 AI 医生?》的深度技术讨论。

原文核心内容概述

Traversal 是一家由 MIT 和 Berkeley 教授及量化交易员组成的 AI-SRE 初创公司,2025 年 6 月完成 4800 万美元融资(Sequoia 和 Kleiner Perkins 领投)。

核心技术定位

  • 以因果推断为基础构建自主决策型 SRE Agent
  • 区别于竞品的”相关性猜测”,通过因果推断实现根因定位
  • 通过仿真沙盒与 GitHub 深度扫描,将故障精准锁定到具体代码变更
  • 已在 American Express 和 Digital Ocean 等财富 100 强客户中实现 90%+ 归因准确率

本文目的:深入解析因果推断技术原理、开源工具链(DoWhy/EconML),以及其与 LLM Agent 的结合方式,为 AI-SRE 实践提供技术参考。


一、背景:为什么需要因果推断?

1.1 AI Coding 带来的新挑战

随着 Claude Code 等 AI 编程工具的普及,AI 贡献的代码已占公开 GitHub 的 4%。但这也带来了新问题:

  • “Claude Hole” 现象: AI 写的系统逻辑有人类很难捕捉的问题
  • 代码复杂度指数级增长,传统运维方式难以应对
  • 企业每年因停机损失约 4000 亿美元

1.2 传统工具的局限

工具类型 能力 局限
Datadog 等监控工具 展示指标波动 无法解释根本原因
传统 AIOps 基于相关性检测异常 可能误判(混淆因素)
规则引擎 硬编码专家经验 难以应对新场景

核心问题: 相关性不等于因果性。只看到”A 和 B 同时发生”,无法确定”A 导致 B”。


二、因果推断基础

2.1 核心概念:相关性与因果性

经典例子:冰淇淋与溺水

分析方式 观察 结论 问题
相关性分析 冰淇淋销量↑ 时,溺水事故↑ 冰淇淋导致溺水? ❌ 荒谬
因果推断 气温↑ → 冰淇淋销量↑
气温↑ → 游泳人数↑ → 溺水↑
气温是共同原因 ✅ 正确

关键区别: 因果推断回答的是——”如果我改变 X,Y 会怎样?”(干预效果)

2.2 因果推断的核心框架

2.2.1 因果图(Causal Graph / DAG)

有向无环图,表示变量间的因果关系:

┌─────────┐     ┌─────────┐     ┌─────────┐
│ 代码变更 │────→│  故障   │←────│  配置   │
│ (v2.3.1)│     │(DB延迟↑)│     │  调整   │
└─────────┘     └────┬────┘     └─────────┘
                     │
                ┌────┴────┐
                │  告警   │
                │ (观测到) │  ← 我们看到的只是症状
                └─────────┘

关键洞察: 告警只是症状,真正的因果链需要推断。

2.2.2 反事实推理(Counterfactual)

核心问题:”如果当时没有做 X,结果会怎样?”

场景 传统监控 因果推断
发布后故障 “CPU升高了,回滚吧” “如果没有这次发布,故障会发生吗?→ 确定是发布导致的”

2.2.3 Do-Calculus(干预演算)

由 Judea Pearl(图灵奖得主)提出,用于从观测数据推断干预效果:

P(Y | do(X)) ≠ P(Y | X)

左边:强制做 X 后 Y 的概率(干预)
右边:观察到 X 时 Y 的概率(条件)

例子:
P(治愈 | 吃药) = 30%  (观察到吃药的人,治愈率30%)
P(治愈 | do(吃药)) = 60%  (强制所有人吃药,治愈率60%)

区别:前者包含自我选择偏差(病情重的人才吃药)

三、开源工具:DoWhy 与 EconML

3.1 DoWhy:完整的因果推断流程

3.1.1 定位与资源

微软研究院开发的因果推断库,核心理念是四步法因果推断流程

  • GitHub: https://github.com/microsoft/dowhy
  • 官方文档: https://www.pywhy.org/dowhy/

3.1.2 四步法架构

┌─────────────────────────────────────────────────────────────┐
│                    DoWhy 四步法流程                          │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│  1. Model(建模)                                           │
│     ├── 定义因果模型:treatment(干预)→ outcome(结果)       │
│     ├── 指定 confounders(混杂变量)                          │
│     └── 可以用领域知识或从数据学习                            │
│                          ↓                                  │
│  2. Identify(识别)                                          │
│     ├── 给定因果图,能否从观测数据估计因果效应?              │
│     ├── 使用 do-calculus 找到识别策略                        │
│     └── 输出:估计方法(如后门调整、工具变量)                 │
│                          ↓                                  │
│  3. Estimate(估计)                                          │
│     ├── 使用识别策略估计因果效应大小                          │
│     ├── 支持多种方法:回归、匹配、加权、工具变量等             │
│     └── 输出:ATE(平均处理效应)、CATE(条件处理效应)         │
│                          ↓                                  │
│  4. Refute(反驳/验证)                                       │
│     ├── 检验估计结果的稳健性                                  │
│     ├── 常用检验:                                           │
│     │   • 安慰剂检验(用假干预替换真实干预)                   │
│     │   • 数据子集检验(用部分数据重新估计)                   │
│     │   • 添加随机混杂变量                                    │
│     └── 如果检验通过,结果更可信                              │
│                                                             │
└─────────────────────────────────────────────────────────────┘

3.1.3 代码示例

import dowhy
from dowhy import CausalModel
import pandas as pd
import numpy as np

# 1. 准备数据
# 场景:研究"新功能上线"对"用户留存"的因果效应
data = pd.DataFrame({
    'user_id': range(10000),
    'treatment': np.random.binomial(1, 0.5, 10000),  # 是否看到新功能
    'age': np.random.normal(30, 10, 10000),
    'income': np.random.lognormal(10, 1, 10000),
    'tenure': np.random.exponential(2, 10000),  # 使用时长
    'outcome': np.random.binomial(1, 0.3, 10000)  # 7日留存
})

# 2. 定义因果模型
model = CausalModel(
    data=data,
    treatment='treatment',
    outcome='outcome',
    common_causes=['age', 'income', 'tenure']
)

# 3. 识别因果效应
identified_estimand = model.identify_effect()
print("识别策略:")
print(identified_estimand)

# 4. 估计因果效应
estimate = model.estimate_effect(
    identified_estimand,
    method_name="backdoor.propensity_score_matching"
)
print(f"\n因果效应估计: {estimate.value}")

# 5. 验证结果稳健性
refutation = model.refute_estimate(
    identified_estimand,
    estimate,
    method_name="placebo_treatment_refuter"
)
print("\n安慰剂检验结果:")
print(refutation)

3.2 EconML:异质性因果效应估计

3.2.1 定位与资源

微软研究院开发的面向机器学习的因果推断库,专注于异质性因果效应估计(CATE)。

  • GitHub: https://github.com/microsoft/EconML
  • 官方文档: https://econml.azurewebsites.net/

3.2.2 核心创新:从 ATE 到 CATE

传统因果推断          EconML 的创新
─────────────        ─────────────────
ATE (平均效应)   →   CATE (条件平均效应)
"总体平均效果如何"    "对不同人群,效果不同"

线性模型          →   机器学习模型
简单参数拟合        复杂模式自动学习

同质人群          →   异质人群
一刀切的策略        精准个性化策略

示例:
新推荐算法的效果

ATE = +5% 转化率  (总体平均提升5%)
     ↓ 没太大用

CATE(age=25, city=一线城市) = +15%  (年轻城市用户效果很好)
CATE(age=60, city=农村)      = -3%   (老年农村用户反而下降)

→ 精准运营:只给第一类用户推新算法

3.2.3 核心方法体系

┌─────────────────────────────────────────────────────────────┐
│                    EconML 方法体系                           │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│  1. 元学习器 (Meta-Learners)                                 │
│     ─────────────────────                                   │
│     • S-Learner: 单模型学习 Y ~ (T, X)                      │
│     • T-Learner: 分别对 T=0 和 T=1 建模                     │
│     • X-Learner: 利用倾向得分优化                           │
│     • R-Learner: 基于残差的学习(推荐)                      │
│     • DR-Learner: 双重稳健学习                               │
│                                                             │
│  2. 工具变量 (Instrumental Variables)                         │
│     ───────────────────────────────                         │
│     • DeepIV: 深度学习 + 工具变量                           │
│     场景:随机化实验不可行,但有工具变量                      │
│                                                             │
│  3. 正交/双重机器学习 (Orthogonal/Double ML)                 │
│     ─────────────────────────────────                       │
│     • DML: 核心方法,Neyman-orthogonal 估计                │
│     • CausalForestDML: 因果森林                             │
│     特点:√n 一致性,可处理高维数据                           │
│                                                             │
│  4. 深层因果模型 (Deep Causal Models)                         │
│     ───────────────────────────────                         │
│     • CEVAE: 因果效应变分自编码器                            │
│     • DeepGMM: 深度广义矩估计                                 │
│     特点:处理隐变量、非线性效应                              │
│                                                             │
└─────────────────────────────────────────────────────────────┘

3.2.4 代码示例:使用 EconML

import numpy as np
import pandas as pd
from econml.dml import CausalForestDML
from sklearn.ensemble import RandomForestRegressor, RandomForestClassifier
from sklearn.model_selection import train_test_split

# 1. 准备数据
np.random.seed(42)
n = 10000

data = pd.DataFrame({
    'user_id': range(n),
    'treatment': np.random.binomial(1, 0.5, n),  # 是否看到新功能
    'age': np.random.normal(30, 10, n),
    'income': np.random.lognormal(10, 1, n),
    'tenure': np.random.exponential(2, n),  # 使用时长
})

# 真实效应:对新用户(tenure低)效果更好
true_effect = 0.1 + 0.3 * np.exp(-data['tenure'])
data['outcome'] = (
    true_effect * data['treatment'] +
    0.05 * data['age'] +
    0.0001 * data['income'] +
    np.random.normal(0, 0.1, n)
)

# 2. 划分训练/测试集
train, test = train_test_split(data, test_size=0.2, random_state=42)

# 3. 使用 CausalForestDML 估计 CATE
estimator = CausalForestDML(
    model_y=RandomForestRegressor(n_estimators=100, random_state=42),
    model_t=RandomForestClassifier(n_estimators=100, random_state=42),
    discrete_treatment=True,
    n_estimators=1000,
    min_samples_leaf=10,
    max_depth=5,
    random_state=42
)

# 拟合模型
estimator.fit(
    Y=train['outcome'],
    T=train['treatment'],
    X=train[['age', 'income', 'tenure']]
)

# 4. 预测 CATE
cate_pred = estimator.effect(test[['age', 'income', 'tenure']])

# 5. 分析异质性
print("CATE 统计摘要:")
print(f"  均值: {cate_pred.mean():.3f}")
print(f"  标准差: {cate_pred.std():.3f}")

# 按 tenure 分组
test_copy = test.copy()
test_copy['cate_pred'] = cate_pred
test_copy['tenure_group'] = pd.qcut(
    test_copy['tenure'], 
    q=4, 
    labels=['新用户', '早期', '中期', '老用户']
)

print("\n按用户生命周期分组的平均 CATE:")
print(test_copy.groupby('tenure_group')['cate_pred'].mean())

四、DoWhy 与 EconML 对比

维度 DoWhy EconML
核心定位 完整的因果推断流程 异质性因果效应估计
主要功能 建模→识别→估计→验证 CATE 估计、DML、因果森林
与 ML 的关系 可使用 ML,但不依赖 深度集成 ML(sklearn)
最佳场景 需要完整因果分析流程 需要精准定位”对谁有效”
验证机制 丰富的反驳检验 置信区间、自助法

两者如何结合?

# DoWhy + EconML 结合示例

# 1. 用 DoWhy 建模和识别
model = dowhy.CausalModel(
    data=data,
    treatment='treatment',
    outcome='outcome',
    common_causes=['age', 'income', 'tenure']
)

identified_estimand = model.identify_effect()

# 2. 用 EconML 进行估计(作为 DoWhy 的估计方法)
estimate = model.estimate_effect(
    identified_estimand,
    method_name="econml.dml.CausalForestDML",
    method_params={
        "init_params": {...},
        "fit_params": {}
    }
)

# 3. 用 DoWhy 进行验证
refutation = model.refute_estimate(
    identified_estimand,
    estimate,
    method_name="placebo_treatment_refuter"
)

五、总结

5.1 核心价值

组件 贡献 局限
LLM 自然语言理解、通用知识、灵活推理 幻觉、统计相关性、无真因果
因果推断 确定性决策、根因定位、可解释性 需要结构化数据、领域知识

结合后的价值:

  1. 根因分析: 从”可能相关”到”确定因果”
  2. 决策支持: 从”经验猜测”到”数据驱动的最优决策”
  3. 可解释性: 从”黑盒”到”白盒因果路径”
  4. 鲁棒性: 从”训练数据分布”到”干预下的泛化”

5.2 集成架构

┌─────────────────────────────────────────────────────────┐
│                    Agent 体系架构                        │
├─────────────────────────────────────────────────────────┤
│  ┌─────────────┐    ┌─────────────┐    ┌─────────────┐ │
│  │  感知层     │───→│  推理层     │───→│  执行层     │ │
│  │  (数据收集) │    │  (决策逻辑) │    │  (工具调用) │ │
│  └─────────────┘    └──────┬──────┘    └─────────────┘ │
│                            │                           │
│              ┌─────────────┼─────────────┐             │
│              ↓             ↓             ↓               │
│        ┌─────────┐  ┌─────────┐  ┌─────────┐          │
│        │ LLM     │  │ 因果    │  │ 规则    │          │
│        │ (通用   │  │ 推断    │  │ 引擎    │          │
│        │ 推理)   │  │ (因果   │  │ (硬编码) │          │
│        │         │  │ 推理)   │  │         │          │
│        └─────────┘  └─────────┘  └─────────┘          │
│              ↑                                    │
│              │      互补关系:                      │
│              │      • LLM 提供通用理解             │
│              │      • 因果推断提供确定性决策       │
│              └─────────────────────────────────────┘
└─────────────────────────────────────────────────────────┘

5.3 协作流程示例

场景: 用户反馈”昨天发布 v2.3.1 后,支付服务延迟飙升”

Step 1: LLM 理解与自然语言处理
─────────────────────────────────
LLM 提取关键信息:
  • 时间:昨天
  • 事件:发布 v2.3.1
  • 症状:支付服务延迟飙升
  • 隐含假设:发布导致延迟(相关性)

生成初步查询:
  "验证:v2.3.1 发布是否导致支付服务延迟飙升?"


Step 2: 因果推断引擎执行因果分析
───────────────────────────────────
(1) 构建因果图:
    从变更历史学习结构:
    v2.3.1 发布 → 订单服务变更 → 数据库负载↑ → 延迟飙升
         ↓
    同时期其他变更:配置更新、依赖升级(混杂因素)

(2) 反事实推理:
    问题:"如果没有 v2.3.1 发布,延迟会飙升吗?"
    方法:do-calculus,后门调整
    数据:历史同期无发布时的延迟基线

(3) 效应估计:
    ATE = E[延迟|do(发布)] - E[延迟|do(不发布)]
    结果:ATE = 0.73 (73% 概率延迟飙升)
    置信区间:[0.68, 0.78],p < 0.001

(4) 仿真验证:
    在沙盒环境复现 v2.3.1 发布 → 确认延迟飙升
    回滚 v2.3.1 → 确认延迟恢复
    验证因果假设成立


Step 3: LLM 解释与报告生成
──────────────────────────
LLM 接收因果推断引擎的结构化输出:
  • 因果效应:ATE = 0.73,置信度 99%
  • 因果路径:v2.3.1 → 订单服务 → 数据库负载 → 延迟
  • 验证结果:沙盒复现成功

生成自然语言报告:
"基于因果推断分析,v2.3.1 发布是导致支付服务延迟飙升的根因。
分析过程如下:

1. 因果定位:v2.3.1 中的订单查询优化导致数据库连接池耗尽,
   进而引发延迟飙升。

2. 因果验证:通过反事实推理,如果没有 v2.3.1 发布,
   延迟飙升的概率为 27%(相比实际的 73%),差异显著(p<0.001)。

3. 仿真验证:在隔离沙盒中复现 v2.3.1 发布,确认延迟飙升;
   回滚后延迟恢复,验证因果假设成立。

建议:立即回滚 v2.3.1,并优化订单查询的数据库连接池配置。"


Step 4: 决策与执行
──────────────────
• 基于因果推断结果,生成修复建议
• 评估修复方案的风险(副作用的概率)
• 决策:自动执行 / 人工确认 / 仅告警
• 执行修复并监控验证

五、总结

5.1 核心价值

能力 传统方法 因果推断增强
根因分析 相关性猜测,误判率高 因果定位,确定性高
决策支持 经验驱动,难以量化 数据驱动,可量化干预效果
可解释性 黑盒规则 白盒因果路径
泛化能力 训练分布内有效 可预测干预下的结果

6.2 技术选型建议

场景 推荐工具 原因
完整的因果分析流程 DoWhy 四步法完整,验证机制丰富
精准定位”对谁有效” EconML CATE 估计,异质性分析
两者结合 DoWhy + EconML 流程 + 精准估计
大规模生产环境 自研 + 开源组合 性能优化、领域适配

6.3 实践建议

  1. 从小场景开始:选择数据质量好、因果关系相对明确的场景试点
  2. 重视领域知识:因果图构建需要 SRE 专家的经验输入
  3. 建立验证闭环:因果推断的结果必须通过 A/B 测试或沙盒验证
  4. 持续迭代优化:根据反馈不断优化因果模型和推断算法

参考资源

  • DoWhy: https://github.com/microsoft/dowhy
  • EconML: https://github.com/microsoft/EconML
  • Judea Pearl: “The Book of Why”(因果推断经典著作)
  • Traversal: https://traversal.ai/(本文分析的创业公司)

本文基于 2026-03-05 的技术讨论整理,主要探讨因果推断在 AI-SRE 领域的应用,以及 DoWhy、EconML 等开源工具的使用。