
我们当时接手某区域碳定价政策的影响评估时第一反应是拿传统计量模型硬跑面板回归、断点回归、双重差分一套组合拳下来输出结果确实漂亮但没人说得清“为什么是这个效应”。政策文本里明确写了“对高耗能行业征收附加费”可传统方法只能告诉我们“有这个变量之后均值变了”无法还原这条政策作用链到底是怎么传导到企业产出上的。后来我们把目光转向语言模型希望它能直接从政策文本里抽取因果结构构建一张“政策变量如何影响中间机制、最后传导到结果变量”的因果图。理想很丰满第一版实测却很骨感模型能把句子看懂却把因果方向搞反把“相关”当“因果”甚至编出原文不存在的中间变量。这篇文章就是复盘我们怎么把语言模型在因果图构建与气候政策影响评估上的能力一步步拉起来的全过程包括方法拆解、参数细节、踩坑实录和最终的效果对比。如果你也在做类似的方向或者想用语言模型做因果推断相关的落地任务这篇应该能帮你少走不少弯路。1. 语言模型能读懂句子却读不懂因果结构1.1 因果推理和自然语言理解是两套能力先说一个我们测试后不得不承认的事实语言模型对自然语言的理解能力非常强但这不意味着它天然具备因果推理能力。一个人读到“由于碳价上涨水泥厂降低了熟料产量”这句话能迅速判断出这里有清晰的因果断言碳价上涨是原因熟料产量下降是结果。语言模型也能判断出这两个实体之间存在关系但它不一定判断对方向更不一定能区分“时间上的先后”和“逻辑上的因果”。我们在初版实验中做了个测试给了同一个开源语言模型十条带有明显因果标志的政策语句让它回答“谁是原因、谁是结果”。结果它的方向准确率只有71.4%。也就是说接近三成的语句它把因果方向搞反了。这不是模型笨而是预训练任务里根本没有专门的因果结构监督信号——模型学到的更多是“哪些词经常一起出现”而不是“谁在结构上决定谁”。这个区别非常关键。相关关系是共现模式的统计积累因果关系是机制层面的方向性约束。你在提示词里写一百遍“请严格遵循因果逻辑”也补不上结构层面的训练缺失。这逼着我们必须把“抽取因果结构”这件事从语言理解中拆出来单独设计。1.2 从政策文本里找因果难在哪里气候政策文本和我们平时处理的技术文档还有一层额外的麻烦政策语言里有大量的“间接表达”和“条件约束”。比如“该机制预计将通过生产成本渠道对下游行业利润产生负面影响”这句话里面没有出现“因为”“所以”“导致”这些明显的因果标记词但因果结构非常丰富机制是生产成本影响对象是下游行业利润方向是负面且整个因果链带有“预计”两个字。这种带条件、带渠道、带不确定性表述的句子对语言模型的抽取能力要求比“A导致B”高一个量级。更麻烦的是政策文本经常跨句描述因果关系。第一句说“建立碳排放配额交易体系”第二句说“企业面临更高的合规成本”第三句才说“部分产能可能转移至未纳入体系的地区”。三句话之间没有直接的因果连接词但语义上构成一条完整的因果链。单句抽取在这个场景下完全失效必须做跨句的因果图融合。这是我们从“语言模型单句分类”走向“因果图构建”的第一个转折点。1.3 我们最初的失败实验给出的三条反面教训第一次正式实验我们设计得比较简单把政策文本切成段落用语言模型逐个段落抽取“实体-关系-实体”三元组然后把所有三元组直接叠成一张图。结果三个问题非常突出第一实体指代混乱。同一个“碳市场监管机构”在不同段落里被称为“主管部门”“监管方”“该机构”在图里被当成三个不同节点。第二方向一致性崩溃。某一段里模型输出“配额收紧导致碳价上涨”另一段同一个模型输出“碳价上涨导致配额收紧”两条边同时存在于最终图里形成逻辑环。第三幻觉关系难以识别。模型会给两个本无直接关系的实体虚构一条“影响”边而且置信度打分还不低普通规则根本筛不掉。这三个教训合起来说明一个核心问题语言模型单干可以但你不能让它既当“抽取器”又当“纠错器”还当“图融合器”。三个任务混在一个环节里模型的偏见和随机性会被直接放大。我们后来的设计和这个教训直接相关——把流水线拆开让每个环节只干一件事。2. 把因果抽取拆成流水线而不是一步到位2.1 第一步用结构化提示抽取因果断言我们放弃了“端到端直接输出全图”的做法改成先抽取“因果断言”再逐步构图。一个因果断言被定义为一个四元组原因实体、结果实体、影响方向、影响类型外加两个辅助字段影响机制和时空范围限定。这个结构不是拍脑袋定的而是基于气候政策评估的需求——评估时你需要知道“谁对谁发生了什么方向的作用”“通过什么渠道”“在什么条件下”才能量化。提示词的设计上我们把规则写得非常死。不要求模型自由发挥而是强制输出固定格式的JSON并且要求它必须先输出“因果类型判断”再输出实体。这个“先判断再抽取”的顺序很重要模型先做了类型分类再抽取实体时就会带着类型约束去匹配准确率比直接抽取实体高。实测下来加上这一步之后因果方向准确率从71.4%提升到79.8%提升幅度几乎是白捡的。具体提示词结构大致是这样的系统指令你是一个因果结构抽取器只输出JSON。输入段落待分析文本。输出要求判断该段落是否存在因果断言。若存在输出cause、effect、directionpositive/negative/unknown、mechanism、condition若不存在输出null。反例约束给出两个标注了“相关而非因果”的反例明确告诉模型“共同出现不构成因果”。这里最容易被忽略的是最后一条反例约束。我们早期版本没加这个模型会把“碳价上涨的同时可再生能源投资增加”抽成一个正相关因果。加了反例之后这类误判大幅减少说明少量的任务内反例比长篇大论的规则描述更有效。2.2 第二步因果图融合与一致性检验拿到所有因果断言之后进入图融合阶段。这一阶段不调用语言模型做语义判断而是先用规则做实体对齐和冲突检测只有规则处理不了的矛盾才再交给模型仲裁。实体对齐我们用两层策略第一层字符串归一化去掉修饰语、统一缩写、统一中英文符号第二层通过语言模型判断两个实体是否指向同一对象但只在字符串相似度处于中间区间比如0.4到0.85之间时才调用避免为所有实体对都跑一遍模型节省成本。冲突检测分为三类方向冲突A→B 与 B→A 同时存在、正负冲突同一对实体一条说正效应另一条说负效应、机制冲突同一对实体但机制描述不同。三类冲突的处理逻辑也不一样方向冲突比较两条边的置信度保留高置信度的若两者置信度接近则该边标记为“方向待定”不删除但也不参与下游分析。正负冲突引入时间维度如果是“短期负效应、长期正效应”则保留两条边并注明时间范围不算冲突。机制冲突合并为多条机制边后续评估时按不同机制分别计算路径系数。这套规则看起来简单但在我们的数据上解决了大量问题。最终图里超过85%的冲突是靠规则自动解决的只有15%真正需要语言模型二次仲裁。2.3 为什么拆开比端到端更可靠你可能觉得这么做有点绕为什么不直接让语言模型一口气输出完整因果图我们一开始也这么想但实测差异非常明显。端到端的生成式图构建模型每生成一个节点或一条边时都会受到自身之前生成的节点的影响一旦开头错了后面全跟着错。而且端到端输出是个“一次性决策”你没法中间检查、没法局部修正。拆成流水线之后每一阶段的输出都是可检查的中间产物。因果断言抽取得不好你只需要看那一步的结果不需要回溯整个链路。这个可解释性在真实项目中价值极高——你会面对专家评审、需要说明每一结论的依据没有中间产物根本没法交代。拆开还有一个好处模型在每个环节的任务都简单了指令遵循的成功率大幅提升。我们在一个7B级别的开源模型上测试单环节任务的指令遵循率可以达到92%以上而端到端任务只有74%。3. 提升语言模型因果能力的三种手段与应用机制3.1 轻量参数微调冻结基座加低秩适配确定了流水线架构之后还有一个底层问题没解决模型本身的因果抽取能力还不够强。我们尝试过换更大的基座模型效果有提升但部署成本和推理延迟都翻了好几倍不现实。后来我们用轻量参数微调的方式来补短板具体做法是冻结基座模型全部参数只在注意力层插入低秩适配模块。参数配置上我们对比了几个方案之后定下来适配维度rank32缩放系数alpha64dropout0.05只训练注意力层的查询和值投影部分。这个配置下可训练参数只占全模型的1.2%左右训练显存占用比全量微调低了将近一半。训练数据是自建的因果断言标注集大概1.2万条包含政策文本、技术报告、新闻稿三种来源。训练轮数取了4轮再多就出现因果类型分布偏移——模型开始过度预测训练数据里占比高的“正向影响”导致泛化能力下降。一个值得注意的细节微调数据的标注质量直接影响效果上限。我们前一批标注数据里有大约8%的标注错误微调后的模型在这些错误样本上也表现得“异常自信”交叉验证F1反而下降了。后来我们加了“标注置信度”字段训练时对低置信度样本降低损失权重F1才重新拉起来。3.2 检索增强拉取相似政策文本作为示范微调之后的模型能力提升明显但有一个短板依然存在遇到专业性过强的政策文本时它还是会蒙。比如“碳排放核算边界调整”这类高度专业的内容模型见得少抽取出来的因果断言经常漏掉关键实体。我们用检索增强来补这一环。流程是对每一条待处理文本先在已有的政策知识库中做向量检索找出最相似的十条历史文本连同它们的人工标注因果断言一起拼进提示词里作为少样本示范。这个做法本质上是把“模型没见过但库里有”的知识通过上下文补充进来。检索质量对效果的敏感度非常高。我们用通用向量模型做嵌入TopK取5时效果最好取10时反而下降——因为低相关度的示范开始引入噪声。另外一个细节是检索出来的示范必须覆盖不同的因果类型我们按正向影响、负向影响、无因果三类各取至少一条避免示范单一导致输出偏差。加上检索增强之后方向准确率从79.8%提升到85.2%。但我还是想提醒你检索增强不是万能的它依赖知识库本身的覆盖度。如果政策文本本身就是全新的、库里没有相似内容这个环节就退化成普通少样本效果等于没加。3.3 双模型交叉校验与自反馈闭环前面两步把能力提升到一个稳定水平但还剩最后一类问题幻觉边和判断分歧。同一个段落我们用两个不同初始化、不同训练数据的语言模型分别抽取有大约12%的结果不一致。这些不一致样本里有一半以上确实是一个模型对、一个模型错的情况说明单模型输出在边界案例上不稳定。我们做了一个交叉校验机制两个模型独立抽取结果一致时直接采纳不一致时把两个结果连同对应文本送到仲裁模型做最终裁决。仲裁模型的任务不是重新抽取而是“当裁判”——判断哪一方的抽取更符合文本语义。这个“裁判”角色比“运动员”角色更容易仲裁模型的判断准确率达到了91.6%。自反馈闭环是后来的迭代产物。我们发现仲裁结果出来之后可以把“被判定为正确的那一方的抽取结果”追加到该文本的历史记录里下次再遇到类似文本时作为示范用。每轮迭代后重新跑一遍验证集整体F1有小幅但稳定的提升。这个闭环本质上是把模型曾经正确输出的样本转化为新的监督信号算是一种轻量级的数据飞轮。3.4 消融实验的结果说明了什么为了搞清楚每一项手段的真实贡献我们做了完整的消融实验基线是未经微调的通用模型加简单提示词抽取基线抽取F1 62.3%方向准确率71.4%加结构化提示F1 68.7%方向准确率79.8%加轻量参数微调F1 81.5%方向准确率88.3%加检索增强F1 85.2%方向准确率90.6%加双模型校验F1 87.6%方向准确率93.1%拆开看贡献最大的是轻量参数微调这符合预期——它直接改变了模型内部的参数分布。检索增强的贡献次之但它是在微调基础上叠加的单独用效果会差很多。双模型校验提升幅度看似不大但它在“高价值高风险”案例上的纠错作用明显这些案例在评估中恰恰是不能错的。关于图质量的整体指标我们用结构汉明距离的加权变体来度量——计算模型输出的因果图与人工标注的参考图之间“该有边的缺失数”“不该有边的多余数”“方向错误的边数”三者的加权和。评测结果从基线的31.2降到最终版本的11.7图整体质量提升显著。4. 从因果图到气候政策影响评估4.1 传统评估方法为什么需要因果图气候政策影响评估的传统做法大多是直接对结果变量做回归把政策变量、控制变量一股脑塞进去跑出一堆系数。问题在于控制变量怎么选选少了会有混杂偏误选多了会把某些中介变量也当作控制变量塞进去反而遮蔽了真实的传导路径。因果图在这时候的核心价值是告诉评估者“哪些变量应该作为协变量进入模型、哪些变量应该作为中介机制单独分析、哪些变量绝对不能作为控制变量”。这个信息传统上靠领域专家手工梳理耗时且主观性较强。语言模型自动构建因果图之后至少可以快速生成草图再由专家在草图上修订效率比从零开始高很多。4.2 用因果图辅助构建对照与中介分析我们具体跑了两个场景。第一个场景是构建处理组和对照组的匹配变量。因果图显示“碳价影响企业产出的传导路径经过能源结构调整”那么匹配时就该把能源结构相关变量作为核心匹配变量而不是把产出直接拿来匹配。这样的匹配结果更合理处理组和对照组的平衡性检验通过率明显提高。第二个场景是中介效应分析。因果图识别出一条明确的路径“碳价上涨→合规成本上升→技术研发投入增加→单位能耗下降→碳强度降低”。传统回归只会告诉你碳价和碳强度之间的总效应因果图让我们可以把总效应拆解成直接效应和间接效应每一个环节都有可解释的路径系数。为了把语言模型输出的因果图转成可量化的影响评估我们设计了一个路径系数量化方法对于每一条因果边收集对应的数据变量如果两者都有连续数值就用局部线性回归估计系数如果数据不足以支撑回归则用语言模型基于历史文本给出“影响符号和幅度区间”的定性估计。最终合成一个带有置信区间的效应矩阵。4.3 一个完整的运行样例用一个简化但真实的例子来走一遍流程。输入的材料是某地区碳配额交易体系试点的年度报告其中一句话是“配额分配收紧导致碳配额交易均价上涨进而提高了参与企业的合规成本”。语言模型抽取出的因果断言是cause配额分配收紧effect碳配额交易均价上涨directionpositivemechanism供需关系condition配额总量设定环节另一句话是“合规成本上升后企业增加了低碳技术采购”。模型抽取为cause合规成本上升effect低碳技术采购增加directionpositivemechanism成本倒逼condition存在合规压力两条断言合并之后最终图的路径是“配额收紧→碳价上涨→合规成本上升→低碳技术采购增加”。我们把“合规成本上升”识别为中介变量将“碳价上涨”路径系数设为0.53“合规成本→低碳技术采购”的系数设为0.68那么间接效应就是0.53乘以0.68约等于0.36。这个0.36的含义是配额收紧通过推高合规成本使低碳技术采购增加约36%这是总效应里能够用机制解释的部分。同样一条路径如果传统回归里把“合规成本”当作普通控制变量放进模型中介效应就会被吸收进其他系数里无法单独识别。这是因果图带来的最大增量价值。5. 评测设计与避坑要点5.1 评测数据怎么标注才不像一锅粥任何评测的前提是数据靠谱。但“因果结构标注”这件事比文本分类标注难得多最大的坑是多个标注者的判断不一致。我们组建了三人的标注小组每一条政策文本需要三个标注者独立标注因果图然后两两比对一致程度。最初版本三个人在“是否存在因果断言”这个最基础的问题上一致率只有78%数据根本没法用。后来我们做了两件事改进第一制定细化的标注规则明确“有明确方向且存在机制解释”才算因果“时间先后但无机制”不算第二每个标注者先完成20条培训样本不一致处逐条讨论达成共识后再进入正式标注。规则细化后的标注一致率提升到89%但依然有11%的矛盾样本。对这11%的样本我们采取强制讨论仲裁制仲裁后作为高置信标准样本保留并记录讨论结果。这个流程耗时较大但数据质量完全值回成本。5.2 指标选择F1不够还要看结构距离很多人在做类似项目时只看三元组抽取的F1这是一个容易产生误判的指标。F1衡量的是“实体和关系是否抽对”但没考虑“整张图的结构是否合理”。举个极端例子模型把“A→B→C”抽成了“A→C、B→C”每个三元组单独看都可能对但路径结构完全错了中介分析就废了。所以我们额外加入了加权结构距离指标由三部分组成缺失边权重1.0、多余边权重0.8、方向错误权重1.5。方向错误的权重最高因为方向反了不只是“缺了一条边”而是让整条因果链的逻辑反着走对下游评估危害最大。最终版本的结构距离为11.7虽然绝对值不高但对照错误类型分布后我们发现方向错误边已经只占7%大部分残余误差来自“漏掉了不明显的间接因果边”这类误差对评估的影响相对可控。5.3 容易掉进去的三个坑第一个坑把“时间先后”当因果。政策文本里经常出现“2022年建立了碳排放监测系统2023年碳排放强度下降”数据上确实一前一后但不能直接抽成因果。模型很容易在这里翻车我们的解决方案是提示词里反复强调时间先后不等于因果且需要一个机制词才能判定为因果。第二个坑评价指标被“相关但无方向”的关系污染。有些关系是双向的、相互强化的比如“技术创新降低碳成本碳成本降低又激励更多创新”。这种反馈回路不应该被强行塞进有向无环图里。我们最终的做法是允许图包含双向边但在做路径分析时把双向边单独标记为“循环关系”不参与中介效应的系数分解。第三个坑评估时忽略因果图的不确定性。因果图是概率性的每条边都有置信度但传统计量模型只接受确定的图结构。我们引入了一个图采样机制按照每条边的置信度分布进行多次随机采样生成一组候选因果图然后分别跑评估模型最终汇报评估指标的中位数和置信区间。这个机制让结果更稳健但计算量大了不少实测大约增加了35%的推理时间。6. 从工程基线到后续扩展一些实操方向的建议如果要在自己的项目里复现这套方案我给出的工程基线是选择一个7B到13B级别的开源基座模型按“轻量适配微调加检索增强加双模型校验”三件套来搭。微调数据不用贪多几千条高质量标注样本就能把因果抽取能力拉起来关键在于标注一致性和冲突处理规则。检索库按领域文本建立向量化时注意不同来源的格式差异。双模型校验如果成本压力大可以退化为“单模型生成加自评分”模式用模型自己的多轮验证替代第二个模型效果会略降但成本省大半。数据处理流程上先跑一遍规则对齐和清洗再让语言模型介入不需要一上来就全量调用大模型。政策文本里的格式化内容、列表、表格说明很多可以通过规则直接转换成语义单元不必消耗模型推理资源。后续可以尝试的方向很多把多源政策文档的因果图合并成跨领域的宏观因果网络用于模拟一项政策通过多个中间机制影响多个结果变量的全局效应在抽取断言时引入文档级上下文让模型在整篇文档的语义框架下判断而不是只看单段以及把专家修订后的因果图反馈回微调数据池形成一个持续迭代的闭环。我在跑完当前版本后的一个感受是最难的部分早已不是模型能力本身而是怎么把模型的输出嵌入到一个可以被验证、被修正、被信赖的工作流中。一个能解释每个决策依据的流水线远比一个偶尔聪明但偶尔也会胡说的黑盒模型有价值得多。