尧图精选

LLM概率校准实战:从非结构化文本到可靠风险变量

🕒 发布时间:2026/10/2 19:09:49 📁 来源:尧图网络
近段时间一直在弄一个不太常规的数据项目把将近50万条警方事故叙述文本交给Jev来跑最终目标是让每一起事故都变成一组概率变量——比如“超速嫌疑0.68”“分心驾驶嫌疑0.42”“车辆故障嫌疑0.15”这样的结构化输出。刚开始我以为最难的是让解析结果足够准确跑完第一批数据才意识到真正卡脖子的环节在概率校准。那一步要是没做好模型给出来的0.72和现实里真实的0.72根本不是一回事。这篇文章就把整个思路和落地过程拆开讲清楚适合正在用语言模型做批量文本结构化或者打算把LLM输出当作下游决策输入的朋友参考。1. 从50万条事故叙述到概率变量项目要跨过哪几道坎1.1 非结构化叙述里到底藏着什么警方事故叙述是典型的半格式化文本开头可能是事故编号和日期中间是警员对事发经过的还原结尾偶尔附着当时的天气、路况、当事人陈述摘录。真正麻烦的是正文部分不同辖区的警员写法完全不同有人喜欢记流水账有人直接写“出事后双方自行协商未报警现场无目击者”还有大量拼写缩写和口语化表达。举条我在这批数据里反复看到的例子车辆行至交叉口时前车突然制动后车未能保持有效安全距离致碰撞。后车司机自述当时正在接听电话天小雨路面微湿。这段描述里至少同时嵌套了三层信息直接因果关系未保持安全距离、间接诱因接打电话、环境条件小雨、路面湿。如果只用传统规则引擎或者关键词匹配最多做到“碰撞”“接电话”这种标签级判断一旦需要区分“主要因素”和“次要因素”、评估每种原因的可信程度规则系统就完全不够用了。这也是我选择Jev来做这层解析的原因。它的优势不在于跑单个文本的能力而在于可以用自然语言指令定义一套稳定的解析规范然后批量、可重复地作用在几十万条文本上把每一段叙述都映射到同一套变量结构里。1.2 为什么在这个场景里概率变量比单一标签更接近事实事故原因的认定天然存在不确定性。同一段叙述里可能既有一些超速的迹象也存在分心驾驶的证据现场没有监控当事人陈述又互相矛盾。这种情况下强行让模型输出一个唯一标签等于丢掉大量信息。我举一个真实的影响在后续做原因聚类时如果按单一标签分组“分心驾驶”这组里会混进大量其实是以超速为主因的记录但如果按概率变量去建向量就能让“主因是A、次因是B”的记录处在两个类别之间聚类边界明显更合理。概率变量的另一个价值在于可以天然兼容证据的不完整。哪怕某条叙述只提到“车辆失控”没有说明是否和路面有关模型也可以输出“路面因素0.35”让这个低置信度推断在下游计算里占据一个很小的权重而不是直接变成0或者1这种硬判断。1.3 Jev在处理这件事里的定位这套方案里Jev的核心角色不是“一个会说话的大模型”而是一个可控的批量文本处理引擎。我需要它做到三件事第一严格按我给定的变量维度输出结构化的概率值而不是自由发挥第二对同一条文本能够给出稳定的结果不能被提示词里的微小变化带跑第三处理50万条数据时不至于在十几万条之后出现明显的质量衰减。实际跑下来Jev把叙述文本变成概率变量这一步做得比我预期要稳但真正决定这些变量能不能被下游使用的是另一层工作——校准。这个问题不解决前面所有解析都是在给错误答案做包装。2. Jev的数据管线拆解叙述文本是怎么一步步变成概率分布的2.1 清洗与去偏先处理噪声再处理语义很多人拿到文本第一反应就是直接丢给模型我在这个项目里吃了一次亏之后才意识到清洗这一步对概率解析的影响比想象中大得多。事故叙述里常见的噪声有四类。第一类是格式噪声时间戳、警号、事故编号混在正文里这些内容对原因判断没有任何帮助还会干扰模型的注意力。第二类是拼写和缩写不一致“mph”和“MPH”、“r/o”rolled over这类现象非常普遍。第三类是辖区的特殊写法同一个地方在不同记录里可能叫“MMI”也可能叫“RR 47B”。第四类是我特别提醒自己的手写录入或OCR识别产生的错别字会把模型带偏。我的处理顺序是先把结构化字段时间、地点、天气、路面状态从正文里剥离出来单独存成字段再对纯叙述部分做大小写统一、常见缩写替换、去重句清洗。这里没有用复杂的NLP工具大部分就是正则加字典表。一个关键经验清洗规范要建立在抽样看数据的基础上不要凭想象写规则。我第一批清理规则里有一条是把所有“T-bone”替换为“侧撞”结果后来发现有几百条记录里“T-bone”指的是某位当事人的名字缩写差点引发一轮系统性误判。2.2 定义“可解析的变量维度”而不是让模型自己发挥这个环节是整个项目的框架直接决定后续所有输出的形状。我最终使用了六个主维度加若干子维度的结构变量维度定义范围输出形式速度相关超速、未按限速行驶、速度过快等0到1区间概率分心/操作不当使用手机、疲劳驾驶、操作失误、分心等0到1区间概率酒药影响酒精或药物影响判断0到1区间概率车辆因素机械故障、轮胎问题、制动失效等0到1区间概率道路环境路面湿滑、能见度低、道路缺陷等0到1区间概率第三方行为其他车辆或行人的危险动作0到1区间概率六个维度并不是互斥的一段叙述可以同时在这六个维度上都有非零概率模型的任务是为每个维度独立给出判断。使用这种方式而不是让模型直接输出“原因列表”是为了让下游计算有统一的数值接口。2.3 批次抽样与结果合并既要规模也要稳定性近50万条文本全部逐条跑LLM既不经济也没有必要。我采用的是分批抽样结合锚点示例的做法。每个批次大概50到100条批次里混合不同类型的叙述确保模型在每个批次里见到的样本分布大体一致避免因为某一批集中出现某种类型而导致输出分布漂移。锚点示例的选择也有讲究。我在提示词里放了几条已经人工标注过的参考样本相当于给模型定基准线。这里有个很容易忽略的细节参考示例的多样性很重要如果全都是高速碰撞类样本模型在处理学校周边的低速碰撞时可能会整体低估“速度相关”维度的概率。结果合并阶段我对同一条文本做了多次独立采样再取均值而不是只跑一次。这个操作的目的是压掉随机性。语言模型的输出有天然波动只跑一次得到的0.63有很大的随机成分但同一条件跑五次取平均稳定性明显改善。3. 概率校准不只是调数值模型输出的0.72和真实世界的0.72根本不是一回事3.1 大模型给出的概率本质上是“模型内部的信念”不是客观频率这是我认为整个项目里最重要的认知转变。Jev在解析文本后输出的0.72到底代表什么它代表的是“模型根据训练数据和当前上下文内部判定这个可能性为0.72”而不是“在真实世界中100起同类事故里有72起确实符合这个判断”。这两者的差别在最开始被我忽略了。原因很简单在验证集上模型输出的0.72往往和标注结果确实有对应关系这就让人产生了“输出概率挺准”的错觉。但验证集本身只是真实世界的切片它反映的是相对排序能力——高分的确实比低分的更像那个类别——却无法保证绝对刻度是对齐的。举个更生活化的例子就像天气预报说“降水概率70%”这句话有价值的前提是在所有预报70%的日子里大约确实有七成会下雨。如果系统预报70%的日子实际只有四成下雨那这个预报的排序能力再强也不能作为“要不要带伞”的可靠参考。事故概率变量在这里面对的是完全一样的问题。3.2 校准的本质让预测概率与真实频率对齐所以校准的定义就很朴素了如果Jev给一批文本打出的“酒药影响概率是0.7”那么在这批文本里真实属于酒药影响的记录比例应该接近70%。这叫作概率对齐也叫可靠性。我在项目里用两种指标来监控校准效果。一是预期校准误差它统计所有分箱里预测概率和实际频率之差的加权平均二是可靠性图把横轴设成预测概率、纵轴设成真实频率看散点是否落在一根45度直线的附近。如果模型给出的0.72那箱真实频率只有0.58那图上就会在0.7位置明显下沉一眼就能看出校准缺口。刚开始跑出来的结果可靠性图就是一条明显的S形曲线低概率段被压得更低高概率段偏高。这意味着模型对“明显像”的事件过度自信对“有点苗头”的事件又过于保守。这种形态在LLM的输出里非常典型。3.3 校准最容易被忽略的部分分群偏移在整体可靠性图上模型可能已经对准了45度线但把数据按辖区、事故发生时段、文本长度拆开看每个子群的校准情况可能千差万别。我说一下实际观察按叙述长度分群时短文本50词以内的“分心驾驶”维度有系统性高估因为模型看到短文本里出现“手机”这个词几乎无条件给定高分而长文本由于信息太杂同维度反而被系统性低估。如果在整体层面只做一次校准这两类误差会互相抵消表面上看起来没问题但一旦把概率变量用在子群分析里结论就是错的。这就是为什么我把校准当作整个项目的“重中之重”——不是因为这一步多难而是因为不做这一步50万条数据产出的所有概率变量都是伪精确精确到小数点位数的错误反而比模糊判断的危害更大。4. 校准实操全流程数据、方法、验证这套组合拳怎么打4.1 校准数据怎么来不能拿原始模型输出自己校准自己校准的第一步是准备带真实标签的基准集。这批数据的标签来源需要独立于Jev的解析结果。在这个项目里我的标签来源有三类警方后续定责记录里明确写出的主因判断、保险理赔记录里标注的责任因素、人工抽样复审时由专业人员做的独立判定。基准集的数量不需要覆盖全部50万条但分布一定要有代表性。我最后用的是8000条带标签样本按事故类型分层采样保证高速碰撞、低速刮蹭、单车失控、涉行人等类型都有足够数量。这里有一个严格的操作纪律基准集一旦定了整个校准过程就只用它不能用同一批数据既做温度缩放又做模型选择否则就是在把验证集当训练集用。4.2 两种主流校准方法怎么选做概率校准有两条技术路线最常用温度缩放和保序回归。它们在原理和适用范围上的差别很明显。温度缩放的操作是为模型原始logit值除以一个温度常数这个常数通过最小化负对数似然求出。它的优势是只需要一个参数不容易过拟合在样本量小的时候表现稳定。但它依赖模型原始logit刚好满足单调变换的基本形状对LLM这种经过RLHF、输出概率的形态已经和原始logit严重脱节的对象来说温度缩放不一定能修复复杂的非线性漂移。保序回归则是直接学一条非递减的映射曲线把模型原始概率映射到校准后的概率。它不限制映射形状理论上可以吸收各种复杂的系统性偏差。我最终为这个项目选择的就是对每个维度单独做保序回归。原因很简单六个维度的偏差形态完全不同速度相关维度是高值过自信而车辆因素维度是整体偏向保守用一个全局温度系数压不住这种分化。实操中我用的是分段保序回归把基准集按预测概率分成十段然后对每一段内部统计真实频率再做平滑。为了不让个别极端样本把曲线带得太陡我把保序回归的输出做了一个小幅度裁剪低于0.05的统一切成0.05高于0.95的切成0.95避免出现绝对0和绝对1这种不切实际的概率。4.3 验证闭环可靠性图、Brier分数与滚动监控校准做完不等于结束验证环节同样要成体系。我每完成一轮校准会整体看三样东西可靠性图是否贴近45度线Brier分数是否持续下降以及各分群子图的偏差程度是否在可接受范围内。Brier分数衡量的是“预测概率与真实标签之间的均方误差”数值越低越好。这个指标的好处是它不仅反映校准——它同时也惩罚辨别力不足。如果我把所有概率全部校准到等于样本基率Brier分数反而会变差因为它同时要求你能把“很可能是”和“可能不是”分开。除此之外我还会做滚动监控。校准曲线是在某一批数据上拟合出来的但真实世界的数据分布会变。到了不同季节事故叙述的语言特征会变不同月份辖区的记录习惯也可能变。所以我的方案是每个月重新抽样一批新的带标签数据去测试校准曲线的表现一旦发现某个维度的校准偏差重新拉大就触发新一轮校准。这里有一条要特别留意的经验校准数据的时间维度比文本量更敏感。同样是监督学习出的映射曲线训练集和测试集在文本主题上稍有漂移校准就会立刻失准。所以我在每个季度的基准集里刻意混入这一季度新出现的事故叙述样式防止模型在已有类型上越学越准、在新类型上一塌糊涂。5. 跑完真实数据后的效果与踩坑记录5.1 校准之后概率变量开始真正可用校准前后同样一批概率变量在下游任务里的表现差别非常大。我们是做原因聚类和风险分层的未校准时用0.7作为高嫌疑阈值筛选“酒药影响”事件查准率只有五成出头校准后再用同一阈值查准率显著提升。原因是模型原本在0.7这个位置上过度自信真实频率其实不到0.7校准把0.7重新映射到了正确的刻度上。另一件让我印象很深的效果出现在多因素共存的场景。未校准时模型给“速度相关”和“道路环境”两个维度都打了中等偏高概率的情况并不多校准之后这类双高记录的数量明显增加而人工复核证实这部分恰恰是真实发生的——雨天超速导致失控本来就该两个维度同时拉高。这说明校准不只在修正刻度还在重新让模型“敢”同时承认几个并存的嫌疑而不是顺着单标签习惯硬挑一个主因。5.2 几个真实的坑提示词、解析容错和锚点漂移先说提示词参考示例带来的偏差。我在2.3里提到锚点示例轮换这个设计最初就是被坑出来的。第一版提示词里固定的参考样本导致输出概率整体偏向示例事故的类型分布——示例里高速碰撞多所有文本的超速维度就整体偏高而且这种偏差无法通过校准修正因为它在不同维度上施加的偏置方向不同。改为多组示例随机轮换之后模型输出才大体回归正常。然后是解析容错问题。50万条文本里总会有一些边缘情况让模型的输出格式不符合规范要么漏了一个维度要么多了一段解释性文字。刚开始我的处理是直接丢弃这些样本跑了一万多条发现丢弃率接近3%这个比例在50万条规模下意味着上万条数据缺失。后来改了解析策略对违规输出做最长一次重试重试仍不通过就标记为“低置信度样本”让该样本在所有维度上的概率都降低到0.3以下而不是直接弃用。这个做法虽然保守但保证了数据流的完整性。最后是锚定漂移的问题。我在批次合并阶段取多次采样均值但后来发现如果某个批次里参杂了几条长文本模型对整批文本的判断尺度会出现短时偏移。这个问题比较隐蔽因为单条结果看不出异常但整批的概率分布会出现一个断层。解决方案是把决策集中在清洗和批次构建环节每条文本按长度分桶确保同一批次的长度分布稳定。5.3 这套管线能不能迁移到别的领域这次做完我对“叙述文本到概率变量”这套管线有了一个比较清晰的迁移判断。它适用的场景有几个共同点大量非结构化描述、描述里隐含多因素归类、下游需要的不只是类别标签而是风险权重、以及能拿到独立的复核标签作为校准基准。我现在正在看的另一个项目是设备质检报告的缺陷归类几百个工程师用自己话写的故障描述结构和警方事故叙述非常像。把变量维度换成电机故障、软件异常、装配公差之后Jev的解析逻辑几乎原样可以复用校准链路也完全适用。我认为凡是“人在记录里讲事情经过而这件事需要被结构化”的领域这套思路都值得试一次。6. 一些实际操作上的体会这次项目对我来说最有意思的部分不是模型解析能力本身而是概率校准把“模型说什么”和“事实是什么”之间的差距变得可以被量化、被修正。我建议如果你也要做类似的事不要一上来就想着把50万条全部处理完先拿两千条走通解析、合并、校准、验证这个完整闭环再放大规模。另外校准数据里尽量留出一部分完全不被参与拟合的样本当作最终的验证集。数据不够的时候容易被省掉但这个问题在小样本上不容易暴露一旦规模扩大验证集和校准集重叠导致的乐观偏差会越来越明显。如果你手头也有类似的非结构文本到风险变量需求哪怕是几万条临床描述或者客服工单也推荐先按这套思路走一遍先把解析变量定义清楚再把校准当成和解析同等重要的环节来设计。最后得到的才是一组真正能支撑决策判断的数字而不是看起来精确的幻觉。
上一篇/下一篇内容由系统自动关联 返回资讯列表 →