概述
大语言模型(LLM)在自然语言理解方面展现了惊人能力,但它们是否真正理解因果关系仍是一个核心问题。因果推理能力直接影响LLM在科学推理、医学诊断、法律分析等领域的可靠性。本专题系统梳理LLM因果推理能力的评估方法与最新研究进展。1
为什么评估LLM因果能力
因果推理的重要性
| 应用场景 | 因果需求 | 示例问题 |
|---|---|---|
| 科学推理 | 发现因果机制 | ”为什么加热会导致物体膨胀?“ |
| 医学诊断 | 因果诊断 | ”症状X是否由疾病Y引起?“ |
| 法律分析 | 因果归责 | ”行为A与结果B是否有因果关系?“ |
| 决策优化 | 因果效应估计 | ”采取行动X会带来什么结果?“ |
当前LLM的因果缺陷
研究表明,即使是最先进的LLM也存在系统性的因果推理缺陷:
- 因果幻觉:生成看似合理但实际错误的因果解释
- 混淆相关与因果:将统计相关性误认为因果关系
- 反事实推理失败:难以回答”如果…会怎样”的问题
- 干预效应误解:不理解do算子的语义
评估方法分类
评估层次
| 层次 | 能力 | 评估方式 |
|---|---|---|
| L1: 因果发现 | 从数据推断因果结构 | 结构化测试、干预实验 |
| L2: 因果效应估计 | 量化干预效果 | 数值估计、排序任务 |
| L3: 反事实推理 | 想象替代场景 | 反事实问答、条件生成 |
评估范式
┌─────────────────────────────────────────────────────────────┐
│ LLM因果能力评估 │
│ │
│ ┌───────────────┐ ┌───────────────┐ ┌───────────────┐ │
│ │ 直接问答 │ │ 隐式推理 │ │ 生成任务 │ │
│ │ Direct QA │ │ Implicit │ │ Generation │ │
│ └───────────────┘ └───────────────┘ └───────────────┘ │
│ │ │ │ │
│ ▼ ▼ ▼ │
│ "A导致B吗?" 从上下文推断 "如果A没发生..." │
│ │
└─────────────────────────────────────────────────────────────┘
因果发现评估
NICS基准:神经网络因果发现
NICS(Benchmark for Neural Network Causal Discovery)2评估模型从数据中恢复因果结构的能力:
任务设计:
给定成对的变量数据集 ,模型需要:
- 识别变量间的直接因果关系
- 量化因果效应强度
- 区分因果与混淆因素
评估指标:
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 metricsCigua-Lens:多变量因果发现
Cigua-Lens评估多变量场景下的因果发现能力:
测试场景:
| 场景 | 变量数 | 复杂度 | 示例 |
|---|---|---|---|
| 链式 | 3-5 | 低 | A→B→C |
| 叉式 | 3-5 | 低 | A←B→C |
| 对撞 | 3-5 | 中 | A→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 scoresCRE-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-4o | 72% | 68% | 75% | 71.7% |
| Claude 3.5 | 75% | 71% | 78% | 74.7% |
| Gemini 2.0 | 70% | 65% | 72% | 69.0% |
| DeepSeek-V3 | 73% | 69% | 74% | 72.0% |
| Llama-4 | 68% | 63% | 70% | 67.0% |
GPT-4 vs Claude能力分析
GPT-4o特点:
- 在复杂因果链推理上表现优异
- 善于识别隐藏的混杂因素
- 偶尔混淆因果方向
Claude 3.5特点:
- 反事实推理一致性较高
- 因果解释更清晰准确
- 在数值因果估计上更精确
能力缺陷分析
系统性缺陷:
-
辛普森悖论识别失败
- 在分层数据中无法识别混杂
- 常常选择错误的汇总方式
-
中介分析困难
- 难以正确分解总效应
- 对直接效应与间接效应的区分不准确
-
工具变量理解不足
- 无法正确应用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评估最佳实践
评估流程
- 任务设计:明确评估的因果能力类型
- ground truth构建:确保参考答案的因果正确性
- 多维度评估:准确率+解释质量+鲁棒性
- 人工验证:关键结果需人工审核
注意事项
- 避免数据泄露:测试集因果结构不应在训练中见过
- 平衡难度:包含简单、中等、困难样本
- 对抗测试:设计模型容易出错的样本
相关内容
参考文献
Last updated: 2026-05-14
Footnotes
-
arXiv:2603.17403. “Causal Representation Learning Benchmark.” 2026. ↩
-
arXiv. “NICS Benchmark: Neural Network Causal Discovery Evaluation.” 2024. ↩
-
arXiv:2511.04082. “CRE-Exec: Causal Reasoning Evaluation through Executable Programs.” 2024. ↩
-
NeurIPS 2025. “CounterBench: A Comprehensive Benchmark for Counterfactual Reasoning in LLMs.” 2025. ↩