工业 AI 受控落地系列 · 场景篇
开错一只法兰之前
把“正向设备识别”做成一条生产级受控 Agent 证据链
从 PEMEX Deer Park 事故出发,拆解数据接入、对象消歧、Rule Center、Java/Python 双栈、异常降级、双 Gate 与风险账本
核心判断
开管作业前的“AI识别”不是一个视觉识别项目,而是一个对象身份、证据一致性与许可责任链问题。真正成熟的系统,不是给出一个很高的置信度,而是在对象无法唯一证明、证据过期、工具失败或规则冲突时,稳定地停下来。
先把结论说清楚
2026年2月,美国化学安全与危害调查委员会(CSB)发布 PEMEX Deer Park 炼厂硫化氢释放事故最终报告。事故发生于2024年10月10日:承包商原本要打开一段已排空管线,却误开了约5英尺之外、外观相同且仍带压的管段,约27,000磅硫化氢释放,造成2人死亡、13人送医。CSB 将“Positive Equipment Identification(正向设备识别)”列为核心安全问题之一。
这个事实把问题讲得非常清楚:高风险作业真正需要回答的,不是“AI看照片能不能认出法兰”(法兰:管道连接件——两截管道之间可拆卸的盘状接合口;并排的两个法兰外观几乎一样,肉眼极难区分,这正是“开错一只法兰”的由来),而是“工单、P&ID、盲板清单、现场标签、隔离状态和检测记录,能不能共同证明眼前这个物理对象就是许可里指定的那个对象”。
一句人话
我们需要的不是一个“会认东西的AI”,而是一个没有证据就不往下走、出了冲突能告诉人为什么的证据编排器。
| 读者 | 先看什么 | 你会得到什么 |
|---|---|---|
| 工艺/设备/EHS | 事故链、Canonical Work Point、双 Gate、KPI | 如何把“对象确认”固化成可复核的作业前证据链 |
| Java/企业应用研发 | 双栈架构、Outbox、幂等、状态机、规则中心 | 怎样不推倒原系统,把 Agent 以智能旁路方式接进去 |
| AI/Agent 工程师 | Claim/Evidence、Skill Registry、HITL、异常降级 | 怎样把“模型能力”变成受控、可审计的生产工作流 |
| 管理者/数智化负责人 | 风险账本、False Pass、PoC路线 | 为什么这不是OCR项目,以及该如何判断是否值得投 |
先看一张全景图:从工单发起到 Trace 归档,四个角色、八个阶段,全部挂在同一个 task_id 上——
(上图即整套系统的运行骨架,后文 15 节内容都是在展开这张图的某一块。)
1. 这不是“识别准确率”问题,而是“错误对象放行”问题
现场作业里最危险的一类错误,往往不是“完全没信息”,而是“信息很多,而且每一份看起来都合理”。工单上有管线号,P&ID上有图,盲板清单有序号,现场也有类似标签;如果系统不能证明这些信息指向同一个物理对象,就存在一个非常现实的缝隙:错误对象可能在所有人都“觉得差不多”的情况下被放行。
计算机里经常会把这类问题拆成识别、检索、OCR、图谱、工作流。但对现场来说,只有一个问题:能不能唯一确认。于是系统设计的北极星也应该随之改变——不是追求“视觉模型Top-1准确率更高”,而是尽量降低 Gate False Pass:本来应该被拦住的错误对象,系统有没有放过去。
术语翻译|Gate False Pass
人话:本来应该被拦住的问题,却被系统放过去了。对高后果作业来说,这比“AI平均准确率95%”更值得盯。
2. 第一公里不是 Agent,而是把“证据供应链”做干净
很多 Agent 方案第一张图就是 LLM、RAG、工作流。可真到化工现场,第一公里往往是数据工程:Excel字段漂移、P&ID版本混杂、设备位号别名、老DCS没有REST API、现场照片标签被遮挡、气体检测记录还有有效时间窗。源头不干净,后面的 Evidence Pack 再漂亮,也只是把 Garbage 包装成 JSON。
| 数据源 | 最常见的脏问题 | 生产级处理 | 进入 Evidence 的最低条件 |
|---|---|---|---|
| 工单/审批数据库 | 业务状态与现场任务不同步 | Java侧主数据+状态快照 | task_id、作业类型、许可版本可追溯 |
| P&ID / 线表 / 盲板清单 | PDF扫描件、版本多、编号别名 | 结构化解析 + 文档版本绑定 + 人工校对 | 来源页/行可定位;版本有效 |
| DCS/GDS/仪表 | 无API、协议老、网络域隔离 | 边缘网关只读采集;OPC DA/UA、Modbus或文件落盘适配 | 时间戳、新鲜度、采集健康状态可见 |
| 现场标签/照片 | 遮挡、反光、OCR误识别 | 视觉/OCR只做交叉证据 | 不能作为唯一身份依据 |
| 检测/隔离记录 | 记录过期、数据延迟 | 有效时间窗+状态校验 | 未过期;来源和责任人明确 |
对多源Excel、CSV和仪表导出文件,Polars适合做列级清洗、类型转换和批处理;DuckDB适合直接查询一批CSV/Parquet/Excel并做临时分析。它们的价值不是“炫性能”,而是让大量一次性Python脚本变成可测试、可复用的数据准备流水线。
数据工程示例:先把台账变成可验证输入,而不是直接丢给大模型
# 示例:把多个设备/盲板台账先统一到 canonical schema import duckdb sql = r''' SELECT trim(line_no) AS line_no, upper(trim(flange_id)) AS flange_id, cast(pid_revision AS varchar) AS pid_revision, try_cast(valid_from AS timestamp) AS valid_from, filename FROM read_csv('blind_lists/*.csv', union_by_name=true, filename=true) WHERE line_no IS NOT NULL ''' rows = duckdb.sql(sql).df()关键边界
“解析成功”不等于“证据可信”。只有同时具备 source_ref、对象ID、版本、时间戳、schema校验结果以及必要的人工确认,数据才有资格进入高风险 Evidence。
3. 先给“要开的那个点”一个唯一身份:Canonical Work Point
Entity Resolution 听起来像算法名,实际解决的是一个很朴素的问题:工单里的“F-2041-17”、P&ID上的某个法兰符号、盲板表第17行、现场二维码和操作人员口中的“第二层东侧那个口”,到底是不是同一个东西。
术语翻译|Entity Resolution
人话:解决“第二版”和“V2.0”是不是同一个版本、“这个现场标签”和“工单对象”是不是同一个物理点的问题。
类比:Canonical Work Point 相当于给每个作业点发一张唯一的“数字身份证”——不管它在工单、图纸、盲板清单还是现场叫什么别名,系统最终只认这张证。
我会先定义一个 canonical work_point,把工单、图纸、清单、现场证据全部挂到这个统一对象上。Agent可以参与候选匹配,但不能在高风险冲突下直接裁决“就是它”。
Canonical Work Point:把“一个现场点”变成跨系统共享对象
work_point_id: WP-ARU-0417
unit: ARU
line_no: 6"-H2S-2041-A
pid_doc: P&ID-ARU-021
pid_revision: R07
flange_id: F-2041-17
blind_list_id: BL-2026-091
upstream_equipment: V-204
downstream_equipment: E-217
field_tag_required: true
| 层级 | 系统先看什么 | 允许自动到哪一步 |
|---|---|---|
| L0 唯一编码 | line_no、flange_id、设备位号 | 全一致且有效时可确认 |
| L1 主数据映射 | 旧编码/别名 → canonical_id | 可自动映射,但必须留审计 |
| L2 拓扑关系 | 上下游设备、阀门、支路、P&ID拓扑 | 只生成候选;冲突即停 |
| L3 位置/上下文 | 装置区、层高、方位、相邻设备 | 补强候选,不单独放行 |
| L4 视觉/OCR | 二维码、挂牌、照片、字符 | 只做交叉验证 |
| L5 人工确认 | 候选接近、标签缺失、高风险对象 | 授权人员确认并写回映射 |
真正成熟的回答不是“我有92%的把握这是F-2041-17”,而是:“存在两个候选对象;拓扑证据无法唯一消歧;现场标签不可见;系统不进入下一步,请由授权人员重新定位并确认。”
4. 用户问“这个点能不能开”,系统内部要拆成一组 Claim
Claim 可以理解成“必须被逐条证明的工程命题”。这样 Agent 的目标就不再是生成一段像专家的结论,而是把每一个前置条件变成可验证对象。
| Claim | 人话 | Evidence / Tool | 失败动作 |
|---|---|---|---|
| C01 对象唯一 | 工单必须只指向一个 work_point | canonical_id + 工单版本 | 不唯一 → BLOCK |
| C02 图纸当前有效 | 不能拿旧版P&ID做当前作业 | 发布状态 + revision | 过期 → BLOCK |
| C03 清单映射一致 | 盲板/法兰清单与工单是同一对象 | 映射Trace | 冲突 → BLOCK |
| C04 现场身份可确认 | 标签/位置/拓扑能把对象唯一找出来 | 现场证据 + 人工确认 | 不确定 → WAIT_HUMAN |
| C05 隔离状态完整 | 上游/下游隔离条件已满足 | 隔离记录/只读状态 | 缺失 → BLOCK |
| C06 前置检测有效 | 检测记录仍在有效时间窗 | 检测时间戳/记录 | 过期 → BLOCK |
| C07 人工许可完成 | 高风险许可责任人已经会签 | Java审批流 | 未完成 → WAIT_HUMAN |
5. Rule / Skill / Knowledge 分开,是受控 Agent 的第一条红线
这里最容易犯的错误,是把SOP、企业制度、工具说明和知识库全部塞进Prompt,然后告诉模型“请严格遵守”。在生产流程里,硬约束必须从语言模型里拿出来。
| 层 | 人话 | 例子 | 为什么独立 |
|---|---|---|---|
| Knowledge | 系统知道什么 | P&ID符号、SOP、设备说明、历史Near Miss | 可检索,但不能替代规则与当前状态 |
| Skill | Agent允许做什么 | query_pid_graph、verify_isolation、build_evidence | 形成工具白名单与权限边界 |
| Rule | 哪些事绝不能被解释过去 | 对象不唯一→BLOCK;过期图纸→BLOCK;高风险→人工 | 可测试、版本化、灰度、回滚、审计 |
生产里我更倾向做一个独立 Rule Center,而不是把规则散落在代码和Prompt里。每条规则至少包含 rule_id、version、effective_from、severity、condition、action、source、test_cases。这样企业标准更新时,可以做新旧版本回放和灰度,而不是重新发一版Agent代码。
规则中心示例:硬约束是配置资产,不是 Prompt 文案
rule_id:LINE_OPENING_004version:3.2effective_from:2026-08-01severity:HIGHwhen:any:-work_point.unique == false-pid.current_release == false-isolation.evidence_complete == falsethen:gate:BLOCKEDrequire_manual_review:truesource:enterprise_line_opening_standard生产环境里,Rule Center 最怕两件事:规则互相打架,以及灰度失控。所以光有 YAML 还不够,至少要再补两道工序:
规则冲突检测:LINE_OPENING_004要发 v3.3,发布前规则中心必须自动对新旧规则集做两层检查——静态层面扫描条件重叠与结论矛盾(例如新规则放宽了隔离证据要求,而另一条隔离标准仍要求证据完整,两条规则在同一证据状态下会给出相反裁决);运行时层面用历史 Evidence Pack 批量回放比对。检出冲突就禁止发布,而不是指望运行时“谁先命中算谁的”。
规则沙箱与回放(Shadow Mode):新规则上线前,必须用过去 6 个月的真实 Evidence Pack 完整跑一遍,输出新旧版本的 BLOCK / WAIT_HUMAN / PASS 差异表。差异只有两种可接受结局:新规则拦下了旧规则漏掉的(更好),或差异逐条有人工签字说明理由。任何“新规则放行了旧规则拦下的案例”,都必须单独评审后才能灰度;灰度期间新旧规则并行打分,Shadow 数据达标才正式切换。
# Rule Center 发布卡点(示意)publish_check:conflict_scan:required# 与现有规则集做条件重叠/结论矛盾扫描shadow_replay:corpus:last_6mo_evidence_packs# 过去6个月真实证据包回放report:block_diff_summary# 新旧规则 BLOCK/WAIT_HUMAN 差异表approval:relaxed_cases:manual_sign_off# 新规则放行了旧规则拦下的案例 → 逐条签字这样 Rule Center 才不是“配置文件仓库”,而是一条带发布门禁的规则资产线。
6. 生产级架构:让 Agent 夹在业务系统和专业工具之间,而不是凌驾其上
这套架构最重要的不是“用了几个Agent”,而是边界清晰:现场OT系统只读接入;Java业务系统掌握身份、权限、工单、审批、签名和最终业务状态;Python Agent负责理解、检索、Skill编排、Evidence Pack和受控推理;规则和专业工具各自拥有独立版本。
架构原则
AI 是增强路径,不是安全流程的单点故障。Agent不可用、模型不可用、外部工具超时,都应该降级到原有人工流程;任何降级都不能绕过对象确认和作业许可。
7. 老 DCS / GDS 没 API 怎么办?先做“只读适配层”
企业现场最大的工程现实之一,是很多系统根本没有现代REST API。DCS、GDS、PLC、仪表和老SCADA可能通过OPC DA、OPC UA、Modbus,甚至定时导出文件提供数据。这里不需要强行把现场系统“云原生化”,更不应该让Agent直接连控制网络做写操作。
更稳妥的做法是在OT与IT之间增加边缘数据接入层:协议适配、只读缓存、时间戳、数据质量标记和健康检查在边缘完成;向上只暴露统一的只读接口。OPC UA本身就是面向工业系统互操作的信息交换标准,可以覆盖传感器、控制系统、MES到企业系统。
| 现场条件 | 接入方式 | Agent能看到什么 | 失败时怎么处理 |
|---|---|---|---|
| 支持 OPC UA | 边缘UA Client订阅 | 当前值、时间戳、质量码 | 连接异常→Evidence stale→WAIT_HUMAN |
| 仅 OPC DA | Windows网关/DA-UA桥接 | 经转换后的只读点位 | 桥接失败→不缓存“上次成功值”冒充当前值 |
| Modbus设备 | 协议网关轮询 | 离散/寄存器只读快照 | 超时→标记UNAVAILABLE,不自动重试到“碰巧成功” |
| 无在线接口 | 受控文件落盘/人工上传 | 带批次/时间戳的文件快照 | 超过新鲜度阈值→BLOCK或人工确认 |
为什么强调“只读”
这类 Agent 的目标是证据收敛和风险拦截,不是替代DCS/PLC控制回路。把写控制值的权限与Agent隔离,既降低安全风险,也更容易通过企业OT安全评审。
8. 夜间外部工具超时怎么办:失败不能被“重试成成功”
对生产系统来说,工具失败本身不可怕;最危险的是失败被静默吞掉,或者系统拿上一次缓存结果继续往下走。每个Skill都应该有明确的工具契约:status、source_ref、observed_at、freshness、confidence、error_code、retryable。
| 故障 | 系统动作 | 最终状态 |
|---|---|---|
| P&ID图谱服务超时 | 短超时 + 有界重试 + Circuit Breaker | TOOL_UNAVAILABLE → WAIT_HUMAN |
| 气检数据超过有效时间窗 | 不使用旧值替代 | EVIDENCE_STALE → BLOCKED |
| DCS/边缘网关离线 | 标记数据源不可用并告警 | DEGRADED_TO_HUMAN |
| 规则服务不可用 | 禁止绕过规则中心 | RULE_ENGINE_UNAVAILABLE → BLOCKED |
| LLM/RAG不可用 | 关闭智能解释,保留确定性检查 | 人工流程继续,AI增强能力降级 |
Spring生态可以用 Circuit Breaker、TimeLimiter、Retry 等机制做外部依赖保护。关键不是采用哪一个库,而是把“失败怎么进入业务状态”写清楚:不能把异常当PASS,也不能让无限重试把夜间作业卡成一个不可解释的半死状态。
9. Java + Python:不推倒重构,也不让两个世界互相污染
很多传统企业的核心业务系统已经在Spring Boot里跑得很稳:SSO、组织、RBAC、流程审批、电子签名、数据库事务、审计。这些东西没有必要因为上Agent就搬到Python。更可复制的路线是“Java稳业务,Python做智能旁路”。
| Java / Spring Boot 保留 | Python Agent 新增 |
|---|---|
| 身份认证、组织、RBAC | LLM意图理解、受限Planner |
| 工单/作业许可/审批/签名 | RAG、Entity Resolution辅助 |
| 业务主状态、数据库事务 | Skill Router、Evidence Pack |
| 规则发布入口/版本元数据 | 工具编排、Explain、Trace |
| 审计主表、归档、最终许可 | 不得越权修改核心业务状态 |
术语翻译|Transactional Outbox
人话:避免“Java里任务已经保存了,但发给Python Agent的消息恰好失败”这种半成功。业务数据和待发事件在一个本地事务里一起落库,再由CDC/MQ可靠发布。
类比:相当于银行转账的“回执单机制”——账记了,回执就一定发得出去;要么都成,要么都不成,不存在“钱扣了、对方却没收到”的半成功。
Python侧仍然要做幂等:同一个 event_id + task_id 重复投递十次,也只能产生一次有效业务动作。Java收到Agent回执后,也不能盲目覆盖状态,而要校验当前 state_version,避免旧事件把新状态“回滚”。
双栈一致性:允许消息重复,不允许业务动作重复
-- Java 本地事务(示意)BEGIN;INSERTINTOwork_task(task_id,state,state_version)VALUES('T-42','AGENT_PENDING',1);INSERTINTOoutbox_event(event_id,task_id,event_type,payload)VALUES('E-1001','T-42','REVIEW_REQUESTED','{...}');COMMIT;-- Python 消费端idempotency_key='E-1001:T-42'ifalready_processed(idempotency_key): ack_and_skip()还有一个容易被忽略的极端场景:人工已经在 Java 侧取消了工单,Python Agent 却恰好在此时返回了 READY_FOR_MANUAL_REVIEW。如果 Java 只校验 state_version,这条迟到回执仍可能把已取消的工单“复活”进复核队列。所以 Java 收到 Agent 回执时要做双重校验:先校验 state_version 防乱序回滚,再校验工单的业务终态——工单已是 CANCELLED 或 COMPLETED 时,回执不触发任何状态机流转,直接落审计日志归档:
-- Java 侧回执校验(示意)UPDATEwork_taskSETagent_receipt=:payload,receipt_status='DISCARDED_TERMINAL'WHEREtask_id=:task_idANDstate_version=:expected_version-- 防乱序回滚ANDstateNOTIN('CANCELLED','COMPLETED');-- 终态直接丢弃-- 0 rows affected → 写审计日志:工单已终态,Agent 回执不入状态机原则是:Agent 的回执永远只是“输入”,不是“指令”。业务状态机的钥匙,始终握在 Java 手里。
10. Agent 的真正产物不是“结论”,而是一张可展开的 Evidence Pack
现场人员不需要看一段AI总结,更需要看到一张“身份卡”:对象是谁、证据有哪些、哪里一致、哪里没确认、哪条规则命中、为什么必须等人工。
Evidence Pack:让“为什么不能继续”可以被人复核
{"task_id":"T-42","work_point_id":"WP-ARU-0417","identity":{"line_no":"6-H2S-2041-A","flange_id":"F-2041-17","pid_revision":"R07"},"evidence":[{"type":"P&ID","ref":"P&ID-ARU-021#R07","verified":true},{"type":"blind_list","ref":"BL-2026-091#row17","verified":true},{"type":"field_tag","ref":"photo://T-42/img3","verified":false,"reason":"tag_occluded"}],"rule_hits":["FIELD_TAG_NOT_VISIBLE"],"gate":"WAIT_HUMAN","reason":"现场身份无法唯一确认"}如果使用LangGraph这类状态编排框架,可以把人工复核点设计成可持久化 interrupt:流程在需要授权人员确认时暂停,保存状态,等待人工输入后从同一个thread恢复。但这里的关键仍然不是框架名字,而是人工中断必须进入业务状态、可重放、可审计。
11. 一个最小可运行 Demo:不发许可,只演示“证据不足就停”
下面的Demo故意不控制DCS、不计算安全设定值,也不自动签发作业许可。它只演示三件事:对象是否唯一、证据是否有效、规则是否允许继续。
FastAPI Demo:输出理由和证据引用,而不是一个黑盒 PASSED
fromdatetimeimportdatetime,timezonefromfastapiimportFastAPIfrompydanticimportBaseModel app=FastAPI()classEvidence(BaseModel):kind:strref:strverified:boolobserved_at:datetime|None=NoneclassRequest(BaseModel):task_id:strcandidate_ids:list[str]pid_current:boolisolation_ok:boolgas_test_fresh:boolevidence:list[Evidence]defgate(req:Request):reasons=[]iflen(set(req.candidate_ids))!=1:reasons.append("WORK_POINT_NOT_UNIQUE")ifnotreq.pid_current:reasons.append("STALE_PID")ifnotreq.isolation_ok:reasons.append("ISOLATION_EVIDENCE_MISSING")ifnotreq.gas_test_fresh:reasons.append("GAS_TEST_STALE")ifany(note.verifiedforeinreq.evidence):reasons.append("UNVERIFIED_EVIDENCE")ifreasons:return{"task_id":req.task_id,"gate":"BLOCKED_OR_WAIT_HUMAN","reasons":reasons,"evidence_refs":[e.refforeinreq.evidence]}return{"task_id":req.task_id,"gate":"READY_FOR_MANUAL_REVIEW","note":"仍需授权人员完成最终作业许可"}@app.post('/review')defreview(req:Request):returngate(req)Demo 的成功标准
不是“AI给了一个很像专家的判断”,而是它能够把对象歧义、过期图纸、隔离证据缺失、气检过期这些问题显式化,并稳定进入BLOCK或WAIT_HUMAN。
12. 上线后运维团队看什么:把 Trace 从“日志”升级成业务证据
生产级 Agent 最容易被忽略的一层是可观测性。普通接口只看HTTP 200/500不够;一个 task_id 应贯穿Java、消息、Agent、Skill、规则、Evidence和人工动作。这样事故复盘和系统升级时,才能回答“当时为什么放行/为什么拦截”。
| 指标 | 人话 | 建议用途 |
|---|---|---|
| Gate False Pass | 本应拦截却放过去的比例 | 高风险场景北极星 |
| Identity Ambiguity Recall | 真实存在对象歧义时能否发现 | 验证消歧链是否漏风险 |
| Evidence Coverage | 关键Claim有合格证据的比例 | 判断证据链是否闭合 |
| Stale Evidence Block Rate | 过期图纸/检测是否稳定拦截 | 防旧数据被当当前事实 |
| Tool Timeout Escalation | 工具失败是否正确转人工/阻断 | 检验降级逻辑 |
| Trace Completeness | 每次工具/规则/人工动作是否留痕 | 审计与复盘 |
| Replay Success | 历史任务能否按当时快照重放 | 升级回归测试 |
部署和升级也要像普通生产系统一样做:规则集、解析器、模型、Prompt、Skill都绑定版本;新版本先做历史Case Replay,再小流量灰度。只要Gate False Pass恶化,就应该回滚,而不是用“新模型平均分更高”解释过去。
13. ROI 不按“OCR省多少分钟”算,而按一套安全账本来算
CSB报告中,PEMEX Deer Park事故造成约1,230万美元与装置失用相关的财产损失。但本文不会把这笔损失直接拿来宣称“Agent可以避免”。真实企业算账时,更可信的做法是用自己的历史数据构建风险账本。
| 账本 | 怎么量 | 建议 |
|---|---|---|
| 直接收益 | 平均工单准备时长、返工次数、重复查图/核清单工时 | 财务可审计,作为确定性收益 |
| 风险收益 | 高风险拦截数 × 专家确认率 × 事件概率/损失估计 | 用半年真实拦截数据校准,不拍脑袋 |
| 合规收益 | Evidence Coverage、Trace Completeness、过期文件拦截 | 作为控制有效性证据 |
| 知识收益 | Rule/Case复用率、Replay成功率、专家映射回写 | 不建议强行货币化 |
这套账还必须诚实地计入隐性成本:WAIT_HUMAN 频率在上线初期会明显上升——系统比人严格,会把很多以前“差不多就行”的单子拦下来,授权人员的复核工作量随之增加。所以完整的财务模型里应该有一个负向因子:专家复核工时增量 = 新增 WAIT_HUMAN 单数 × 平均复核时长 × 专家工时成本,并给出它随规则调优逐步收敛的预估曲线。把这笔账主动摆到桌面上,比只讲收益更容易赢得管理层信任——财务模型诚实,项目才走得远。
如果管理层一定需要一个财务模型,可以用期望损失而不是“事故价值”叙事:
风险账本:半年后用真实Gate数据重新校准 P、L、R
年风险收益(示例公式) = N × P × L × R
N:一年高风险开管/拆盲板任务数
P:历史上经专家确认的对象/版本/前置条件重大问题概率
L:一次问题造成的平均返工、停工、物料、设备或项目损失
R:受控系统实际降低该问题流入后续作业的比例
给管理层的一句话
这套系统不是为了“每年少查几小时图纸”,而是为了建立一个永远在线、可审计、不会因为疲劳而跳过前置条件的复核层;它的价值最终要用真实拦截数据证明,而不是靠PPT承诺“绝对安全”。
14. 60 天 PoC:先证明“能不能稳定停下来”,再谈自动化率
| 阶段 | 核心工作 | Go / No-Go |
|---|---|---|
| W1-2|对象与数据基线 | 选一个装置、20-30个典型开管点;定义canonical work_point;梳理数据源 | 关键对象能否唯一标识;关键数据是否可追溯 |
| W3|图纸/清单解析 | P&ID、线表、盲板清单结构化;版本绑定;source_ref | 过期/错版是否能被识别而非静默通过 |
| W4|现场只读接入 | 边缘网关接OPC/Modbus/文件;数据新鲜度与健康状态 | 断链/过期是否进入明确降级状态 |
| W5|Entity + Evidence | 多层候选消歧、冲突工作台、Evidence Pack | 对象歧义是否稳定暴露 |
| W6|规则与双Gate | Rule Center、QualityGate、ManualReviewGate | Gate False Pass是否达到试点阈值 |
| W7|Java/Python协同 | Outbox、幂等、状态同步、失败恢复 | 网络闪断/重复消息后业务状态能否恢复 |
| W8|Shadow Mode | 历史回放、故障注入、现场演练;只给建议不改变作业流程 | 真实问题拦截质量是否足以进入下一阶段 |
还有一条经常被漏掉的验收项:人机交互摩擦测试(安排在 W5-W6)。工业 AI 落地最大的阻力往往不是技术,而是一线配合度——工艺员嫌扫码麻烦、承包商嫌证据上传繁琐。这期间要实测:工艺员/承包商完成一次完整 Evidence Pack 确认的平均耗时,是否超过原有纸质流程的 1.5 倍。一旦超过,先做交互减法(预填默认值、扫码即传、清单化点选),而不是靠行政命令硬推——再安全的系统,只要太慢,就一定会被现场绕过去;而被绕过的安全系统,比没有系统更危险。
PoC真正应该追求的不是“自动通过率80%”。在早期高风险场景里,系统经常说“我不确定,请人工确认”并不是失败;只要它能稳定发现真实歧义、避免False Pass,并且每一次停下来都有可解释证据,就是非常有价值的结果。
15. 最后把边界说清楚:这个 Agent 能做什么,不能做什么
| 可以做 | 不应该做 |
|---|---|
| 读取并归一工单、P&ID、盲板清单、现场标签、隔离/检测证据 | 直接控制DCS/PLC、改变阀位或下发生产设定值 |
| 发现对象歧义、版本过期、证据缺失、工具失败 | 用LLM置信度替代正向设备识别程序 |
| 调用白名单Skill、生成Evidence Pack、触发Gate | 绕过企业许可、电子签名和授权责任人 |
| 在不确定时暂停并请求人工确认 | 把“接口失败/规则不可用”解释成默认通过 |
| 保留task_id、Trace、Rule版本和人工动作供Replay | 承诺“绝对安全”或把公开事故营销化 |
这篇文章真正想留下的东西
开管作业只是一个场景。把表象拿掉以后,它验证的是一套更通用的工业AI方法:Raw Data → Data Governance → Canonical Object → Claim → Evidence → Rule/Skill/Knowledge → Domain Tool → Controlled Agent → QualityGate → ManualReviewGate → Trace/Replay → Risk Metrics。变的是业务对象,不变的是“可追溯、可复核、可拦截、风险可度量”。
结语
工业现场不缺一个更会说话的模型。真正稀缺的是:当证据不足、对象不唯一、工具失败、数据过期或责任边界不清时,系统仍然能够冷静地停下来,并且把“为什么停”完整交给人。
如果AI要进入高风险业务流程,这可能比“它像不像专家”更值得追求。
参考资料与写作边界
U.S. Chemical Safety and Hazard Investigation Board, Fatal Hydrogen Sulfide Release at PEMEX Deer Park Refinery, Investigation Report, February 2026. https://www.csb.gov/file.aspx?DocumentId=6315
CSB — PEMEX Deer Park Chemical Release case page. https://www.csb.gov/pemex-deer-park-chemical-release-/
OPC Foundation — OPC Unified Architecture Part 1: Overview and Concepts. https://reference.opcfoundation.org/specs/OPC-10000-1/4
Debezium — Outbox Event Router documentation. https://debezium.io/documentation/reference/stable/transformations/outbox-event-router.html
Spring Cloud Circuit Breaker — Resilience4J reference. https://docs.spring.io/spring-cloud-circuitbreaker/reference/spring-cloud-circuitbreaker-resilience4j.html
LangGraph — Interrupts / Human-in-the-loop documentation. https://docs.langchain.com/oss/python/langgraph/interrupts
DuckDB — Data Sources / CSV and Excel ingestion documentation. https://duckdb.org/docs/stable/data/data_sources
写作边界
事故数据与调查结论来自CSB公开资料;本文提出的架构、Rule字段、Gate指标、PoC周期、数据接入方式和ROI模型属于工程设计建议,需要企业结合自身工艺、制度、系统安全区划和历史数据验证。本文不提供生产控制设定值,也不替代任何法定/企业安全许可程序。