想象你是一名刚搬进陌生城市的新手司机:你精通油门、刹车、方向盘,却不知道哪条路最快到医院、哪条单行道最近到小学。有人问你因果问题——“暴雨为什么会导致就医延误?”——你只能凭记忆瞎猜,而你的记忆里只有冷冰冰的统计数字:“下雨天医院人确实多”。 大语言模型(LLM)就是这样一个车技娴熟却不认路的司机:它能流畅地生成语言,却对“暴雨→内涝→交通瘫痪→就医延误”这类因果链条缺乏可靠认知。因果图谱(Causal Knowledge Graph),正是递给 LLM 的那张城市地图——用圆圈表示变量与事件(地标),用带箭头的边表示因果方向(单行道),把世界的因果机制结构化地存储起来。本文以这张“因果地图”为主线,依次讲解图谱的基本结构、构建存储、查询推理、与 LLM 的融合方式、落地场景以及面临的挑战。看懂它,你就掌握了让 LLM 从“凭感觉回答”走向“照着地图回答”的关键一步。

岗位关联

因果图谱是因果知识增强 LLM 的基础数据设施。掌握它的结构与用法,是从事可解释 AI、医疗问答、金融风控等落地方向的从业者必补的一课。

目录
  1. 可视化演示
  2. 图谱基本结构:地标与单行道
  3. 构建与存储:测绘与归档
  4. 查询与推理:问路与导航
  5. LLM 融合方式:导航进车厢
  6. 落地应用:地图的价值时刻
  7. 挑战与前景:地图的边界
  8. AI 应用场景
  9. Python 演示
  10. 常见误区
  11. 面试题

可视化演示

展示因果图谱的有向图结构与机制标注、检索增强生成中因果子图检索与LLM注入流程、以及因果图谱与传统知识图谱的结构差异,交互切换三种模式探索。

本节配有交互动效(进入视口后自动加载,约 3KB)。

'+CAPS.mode1+'

图谱基本结构:地标与单行道

城市地图上最显眼的是什么?是地标:医院、公园、学校、工厂。它们构成城市的骨架。因果图谱同理,它的“地标”是变量与事件——例如“暴雨”“交通瘫痪”“就医延误”。每一个地标都对应真实世界里一个可以观测的状态,它们不是随手画的,而是承载着因果关系的主角。

光有地标还不够,地图必须告诉你“这些地标之间怎么走”。因果图谱用有向边把两个节点连接起来:一条从 X 指向 Y 的边,表示“X 是因,Y 是果”。这种方向性就像单行道——你可以从“暴雨”开到“内涝”,但不能从“内涝”倒车回“暴雨”。方向,是因果图谱区别于普通知识图谱的第一特征。

形式上,一个因果图谱就是一张有向图:V 是节点集合,E 是边集合。为了表达“怎么导致的”,每条边还带一个关系类型 r,如“导致”“加重”“抑制”。于是最小粒度的因果知识被封装为三元组“(原因,关系,结果)”,例如(暴雨,导致,内涝)。多个三元组共享节点,便织成一张可导航的因果网络。

所以,当你打开一张因果图谱时,就像展开一张城市地图:每个圆圈都是一座地标,每条带箭头的线都是一条单行道。地标与单行道构成了地图的骨架,而下一步,我们要把这张地图“测绘”出来,并存进档案库。

G=(V, E),V={X1, X2, …, Xn},E={(Xi→rXj)}\displaystyle G=(V,\ E),\qquad V=\{X_1,\ X_2,\ \ldots,\ X_n\},\qquad E=\{(X_i \xrightarrow{r} X_j)\}
打个比方:这个式子把“因果图谱”拆成了两件套——一堆节点(变量)加一组带箭头的关系(因果边)。读懂了它,就等于拿到了阅读整张“因果地图”的钥匙。
  1. 节点集合 V这里 V 中的每个元素 \(X_i\) 表示一个变量或事件,例如“暴雨”“就诊人数”,它们就是地图上的地标。
    V={X1, X2, …, Xn}V=\{X_1,\ X_2,\ \ldots,\ X_n\}
  2. 有向因果边\((X_i \xrightarrow{r} X_j)\) 表示从原因 \(X_i\) 指向结果 \(X_j\) 的一条边,\(r\) 是关系类型,如同单行道的行驶方向。
    (Xi→rXj)(X_i \xrightarrow{r} X_j)
  3. 整体结构 GG 由节点集合与边集合共同构成,是所有查询与推理操作赖以进行的基础骨架。
    G=(V, E)G=(V,\ E)

构建与存储:测绘与归档

一张城市地图不会凭白从天上掉下来。它需要测绘员拿着仪器勘察街道、标定门牌、确认单行方向。因果图谱的“测绘”同样有三大来源:领域专家把长期研究验证的因果机制手工录入;NLP 系统从医学文献、新闻报告中抽取因果表述;数据科学家用统计与干预方法从数据里提出候选因果边。

三条“测绘通道”产出的证据质量并不相同。专家知识最可靠但覆盖有限;文献挖掘覆盖广但有表述噪声;数据学习效率高却最容易把“相关性”误判成“因果性”。因此,工程上不会直接采纳某一条来源,而是给每条候选边打一个置信度分数:证据越充分、来源越可靠,分数越高。

置信度的计算可以形式化为“支持证据与总证据之比”。例如边“暴雨→内涝”有 95 篇文献支持、5 篇质疑,置信度就是 95/(95+5)=0.95。建好边之后,图谱通常存储在原生图数据库(如 Neo4j)中,节点、边、属性以邻接表或三元组形式落盘,支持毫秒级检索。

至此,测绘完成、档案入库。这张“因果地图”被整齐地叠放在档案柜里——但它真正的价值,是当司机(LLM)来问路时,能快速翻出那一条正确的路线。接下来我们看看“问路”是怎么发生的。

Conf(Xi→Xj)=S(Xi, Xj)S(Xi, Xj)+D(Xi, Xj)\displaystyle \text{Conf}(X_i \to X_j)=\frac{S(X_i,\ X_j)}{S(X_i,\ X_j)+D(X_i,\ X_j)}
一句话解释:某条因果边的可信度 = 支持它的证据 ÷ 全部相关证据。证据一边倒支持时,置信度就逼近 1。
  1. 支持证据 S分子的 \(S(X_i,\ X_j)\) 统计支持“\(X_i\) 导致 \(X_j\)”这条边的证据数量,例如支持该结论的文献篇数。
    S(Xi, Xj)S(X_i,\ X_j)
  2. 反对证据 D\(D(X_i,\ X_j)\) 统计质疑或否定该因果关系的证据数量。
    D(Xi, Xj)D(X_i,\ X_j)
  3. 置信度结果两者之比落在 0 到 1 之间,越接近 1 表示因果边越可信,越接近 0 越倾向被剔除。
    Conf(Xi→Xj)\text{Conf}(X_i \to X_j)

查询与推理:问路与导航

新手司机拿到地图后的第一个动作是什么?打开导航问一句:“从中心医院到老城小学怎么走?”因果图谱的使用者(无论是人还是 LLM)也一样,首先要擅长“问路”。最常见的三种问法:查节点——“暴雨这个节点存在吗?它旁边连着谁?”;查邻域——“内涝直接影响哪些后果?”;查路径——“暴雨是怎么一步步走到就医延误的?”

前两种问法对应图数据库中的“单点检索”与“邻域扩展”操作,返回节点属性与一跳或多跳邻居,适合回答“是不是”“和什么相关”这类问题。而因果问答真正的高潮是“路径搜索”:给定起点 \(X_a\) 与终点 \(X_b\),在图上找出一条或多条因果链,每一条路径都刻画了一个完整的因果传导机制。

当存在多条路径时,需要为它们排序——因为不是每条链都一样可信。一副完整的因果链条遵循“木桶效应”:任一环置信度低,整条链的可靠性就被拉低。因此一条路径的综合置信度取所有边置信度的乘积,随后按从高到低返回给查询者。

问路的过程,本质上就是在“因果地图”上规划路线:它会告诉你“暴雨→内涝→交通瘫痪→就医延误”这条链,也会告诉你候选链的可靠程度。但地图只负责指路,真正“开车”的 LLM 还需要把路线听进耳朵里——这就是下一节的故事。

Path(Xa, Xb)={ (Xa→Xk1), (Xk1→Xk2), …, (Xkm→Xb) }\displaystyle \text{Path}(X_a,\ X_b)=\{\ (X_a \to X_{k_1}),\ (X_{k_1} \to X_{k_2}),\ \ldots,\ (X_{k_m} \to X_b)\ \}
一句话解释:从原因到结果的因果链,就是一段又一段“由因到果”的边首尾相接而成的完整路线。
  1. 起点边\((X_a \to X_{k_1})\) 是从起点出发的第一段,要求起点变量与第一个中间节点之间存在直接的因果边。
    (Xa→Xk1)(X_a \to X_{k_1})
  2. 中间链条\((X_{k_1} \to X_{k_2}),\ \ldots,\ (X_{k_{m-1}} \to X_{k_m})\) 描述因果如何逐级传导,每一跳都必须依赖上一步的结果。
    (Xk1→Xk2)(X_{k_1} \to X_{k_2})
  3. 终点边\((X_{k_m} \to X_b)\) 是抵达终点的最后一段,使整条链闭合为一条从因到果的完整路径。
    (Xkm→Xb)(X_{k_m} \to X_b)

LLM 融合方式:导航进车厢

想象一下:你手里摊着一张城市地图,自己边走边认地标未必会出错,但如果副驾上有一个导航 APP 把路线一句一句播报给你,开车会轻松得多。LLM 与因果图谱的关系正是如此——图谱不会说话,需要一套“导航系统”把图里的因果信息翻译成模型听得懂的语言。

第一种结合方式是“检索增强”:当用户提出因果问题 q 时,系统先从图谱中检索出与 q 相关的局部子图(通常用实体对齐加邻域扩展实现),再把子图序列化成文本拼进提示词。第二种是“结构注入”:将因果路径写成“病因链:暴雨 → 内涝 → 交通瘫痪 → 就医延误”这样的固化模板,让模型直接读到机制链。第三种是“推理反馈”:让 LLM 沿图谱边一步一步走,边走边解释,最终把多步证据汇聚成答案。

三种方式殊途同归,都是在调整模型生成答案时的条件分布——原来模型只能靠参数里的统计记忆作答,现在多了一个由图谱提供的显式上下文 \(\mathcal{C}_{\mathcal{G}}(q)\)。这也是因果图谱“可解释性”的来源:你可以指着某条路径告诉用户,答案的依据是这条因果链,而不是一句玄学的“模型预测如此”。

有了导航,新手司机也能自信地上路了。接下来的问题很实际:这张“因果地图”装上导航之后,到底在哪些城市、哪些车型上最值回票价?让我们看看地图的实战时刻。

y^=arg⁡max⁡y PLLM( y∣q, CG(q) )\displaystyle \hat{y}=\arg\max_{y}\ P_{\text{LLM}}\big(\,y \mid q,\ \mathcal{C}_{\mathcal{G}}(q)\,\big)
一句话解释:模型最终选哪个答案,取决于“问题本身”与“从图谱检索到的因果证据”这两者的联合作用。
  1. 用户问题 q\(q\) 是用户提出的因果类问题,例如“为什么暴雨会导致就医延误?”,它是整个检索与生成的起点。
    qq
  2. 图谱上下文\(\mathcal{C}_{\mathcal{G}}(q)\) 表示针对问题 q 从因果图谱中检索到的局部子图或路径序列,相当于导航为这次行程选好的路线。
    CG(q)\mathcal{C}_{\mathcal{G}}(q)
  3. 条件分布与取值\(\arg\max_{y}\ P_{\text{LLM}}(y \mid q,\ \mathcal{C}_{\mathcal{G}}(q))\) 表示在已知问题和图谱上下文的情况下,选择模型认为概率最高的答案 y。
    y^=arg⁡max⁡y PLLM(y∣q, CG(q))\hat{y}=\arg\max_{y}\ P_{\text{LLM}}(y \mid q,\ \mathcal{C}_{\mathcal{G}}(q))

落地应用:地图的价值时刻

一张精准的城市地图,对出租车司机是赚钱工具,对急救车是生命线,对物流卡车是效率表。因果图谱也是如此,它的价值在不同的 AI 场景中各有各的精彩。第一个舞台是医疗诊断:患者问“为什么我吃降压药后总是头晕”,系统沿图谱检索“降压药→血压骤降→脑供血不足→头晕”,回答既快又有依据,医生也能据此核查。

第二个舞台是金融风险。分析师关心“央行加息会传导到哪些行业”,图谱上存着“加息→融资成本上升→房地产投资收缩→建材需求下降”的机制链,LLM 根据路径生成研报摘要,比单纯依赖历史行情数据更有逻辑。第三个舞台是智能客服排障:用户报修“家中宽带频繁断网”,系统沿“暴雨→线路老化→信号衰减→断网”定位根因,把排查建议前置到对话中。

在实际系统中,这些场景共享同一个技术动作:把候选因果路径按综合置信度打分排序,取最优链路的证据注入 LLM。形式化地说,即对所有从原因 X 到结果 Y 的路径计算“各边置信度乘积”并取最大值,作为这次回答的重点依据。

你看,同一张“因果地图”,在医疗车上救急,在金融引擎里避险,在客服热线中排障。地图还是那张地图,区别只在于问路的人带着不同的目标。不过,地图也并非完美——现实中要测绘一张完全准确的图,难比登天。

Score(X, Y)=max⁡P ∈ Paths(X, Y) ∏e ∈ PConf(e)\displaystyle \text{Score}(X,\ Y)=\max_{\mathcal{P}\,\in\,\text{Paths}(X,\ Y)}\ \prod_{e\,\in\,\mathcal{P}} \text{Conf}(e)
一句话解释:多条候选因果链互相比拼时,先算每条链的乘积分,再挑分数最高那条作为答案依据。
  1. 候选路径集合\(\text{Paths}(X,\ Y)\) 是所有从原因 X 通往结果 Y 的因果路径集合,应用系统会先把它枚举出来。
    Paths(X, Y)\text{Paths}(X,\ Y)
  2. 单路径分值对路径 \(\mathcal{P}\) 中每条边 e 的置信度求乘积,得到该路径的可信分值。
    ∏e ∈ PConf(e)\prod_{e\,\in\,\mathcal{P}} \text{Conf}(e)
  3. 取最优在所有路径分值中取最大值,作为这次因果问答的核心证据链。
    max⁡P ∈ Paths(X, Y)\max_{\mathcal{P}\,\in\,\text{Paths}(X,\ Y)}

挑战与前景:地图的边界

再精细的城市地图也有盲区:新修的立交桥还没画上去,老城区的小巷可能标错了方向。因果图谱同样面临三大现实挑战。首先是“数据稀疏”:很多变量之间的因果机制鲜有文献记载,也没有实验条件去验证,图上就会留下大片空白,导致路径搜索经常“无路可走”。

其次是“噪声干扰”:从海量文本和数据中自动抽取的候选边,混杂着“相关性冒充因果性”的假边。如果置信度阈值设得不够高,噪声就会污染整个查询结果。第三是“动态演化”:因果机制不是刻在石头上的一成不变——新药上市、政策调整、技术更迭都会改变旧链条,图谱必须像活地图一样持续更新。

更新操作在数学上非常朴素:每个周期把新证据支持的边集 \(\Delta^{+}\) 并入图,把过时或置信度跌破阈值的边集 \(\Delta^{-}\) 剔除,得到新一版图。工程上的难点在于更新的频率与一致性:更新太快会引入尚未稳定的新边,更新太慢又让回答越来越过时。未来的方向是让图谱与 LLM 双向协同——一边用 LLM 加速建图,一边用图谱反哺推理,形成“以图补智、以智建图”的飞轮。

回到开头那位新手司机:他手里的地图可能有些许陈旧,但比起毫无地图地盲开,已经是“碰运气”到“有依据”的跨越。因果图谱的边界,正是未来 AI 可解释性拓展的边界。记住这张“因果地图”的故事,你会比大多数人更早看懂大模型走向可靠推理的这条路。

Gt+1=( Gt∪Δ+ )∖Δ−\displaystyle \mathcal{G}_{t+1}=\big(\,\mathcal{G}_t \cup \Delta^{+}\,\big)\setminus \Delta^{-}
一句话解释:图谱的每一次换代,就是“加入被证实的新边、删掉被推翻的旧边”的加减法。
  1. 新增边集合\(\Delta^{+}\) 是本周期新获得证据支持的因果边,例如新发表的研究确认的传导机制。
    Δ+\Delta^{+}
  2. 剔除边集合\(\Delta^{-}\) 是置信度跌破阈值或已被证伪的旧边,例如被撤销的医学结论。
    Δ−\Delta^{-}
  3. 新一版图谱\(\mathcal{G}_{t+1}\) 表示在旧图 \(\mathcal{G}_t\) 上先并入新边、再剔除旧边之后得到的最新版本,如此周而复始地演化。
    Gt+1=(Gt∪Δ+)∖Δ−\mathcal{G}_{t+1}=\big(\mathcal{G}_t \cup \Delta^{+}\big)\setminus \Delta^{-}

AI 应用场景

医疗诊断问答:讲得出“为什么”的 AI 医生

阶段:检索增强生成(RAG)中的图谱检索与上下文注入

解决的问题:传统医疗问答 LLM 依据训练语料中的统计相关性作答,经常“答得顺但说不清为什么”,医生不敢采信。接入因果图谱后,系统把症状与检查结果映射到节点,沿“诱因→机制→症状”的路径检索,给出可逐条核查的因果链,回答的准确性与可解释性同时提升。

具体案例:患者问“为什么服用硝苯地平后会头晕”,系统检索图谱命中“硝苯地平→外周血管扩张→血压骤降→脑供血不足→头晕”链条,在回答中主动展示该路径,医生据此判断是否为药物副作用并调整方案。

金融风险传导:把政策翻译成行业链

阶段:结构化知识注入与生成(图谱路径作为推理依据)

解决的问题:分析师常要翻阅数十份研报才能把“宏观政策→行业传导→企业风险”串成链条,效率低且容易遗漏中间环节。因果图谱把这类传导机制提前结构化,LLM 直接沿图谱路径组织答案,保证结论有链可查、有据可依。

具体案例:投研助手收到“央行加息对地产链有哪些影响”,系统沿图谱检索“加息→融资成本上升→房企现金流承压→建材需求下滑”,生成带因果链的研报草稿,每条结论旁标注图谱证据来源。

智能客服排障:沿因果链定位根因

阶段:对话式因果推理(多现象映射到节点后回溯共同祖先)

解决的问题:传统客服机器人只能匹配 FAQ 话术,面对“下雨天宽带频繁掉线”这类多因交叉描述束手无策。结合因果图谱后,机器人把客户描述的多个现象映射到节点,回溯共同原因节点定位根因,并据此给出处置建议。

具体案例:用户报修“下雨天宽带经常断网”,机器人沿“暴雨→线路受潮→信号衰减→掉线”路径解释原因,并主动推送“检查户外网线接头是否进水”的建议,一次解决率提升约 20%。

Python 演示

python102 行
# -*- coding: utf-8 -*-"""最小可用的因果图谱演示: 构建, 查询, 路径搜索与 LLM 增强回答"""  class CausalNode:    def __init__(self, name):        self.name = name  class CausalGraph:    def __init__(self):        self.nodes = []        self.adj_map = {}        self.conf_map = {}     def node_names(self):        return [n.name for n in self.nodes]     def add_node(self, name):        if name not in self.node_names():            self.nodes.append(CausalNode(name))     def add_edge(self, cause, effect, confidence=0.9):        self.add_node(cause)        self.add_node(effect)        if cause not in self.adj_map:            self.adj_map[cause] = []        self.adj_map[cause].append((effect, confidence))        self.conf_map[(cause, effect)] = confidence     def neighbors(self, cause):        return self.adj_map.get(cause, [])     def find_paths(self, start, goal, max_depth=4):        """DFS 搜索从 start 到 goal 的全部因果路径, 返回 (路径, 综合置信度)"""        paths = []        visited = {start}         def dfs(node, path, score):            if node == goal:                paths.append((list(path), score))                return            if len(path) >= max_depth:                return            for nxt, conf in self.neighbors(node):                if nxt in visited:                    continue                visited.add(nxt)                path.append(nxt)                dfs(nxt, path, score * conf)                path.pop()                visited.discard(nxt)         dfs(start, [start], 1.0)        paths.sort(key=lambda item: -item[1])        return paths     def format_context(self, paths, limit=2):        """把最优路径序列化成 LLM 可读的因果上下文"""        lines = []        for path, score in paths[:limit]:            chain = " -> ".join(path)            lines.append("因果链: %s (置信度 %.2f)" % (chain, score))        return "; ".join(lines)  def pseudo_llm(question, context):    """模拟大语言模型: 把图谱检索到的因果上下文注入回答"""    if not context:        return "我不确定其中的因果关系, 需要更多信息。"    return ("根据因果图谱检索: %s。\n"            "结合因果链, 回答: %s" % (context, question))  def main():    g = CausalGraph()    g.add_edge("暴雨", "城市内涝", 0.95)    g.add_edge("城市内涝", "交通瘫痪", 0.90)    g.add_edge("交通瘫痪", "就医延误", 0.85)    g.add_edge("暴雨", "线路老化", 0.70)    g.add_edge("线路老化", "信号中断", 0.88)    g.add_edge("信号中断", "就医延误", 0.60)     print("== 因果图谱节点 ==")    print(g.node_names())     print("\n== 邻域扩展: 暴雨直接影响哪些后果 ==")    for effect, conf in g.neighbors("暴雨"):        print("暴雨 -> %s (置信度 %.2f)" % (effect, conf))     print("\n== 路径搜索: 暴雨如何导致就医延误 ==")    paths = g.find_paths("暴雨", "就医延误")    for path, score in paths:        print("%s (综合置信度 %.2f)" % (" -> ".join(path), score))     print("\n== 模拟 LLM 增强回答 ==")    context = g.format_context(paths)    print(pseudo_llm("为何暴雨会导致就医延误?", context))  if __name__ == "__main__":    main()
目的:实现一个最小可用的因果图谱——支持节点/边构建、邻域查询、DFS 路径搜索与置信度排序,并模拟 RAG 把因果链注入 LLM 回答。
  1. self.adj_map[cause].append((effect, confidence))用邻接表保存“原因 → (后果,置信度)”的映射,对应图谱的有向边。
  2. paths.append((list(path), score))找到终点节点时,保存一条完整因果链及其累计置信度。
  3. dfs(nxt, path, score * conf)深度优先搜索沿边递归,用乘法累积路径置信度,体现“木桶效应”。
  4. paths.sort(key=lambda item: -item[1])按综合置信度从高到低排序,让最优因果链排在最前。
  5. chain = " -> ".join(path)把节点列表序列化成人类可读的因果链文本,供注入提示词。
  6. g.find_paths("暴雨", "就医延误")发起路径搜索,找出图中所有因果传导链并排序。
  7. pseudo_llm(question, context)模拟 RAG:把检索到的图谱上下文拼进模型回答,展示“导航播报”效果。

常见误区

误区“通用知识图谱里不也有'导致''引发'这类关系吗?直接用现成的知识图谱回答因果问题不就行了?何必再造一张因果图谱?”

正解通用知识图谱追求“实体—关系—实体”的覆盖面,大量边是“位于、属于、出版”等非因果关联;因果图谱则要求每条边都满足方向性(因→果)且具有可验证机制。如果把“位于同一城市”当成因果链,LLM 就会一本正经地胡说八道。两者用途不同,建图标准自然不同。

为何常见:两者都是“节点+边”的图形态,初学者只看结构相似,忽略了“边的语义约束”才是区分关键。

误区“我用皮尔逊相关系数算出 A 和 B 高度相关,时间上也是 A 在前,那这条 A→B 的因果边就可以入图了。”

正解相关性不等于因果性。经典例子是冰淇淋销量与溺水人数高度相关,真实因果链却是“气温升高”同时驱动两者。要确认因果,需要排除混杂因素、参考干预实验或融合专家机制知识。统计相关只能作为候选证据,必须配合置信度评估。

为何常见:相关性在数据里随手可算,而因果验证成本高,人天生倾向“省事归因”。

误区“反正是用图谱增强 LLM,把图谱里所有节点和边都写进提示词,给足信息,模型总该答准了吧?”

正解上下文过长会稀释模型的注意力,还会引入大量无关噪声、推高 token 成本。正确做法是像导航只播报该走的路口一样,按问题检索局部子图与相关路径,只注入最相关的因果链,既准又省。

为何常见:“信息越多越好”在小规模实验中成立,但在 LLM 的上下文窗口与注意力机制下,噪声增长往往快于信息增益。

误区“图谱构建完成后就像字典一样躺着,以后查询直接读就行,不需要再维护。”

正解因果机制会随现实演化:新药上市改变治疗方案、政策调整改变传导路径、旧研究被证伪。图谱必须周期性地并入新边 \(\Delta^{+}\)、剔除过时边 \(\Delta^{-}\),否则回答会越来越陈旧,甚至给出已被推翻的因果结论。

为何常见:把图谱类比成静态字典,忽略了它本质上是“对动态世界的一张快照”。

面试题

Q1. 因果图谱中,一条因果边最核心的约束是什么?

单选题 · easy

  • A.两个节点文字描述清晰
  • B.边必须从原因指向结果← 正确答案
  • C.每条因果边都要有权重
  • D.节点必须属于同一领域

答案:B。因果边的灵魂是方向性——必须从因指向果,如同单行道。文字描述、数值权重、领域归属都是可选项,唯有方向性不可妥协。这与前文“方向是因果图谱第一特征”的论述一致。

Q2. 在因果三元组(X, r, Y)中,符号 r 表示什么?

单选题 · easy

  • A.节点的编号序号
  • B.图谱的版本号
  • C.因果关系的类型← 正确答案
  • D.检索路径的距离

答案:C。三元组是因果知识的最小封装,“(原因,关系,结果)”中 r 描述关系类型,如“导致”“加重”“抑制”。它回答的是“怎么导致的”这个问题,而不是编号、版本或距离。

Q3. 以下哪类证据不能单独作为构建因果图谱的依据?

单选题 · easy

  • A.权威专家归纳的因果机制
  • B.文献里明确的因果结论
  • C.观测数据中的统计相关← 正确答案
  • D.随机对照试验的结果

答案:C。统计相关可能由混杂因素导致,比如冰淇淋销量与溺水人数相关但并无因果。单靠观测相关性建边会混入大量假边,必须结合干预实验或专家校验,因此选项 C 不能单独作为依据。

Q4. 一条因果路径的综合置信度通常如何计算?

单选题 · mid

  • A.各边置信度的求和值
  • B.各边置信度的乘积值← 正确答案
  • C.各边置信度的最大值
  • D.各边置信度的均值

答案:B。因果链遵循“木桶效应”——任一环断裂整条链就不成立,所以各边置信度取乘积。求和、取最大或均值都无法体现“一环薄弱则全链不可靠”的特性。

Q5. 检索增强的因果问答中,注入 LLM 的上下文最好是?

单选题 · mid

  • A.全量因果图谱的序列化文本
  • B.与问题相关的局部因果子图← 正确答案
  • C.所有节点名称构成的清单
  • D.图谱构建过程的代码

答案:B。像导航只播报该走的路口一样,应该按问题检索局部子图与相关路径。全量文本会稀释注意力、引入噪声并浪费 token;节点清单缺少边信息;构建代码与回答无关。

Q6. 关于因果图谱与通用知识图谱的区别,正确的是?

单选题 · hard

  • A.因果图谱中不包含任何节点
  • B.通用图谱含非因果关联边← 正确答案
  • C.两者结构完全不同无交集
  • D.因果图谱只能用图库存储

答案:B。通用知识图谱以实体关系覆盖为目标,包含大量“位于、属于”等非因果边;因果图谱只沉淀带方向且可验证的因果机制。两者都是图结构、可互相借鉴,而非完全无交集。

Q7. 因果图谱动态更新时,主要处理的对象是?

单选题 · hard

  • A.置信度下降或语义过时的边← 正确答案
  • B.所有历史数据形成的旧边
  • C.与专家知识冲突的边
  • D.仅仅只有新加入的边

答案:A。动态更新是“加减法”:并入新证据支持的边(\(\Delta^{+}\)),剔除置信度跌破阈值或语义过时的边(\(\Delta^{-}\))。并非所有旧边都要删,也不是只加新边,而是按证据状态决定增删。

Q8. 以下哪些属于构建因果图谱的可靠证据来源?

多选题 · mid

  • A.领域专家手工标注的图谱← 正确答案
  • B.学术文献中的因果表述← 正确答案
  • C.含混杂因素的历史日志
  • D.有对照的干预实验数据← 正确答案

答案:ABD。专家知识、文献挖掘、干预实验都是可靠来源;而含混杂因素的历史日志只提供相关性,需进一步排除混杂后才能建边,不能直接作为可靠证据。

Q9. 因果图谱增强大语言模型的常见方式有哪些?

多选题 · mid

  • A.检索因果路径拼入提示词← 正确答案
  • B.让模型沿图谱路径逐步推理← 正确答案
  • C.用图谱替换模型全部参数
  • D.从图谱抽取子图作上下文← 正确答案

答案:ABD。检索增强(子图作上下文)、结构注入(路径文本拼入提示词)、推理反馈(沿图谱逐步推理)是三种主流方式。图谱是外部知识设施,并不修改模型内部参数。

Q10. 关于“相关性不等于因果性”,正确的说法是?

多选题 · hard

  • A.相关可以由共同原因导致← 正确答案
  • B.因果确认需考虑时间先后← 正确答案
  • C.相关性足以支撑因果建边
  • D.干预实验可提供因果证据← 正确答案

答案:ABD。共同原因(混杂)会造成虚假相关,所以选项 A 正确;原因必须先于结果发生,所以时间先后很重要,B 正确;干预实验是因果验证的重要手段,D 正确;相关性本身不足以建边,C 错误。