上个月我们在审一份为期三十天的可靠性摸底试验报告,会开了不到半小时就卡住了:故障次数对不上。有人从试验记录里数出37次故障,有人数出33次,还有人说其中至少两条根本不算故障。别小看这几次的差别,故障次数一改,平均故障间隔时间跟着变,最后的可靠性结论甚至可能从“不达标”翻成“达标”。也是从那次会议之后,我们搭起了一套用AI做报告文档审核的内部工具,代号IACheck,专职做故障次数精准核验,顺带把整个可靠性检测与评估体系的数据口径重新捋了一遍。这篇就聊聊这套东西解决的是什么问题、具体怎么落地,以及运行过程中踩过的那些真实边界。
1. 故障次数核验:可靠性评估里最容易被忽视的地基
1.1 同一个故障,三种写法:描述差异如何让计数失真
如果把可靠性检测与评估体系比作一栋楼,故障次数就是地基里的钢筋。这个比喻一点都不夸张。平均故障间隔时间的分子是累计试验时间,分母是故障次数;故障率、可靠度函数、维修性指标的计算,几乎都要从这个数字出发。可恰恰是这个最基础的数字,在实际操作中最容易出问题。
最常见的情况是同一个故障在不同人的笔下有完全不同的写法。有一次我在复核时发现,同一个电源模块过压保护动作,试验日志里写的是“电源模块输出异常”,维修记录里写的是“电源保护,重启后正常”,质量系统的缺陷单上又变成“输出电压超上限”。如果不是恰好三份文档的样机编号和发生时间都能对上,这三个条目会被当成三次独立故障,故障次数直接虚增两倍。而反向的风险同样存在:有些记录把故障描述得非常隐晦,比如“整机运行不太稳定”,没有经验的人根本看不出来这是一条故障还是操作人员的抱怨。
这个问题在行业里并不少见。故障记录的填写质量完全取决于当时值班工程师的习惯,同一个团队里有人喜欢写现象,有人喜欢写判读结论,有人惜字如金只写一个“偶发”。当这些记录汇总到一份可靠性评估报告里时,每一处描述差异都会变成统计口径的偏差。最让人头疼的是,这种偏差不是你仔细看一遍就能发现的,它藏在几百条记录的措辞缝隙里。
1.2 口径之争:故障记录与故障判据之间的鸿沟
除了描述差异,更麻烦的是故障记录与故障判据之间的鸿沟。一份试验记录里有大量信息是按时间顺序写的事件,并不等于故障。比如“试验箱温度达到设定值,样机功耗上升”,这很可能只是正常的温升现象;“更换备件后复测通过”,这描述的是处理动作而不是故障本身。到底哪些条目算故障,需要结合试验条件、指标限值、是否属于外部原因来综合判断。
这个判断在很多人看来是“常识”,但真要把常识写成可执行的规则时才会发现,里面有太多隐性条件。比如某设备在电压跌落试验中发生复位,到底算不算故障,取决于该设备的规格书是否允许复位。不同产品、不同批次,判据都不一样。人工审核时,这个判断靠经验;审核任务一多、人员一换,口径就不稳定了。
这也是为什么只靠增加人手解决不了问题——人少了看不过来,人多了口径更乱。可靠性评估最怕的不是结论不好,而是同样的输入数据,换个人统计就得出完全不同的结论。判定口径无法固化,后面所有基于故障次数的分析都等于建立在流沙上。
1.3 人工核验为什么救不了场
我见过很多团队用最原始的方式处理这类问题:把报告打出来,拿尺子对着表格一行一行数,再做记号。这样做的结果通常是,一次鉴定会前,几个工程师连续加班两天,数出来的数字还不一样。原因倒也不是谁粗心,而是每个人对“这条算不算故障”“这两条是不是同一个故障”的判断标准都不一样。
更麻烦的是,人工审核的过程没有留痕。最后汇报时,评审专家问一句“这个数字是怎么来的”,我们往往只能回答“我们人工核过的”。这个回答在追溯性要求越来越高的今天,已经很难让人信服。故障次数直接关系到产品能不能定型、可靠性指标能不能达标,如果连这个数字的来源都说不清楚,整套评估体系的可信度都会被打问号。
所以我在那次故障次数对不上的会议之后,下决心要做一个能自动读报告、自动归一描述、自动给出核验意见并留下完整证据链的工具,也就是后来的IACheck。
2. IACheck怎么读懂故障记录:一次解析、两次归一的处理链路
IACheck的总体思路不是简单地把报告丢给某个大模型让它输出一个数字,而是把核验过程拆成可追溯的几步:先把非结构化文档变成结构化字段,再把故障描述归一成标准故障模式,最后用规则引擎完成计数。每一层都可以独立检查、独立修正。
2.1 先把非结构化文档变成结构化字段
第一步是把非结构化文档变成结构化字段。可靠性报告的来源很杂,质量管理系统导出的PDF、试验台软件生成的日志、手写扫描件都有。IACheck先用OCR把图片和扫描件转成文字,再做版面解析,把每一段文字归到正确的表格行列里。这一步看起来简单,实际最容易翻车。
尤其是跨页表格,第二页没有表头,程序很难判断这列到底是“故障现象”还是“处理措施”。我们在工程上做了个折中:不仅要做版面还原,还要对关键字段做类型校验。比如“累计工作时间”这个字段必须是一个数字加一个时间单位,如果识别结果里出现明显异常,就自动标记为疑似错误,并在界面里把原图区域框出来,让复核的人一眼看到原始凭证。AI的判读结果本身不能直接作为最终结论,原始证据必须随时可查。
标准化之后,每条记录至少包含这些字段:
- 样机编号
- 试验阶段
- 累计工作时间
- 故障发生时刻
- 故障现象
- 故障部件
- 处理措施
- 备注
有了这组字段,后面的归一化和计数才有稳定的操作对象。
2.2 故障描述归一的三个层次
第二步是故障描述归一。归一化分三个层次。第一层是部件名称的归一。同一块电路板,在不同报告里可能被写成“电源板”“电源模块”“电源组件”甚至“PSU板”,这些都必须映射到唯一的部件编码。第二层是故障模式的归一。比如“偶发重启”“黑屏后自动恢复”“异常断电后自行恢复”,语言表达差别很大,但在可靠性分析里它们属于同一个故障模式:异常重启。
第三层是语义级别的归一。这一步依赖语言模型把整句话转成向量,再和故障模式库里的标准描述做相似度匹配。相似度超过设定阈值的自动归类,低于阈值的转到人工。为什么必须做这个三层结构?因为直接问模型“这条记录属于哪个故障模式”虽然方便,但模型可能给出两个不同结果而给不出一个稳定的说法,条款多了之后很难排查。分层的最大好处是每一层出问题都可以单独修正,词典错了就改词典,模型错了就补样本,不会牵一发动全身。
2.3 用规则把“次数”判准:去重、合并与剔除逻辑
归一化解决的是“是不是同一个故障”的判断前序问题,最终计数还得靠规则引擎,因为计数必须确定,不能这次跑出37次、下次跑出33次。IACheck的规则层专门处理三件事:合并、剔除、追溯。
合并的逻辑是:同一样机出现同一部件同一故障模式,且发生时间间隔在设定窗口内,判定为同一故障的重复表现,合并计数。比如某样机在48小时试验循环里出现三次显示黑屏但自动恢复,且中间没有更换部件,按可靠性判据通常应作为一次可报告故障处理。合并时,系统会生成一条证据链:哪几条原始记录、为什么合并、隶属哪个样机哪个部件。
剔除的逻辑是:试验条件超差、外部电网异常、人工误操作等原因导致的异常,不属于产品可靠性故障。系统把这类原因单独归为“非可报告”,并记录剔除理由。追溯则是把合并、剔除、保留操作全部反写到原始记录上,最终输出一份核验差异说明表。下面是一条约束处理后的记录示例:
{ "record_id": "T-2025-0512-014", "device_sn": "S0102-003", "fault_part": "P202-PSU", "fault_mode": "M301-异常重启", "fault_time": "2025-05-12 09:41:22", "working_hours": 215.5, "suggest": "merge", "merge_with": ["T-2025-0511-023"], "confidence": 0.93, "reason": "同一样机同一部件同一故障模式,且发生时间间隔小于36小时" }3. 落地IACheck的实操要点:从历史数据标定到验收闭环
3.1 历史报告标定:故障词典与故障码体系的建设
说句实在话,IACheck这类工具不是装上就能用的,它需要先吃够一定量的历史报告。我们在起步阶段做的最重要的一件事,是整理故障词典和故障码体系。流程大概是:从历史报告里挑出两百到五百条有代表性的记录,逐条标注出部件名、故障现象、处理措施,并且明确标出哪些记录最终被判定为可报告故障、哪些被合并、哪些被剔除。
这些标注数据同时干三件事:一是用来写同义表达词典,比如“黑屏”“显示无输出”“屏幕不亮”归到一类;二是用来归纳每个产品线的两级故障码,先按部件编码,再按故障模式编码;三是用来训练和评估语义模型。没有这个步骤就急着上线,后面一定会在准确率上栽跟头。我自己见过太多项目跳过标定直接调模型,最后模型在测试集上表现不错,一到真实报告就频繁出错,因为真实报告里的表达方式远比测试集丰富。
提示:故障词典不是一次性建完的,至少要留出两轮迭代的余量。第一轮覆盖规范写法,第二轮专门吸收口语化、缺主语、带错别字的写法。
3.2 模型与规则的分工配置
第二个要点是把握模型与规则的配置度。我的建议是重规则、轻模型。凡是能用词典、正则、字段映射解决的事情,坚决不交给模型。模型只负责一件事:开放文本的语义归一,也就是处理词典覆盖不到的语言变化。最后计数必须由规则引擎完成。
原因很简单:模型的预测天生带有不确定性,同一句话换一种问法可能给出不同结果;但故障次数是要写进报告、要对外解释的数据,必须稳定、可复现。如果第一版不想投入太多资源,可以不接大模型,而是先微调一个轻量的序列标注模型来抽取实体,再用文本向量相似度做归一。这样做的好处是出错好定位、算力要求低,坏处是面对特别口语化的描述时泛化能力弱。实测下来,只要词典覆盖到位,轻量模型加规则的组合已经能覆盖大部分规范试验记录。
3.3 输出设计与人工复核闭环
第三个要点是输出设计和人工复核闭环。IACheck的输出不是简简单单给一个数字,而是给一个可以审查的过程。每条原始记录都会得到一个处理意见:保留、合并、剔除、人工复核,附带置信度和理由。置信度高的记录可以自动通过;置信度中等的记录进入一个快速勾选界面,人工只需要看系统高亮的关键字段,做确定或推翻;置信度低的记录必须逐条点开原文,对照原报告截图核验。
在验收上,我们用一段已由资深工程师人工判定过故障次数的历史数据做盲测,计算IACheck的核验结果与人工判定结果的一致率。第一版的目标我建议设在90%以上再放量使用,达不到就继续补词典、补规则、补样本。另外还有一个非常实用的设计:把每次人工推翻AI判定的案例都记录下来,定期归因,这比任何测试指标都能说明问题。
4. 实测中的坑:AI核验在真实报告前暴露的边界问题
4.1 扫描件OCR错字与表格串列
第一个坑是OCR错字和表格串列。我们有一批比较老旧的历史报告,是扫描出来的,清晰度本来就不高。OCR把“电机”识别成“电枢”,把型号字母里的O识别成数字0,部件编码完全对不上。更麻烦的是表格跨页后表头丢失,程序把第二页第一列的数据当作故障现象,实际那列是处理措施,统计结果自然全错。
后来我们加了两道保险:第一,字段类型校验,比如累计工作时间必须匹配数字加单位的模式,如果识别结果不满足就标记为疑似误识别;第二,所有进入人工复核界面的记录都保留原图区域截图,人可以点开看原始证据。这套机制虽然让自动化率打折,但至少保证了不会把错误结果一路传到故障库里。宁可在核验环节多花一点人工时间,也不要在后续评估分析里反复返工。
4.2 “同一故障”的时空窗如何定义
第二个坑是“同一故障”的时间窗定义。这个坑严格来说不是技术坑,而是定义坑,但技术实现绕不开它。如果把时间窗设成固定的小时数,比如48小时,同一故障只是没有在修复后完整跑过一个验证周期,再次出现时就会被拆成多次故障;如果时间窗设得过长,两个没有因果关系的独立故障又会被糊里糊涂地合并成一次。
我们最后采用的做法是按验证周期而不是按小时数判断:样机更换部件后,重新完整运行了一个验证周期没有再出同类问题,之后再次出现同类问题,视为新的故障;如果没有经过完整验证就又出现,视为同一故障未修复。但这个定义在不同产品线里并不一样,所以规则里的时间窗参数必须做成可配置项。同时我强烈建议,在每次评审会之前,把时间窗的取值和试验工程师、设计师对齐一遍,否则AI的合并结果很可能会在评审会上被挑战。
4.3 置信度阈值的取舍
第三个坑是置信度阈值的取舍。最开始我们把自动判定阈值设得很高,基本0.9以上才自动处理,结果大量记录都进了人工池,系统并没有给审核人员省多少事。后来我们把阈值下调到0.6,自动化率上去了,但业务方很快发现有些明显该人工确认的记录被自动放行了。
最后我们改成两级阈值:0.85以上自动判定,0.6到0.85之间进入快速勾选界面,0.6以下强制人工逐条核验。这个调整之后,系统的自动化率大概能回到百分之六十多,同时误判率可以接受。经验就是,阈值不是一个参数,而是一组参数,而且一定要基于实际业务的容错能力来调。可靠性报告这种场景,我对自动判定的要求是宁可少判,不可错判。因为少判还有人工兜底,错判直接污染数据。
4.4 历史数据的格式多样性
第四个坑来自历史数据的格式多样性。这几年我们手里的存档报告来源五花八门,有纸质的、有试验台软件直接导出的、有自己整理到Excel里的,字段命名完全不一致。刚开始我们想让IACheck把所有历史数据一次全部清洗完,结果陷在格式适配的泥潭里。
最后调整了策略,按报告批处理:先把结构规范的最新报告跑通,形成基准;把结构较老、表述较乱的报告作为后续批次,一边处理一边补充标注,作为模型和词典的增量训练数据。这种分阶段推进的方式比一开始求全实用得多。后来我还发现,IACheck上线三个月之后,由它核验过的报告格式开始反过来影响试验团队的填写习惯,大家知道最终会有AI来审,填写规范了很多,模板层面甚至在源头减少了模糊描述。这个正反馈是我当初没有预料到的。
5. 故障次数核准后,可靠性评估体系被重塑的部分
5.1 MTBF从拍脑袋变成可追溯
故障次数一旦被精准核验,第一个明显变化是MTBF这类指标终于从拍脑袋变成了可追溯。我们有一个项目,原统计的故障次数是18次,IACheck核验后确认的可报告故障是14次。别看只差4次,在那个累计试验时长下,MTBF从约500小时变成了约640小时,直接影响了这个项目“是否达到规定的最低可接受值”的结论。
| 项目 | 人工原统计 | IACheck核验 | 差异原因 |
|---|---|---|---|
| 故障记录总数 | 23 | 23 | 无 |
| 可报告故障 | 18 | 14 | 3次合并、1次剔除 |
| 计算用试验时长 | 9000小时 | 9000小时 | 不变 |
| 修正后MTBF | 500小时 | 642小时 | 故障次数差异 |
同时我也要说明,这绝不意味着系统在放松判据帮产品过关;恰恰相反,因为每一条合并、剔除都有证据链,评审专家反而更愿意接受结论。过去人工数出来的数字大家心里都有疑问,只是碍于没有更好的方案才勉强接受;现在数字背后有逐条解释,可靠性结论的置信度完全不一样。
5.2 故障模式分布终于能支撑Pareto决策
第二个变化是故障模式分布终于能支撑决策了。过去我们想画一张故障模式频次排序表,一共十来个故障模式,“其他”类却能占到将近三分之一,因为人工归类时抓不住那么多细节,很多表述模棱两可的记录都被丢进了“其他”。IACheck做了语义归一之后,“其他”类占比大幅下降,真正的TOP故障模式浮现出来。
比如某个项目里,异常重启、传感器无输出、通讯时断三类问题占了七成故障次数,这个排序直接指导了下一轮设计改进和维修策略的制定。如果没有精准的故障分类,这些资源投入方向很可能就是拍脑袋。可靠性评估的价值并不只是算出几个指标交差,而是把有限的设计改进资源投向真正值得投入的地方。故障次数核验这一步做扎实了,后面所有的分析才有根基。
5.3 从我的角度看这套体系的局限与经验
最后说说我自己的体会。用IACheck做故障次数精准核验,最核心的价值不在于替代人,而在于把“判定过程”本身变成可解释、可被复查的对象。我也提醒自己,不要把AI的能力神化:故障判据的源头仍然是工程定义,AI只是把定义翻译成了规则和模型。如果我们内部对于某类故障到底算不算可报告故障本身就说不清楚,那AI只能放大这种混乱,而不是解决它。
从分工上看,我的建议是让AI负责把模糊海量的记录变成结构化的候选结论,让人负责处理那些低置信度、真真假假的疑难条目。这样做一个月之后,我发现团队审核报告的时间不仅没有增加,反而明显变少,而且每个人对“故障次数为什么是这个数”的解释能力都强了很多。现在我再拿到一份可靠性报告,先看IACheck输出的核验差异表,再决定要不要翻原始记录,效率比从前翻纸质报告高得多。这套方法目前还在继续打磨,尤其是针对更复杂的多故障交织场景,还有不少空间可以扩展。