因果推断是 LLM 最容易被质疑的战场——漏掉一个协变量,"效应"就是噪声。而且它不像代码 bug 会直接崩,坏估计只会安静地误导业务决策。这周 Netflix 开源的 oci-agent(Netflix-Skunkworks/oci-agent)值得每个做数据科学的团队读一遍:一个 actor 智能体根据人写的分析计划,把参数填进模板 Jupyter notebook 并执行;一个 critic 智能体审查结果、给出三档判定、要求修改;循环直到报告通过。它不是生产级代码,但是目前公开最清晰的"把因果分析苦活自动化、又不交出人类判断"的蓝本。
为什么这个模式值得抄
Netflix 把观测因果推断(OCI)定义为 target trial emulation——用观测数据为你的问题找到最优 A/B 实验。内部案例最能说明问题:估算新娱乐类型对留存的影响时,critic 发现了早期采用者偏差和失败的 placebo 检验,最终把效应估计压到了 naive 线性回归基线的 25%。脚手架本身就是产品。
核心设计:actor-critic 闭环
整条管线是一个循环,每步都有可审计的产物:
plan → actor.draft → spec → nb_runner → results.json → critic.evaluate → oci_report.md
↑ │
└────── actor.revise ◀────────── critique.json ◀──────┘三个组件,都在 oci_agent/ 下:
- Actor(
actor.py):把 markdown 分析计划转成 spec YAML,后续迭代吸收 critic 的修改建议。 - Runner(
nb_runner.py):把 spec 参数注入 notebook 的配置 cell,执行 notebook,再追加结果序列化 cell。 - Critic(
critic.py):对照writing-reportsskill 审查results.json,输出fully_satisfactory/satisfactory_with_caveats/not_satisfactory三档判定和具体修改项。
两个设计决策是精髓。一是模板 notebook:agent 只在固定且经过评审的分析结构内操作,最佳实践是默认值而不是碰运气。二是 skills 就是 markdown:writing-specs、changing-notebooks、running-notebooks、writing-reports、suggesting-remedies 运行时加载,改文本就能改行为,不用动代码。
本地跑一遍
需要 Python 3.10+。注意依赖锁了 numpy<2:econml 传递依赖的 shap 引用了 numpy ≥ 2.0 已删除的 np.bool8。
python3 -m venv .venv && source .venv/bin/activate
pip install -e .
export ANTHROPIC_API_KEY=sk-ant-... # actor/critic 走 Claude Messages API
# 生成一份合成的 ACIC 形状数据集,先跑通冒烟测试
python evals/generate_synthetic_acic.py
# 单步驱动循环
oci-agent draft --plan plans/tryitout.md --specs-dir specs
oci-agent run specs/tryitout/iter_01.yaml --output-dir output/tryitout
oci-agent evaluate output/tryitout --plan plans/tryitout.md
oci-agent revise output/tryitout --specs-dir specs/tryitout
# 或者一条命令跑完整循环
oci-agent loop specs/tryitout/iter_01.yaml --output-dir output/tryitout \
--specs-dir specs/tryitout --plan plans/tryitout.md --iterations 1CLI 会自动递增输出目录(iter_02/、iter_03/…)和 spec 文件名,迭代计数不用自己记。要走代理而不是直连 Anthropic?设 ANTHROPIC_BASE_URL 即可。
闭环真的有用吗?看数据
在 ACIC 2016 基准(77 个数据生成过程)上,覆盖率扎实、偏差很低:
Estimand |Bias| RMSE Cov95
ATE 0.015 0.173 84.8%
ATT 0.017 0.083 96.1%
ATO 0.014 0.066 97.0%ATT 的偏差在官方 ACIC 黑盒基准的 16 个参赛者里排第 5。最有说服力的是对照实验:在 10 个 ACIC 数据集上,完整 actor-critic 循环的 ATT 平均 |error| 只有 0.054,9/10 次覆盖真值;而同一个 Sonnet 4.6 只给计划文本和 5 行数据、不给任何工具时,平均 |error| 高达 2.572——差了约 48 倍,只有 3/10 覆盖真值。critic 的确定性判定与独立 LLM 裁判在 666/693(96%)条记录上一致。
实践建议
- 人留在顶层。你负责提问题和拍板结果,agent 干敏感性分析、迭代追踪、写报告——这些正是最烧分析师时间的事。
- 审产物,不审感觉。每轮迭代留下
spec.yaml、results.json、执行过的 notebook、critique.json、oci_report.md。把它们接进你的评审流程,得到的是过程透明,而不只是输出。 - 别直接上生产。这是 Skunkworks 参考实现:不收 PR、无维护承诺。拿它当架构样板——actor-critic 骨架可以迁移到其他分析领域,因为 skills 只是 markdown。