市医院的数据科主任老周遇到一件烦心事:他手里有上千份重症病人的电子病历,炎症指标和住院天数总是同涨同落,可他要写的是“因果诊断报告”,不是“相关性报告”。正当他盯着屏幕发愁时,科室请来一位会诊老中医。老先生不看数据,只问了几句病情,便写下三张纸条:“炎症拖长住院”“高龄加重炎症”“住院延长恶化炎症”。老周半信半疑地把纸条递给统计软件——软件照单办事,原本要跑一整夜的搜索,两个小时就出了结果,而且方向判断比过去准得多。 这不是科幻段子,而是当下 AI 界真实兴起的研究思路:因果发现 Prompt。它把大模型当成那位见多识广的“老中医”,用一份精心设计的提示词(问诊单)请它输出变量之间可能存在的因果关系,再把这些“经验纸条”作为先验,指引传统因果发现算法快、准、稳地搜索图结构。一句话:让常识为数据导航,让人机协作破解因果难题。
掌握因果发现 Prompt,等于为你的因果推断工作流装上一台“常识加速器”——让 AI 系统不仅能解释相关,更能逼近因果,这是提升 AI 可信度的关键一环。
目录
可视化演示
展示因果发现Prompt全流程:变量列表构建Prompt输入LLM、大模型推理生成因果假设图、先验与数据驱动方法融合加速因果发现,通过交互理解人机协作因果发现机制。
本节配有交互动效(进入视口后自动加载,约 3KB)。
Prompt构建:变量列表驱动LLM因果推理 将变量列表与领域背景组织为结构化Prompt LLM基于常识知识输出因果假设 H = LLM(Vars, Context) Prompt将LLM因果常识转化为可用先验信号
问题缘起:数据只能告诉你“在一起”,不能告诉你“谁领导谁”
市医院新来的数据科主任老周,盯着电子病历里两列数字发愁:重症患者的“炎症指标”和“住院天数”总是同步升高。他能断定两者“有关”,却不敢断定是炎症拖长了住院,还是住院久了引发炎症——也许背后还有一个“年纪大”的共同原因在暗中起作用。统计软件是数据的天才,却是因果的哑巴。
因果发现要解决的就是这个“哑巴”问题:给定一堆观测变量,我们想推出“谁影响谁”的有向图。传统 PC 算法、GES 算法拿着数据矩阵反复做条件独立性检验、搜索图结构,可有三个坎迈不过去。第一坎:相关不等于因果,图中多画一条错边,后续因果推断全盘皆输;第二坎:搜索空间爆炸,4 个变量的候选有向无环图就有 543 个,10 个变量时是天文数字;第三坎:方向定不准,X 和 Y 明显相关,但箭头该朝哪边,数据经常沉默。
第一坎用公式说就是:
这三个坎说明:光有数据不够,人类积累了千年的“常识病因学”一直没有被算法用起来。于是有人想:能不能请一位“见多识广的老先生”先画一张怀疑清单?这就有了因果发现 Prompt。
- 条件概率 $P(Y \mid X)$表示已知 X 发生之后,Y 出现的统计频率,属于被动观察
- 干预算子 $P(Y \mid \mathrm{do}(X))$表示主动把 X 设定为指定值后 Y 的概率分布,属于实验干预
- 不等号 $\ne$强调观察到的相关性不能直接等价于干预后的因果效应
核心原理:老中医的常识先验如何变成算法语言
老中医望闻问切不靠仪器,靠的是脑子里几十年攒下的“病因模式”:面色萎黄加上脉象沉细,多半先考虑脾虚。大语言模型(LLM)也类似——它读过千万篇论文、新闻、百科,见过无数“X 与 Y 相关”的表述,脑子里沉淀了一份“世界如何运作”的常识地图。这份地图,正是传统算法最缺的东西。
因果发现 Prompt 的核心玩法,就是把“问诊单”递给 LLM:单子上写清要研究的变量列表和一小段领域背景。LLM 看完,输出一条条“疑似因果边”:A 可能影响 B、C 可能由 D 引起,并可以带上置信度。这些边组装起来,就是一张“先验因果草稿图”。注意,这张图不是最终答案,而是用来指导搜索的起点。
从贝叶斯视角看,这张草稿图对应“结构先验”。因果结构学习可以表达为一个后验最大化问题:
数据像现代仪器的实测报告,先验像老中医的经验打分。两者相加,算法从“盲目搜索”升级为“带偏好的搜索”——这正是因果发现 Prompt 一切收益的源头。
- 最优图 $\hat{G}$算法在全部候选结构中最终选中的那张因果图
- 数据对数似然 $\log P(D \mid G)$在给定图 G 的前提下,观测到数据 D 的概率取对数,数值越大说明图对数据解释得越好
- 结构先验 $\log P(G)$LLM 依据常识对图 G 的事先认可程度,对应老中医的经验权重
- 最大化求和 $\arg\max$遍历所有候选图,把“数据分”与“先验分”相加,选出总分最高的那张
设计方法:一张好问诊单长什么样
老中医再高明,问诊单写不清也白搭。你要是只写“病人叫张三”,他没法判断。同样,LLM 的常识再丰富,Prompt 给不到位,输出的因果假设就会天马行空。一份合格的因果发现 Prompt,有四个要件缺一不可。
第一,变量列表要全:把每个变量的规范名写清楚(“收缩压”“体重指数”),别用“那个指标”这类模糊代称,否则模型只能靠猜。第二,领域背景一句话:交代数据场景(“某三甲 ICU 的 24 小时监护记录”),激活模型在对应领域的常识——ICU 的因果机制和电商点击数据的因果机制完全不同。第三,提问句式明确:直接问“请输出你认为存在因果关系的边及方向”,别问“你看这俩有关吗”,前者要的是因果结构,后者只会得到相关性描述。第四,约束输出格式:要求以 (原因,结果,置信度) 三元组返回,方便程序直接解析进下游流程。
设计精良的 Prompt 还能让模型自带“条件独立”意识:如果模型判断“在给定 Z 的情况下 X 和 Y 不再有关系”,它就不会草率地在 X 与 Y 之间画一条直连边。
问诊单越规范,老中医的经验纸条就越靠谱,程序也越容易接手。这四要素,就是因果发现 Prompt 的“问诊单模板”。
- 条件独立符号 $\perp\!\!\!\perp$读作“独立于”,表示两变量之间没有直接的信息流动
- 给定集合 $Z$把 Z 的取值固定住之后,再观察 X 与 Y 的关系
- 整体判据Z 控制后 X 与 Y 独立,说明 XY 之间的关联被 Z 解释了
结合路径:纸条如何变成搜索地图
老中医写完纸条,侦探就得把纸条变成行动方案。纸条上说“重点查这三条街”,侦探就只搜这三条街,而不是全城撒网。因果发现算法同理——把 LLM 的先验当作搜索地图来用。
先验融入搜索有两条路线。硬约束:把 LLM 给出的边设为“必选项”,搜索只遍历包含这些边的候选图。软约束:先验边不强制存在,但在评分函数里获得额外加分——正是公式里的 $\log P(G)$ 那一项。软约束更稳健,因为它允许数据反驳 LLM 的错误建议,更贴合“先验是助手而非领导”的定位。
不管哪条路线,效果都是搜索空间锐减:
除了剪枝,先验还承担“方向定向”任务:数据只告诉你 A 和 B 相关,LLM 补一句“通常是 A 影响 B”,算法就优先尝试 A→B 而非 B→A。更妙的是可以迭代:第一轮先验进算法,算法出结果,把结果反馈给 LLM 修正观点,再跑第二轮。就算老中医圈错了一条街也没关系,仪器复核会划掉它,只是多花一点时间——这比从零搜索快得多。
- 全部候选图集 $\mathcal{G}_{\mathrm{all}}$无任何先验时,所有可能构成有向无环图的集合
- 先验候选图集 $\mathcal{G}_{\mathrm{prior}}$只保留满足 LLM 先验边的图之后剩下的集合
- 远小于号 $\ll$表示数量级上的明显差距,评分函数调用次数因此大幅下降
效果优势:从全城搜查到精确打击
侦探全城撒网要三个月,按纸条精确打击只要三天。因果发现 Prompt 的收益也是三个层面:候选图少了、方向准了、数据需求低了。
加速结构搜索:4 个变量时无先验要评估 543 个 DAG,加入 3 条先验边后只剩数十个,评分调用次数断崖式下跌。提升方向准确:先验直接告诉算法先试哪条边方向,避免在错误方向上反复试探。数据效率提升:当样本量捉襟见肘(比如罕见病只有 30 份病历),纯数据可能什么都学不出来,先验让算法在“小数据”下也能开工。
加速比可以量化成一个简洁的比值:
人机协作的新路径就此打通:LLM 凭常识画方向,算法凭数据做检验,人工做最终审定。三方各司其职,这正是因果发现 Prompt 被称为“人机协作因果发现创新路径”的原因。
- 分子 $|\mathcal{G}_{\mathrm{all}}|$无先验时需要评估的候选图总数
- 分母 $|\mathcal{G}_{\mathrm{prior}}|$有先验后只需评估的候选图数量
- 加速比 $\eta$两者相除得到的倍数,$\eta$ 越大说明先验带来的收益越明显
局限风险:老中医也有误诊时
老中医不是神。碰到从没见过的新病毒,他也会按老经验开出无效方子。LLM 同样会一本正经地“幻觉”:为迎合你的提问,编造一条在文本中站不住脚、在现实中不存在的因果边。所以因果发现 Prompt 必须清醒认识自己的边界。
风险主要有三类。幻觉风险:模型“编造”合理但不存在的因果关系,尤其是在变量名生僻或背景含糊的时候。领域偏差:LLM 的训练语料以公开通用文本为主,对特定垂直领域(如某厂生产线上独有的传感器组合)认知薄弱,给出的先验可能就是“想当然”。验证缺失:把先验当结论直接写进报告,这是最危险的用法——等于把假设当成事实。
兜底的永远是对数据的检验。贝叶斯后验公式把所有信息综合在一起:
数据是最终裁判。老中医的纸条只是“重点排查名单”,仪器验证过了,才能写进病历。因果发现 Prompt 的正确姿态,始终是:先验是助手,数据是裁判,算法是执法者。
- 后验概率 $P(G \mid D)$看到数据之后,对候选图 G 的最终信任程度
- 似然项 $P(D \mid G)$来自观测数据的证据强度,数据越吻合,数值越高
- 先验项 $P(G)$LLM 凭常识给的底分,相当于老中医的经验权重
- 归一化项 $P(D)$保证所有候选图概率之和为 1 的常数分母
AI 应用场景
医院慢病根因分析
阶段:数据准备与因果发现
解决的问题:传统统计只能给出“危险因素相关矩阵”,医生难以判断高血压与糖尿病谁先影响谁、肥胖在中间扮演什么角色。人工梳理文献耗时耗力,且容易遗漏变量间的方向性关系。
具体案例:某三甲医院内分泌科将患者的血糖、胰岛素、BMI、年龄、家族史五个变量加上一句“2 型糖尿病门诊随访数据”背景输入 LLM,得到三条先验边(肥胖→胰岛素抵抗→血糖升高、年龄→血糖升高),再交给 PC 算法在 2000 份病历上验证。搜索时间缩短约 40%,方向准确率从 61% 提升到 78%,医生拿到一份“待临床复核”的候选因果路径图。
电商推荐因果归因
阶段:特征工程与转化归因
解决的问题:用户行为链路长,浏览、加购、下单之间高度相关,运营团队想知道“哪个环节真正推动了购买”,而不是只看点击率报表。
具体案例:推荐算法团队把“曝光、点击、加购、收藏、下单”五个核心变量和一句“电商 App 首页推荐场景”背景交给 LLM,得到“点击→加购→下单”为主链路的先验假设。GES 算法在先验约束下搜索,候选结构从上千缩减到不足百个,最终确认“加购”是转化关键中介,运营资源随之向加购引导倾斜。
工业故障根因定位
阶段:时序因果发现与根因分析
解决的问题:生产线上几十个传感器同时波动,故障发生时告警成片,工程师无法判断哪个是根因、哪些只是连锁反应。
具体案例:AIoT 团队将温度、振动、电流、转速等八个传感器变量加上“注塑机产线”背景输入 LLM,模型凭设备常识提出“电流异常→温度升高→振动加剧”的先验路径。时序因果发现算法以此为起点定向搜索,根因定位准确率提升约 30%,平均排障时间从 4 小时压缩到 1.5 小时。
Python 演示
import itertools # 待研究的变量集合(节点)variables = ['A', 'B', 'C', 'D'] # 所有可能有向边:任意两个不同节点之间各一条all_edges = [(i, j) for i in variables for j in variables if i != j] # 模拟 LLM 输出的因果先验边(常识判断:B 影响 A,C 影响 D,D 依赖 A)llm_prior_edges = [('B', 'A'), ('C', 'D'), ('D', 'A')] # 模拟"真实因果图":LLM 先验 4 条中命中 3 条,另有 1 条未发现(A -> C)true_edges = [('B', 'A'), ('C', 'D'), ('D', 'A'), ('A', 'C')] def is_dag(edges): """拓扑排序:判断边集能否构成有向无环图""" indeg = {v: 0 for v in variables} adj = {v: [] for v in variables} for u, v in edges: adj[u].append(v) indeg[v] += 1 queue = [v for v in variables if indeg[v] == 0] seen = 0 while queue: node = queue.pop() seen += 1 for w in adj[node]: indeg[w] -= 1 if indeg[w] == 0: queue.append(w) return seen == len(variables) def enumerate_dags(edge_pool): """枚举给定边池中所有能构成 DAG 的子集""" dags = [] for size in range(len(edge_pool) + 1): for combo in itertools.combinations(edge_pool, size): if is_dag(list(combo)): dags.append(list(combo)) return dags def overlap_count(graph): """简化评分:候选图与真实因果边集合的重合边数 (真实场景下此处应替换为数据似然或 BIC 评分)""" return sum(1 for e in graph if e in true_edges) def main(): all_dags = enumerate_dags(all_edges) prior_dags = [g for g in all_dags if all(e in g for e in llm_prior_edges)] print('无先验搜索:需评估 {} 个候选 DAG'.format(len(all_dags))) print('有先验搜索:仅评估 {} 个候选 DAG'.format(len(prior_dags))) speedup = len(all_dags) / float(len(prior_dags)) print('搜索空间缩减至 {:.2f}%,加速约 {:.1f} 倍'.format( len(prior_dags) / float(len(all_dags)) * 100, speedup)) best_prior = max(prior_dags, key=overlap_count) best_all = max(all_dags, key=overlap_count) print('先验约束下最优图命中真实边数:{} / 4'.format(overlap_count(best_prior))) print('全空间搜索最优图命中真实边数:{} / 4'.format(overlap_count(best_all))) if __name__ == '__main__': main()
llm_prior_edges = [('B', 'A'), ('C', 'D'), ('D', 'A')]模拟 LLM 输出的先验因果边,相当于老中医的经验纸条def is_dag(edges)用拓扑排序判断候选边集是否构成合法有向无环图for combo in itertools.combinations(edge_pool, size)枚举边池中所有大小的子集,即遍历候选图空间prior_dags = [g for g in all_dags if all(e in g for e in llm_prior_edges)]硬约束:只保留完全包含先验边的候选图speedup = len(all_dags) / float(len(prior_dags))计算加速比,对应正文中的 $\eta$best_prior = max(prior_dags, key=overlap_count)在先验候选集中挑出与真实结构最吻合的最优图if __name__ == '__main__':可执行入口,直接运行即可看到搜索空间对比结果
常见误区
误区我刚把变量列表发给大模型,它就输出“A 导致 B、C 导致 D”,这张因果图不就是现成的结论吗?为什么还要跑传统算法、做数据验证?直接抄进报告不就行了?
正解LLM 输出的是“基于文本记忆的常识假设”,不是从你的数据里学到的结论。它没看过你的样本分布,没做过条件独立检验,更没做过干预实验。把先验当结论,等于把老中医的纸条直接抄进病历——万一纸条是凭印象写的呢?正确姿态是让数据做最终裁判:先验只用来缩小搜索范围、指导方向,最终因果图必须经过数据评分或实验确认。
为何常见:LLM 的回答太流畅、太自信,语气上就像“查到了事实”,加上因果边本身难以凭直觉检验,初学者很容易把“生成内容”混同于“事实结论”。
误区因果发现 Prompt 有什么难的?我把五个变量名贴进去,让它输出因果边,不就行了?最多再加一句“请输出因果关系”。
正解变量列表只是问诊单的第一栏。领域背景决定 LLM 激活哪套常识——ICU 数据和电商点击数据的因果机制完全不同;提问句式决定它回答的是“因果”还是“相关”;输出格式约束决定结果能否被程序解析。四个要素缺一不可,否则模型给的答案可能含糊、格式混乱、甚至答非所问。一份好 Prompt 是结构化接口协议,不是闲聊。
为何常见:人们习惯了日常聊天式 Prompt,以为“把问题说清楚”就够了;但面向机器 Pipeline 的 Prompt,本质是一份有字段、有约束的接口协议。
误区LLM 给的先验边只要有一条是错的,整个搜索不就带偏了吗?那还不如不用,免得引入错误知识。
正解这正是“硬约束 vs 软约束”的区别。如果采用软约束(先验边评分加成),一条错误先验只会让错误候选图“+1 分”,数据似然项会把它压下去。哪怕 4 条先验只对 3 条,搜索空间依然可以显著缩减,方向准确率也会大幅提升。先验的价值在于“缩小范围”,不在于“绝对正确”——就像老中医圈三片区域,错一片不影响另外两片的价值。
为何常见:人们习惯把“先验”理解为“结论”,一旦有错就觉得全盘皆输;实际上在贝叶斯框架里先验是“权重”而非“铁律”,可以与数据相互校正。
误区有了大模型,PC、GES 这些老算法是不是可以淘汰了?以后全让 LLM 画因果图,又快又省事。
正解恰恰相反,LLM 不具备因果识别的数据证据:它不知道你的样本分布、做不到条件独立检验、无法量化统计不确定性。它擅长的是“提出假设”,传统算法擅长的是“检验假设”。因果发现 Prompt 的定位是给算法提供先验输入,加速并定向搜索,而不是取代算法。两者协作才是正确打开方式,缺一不可。
为何常见:大模型在文本任务上表现太强,容易让人产生“它能包办一切”的错觉;但因果发现本质上是一个需要数据证据的结构学习问题,不是语言生成问题。
面试题
Q1. 因果发现算法的核心目标是找出变量之间的什么关系?
- A.统计关联性
- B.有向因果联系← 正确答案
- C.变量聚类结果
- D.时间序列波动
答案:B。因果发现的目标是还原“谁影响谁”的有向图结构,而不是停留在统计相关性上。A 只是相关性描述;C 是聚类任务;D 是时序分析任务。唯有 B 直接指向因果结构本身。
Q2. 关于相关性与因果关系,下列哪项说法正确?
- A.相关一定蕴含因果
- B.相关不一定蕴含因果← 正确答案
- C.因果不产生任何相关
- D.相关与因果无关联
答案:B。相关只是统计上的共同变化,可能由混淆因子导致,不必然构成因果。B 正确。A 把相关等同于因果,是经典错误;C 和 D 都否认了因果通常伴随相关的常见现象,过于绝对。
Q3. $P(Y \mid \mathrm{do}(X))$ 表示什么含义?
- A.X 发生下 Y 的条件概率
- B.主动干预 X 后的 Y 分布← 正确答案
- C.X 和 Y 的联合概率分布
- D.Y 对 X 的回归拟合系数
答案:B。$\mathrm{do}(X)$ 是干预算子,表示主动把 X 设定为某个值,观察 Y 的变化,这是因果层面的效应。A 是普通条件概率;C 是联合分布;D 是回归系数,都与“干预”无关。
Q4. 下列哪项是因果发现 Prompt 所必需的输入信息?
- A.研究变量的完整列表← 正确答案
- B.企业级深度学习框架
- C.模型的全部训练语料
- D.高精度标注数据集
答案:A。因果发现 Prompt 的核心输入是变量列表和领域背景,让 LLM 知道“在哪些变量之间找因果”。B、C 是模型训练层面的东西,D 是监督学习需求,都不是该场景的必需输入。
Q5. LLM 输出的因果先验在贝叶斯结构评分中对应哪一项?
- A.数据似然估计值
- B.结构先验估计值← 正确答案
- C.全概率密度函数
- D.梯度下降学习率
答案:B。贝叶斯评分公式中 $\log P(D\mid G)$ 是数据似然项,$\log P(G)$ 是结构先验项。LLM 凭常识对图 G 的打分正是 $\log P(G)$,对应结构先验。A 来自数据,C 是归一化分母,D 是优化器参数。
Q6. 将 LLM 先验融入因果发现算法的常见方式有哪些?
- A.硬约束保证边必须存在← 正确答案
- B.软约束评分加成提升← 正确答案
- C.完全跳过数据验证环节
- D.用先验替代全部搜索
答案:AB。硬约束把先验边设为必选项,软约束给先验边在评分函数中加分,两者都是规范的融合方式,选 A、B。C 跳过验证会放大幻觉风险;D 让先验替代搜索,等于放弃数据证据,都是错误做法。
Q7. 加入 3 条 LLM 先验边后,4 变量候选 DAG 从 543 个缩减到数十个,这反映了什么?
- A.数据样本量显著增加
- B.先验缩小了搜索空间← 正确答案
- C.系统变量数目减少了
- D.评分函数跟着改变了
答案:B。候选图数量骤减的直接原因就是先验约束移除了大量不满足先验边的结构,即“搜索空间剪枝”。变量数没变(C 错)、数据没变(A 错)、评分函数也没变(D 错),变的是搜索范围。
Q8. 若观测数据强烈反对 LLM 的先验假设,正确的处理方式是什么?
- A.坚持先验推翻数据结论
- B.以数据检验结果为准← 正确答案
- C.反复修改提示词直到吻合
- D.删除所有冲突的变量
答案:B。数据是最终裁判。先验只是辅助搜索的假设,当数据似然强力反对时,后验会压过先验,此时应接受数据结论。A 本末倒置;C 是自欺欺人的数据篡改;D 削足适履,都不可取。
Q9. 因果发现 Prompt 可能存在的风险有哪些?
- A.LLM 可能输出幻觉因果边← 正确答案
- B.垂直领域先验知识偏弱← 正确答案
- C.先验未经验证有风险← 正确答案
- D.数据量过大导致过拟合
答案:ABC。幻觉编造、垂直领域知识薄弱、未经验证当结论使用,都是该方法的典型风险,选 A、B、C。D 描述的是数据量层面的机器学习问题,与因果发现 Prompt 的核心风险无关。
Q10. 关于条件独立性 $X \perp\!\!\!\perp Y \mid Z$ 在因果发现中的作用,下列说法正确的有?
- A.避免混淆因子误导← 正确答案
- B.帮助排除无用边← 正确答案
- C.表示 X 直接导致 Y
- D.减少图结构歧义← 正确答案
答案:ABD。给定 Z 后 X 与 Y 独立,说明关联被 Z 解释,XY 之间不应当有直连边,因此可避免把混淆因子当直接因果(A 对)、排除无用边(B 对)、消除结构歧义(D 对)。C 恰好说反——条件独立恰恰否定“X 直接导致 Y”。