想象你去医院看病。普通医生遇到“发烧”,就翻开病历库,搜出一堆“发烧”的病历,挑最像的照本宣科开药。这是“搜索式”问诊——病历相似就照搬,至于这些病历里的病人为什么好转、有没有同时输液、有没有自然痊愈(混杂因素),医生并不深究。这正是“检索增强生成(RAG)”的做法:大模型拿到问题,先在文档库里搜“看起来像”的段落,再拼进回答里。 而一位“因果医生”会多问几步:搜到病历后,先画一张“病因链条图”——哪个因素导致了发烧?有没有一只“看不见的手”同时推动了吃药和好转?如果当初没有吃药,结局会怎样?想清楚了,才落笔开方。因果RAG检索增强,就是给AI装上这套“病因思维”:检索文档时不只看表面相似,而是依据因果知识过滤、重排、反事实推演,最终生成更可信的回答。
对 AI 从业者而言,掌握因果RAG意味着从“会搜索的助手”升级为“懂因果的专家”。在医疗、风控、科研等高风险场景,因果RAG能显著提升回答的可信度与可解释性,是算法工程师和数据科学家拉开竞争力的关键技能。
目录
可视化演示
展示传统RAG与因果RAG的检索对比:因果相关性判别剔除混杂偏差,反事实检索增强与去偏重排提升检索质量。
本节配有交互动效(进入视口后自动加载,约 3KB)。
因果RAG检索对比 传统RAG:按相关性排序,混杂文档混入 混杂偏差:相关但非因果的文档被检索 因果RAG:因果相关性判别剔除混杂 Score_causal = Sim(q,d) × CausalRel(q,d) 因果过滤提升检索精度
1. RAG基础:搜索式医生
普通医生看“发烧”,就翻病历库找相似病历,照搬最像几份的治疗方案。这种“搜到啥就用啥”的方式,正是RAG的日常。RAG的全称是检索增强生成,当大模型不知道答案时,它不硬编,而是先从文档库里检索相关片段,再合成回答。这套流程让AI能借助外部知识回答最新、最具体的问题,而不是只靠头脑里的旧知识。
RAG分两半:一半是“检索模块”,把用户问题变成向量,在文档库里按相似度排名;另一半是“生成模块”,把检索到的文档当作临时参考资料,交给大模型写答案。检索模块最常用的打分方式是“余弦相似度”——问题 q 和文档 d 分别被编码成向量,相似度越高,文档就越靠前。
然而,“像不像”式检索有个隐患:相似不等于病因相同。两本发烧病历,一本是病毒感染,一本是药物副作用,搜索时都可能排在最前面。普通医生若不细究,就会开错药方。这正是因果RAG登场的理由。
- 向量化把问题 q 和文档 d 分别表示成 n 维数值向量,让文本可以参与数学运算
- 点积对应位置相乘后累加,得到两个向量的“重合程度”
- 模长归一化除以两个向量的长度,把相似度限制在 [-1,1] 区间,方便统一排序
2. 因果思维:观察与干预的分野
假设一位病人说“我吃了药A,烧退了”,你能证明药A退烧吗?不一定。他可能同时喝了大量热水,可能本来就处于康复期,这些都是“看不见的手”——统计学上叫混杂因素。它们让“吃药”和“退烧”看起来相关,即使药物本身毫无效果。这就是“相关不等于因果”的经典场景。
相关性用条件概率 P(Y|X) 描述:看到 X 时 Y 的分布。因果性要用干预算子 do(X=x) 描述:如果我们主动把 X 设为 x,Y 会发生什么。二者的区别,就是“观察”与“实验”的区别。在因果图语言里,P(Y|do(X=x)) 回答的是“如果我强行让所有病人吃药,退烧率会变成多少”;P(Y|X=x) 只是“吃药的人里退烧有多少”。
资深医生会追问:这个病人是不是同时用了其他疗法?有没有自愈倾向?这就是在做“去混杂”。只有看穿相关背后的因果结构,才能给出真正有效的诊断。因果RAG要做的第一件事,就是让AI拥有这层“去混杂”的警觉。
- 条件概率在观察数据中,看到 X=x 的样本里,Y 的分布情况
- 干预分布通过 do 算子把 X 强制设为 x,并切断外部对 X 的影响后,Y 的分布
- 不等性当存在混杂因素 Z 同时影响 X 和 Y 时,两者通常不相等
3. 整体架构:结构化问诊流程
因果医生问诊,从来不只看一张化验单。他先听主诉(查询),让护士调取相关病历(初步检索),脑中画出病因链条(因果图),最后结合链条开方(生成)。因果RAG的架构,正是一次“结构化问诊”:先召回候选文档,再抽取因果结构,最后用因果证据增强生成。
整体流程可以拆成三个环节。第一环,初步检索:用普通相似度从文档库召回候选文档,相当于护士先按症状把可能的病历都拿过来。第二环,因果推理:从查询和文档中提取因果结构,得到一张因果图 G,标记出混杂因素、干预变量和结果变量。第三环,增强生成:把因果证据拼进提示词,让大模型在因果链条的约束下生成答案。
从形式上看,因果RAG生成答案的概率不再只依赖查询和文档,而是依赖查询与因果感知检索的结果:
这一架构让每一次回答都有“病历+病因链”双重支撑。普通医生只给结论,因果医生给出病历、链条和结论——这正是“增强”二字的含义。图谱越准,问诊越稳。
- 因果图表示G 是从文档和查询中提炼出的因果知识,节点是变量,边是因果方向
- 因果感知检索函数 Rc 以查询 q 和因果图 G 为条件,选出 k 个最值得参考的文档
- 条件生成大模型 θ 在给定查询和因果证据的条件下,生成答案 y 的概率
4. 知识构建:画一张疾病因果地图
要让医生每次都能画出病因链,医院得先有一张“疾病因果地图”。这张地图不是凭空抄来的,而是从成千上万份病历和论文中提炼出来的。在因果RAG里,这件事叫“因果图谱构建”——把散落在文本里的因果知识,整理成结构化的有向图。
构建过程主要有三步。第一步,因果发现:从非结构化文本中识别“谁导致谁”,比如“吸烟→肺癌”“熬夜→免疫力下降”,通常以三元组(原因,方向,结果)的形式抽出。第二步,图谱表示:把三元组存入有向图 G=(V,E),节点是概念或变量,边是因果方向。第三步,知识融合:把新抽取的三元组与已有图谱对齐、去重、解决矛盾,避免同一对概念出现相反方向的边。
因果发现的一个重要武器是条件独立性检验:若给定 Z 后 X 与 Y 条件独立,则 X 与 Y 之间很可能没有直接的因果边。
这张地图越完整,医生看病就越准。但也别指望一劳永逸:医学在进步,图谱也需要不断更新——这正是知识融合存在的意义。因果RAG的“知识构建”就是持续给地图添砖加瓦的过程。
- 条件独立定义给定 Z 后,X 和 Y 的联合分布可以拆成各自分布之积,说明二者不再相关
- d-分离若 Z 阻断了 X 到 Y 的所有路径,则称 X 与 Y 关于 Z d-分离
- 因果发现应用如果只有 W 能使 X 和 Y 独立,则说明因果链条很可能是 X→W→Y
5. 检索策略:绕开混杂找证据
地图在手,医生怎么用?他不会把“症状最像”的病历排在第一位,而是先看地图:哪些病历的病因链与当前病人吻合?哪些只是恰好有相似症状?检索的顺序,要从“像不像”变成“因不因”——这正是因果感知检索的核心思想。
因果感知检索通常分三步。第一,因果过滤:删掉与因果图相矛盾的文档,比如声称“吃药一定退烧”却完全忽略混杂因素的病历。第二,后门重排:按混杂变量分层,重新估计每篇文档的因果强度。第三,反事实排序:思考“如果没有这个因素,结论还成立吗”,把经受住反事实考验的文档排在前面。
后门调整是最经典的因果效应估计方法。若混杂变量 Z 满足后门准则,则干预效用可以由观测数据计算:
这一步相当于医生对每份病历做“双盲审视”:这病人退烧,是药物的功劳,还是因为他本来就会好?绕过混杂因素排序,检索到的证据才真正可用来下结论。
- 混杂分层把全部样本按混杂变量 Z 的取值分成若干子群,每组内部 Z 固定
- 组内估计在每个子群内,用条件概率估计 X 对 Y 的效应
- 加权汇总用 P(Z=z) 作为权重,把所有子群的估计值加权求和
6. 生成机制:带着反事实开药方
开药方时,普通医生可能照搬旧病历,因果医生则会做一次“如果当初”的推演:如果当时没吃这个药,病人会怎样?这种反事实想象,让药方不是模板,而是针对病因的定制方案。因果RAG的生成阶段,正是带着这种“反事实思维”来写答案。
生成阶段要做三件事。第一,干预约束:生成方向必须与因果图一致,比如只能写“因为 X 所以 Y”,不能颠倒因果。第二,反事实注入:把反事实推演的结果写成提示词,让模型看到“对照世界”的信息。第三,幻觉缓解:因果约束让模型无法随便编造不存在的关系,从而减少幻觉。
从技术上看,因果RAG的生成依然是自回归语言模型,只是每一步的条件里多了一组因果证据:
反事实推演让回答多了一层“对照组”。病人问“这药管不管用”,因果医生会说“有用,而且如果不吃,预期会差30%”——这就是因果增强后的回答质量。AI不再只是复述病历,而是能站在反事实的“平行世界”里给出判断。
- 逐词生成第 t 个输出词 y_t 的分布依赖已经生成的前面所有词
- 因果上下文因果感知检索返回的文档集合,作为额外的外部证据
- 完整条件概率将因果证据与问题、前文拼接,作为每一步生成的条件
7. 评估优化:衡量医生的真本事
怎么衡量因果医生比普通医生强?不能只看看病快不快,还要看诊断是否命中病因。比如“如果不吃这个药,病情会怎样”的预测准不准。对每个病人逐一打分再求平均,就能得到医生的整体水平——这就是因果效应评估的思路。
因果RAG的评估,至少看三方面。第一,因果一致性:生成文本中的因果方向与知识图谱是否一致,这是区别于普通RAG的核心指标。第二,鲁棒性:图谱不完整、文档有噪声标签时,系统是否还能稳定工作。第三,计算开销:因果图构建与推理的成本,能否控制在工程可接受的范围内。
在个体层面,一个病人的因果效应可以用“潜在结果之差”来表示:
评估让我们知道“这位医生是否值得晋升”。因果RAG工程化的关键是:既要疗效好(因果一致),也要效率高(低成本),在真实数据永远不完美的前提下,做出可靠判断。这才是从demo走向生产的最后一公里。
- 潜在结果第 i 个病人在干预与不干预两种世界下的结局,记作两个值
- 个体因果效应同一病人两种结局之差,表示干预对他个人的净影响
- 平均因果效应对所有病人取期望,得到群体的平均影响
AI 应用场景
医疗诊断辅助问答
阶段:知识构建 + 因果感知检索
解决的问题:医生提问“药物A能否降低血压”时,普通RAG会把“药物A与血压下降相关”的观察性研究排在前面,给出倾向性结论;因果RAG会依据“混杂因素→干预→结局”图谱重排证据,优先引用随机对照实验,输出严谨结论。
具体案例:某三甲医院的AI辅助决策系统,从历史病历中提取“用药→副作用→并发疾病”因果三元组构建图谱。检索时对“相关”与“因果”证据分别打标,医生能看到证据等级和混杂因素提醒。
信贷风控反事实问答
阶段:因果感知检索 + 增强生成
解决的问题:风控分析师问“提高新客户额度会增加坏账率吗”,普通RAG找到“高额度客户坏账率高”的报告,忽略“高额度客户收入更高”这一混杂;因果RAG按收入分层重排,输出“收入相近时额度提升对坏账影响不大”的反事实结论。
具体案例:某消费金融公司的风控问答机器人,构建收入、负债、信用分数等混杂节点,用后门调整重排内部研报,回答中附“已排除混杂因素影响”的因果说明。
Python 演示
import math class SimpleCausalRAG: """极简因果RAG演示:医生看病比喻""" def __init__(self): # 病历文献库(关键词、是否提及混杂、是否含干预证据) self.docs = { 'd1': { 'text': '服药志愿者血压下降,同期增加了休息。', 'keywords': ['药物A', '血压', '下降'], 'confounder': True, 'intervention': False }, 'd2': { 'text': '随机对照实验中,药物A组血压显著低于安慰剂组。', 'keywords': ['药物A', '血压', '下降'], 'confounder': False, 'intervention': True }, 'd3': { 'text': '观察性数据显示血压下降与睡眠质量有关。', 'keywords': ['血压', '下降', '睡眠'], 'confounder': True, 'intervention': False } } def sim(self, query, keywords): """问题与文档的关键词重合度相似度""" q = set(query.split()) k = set(keywords) if not k: return 0.0 return len(q & k) / math.sqrt(len(q) * len(k)) def retrieve(self, query, top_k=2, use_causal=True): """检索:普通相似度 或 因果增强重排""" scored = [] for doc_id, doc in self.docs.items(): s = self.sim(query, doc['keywords']) if use_causal: # 后门调整:提及混杂则扣分,包含干预证据则加分 if doc['confounder']: s -= 0.3 if doc['intervention']: s += 0.5 scored.append((s, doc_id)) scored.sort(reverse=True) return scored[:top_k] def answer(self, query, use_causal=True): """生成:模板式回答 + 反事实推演""" hits = self.retrieve(query, use_causal=use_causal) evidence = [self.docs[did]['text'] for _, did in hits] head = '因果RAG结论:' if use_causal else '普通RAG结论:' if use_causal: counter = '反事实推演:若不干预,预期血压下降幅度显著减小。' else: counter = '提示:证据可能受混杂因素影响。' return head + ';'.join(evidence) + '。' + counter if __name__ == '__main__': rag = SimpleCausalRAG() query = '药物A 血压' print(rag.answer(query, use_causal=False)) print() print(rag.answer(query, use_causal=True))
def sim(self, query, keywords):用关键词重合度模拟向量相似度,作为检索打分的基底。if doc['confounder']: s -= 0.3文档提及混杂因素(休息、睡眠),说明结论不可靠,排序分数下调。if doc['intervention']: s += 0.5文档包含对照实验、安慰剂等干预证据,因果可信度大幅提升。scored.sort(reverse=True)按因果增强后的分数从高到低排序,让高质量证据排在最前。counter = '反事实推演:若不干预,预期血压下降幅度显著减小。'用反事实语气生成结论,让回答更接近“实验对照”的表达。
常见误区
误区很多初学者认为RAG的检索环节找到“长得像”的文档就够了,相似度最高的文档就是最可信的证据。看到“药物A与血压下降相关”就直接回答“药物A有效”。
正解相似度只反映“相关性”,不反映“因果性”。就像两本发烧病历字面相似,但病因可能完全不同。因果RAG必须检查文档是否混淆了相关与因果,并通过因果图过滤、后门重排和反事实排序来筛选证据。
为何常见:相似检索的分数直观、可解释,让人本能地觉得“分数高=对”。而因果分析需要额外步骤,初学者容易为了省事跳过。
误区有人认为把知识图谱(如“药物-疾病-症状”关系图)接入RAG就是因果RAG,两者都是“节点+边”的结构,没什么区别。
正解普通知识图谱只描述“有关系”,因果图描述的是“有方向、可干预的因果关系”。因果图支持do算子、后门调整和反事实推演,而普通知识图谱不具备这种干预语义。把知识图谱直接塞给RAG并不等于因果RAG。
为何常见:两者在可视化上都是圆形节点加箭头,外形极其相似,初学者很容易混淆语义层面的差异。
误区初学者看到后门调整公式,以为只要把变量放进 Z 集合,就万事大吉,所有混杂都能被自动消除。
正解后门调整只在 Z 满足后门准则时成立——Z 必须阻断所有非因果路径,且不能有未观测的混杂变量。随意挑选变量、遗漏重要混杂,都会导致错误的估计。就像医生只按年龄分层,却忽略了吸烟史,结论依然不可靠。
为何常见:公式本身看起来很简洁,让人误以为它是通用解法,忽略了公式背后的因果假设。
误区有人认为只要有了因果图谱和检索模块,大模型就只是“复读机”,自身的语言理解与推理能力不再重要。
正解因果知识是“增强”而非“替代”。从文档中抽取三元组、判断因果方向、生成反事实文本,都依赖大模型的语义理解。图谱提供骨架,大模型负责填充血肉。
为何常见:“检索增强生成”这个名字给人“全靠外部知识”的印象,让人低估了生成模型本身的智能。
面试题
Q1. RAG 的核心思路是?
- A.只靠模型内部记忆回答
- B.先从文档库检索再生成← 正确答案
- C.用知识图谱替代语言模型
- D.随机挑选文档拼进回答
答案:B。RAG(检索增强生成)的关键在于“先检索、再生成”。A 是纯生成模型,缺少外部知识;C 错在“替代”,图谱是辅助不是替代;D 随机挑选文档没有检索质量可言。正确答案是 B。
Q2. P(Y|X) 与 P(Y|do(X)) 的核心区别是?
- A.前者是观察,后者是干预← 正确答案
- B.前者是干预,后者是观察
- C.两者含义完全一致
- D.前者只用于时间序列分析
答案:A。P(Y|X) 是在观察数据中“看到”X 时 Y 的分布,P(Y|do(X)) 是“主动把 X 设为某个值”后系统的反应。类比医院场景,前者是病历记录里的相关性,后者是严格实验中的因果效应。
Q3. 在“发烧→吃药→好转”的例子里,如果病人同时多喝水,喝水属于?
- A.结果变量
- B.混杂因素← 正确答案
- C.工具变量
- D.无关变量
答案:B。多喝水同时影响“是否吃药”和“是否好转”,是典型的混杂因素。它让吃药与好转看起来相关,即使药物无效。忽略它,就会把相关误判成因果。
Q4. 因果 RAG 与普通 RAG 最本质的区别是?
- A.使用更大的语言模型
- B.检索时考虑因果知识← 正确答案
- C.检索阶段完全删除
- D.生成的答案会更简短
答案:B。因果RAG本质上仍走“检索+生成”框架,关键在于检索时引入因果知识(因果图、后门调整、反事实)来筛选和重排证据。A 只是模型规模变化,C 和 D 都不符合实际。
Q5. 因果感知检索策略包括?
- A.因果过滤筛选文档← 正确答案
- B.后门调整重新排序← 正确答案
- C.反事实推演再排序← 正确答案
- D.随机抽取候选文档
答案:ABC。三种策略层层递进:先过滤掉违背因果图的文档,再按混杂分层做后门重排,最后用反事实推演排序。随机抽样没有利用因果知识,不属于因果感知检索。
Q6. 后门准则公式中 Z 的作用是?
- A.按混杂因素分层加权← 正确答案
- B.提供检索加速索引
- C.删除全部异常样本
- D.直接生成最终回答
答案:A。后门调整把数据按混杂变量 Z 分组,在每个子组内估计 X→Y 的效应,再按 Z 的分布加权汇总,从而消除混杂偏差。B、C、D 都与后门调整无关。
Q7. 因果图谱构建的常见步骤有?
- A.从文本中抽取因果三元组← 正确答案
- B.用条件独立性发现因果← 正确答案
- C.新旧知识融合去矛盾← 正确答案
- D.随机游走生成文本答案
答案:ABC。因果图谱构建包括文本三元组抽取(如“吸烟→肺癌”)、条件独立性检验发现结构、以及新旧知识融合。随机游走属于图上的应用层方法,不是构建步骤。
Q8. 反事实“如果当初不干预”在因果RAG中用于?
- A.为生成提供对照参考← 正确答案
- B.压缩因果图谱存储
- C.加速向量文档检索
- D.自动生成监督标签
答案:A。反事实“如果不干预会怎样”为生成提供对照信息,让回答更接近“实验组 vs 对照组”的语气。其他选项与反事实无关。
Q9. 评估因果 RAG 时“因果一致性”指?
- A.因果方向与图谱一致← 正确答案
- B.回答中出现因果字样
- C.候选文档数量最多
- D.检索响应速度最快
答案:A。因果一致性指模型输出的因果关系方向与已有知识图谱一致,是因果RAG最重要的评估维度之一。B 是表面文字,C、D 是数量和效率指标。
Q10. 普通 RAG 的局限有?
- A.只看相关不看因果← 正确答案
- B.易被表面相似文档误导← 正确答案
- C.可能回答虚假因果关系← 正确答案
- D.完全不能生成语言文本
答案:ABC。普通RAG按相似度检索,容易把“相关”当“因果”,从而被表面相似的文档误导,输出虚假因果结论。D 说“完全不能生成文本”纯属夸张。