概述

大语言模型(LLM)在自然语言理解方面展现了惊人能力,但它们是否真正理解因果关系仍是一个核心问题。因果推理能力直接影响LLM在科学推理、医学诊断、法律分析等领域的可靠性。本专题系统梳理LLM因果推理能力的评估方法与最新研究进展。1


为什么评估LLM因果能力

因果推理的重要性

应用场景因果需求示例问题
科学推理发现因果机制”为什么加热会导致物体膨胀?“
医学诊断因果诊断”症状X是否由疾病Y引起?“
法律分析因果归责”行为A与结果B是否有因果关系?“
决策优化因果效应估计”采取行动X会带来什么结果?“

当前LLM的因果缺陷

研究表明,即使是最先进的LLM也存在系统性的因果推理缺陷:

  1. 因果幻觉:生成看似合理但实际错误的因果解释
  2. 混淆相关与因果:将统计相关性误认为因果关系
  3. 反事实推理失败:难以回答”如果…会怎样”的问题
  4. 干预效应误解:不理解do算子的语义

评估方法分类

评估层次

层次能力评估方式
L1: 因果发现从数据推断因果结构结构化测试、干预实验
L2: 因果效应估计量化干预效果数值估计、排序任务
L3: 反事实推理想象替代场景反事实问答、条件生成

评估范式

┌─────────────────────────────────────────────────────────────┐
│                    LLM因果能力评估                          │
│                                                              │
│  ┌───────────────┐  ┌───────────────┐  ┌───────────────┐   │
│  │  直接问答     │  │  隐式推理     │  │  生成任务     │   │
│  │  Direct QA    │  │  Implicit     │  │  Generation   │   │
│  └───────────────┘  └───────────────┘  └───────────────┘   │
│         │                 │                 │               │
│         ▼                 ▼                 ▼               │
│  "A导致B吗?"       从上下文推断       "如果A没发生..."    │
│                                                              │
└─────────────────────────────────────────────────────────────┘

因果发现评估

NICS基准:神经网络因果发现

NICS(Benchmark for Neural Network Causal Discovery)2评估模型从数据中恢复因果结构的能力:

任务设计

给定成对的变量数据集 ,模型需要:

  1. 识别变量间的直接因果关系
  2. 量化因果效应强度
  3. 区分因果与混淆因素

评估指标

class NICSEvaluator:
    def evaluate(self, model, ground_truth_graph, predicted_graph):
        metrics = {}
        
        # 1. 结构汉明距离 (SHD)
        # 错误边(添加、删除、翻转)的数量
        metrics['SHD'] = self._structural_hamming_distance(
            ground_truth_graph, 
            predicted_graph
        )
        
        # 2. 骨架精度/召回率
        metrics['skeleton_precision'] = self._skeleton_precision(
            ground_truth_graph, 
            predicted_graph
        )
        metrics['skeleton_recall'] = self._skeleton_recall(
            ground_truth_graph, 
            predicted_graph
        )
        
        # 3. 方向精度
        metrics['orientation_accuracy'] = self._orientation_accuracy(
            ground_truth_graph, 
            predicted_graph
        )
        
        return metrics

Cigua-Lens:多变量因果发现

Cigua-Lens评估多变量场景下的因果发现能力:

测试场景

场景变量数复杂度示例
链式3-5A→B→C
叉式3-5A←B→C
对撞3-5A→B←C
混合5-10复杂DAG
含混杂5-10存在未观测混杂

LLM因果发现评估方法

class LLMCausalDiscovery:
    def __init__(self, llm):
        self.llm = llm
        
    def discover_causal_structure(self, data_df):
        """
        使用LLM进行因果发现
        """
        # 1. 生成统计摘要
        stats = self._generate_statistics(data_df)
        
        # 2. 构建提示
        prompt = f"""
给定以下变量的统计信息:
{stats}
 
请推断变量之间的因果关系。
因果关系应遵循格式:[原因] → [结果]
 
注意:
1. 区分直接因果和间接因果
2. 考虑可能的混杂因素
3. 避免混淆相关与因果
 
输出格式:
原因1 → 结果1
原因2 → 结果2
...
"""
        
        # 3. 解析LLM输出
        response = self.llm.generate(prompt)
        causal_edges = self._parse_edges(response)
        
        return causal_edges
    
    def _generate_statistics(self, df):
        """生成描述性统计"""
        stats = []
        for col in df.columns:
            stats.append(f"{col}: 均值={df[col].mean():.2f}, 标准差={df[col].std():.2f}")
        return "\n".join(stats)

因果推理任务评估

COLGEN:概念级因果生成

COLGEN评估模型从概念层面进行因果推理的能力:

任务类型

任务描述示例
因果补全给定因果链的一部分,补全其他部分”因为A,B发生” → 推断A→B
因果解释解释现象背后的因果机制解释”为什么…”
因果预测基于因果关系预测结果”如果A,B会…”
因果归因识别结果的因果来源”什么导致…”

评估框架

class COLGENEvaluator:
    def __init__(self, llm):
        self.llm = llm
        
    def evaluate_conceptual_causation(self, task, response, ground_truth):
        scores = {}
        
        # 1. 因果正确性
        scores['causal_accuracy'] = self._check_causal_validity(
            response, ground_truth['causal_graph']
        )
        
        # 2. 逻辑连贯性
        scores['logical_coherence'] = self._check_coherence(response)
        
        # 3. 完整性
        scores['completeness'] = self._check_completeness(
            response, ground_truth['required_elements']
        )
        
        # 4. 自然度(LLM评估)
        scores['naturalness'] = self._llm_judge_quality(response)
        
        return scores

CRE-Exec:可执行因果推理

CRE-Exec3评估模型执行可验证因果计算的能力:

核心任务:给定因果图和干预,生成可执行的Python代码。

# 示例任务
task = {
    "description": """
给定因果图 X → Z → Y,其中X还直接影响Y。
计算 do(X=1) 对 Y 的平均因果效应。
    """,
    "causal_graph": {
        "X": {"parents": []},
        "Z": {"parents": ["X"]},
        "Y": {"parents": ["X", "Z"]}
    },
    "data": {
        "X": [0, 1, 0, 1, ...],
        "Z": [0, 1, 1, 0, ...],
        "Y": [0, 1, 1, 0, ...]
    },
    "expected_answer": "0.35"  # ATE的近似值
}
 
class CREExecEvaluator:
    def evaluate(self, model_response, task):
        # 1. 提取代码
        code = self._extract_code(model_response)
        
        # 2. 执行代码
        try:
            exec_result = self._execute_safely(code, task['data'])
        except:
            return {'execution': False, 'score': 0}
        
        # 3. 验证结果
        score = self._verify_answer(exec_result, task['expected_answer'])
        
        return {
            'execution': True,
            'answer': exec_result,
            'score': score
        }

CounterBench:反事实推理基准

CounterBench4是评估反事实推理能力的综合基准:

任务分类

类别任务描述评估方式
CF-Prediction预测反事实结果准确性
CF-Generation生成反事实场景质量评估
CF-Explanation解释因果机制人类评估
CF-Intervention设计干预方案可行性

反事实预测评估

class CounterfactualPredictor:
    def __init__(self, llm):
        self.llm = llm
        
    def predict_counterfactual(self, scenario, intervention):
        """
        反事实预测
        """
        prompt = f"""
场景:{scenario}
干预:{intervention}
 
请预测在上述干预下,结果会如何变化。
提供一个清晰、具体的预测。
 
预测:
"""
        return self.llm.generate(prompt)
    
    def evaluate_prediction(self, prediction, ground_truth):
        """
        评估反事实预测质量
        """
        metrics = {}
        
        # 1. 方向正确性
        metrics['direction'] = self._check_direction(
            prediction, ground_truth
        )
        
        # 2. 数量级合理性
        metrics['magnitude'] = self._check_magnitude(
            prediction, ground_truth
        )
        
        # 3. 因果机制一致性
        metrics['mechanism'] = self._check_mechanism(
            prediction, ground_truth['causal_mechanism']
        )
        
        return metrics

反事实质量指标

指标定义计算方式
Validity满足目标反事实的程度检查输出是否符合干预条件
Feasibility反事实的可实现性检查约束是否被违反
Minimality最小修改程度计算与原状的编辑距离
Diversity反事实的多样性多个反事实间的差异度

LLM因果能力分析

2025年模型对比

模型因果发现反事实推理因果解释总体
GPT-4o72%68%75%71.7%
Claude 3.575%71%78%74.7%
Gemini 2.070%65%72%69.0%
DeepSeek-V373%69%74%72.0%
Llama-468%63%70%67.0%

GPT-4 vs Claude能力分析

GPT-4o特点

  • 在复杂因果链推理上表现优异
  • 善于识别隐藏的混杂因素
  • 偶尔混淆因果方向

Claude 3.5特点

  • 反事实推理一致性较高
  • 因果解释更清晰准确
  • 在数值因果估计上更精确

能力缺陷分析

系统性缺陷

  1. 辛普森悖论识别失败

    • 在分层数据中无法识别混杂
    • 常常选择错误的汇总方式
  2. 中介分析困难

    • 难以正确分解总效应
    • 对直接效应与间接效应的区分不准确
  3. 工具变量理解不足

    • 无法正确应用IV估计
    • 误解排他性约束
# 测试辛普森悖论
simpson_paradox_prompt = """
医院A和医院B都在测试一种新药。
 
医院A数据:
- 治疗组:200人,康复180人(90%)
- 对照组:200人,康复160人(80%)
 
医院B数据:
- 治疗组:200人,康复80人(40%)
- 对照组:200人,康复60人(30%)
 
总体数据:
- 治疗组:400人,康复260人(65%)
- 对照组:400人,康复220人(55%)
 
问题:
1. 分别在两家医院,哪家医院显示药物有效?
2. 总体数据是否显示药物有效?
3. 为什么会出现这种矛盾?
"""
 
# 典型LLM错误:选择总体数据或选择错误的分层

提升LLM因果能力的方法

Chain-of-Thought提示

CoT提示显著提升因果推理性能:

def causal_cot_prompt(question):
    return f"""
问题:{question}
 
让我们逐步思考因果关系:
 
步骤1:识别变量
- 处理变量(X):
- 结果变量(Y):
- 可能的混杂变量(Z):
 
步骤2:构建因果假设
基于问题描述,我假设以下因果结构:
[在此画出因果图]
 
步骤3:分析因果效应
- 总效应 = 直接效应 + 间接效应
- 需要控制的混杂:[列出]
- 正确的分析方法:[选择]
 
步骤4:得出结论
基于以上分析,答案应该是:
"""

因果微调策略

数据增强方法

class CausalDataAugmentation:
    def __init__(self, base_dataset):
        self.base = base_dataset
        
    def generate_causal_pairs(self):
        """
        生成因果相关的数据对
        """
        augmented = []
        
        for sample in self.base:
            # 1. 生成反事实样本
            cf_sample = self._generate_counterfactual(sample)
            augmented.append(cf_sample)
            
            # 2. 生成因果链变体
            chain_variants = self._vary_causal_chain(sample)
            augmented.extend(chain_variants)
            
            # 3. 添加混杂场景
            confounded = self._add_confounding(sample)
            augmented.append(confounded)
            
        return augmented
    
    def _generate_counterfactual(self, sample):
        """
        生成反事实训练样本
        """
        original_text = sample['text']
        original_label = sample['label']
        
        # 生成反事实文本
        cf_text = self._swap_cause_effect(original_text)
        
        # 反事实标签应该翻转
        cf_label = self._flip_label(original_label)
        
        return {'text': cf_text, 'label': cf_label, 'is_counterfactual': True}

因果知识注入

class CausalKnowledgeInjector:
    def __init__(self, llm, causal_kb):
        self.llm = llm
        self.causal_kb = causal_kb
        
    def enhance_prompt(self, query):
        """
        在提示中注入相关因果知识
        """
        # 1. 检索相关因果规则
        relevant_rules = self.causal_kb.retrieve(query)
        
        # 2. 构建增强提示
        enhanced = f"""
[因果背景知识]
{relevant_rules}
 
[问题]
{query}
 
[回答要求]
- 参考上述因果知识
- 区分相关性与因果性
- 考虑可能的混杂因素
"""
        return enhanced

评估最佳实践

评估流程

  1. 任务设计:明确评估的因果能力类型
  2. ground truth构建:确保参考答案的因果正确性
  3. 多维度评估:准确率+解释质量+鲁棒性
  4. 人工验证:关键结果需人工审核

注意事项

  • 避免数据泄露:测试集因果结构不应在训练中见过
  • 平衡难度:包含简单、中等、困难样本
  • 对抗测试:设计模型容易出错的样本

相关内容


参考文献


Last updated: 2026-05-14

Footnotes

  1. arXiv:2603.17403. “Causal Representation Learning Benchmark.” 2026.

  2. arXiv. “NICS Benchmark: Neural Network Causal Discovery Evaluation.” 2024.

  3. arXiv:2511.04082. “CRE-Exec: Causal Reasoning Evaluation through Executable Programs.” 2024.

  4. NeurIPS 2025. “CounterBench: A Comprehensive Benchmark for Counterfactual Reasoning in LLMs.” 2025.