概述

CausalBench是由Jin等人于NeurIPS 2024提出的因果LLM综合评估框架,旨在系统化评估大型语言模型在因果推理任务上的能力。该框架涵盖了因果推断的四个核心维度:因果发现、反事实推理、因果效应估计和因果解释,为因果LLM研究提供了标准化的评估基础设施。1

随着LLM在因果推理任务上的应用日益广泛,如何准确评估其因果能力成为一个关键问题。CausalBench的出现填补了这一空白,其核心贡献包括:

  1. 系统化评估维度:覆盖因果推断的核心任务类型
  2. 多样化数据源:包含医学、经济、社会科学等领域的真实数据
  3. 多粒度评估指标:从粗粒度准确率到细粒度的因果结构评估
  4. 标准化基准:便于不同模型和方法之间的公平比较

四维度评估体系

CausalBench的评估框架围绕四个核心因果任务维度展开:

┌─────────────────────────────────────────────────────────────────┐
│                        CausalBench 评估框架                         │
├─────────────────────────────────────────────────────────────────┤
│                                                                  │
│   ┌─────────────────┐  ┌─────────────────┐                      │
│   │   因果发现      │  │  反事实推理     │                      │
│   │  (Discovery)    │  │ (Counterfactual) │                     │
│   └────────┬────────┘  └────────┬────────┘                      │
│            │                     │                                │
│   ┌────────┴────────┐  ┌────────┴────────┐                      │
│   │   因果效应估计   │  │   因果解释      │                      │
│   │  (Estimation)   │  │  (Explanation)  │                      │
│   └─────────────────┘  └─────────────────┘                      │
│                                                                  │
└─────────────────────────────────────────────────────────────────┘

维度一:因果发现(Causal Discovery)

评估LLM从数据或文本中识别因果关系的能力。

任务类型

  1. 从观测数据发现因果图:给定观测数据,恢复底层因果结构
  2. 从文本提取因果关系:从自然语言文本中抽取因果关系
  3. 因果结构问答:回答关于因果图结构的问题(如”X是Y的原因吗?”)

评估指标

discovery_metrics = {
    # 结构准确性指标
    "SHD": "Structural Hamming Distance",  # 与真实图的边差异数
    "F1": "Edge F1 Score",  # 边预测的精确率和召回率调和平均
    "MEC": "Markov Equivalence Class Accuracy",  # 马尔可夫等价类准确率
    
    # 方向准确性指标
    "Orientation_F1": "Causal Direction F1",  # 因果方向预测的F1
    
    # 分数性指标
    "AUROC": "ROC曲线下面积",  # 因果关系存在性的判别能力
    "AUPRC": "PR曲线下面积"   # 不平衡情况下的表现
}
 
def evaluate_discovery(predicted_graph, true_graph):
    """
    评估因果发现性能
    """
    metrics = {}
    
    # 计算SHD
    metrics["SHD"] = compute_shd(predicted_graph, true_graph)
    
    # 计算边F1
    metrics["F1"] = compute_edge_f1(predicted_graph, true_graph)
    
    # 计算马尔可夫等价类准确率
    metrics["MEC"] = compute_mec_accuracy(predicted_graph, true_graph)
    
    return metrics

示例问题

问题:给定以下数据集的统计特性,识别变量之间的因果关系。
数据:气温(X)、冰淇淋销量(Y)、溺水人数(Z)

分析:需要识别出气温是冰淇淋销量和溺水人数的共同原因,
而非冰淇淋导致溺水或溺水导致冰淇淋销量增加。

期望输出:因果图,边{X→Y, X→Z}

维度二:反事实推理(Counterfactual Reasoning)

评估LLM理解和生成反事实场景的能力。

任务类型

  1. 反事实问题回答:回答”如果X没有发生,Y会怎样?“类问题
  2. 反事实生成:生成合理的反事实场景描述
  3. 反事实有效性评估:评估给定反事实陈述的合理性

评估指标

counterfactual_metrics = {
    # 语义正确性
    "Plausibility": "反事实场景的合理性评分(1-5)",
    "Specificity": "反事实陈述的特异性程度",
    
    # 因果有效性
    "Intervention_Consistency": "是否正确应用do-操作",
    "Counterfactual_Validity": "反事实结论的因果有效性",
    
    # 生成质量
    "BLEU": "与参考反事实描述的BLEU分数",
    "Semantic_Similarity": "语义相似度"
}
 
def evaluate_counterfactual(cf_statement, context, true_counterfactual):
    """
    评估反事实推理能力
    """
    
    # 1. 检验plausibility
    plausibility_score = llm_judge.evaluate(
        f"Rate the plausibility of this counterfactual: {cf_statement}"
        f"Context: {context}"
        f"Scale: 1 (impossible) to 5 (very plausible)"
    )
    
    # 2. 检验因果有效性
    intervention_check = verify_do_operation(
        cf_statement, 
        causal_model
    )
    
    # 3. 语义正确性
    semantic_score = compute_similarity(cf_statement, true_counterfactual)
    
    return {
        "plausibility": plausibility_score,
        "causal_validity": intervention_check,
        "semantic_accuracy": semantic_score
    }

示例问题

问题:患者A服用了新药X后出现肝损伤。
反事实问题:如果患者A没有服用药物X,他会肝损伤吗?

期望回答:
"根据药物X的已知副作用机制,肝损伤是由于药物代谢产物
对肝细胞的毒性作用。如果患者A没有服用药物X,
在保持其他因素不变的情况下,他不太可能出现肝损伤。

这个反事实推断基于:
1. 时间顺序:服药在先,损伤在后
2. 生物学机制:已知药物代谢产物具有肝毒性
3. 剂量-反应关系:损伤严重程度与药物剂量相关"

维度三:因果效应估计(Causal Effect Estimation)

评估LLM辅助因果效应估计的能力。

任务类型

  1. 识别正确的估计目标:理解用户想要估计何种因果效应
  2. 选择合适的估计方法:根据数据特征推荐因果估计方法
  3. 估计结果解读:解释因果效应估计值的实际含义

评估指标

estimation_metrics = {
    # 估计准确性
    "Bias": "因果效应估计的偏倚",
    "MSE": "均方误差",
    "Coverage": "置信区间的覆盖概率",
    
    # 方法选择准确性
    "Method_Selection_Accuracy": "是否选择了最合适的方法",
    "Method_Relevance": "所选方法的合理性评分",
    
    # 解释质量
    "Interpretation_Accuracy": "效应解释的正确性",
    "Confidence_Interval_Coverage": "CI是否正确反映了不确定性"
}
 
def evaluate_causal_estimation(
    llm_recommendation, 
    ground_truth_method, 
    ground_truth_effect
):
    """
    评估因果效应估计能力
    """
    
    # 评估方法选择
    method_correct = (
        llm_recommendation["method"] == ground_truth_method
    )
    
    # 评估效应估计
    effect_bias = abs(
        llm_recommendation["estimate"] - ground_truth_effect
    )
    
    # 评估解释质量
    interpretation_score = llm_judge.evaluate(
        f"Rate the accuracy of this causal effect interpretation:\n"
        f"{llm_recommendation['explanation']}\n"
        f"True effect: {ground_truth_effect}"
    )
    
    return {
        "method_correct": method_correct,
        "effect_bias": effect_bias,
        "interpretation_score": interpretation_score
    }

示例问题

问题:给定一个观测数据集(包含Treatment和Outcome以及多个Covariates),
用户想知道Treatment对Outcome的平均因果效应。

期望回答:
1. 首先识别这是观测数据,需要考虑混杂因素
2. 推荐合适的估计方法(如PSM、IPW、回归等)
3. 解释估计结果的含义:"ATE = 5.2表示接受治疗的个体
   与不接受治疗的个体相比,预期结果平均增加5.2个单位"
4. 提供置信区间和假设检验结果

维度四:因果解释(Causal Explanation)

评估LLM生成人类可理解因果解释的能力。

任务类型

  1. 因果机制解释:解释变量之间的因果作用机制
  2. 统计结果因果化:将统计关联解释为因果关系
  3. 因果路径分析:描述因果效应的传导路径

评估指标

explanation_metrics = {
    # 忠实性
    "Faithfulness": "解释是否忠实于底层因果机制",
    "Completeness": "解释是否涵盖所有相关因果路径",
    
    # 可理解性
    "Clarity": "语言清晰度评分",
    "Simplicity": "解释的简洁程度",
    "Technical_Accuracy": "因果概念使用的准确性",
    
    # 效用
    "Actionability": "解释是否有助于决策",
    "User_Satisfaction": "用户满意度评分"
}
 
def evaluate_causal_explanation(
    explanation, 
    causal_graph, 
    target_audience
):
    """
    评估因果解释质量
    """
    
    # 1. 忠实性检验
    # 检查解释中提到的因果关系是否与图结构一致
    faithfulness = check_faithfulness(
        explanation, 
        causal_graph
    )
    
    # 2. 完整性检验
    completeness = check_completeness(
        explanation,
        causal_graph,
        focus_variables=get_target_variables(explanation)
    )
    
    # 3. 清晰度评估
    clarity_score = llm_judge.evaluate(
        f"Rate the clarity of this causal explanation for {target_audience}:\n"
        f"{explanation}\n"
        f"Scale: 1 (very unclear) to 5 (very clear)"
    )
    
    # 4. 因果准确性
    accuracy_score = evaluate_causal_accuracy(
        explanation,
        causal_graph
    )
    
    return {
        "faithfulness": faithfulness,
        "completeness": completeness,
        "clarity": clarity_score,
        "accuracy": accuracy_score
    }

示例问题

问题:解释为什么"接受职业培训"会提高就业概率。
请用普通人都能理解的方式解释。

期望回答:
"职业培训提高就业的因果机制可以分为几个路径:

直接路径:培训 → 技能提升 → 就业能力 → 就业
- 培训提供了具体的工作技能
- 这些技能使求职者更适合市场需求

间接路径:培训 → 自信心提升 → 求职行为 → 就业
- 培训经历增强了求职者的信心
- 信心的提升使他们更积极地寻找和申请工作

中介因素:雇主认知
- 雇主将培训证书视为求职者质量的信号
- 这减少了信息不对称,加快了招聘决策

混杂控制:需要控制年龄、教育程度、地区等因素,
因为它们同时影响培训参与和就业结果。"

CausalGraphBench:因果图发现基准

CausalGraphBench是CausalBench中专注于因果图发现任务的子基准。2

任务类型

  1. 因果结构识别:给定变量集合,识别变量之间的因果关系
  2. 因果方向判断:判断因果关系的方向
  3. 因果强度估计:估计因果效应的强度
  4. 混杂识别:识别潜在的混杂因素

数据集组成

causal_graph_bench_data = {
    # 模拟数据集
    "simulated": {
        "Linear_Gauss": "线性高斯结构方程模型",
        "Nonlinear": "非线性因果关系",
        "Discrete": "离散变量因果模型",
        "Mixed": "混合类型变量",
        "Latent_Confounder": "存在隐混杂的情况"
    },
    
    # 真实数据集
    "real_world": {
        "Medical": "医疗领域(ICU患者、临床试验)",
        "Economic": "经济领域(就业、收入数据)",
        "Social": "社会领域(教育、人口统计)",
        "Scientific": "科学领域(生物、物理实验)"
    },
    
    # 文本数据集
    "text_based": {
        "Causal_Statements": "因果陈述文本",
        "News_Articles": "新闻文章中的因果关系",
        "Scientific_Abstracts": "科学摘要中的因果关系"
    }
}

编码敏感性分析

CausalGraphBench的一个关键发现是LLM对因果图的编码方式高度敏感。2

# 不同编码方式的效果对比
encoding_experiments = {
    "adjacency_matrix": {
        "description": "邻接矩阵编码",
        "example": "1→2→3 转为 [[0,1,0],[0,0,1],[0,0,0]]",
        "performance": "相对较低,结构信息丢失"
    },
    
    "edge_list": {
        "description": "边列表编码",
        "example": "X→Y, Y→Z",
        "performance": "中等,理解成本较低"
    },
    
    "natural_language": {
        "description": "自然语言描述",
        "example": "X causes Y, which in turn causes Z",
        "performance": "最佳,语义信息丰富"
    },
    
    "dagitty_format": {
        "description": "DAGitty格式",
        "example": "dag { X -> Y -> Z }",
        "performance": "较高,需要专业知识"
    }
}
 
def analyze_encoding_sensitivity():
    """
    分析编码方式对因果发现性能的影响
    """
    results = {}
    
    for encoding in encoding_experiments:
        performance = evaluate_on_causalgraphbench(
            model=current_model,
            encoding=encoding,
            num_samples=1000
        )
        results[encoding] = performance
    
    # 统计分析
    best_encoding = max(results, key=lambda k: results[k]["F1"])
    improvement = results[best_encoding]["F1"] - results["adjacency_matrix"]["F1"]
    
    print(f"最佳编码方式: {best_encoding}")
    print(f"相比邻接矩阵提升: {improvement:.2%}")
    
    return results

四种查询类型

CausalGraphBench定义了四种类型的因果查询:

查询类型描述示例典型准确率
结构查询关于因果图拓扑结构的问题”X和Y之间有因果关系吗?“约75%
反事实查询涉及do-操作的反事实推理”如果X没有发生,Y会怎样?“约61%
中介查询关于中介机制的问题”X如何影响Y?Z是中介吗?“约68%
干预查询关于干预效果的问题”强制X=1对Y有什么影响?“约65%
query_type_analysis = {
    "structural": {
        "examples": [
            "Is there a causal relationship between X and Y?",
            "What are the confounders of X and Y?",
            "Is Z a mediator between X and Y?"
        ],
        "llm_strengths": "模式识别能力强",
        "llm_weaknesses": "可能混淆相关性与因果性"
    },
    
    "counterfactual": {
        "examples": [
            "If X had not occurred, would Y have been different?",
            "Would the effect of X on Y change if Z were different?",
            "What would Y have been under treatment X=1?"
        ],
        "llm_strengths": "自然语言理解能力强",
        "llm_weaknesses": "形式化do-操作理解不足"
    },
    
    "mediation": {
        "examples": [
            "Is Z a mediator of the X → Y relationship?",
            "What proportion of X's effect on Y is mediated by Z?",
            "How does the direct effect compare to the indirect effect?"
        ],
        "llm_strengths": "能够识别中介概念",
        "llm_weaknesses": "量化中介效应不准确"
    },
    
    "intervention": {
        "examples": [
            "What is the effect of setting X=1 on Y?",
            "If we intervene to increase X by one unit, what happens to Y?",
            "Does intervening on Z change the X → Y relationship?"
        ],
        "llm_strengths": "理解干预概念",
        "llm_weaknesses": "区分观察与干预的能力有限"
    }
}

CauSciBench:科学因果推理基准

CauSciBench是针对科学领域的因果推理基准,涵盖物理、化学、生物等学科的因果推理任务。1

领域覆盖

causcibench_domains = {
    "physics": {
        "topics": ["力学", "热力学", "电磁学", "量子力学"],
        "examples": [
            "分析弹簧-质量系统中阻尼对振动的影响",
            "解释热传导中的傅里叶定律",
            "推导电路中电压-电流关系的因果机制"
        ]
    },
    
    "biology": {
        "topics": ["遗传学", "生理学", "生态学"],
        "examples": [
            "基因突变如何通过信号通路影响表型",
            "环境因素如何通过生态系统影响物种分布",
            "药物作用机制中的因果链条"
        ]
    },
    
    "medicine": {
        "topics": ["临床医学", "流行病学", "药物学"],
        "examples": [
            "评估疫苗对疾病发病率的因果效应",
            "识别疾病的风险因素及其作用机制",
            "药物相互作用中的因果关系"
        ]
    },
    
    "social_science": {
        "topics": ["经济学", "心理学", "教育学"],
        "examples": [
            "政策干预对经济指标的长短期效应",
            "教育投入与学业成就的因果关系",
            "社会因素对心理健康的因果影响"
        ]
    }
}

评估特点

causcibench_evaluation = {
    # 领域知识整合
    "domain_knowledge_integration": {
        "description": "评估模型是否能够利用领域知识进行因果推理",
        "metrics": [
            "Domain_Accuracy",  # 领域特定问题准确率
            "Knowledge_Utilization",  # 领域知识利用率
            "Cross_Domain_Transfer"  # 跨领域因果推理能力
        ]
    },
    
    # 机制理解
    "mechanism_understanding": {
        "description": "评估模型对因果机制的理解程度",
        "metrics": [
            "Mechanism_Identification",  # 机制识别准确率
            "Causal_Chain_Length",  # 可处理的因果链长度
            "Feedback_Loop_Handling"  # 反馈循环处理能力
        ]
    },
    
    # 科学严谨性
    "scientific_rigor": {
        "description": "评估因果推理的科学严谨性",
        "metrics": [
            "Assumption_Verification",  # 假设验证能力
            "Confounding_Control",  # 混杂控制意识
            "Uncertainty_Quantification"  # 不确定性量化能力
        ]
    }
}

评估方法论

评估流程

def causalbench_evaluation_pipeline(model, benchmark_config):
    """
    CausalBench标准化评估流程
    """
    
    results = {
        "discovery": {},
        "counterfactual": {},
        "estimation": {},
        "explanation": {}
    }
    
    # 1. 因果发现评估
    print("评估因果发现能力...")
    results["discovery"] = evaluate_discovery(
        model,
        benchmark_config["discovery_tasks"]
    )
    
    # 2. 反事实推理评估
    print("评估反事实推理能力...")
    results["counterfactual"] = evaluate_counterfactual(
        model,
        benchmark_config["counterfactual_tasks"]
    )
    
    # 3. 因果效应估计评估
    print("评估因果效应估计能力...")
    results["estimation"] = evaluate_estimation(
        model,
        benchmark_config["estimation_tasks"]
    )
    
    # 4. 因果解释评估
    print("评估因果解释能力...")
    results["explanation"] = evaluate_explanation(
        model,
        benchmark_config["explanation_tasks"]
    )
    
    # 5. 综合评分
    final_scores = compute_final_scores(results)
    
    return {
        "detailed_results": results,
        "summary_scores": final_scores,
        "recommendations": generate_recommendations(final_scores)
    }

评分体系

scoring_framework = {
    # 四个维度的权重
    "dimension_weights": {
        "discovery": 0.25,
        "counterfactual": 0.25,
        "estimation": 0.25,
        "explanation": 0.25
    },
    
    # 子维度权重
    "subdimension_weights": {
        "discovery": {
            "structure_accuracy": 0.4,
            "direction_accuracy": 0.3,
            "strength_estimation": 0.3
        },
        "counterfactual": {
            "plausibility": 0.3,
            "causal_validity": 0.4,
            "specificity": 0.3
        },
        "estimation": {
            "method_selection": 0.3,
            "effect_estimation": 0.4,
            "interpretation": 0.3
        },
        "explanation": {
            "faithfulness": 0.35,
            "clarity": 0.35,
            "actionability": 0.3
        }
    },
    
    # 综合评分计算
    "final_score": lambda results: sum(
        dim_weight * results[dim]
        for dim, dim_weight in scoring_framework["dimension_weights"].items()
    )
}

关键发现与洞察

发现一:编码敏感性

LLM对因果信息的编码方式高度敏感。自然语言描述的因果图表现显著优于形式化的矩阵编码:

  • 最佳编码:自然语言因果描述(平均F1: 0.78)
  • 次优编码:DAGitty格式(平均F1: 0.71)
  • 最差编码:邻接矩阵(平均F1: 0.62)

发现二:查询类型难度差异

不同类型的因果查询准确率存在显著差异:

结构查询      ████████████████████  75%
反事实查询    ██████████████████    61%
干预查询      ██████████████████    65%  
中介查询      ██████████████████    68%

洞察:反事实查询最难,因为需要精确理解do-操作和反事实逻辑。

发现三:领域知识的重要性

在科学因果推理中:

  • 具备领域知识时:准确率提升约15-20%
  • 缺乏领域知识时:容易产生”看似合理但错误”的因果推断
  • 最佳策略:结合通用因果推理能力与领域特定知识

发现四:链式推理的局限性

当因果推理需要多步推理时:

chain_length_analysis = {
    1: {"accuracy": 0.82, "reasoning_steps": 1},
    2: {"accuracy": 0.71, "reasoning_steps": 2},
    3: {"accuracy": 0.58, "reasoning_steps": 3},
    4: {"accuracy": 0.44, "reasoning_steps": 4},
    5: {"accuracy": 0.31, "reasoning_steps": 5}
}

洞察:因果链长度增加时,准确率急剧下降,表明LLM在长程因果推理上存在局限。


使用指南

快速开始

from causalbench import CausalBench
 
# 初始化评估器
evaluator = CausalBench(
    model="gpt-4",
    benchmark="full",  # full / quick / domain_specific
    dimensions=["discovery", "counterfactual", "estimation", "explanation"]
)
 
# 运行评估
results = evaluator.evaluate()
 
# 查看详细报告
results.generate_report(format="markdown")

自定义评估

from causalbench import CausalBench, TaskConfig
 
# 定义自定义任务
custom_tasks = [
    TaskConfig(
        type="discovery",
        prompt="Given the following data summary, identify causal relationships...",
        ground_truth=causal_graph,
        metrics=["SHD", "F1", "MEC"]
    ),
    TaskConfig(
        type="counterfactual",
        prompt="If treatment X had not been administered...",
        ground_truth=counterfactual_outcome,
        metrics=["Plausibility", "Validity"]
    )
]
 
# 运行自定义评估
evaluator = CausalBench(model="claude-3", custom_tasks=custom_tasks)
results = evaluator.evaluate()

局限性与发展方向

当前局限性

  1. 评估的主观性:某些评估维度(如解释质量)依赖主观判断
  2. ground truth的可靠性:复杂因果场景的ground truth难以确定
  3. 分布外泛化:基准数据集可能无法覆盖所有实际场景
  4. 多模态挑战:当前基准主要针对文本,未涉及多模态因果推理

未来发展方向

  1. 动态评估基准:随LLM能力提升持续更新评估标准
  2. 交互式评估:引入人类反馈进行主观维度评估
  3. 多模态扩展:纳入图像、视频中的因果推理评估
  4. 因果能力诊断:开发诊断性评估,识别LLM的因果能力短板

参考资料


相关专题

Footnotes

  1. Jin et al. (2024). CausalBench: A Comprehensive Benchmark for Causal Reasoning with Large Language Models. NeurIPS 2024 Datasets & Benchmarks Track. 2

  2. Sheth et al. (2025). CausalGraph2LLM: Evaluating LLMs for Causal Queries. NAACL 2025 Findings. 2