基于抽象因果推理 (Abstract Causal Reasoning, ACR) 的 LLM 因果发现框架
本项目实现了一个创新的因果发现方法,通过将统计特征翻译为自然语言叙事,让大型语言模型 (LLM) 在完全脱敏的条件下推断变量之间的因果关系。
传统的 LLM 因果推断研究常被质疑只是"记住"了训练数据中的共现关系(如"吸烟→癌症")。
我们的方法通过:
- 匿名化变量(Var_A, Var_B)
- 提取统计行为特征(残差独立性、分布形态、拟合度)
- 翻译为自然语言叙事(如"A->B 的误差几乎是随机的,但 B->A 的误差中仍包含 B 的痕迹")
强制 LLM 依靠逻辑推理而非语义知识来判断因果方向。
本项目不仅仅是单一的 LiNGAM 或 ANM 实现,而是一个自适应的统计特征提取系统,能够根据数据类型自动选择最优策略:
| 数据类型 | 核心理论 | 关键指标 | 适用场景 |
|---|---|---|---|
| 连续变量 | LiNGAM | 偏度、峰度(非高斯性) | 线性因果关系 |
| Non-linear ANM | 互信息 (MI)、多项式拟合 R² | 非线性因果关系 | |
| 稳定性分析 | 异方差性检测 | 捕捉反向拟合的不稳定性 | |
| 离散变量 | 信息论 | 条件熵、边际熵 | 真实世界离散数据(bnlearn) |
| 预测能力 | 逻辑回归准确率 | 分类变量的因果判断 |
关键突破:将数值统计特征(如 MI=0.35, H(Y|X)=0.72)转化为自然语言叙事,使 LLM 能够像人类专家一样进行因果推理。
LLM 不再是简单的分类器,而是一个能够:
- 综合多源证据:权衡来自熵、拟合度、残差独立性等多个维度的证据。
- 处理矛盾信号:在复杂度不对称与残差独立性冲突时做出合理判断。
- 输出可解释推理链:提供完整的推理过程,而非黑盒决策。
pip install numpy scipy scikit-learn pandas pydantic openai zhipuai pyyaml编辑 llms/config.yaml,设置默认使用的模型:
used_model: "deepseek-ai/DeepSeek-V3.1"# 使用默认配置
python3 run_experiment.py
# 指定参数
python3 run_experiment.py --model "gpt-4-turbo" --samples 1000 --output results.json- 控制台: 实时显示推理进度和准确率
- JSON 文件:
experiment_results.json- 完整的推理结果
LLMBayesian/
├── 📂 background/ # 项目背景文档
│ └── task.md # 实验计划和进度追踪
├── 📂 results/ # 实验结果存储
│ ├── experiment_results.json # 合成数据实验结果
│ └── real_network_results.json # 真实网络测试结果
├── 📂 tests/ # 测试脚本
│ ├── run_experiment.py # 运行合成数据实验
│ └── test_real_networks.py # 测试真实贝叶斯网络
├── 📂 utils_set/ # 核心功能模块
│ ├── stat_translator.py # 统计特征 -> 自然语言叙事(支持 HSIC)
│ ├── data_generator.py # 合成因果数据生成器
│ ├── causal_reasoning_engine.py # 端到端推理引擎
│ ├── prompts.py # Prompt 模板库(Sherlock Holmes 风格)
│ ├── causal_inference_schema.py # Pydantic 响应模型
│ └── utils.py # 配置加载工具
├── 📂 llms/ # LLM 管理系统
│ ├── manager.py # LLM 管理器
│ ├── config.yaml # 模型配置(支持 OpenAI/ZhipuAI/ModelScope)
│ ├── base.py # LLM 基类
│ └── providers/ # 各提供商实现
├── README.md # 本文件
├── MODIFICATION_SUMMARY.md # 最新修改总结
└── PROJECT_STRUCTURE.md # 详细项目结构说明
💡 详细的文件组织说明请参见 PROJECT_STRUCTURE.md
- 准确率: 100% (4/4) 因果案例 🎉
- ✅ LiNGAM (线性非高斯): 正确(HSIC + 偏度信号)
- ✅ Reverse (反向因果): 正确(HSIC + 异方差性)
- ✅ ANM (非线性): 正确(MLP 强拟合 + HSIC)
- ✅ Independent: 正确识别(R²=0, 相关性=0)
- ❌ Confounder: 误判(混淆因子难以区分)
| 网络 | 规模 | ACR-Hybrid | PC | HillClimb | Random | 提升 |
|---|---|---|---|---|---|---|
| Asia | 8 nodes, 8 edges | 5 | 12 | 16 | 16 | 58%↓ |
| Sprinkler | 4 nodes, 4 edges | 3 | 0 | 2 | 6 | - |
| Alarm | 37 nodes, 46 edges | 8 | 75 | 85 | 84 | 89%↓ |
| Sachs | 11 nodes, 17 edges | 4 | 29 | 24 | 30 | 86%↓ |
SHD (Structural Hamming Distance): 越低越好,0 表示完美复原
关键发现:
- ✅ 复杂网络优势: 在 Alarm 网络上 SHD=8 vs PC=75,提升 89%
- ✅ 中型网络优势: 在 Asia 网络上 SHD=5 vs PC=12,提升 58%
⚠️ 简单网络劣势: Sprinkler 上传统算法达到完美(SHD=0),ACR 略逊(SHD=3)- 🎯 核心定位: Blind Causal Discovery(无语义信息场景),隐私保护领域的首个 LLM 方法
- 客观叙事 (Objective Narrative): 将判决权交给 LLM,仅提供相对差异的客观描述,避免硬编码偏见。
- MLP 非线性拟合: 替代多项式回归,彻底解决 ANM 案例的欠拟合问题(准确率 0% → 100%)。
- IGCI 原理: 在离散数据中,边缘熵 (Marginal Entropy) 优于条件熵,修正"预测陷阱"。
- 量化对比框架: 引入 SHD 指标,与 PC/HillClimb/Random 传统算法同台竞技。
pip install numpy scipy scikit-learn pandas pydantic openai zhipuai pyyaml bnlearn matplotlib seaborn编辑 llms/config.yaml,设置你的模型 API:
used_model: "deepseek-ai/DeepSeek-V3.1"python tests/run_experiment.py --model deepseek-v3 --samples 1000python tests/test_real_networks.py --network alarm
python tests/test_real_networks.py --network asia
python tests/test_real_networks.py --network sachspython tests/test_hybrid_pipeline.py --network alarm --strategy conservativepython figures/fig1_mechanism_check.py
python figures/fig2_performance_gap.pycd paper && xelatex main.tex生成数据:
from utils_set.data_generator import CausalDataGenerator
generator = CausalDataGenerator(random_seed=42)
datasets = generator.generate_batch(n_samples=500)分析单个数据对:
from utils_set.stat_translator import StatTranslator
translator = StatTranslator()
stats = translator.analyze(X, Y)
narrative = translator.generate_narrative(stats)
print(narrative)使用 LLM 推理:
from utils_set.causal_reasoning_engine import CausalReasoningEngine
engine = CausalReasoningEngine(model_name="gpt-4-turbo")
results = engine.run_experiment(datasets, save_results=True)- MLP 升级: 引入神经网络回归解决 ANM 欠拟合
- Prompt 修正: 引入 IGCI 原理解决离散数据误判
- 量化对比: 实现 SHD 计算和传统算法 baseline(PC, HillClimb)
- 扩展测试: 在 Asia, Sprinkler, Alarm, Sachs 网络上完成测试
- 论文写作: 完成全部章节(中文版)
- 可视化: 完成机制验证图和性能对比图
- 竞品对照: 验证 PromptBN 在 Blind Setting 下的性能崩溃
- 投稿准备: 整理代码和补充材料
- 实现"元认知仲裁"机制(综合多种算法)
- 在大规模真实数据集上验证
- 投稿顶级会议 (NeurIPS/ICML/ICLR)
当前阶段: 论文初稿已完成 ✅
论文文件位于 paper/ 目录:
main.pdf- 编译后的论文 (8页,中文)figures/- 图表文件
欢迎提交 Issue 和 Pull Request!
MIT License
- bnlearn: https://github.com/erdogant/bnlearn
- LiNGAM 理论: Shimizu et al. (2006)
- ANM 理论: Hoyer et al. (2009)