恒美微站 Logo 恒美微站
  • 首页
  • 关于我们
  • 建站服务
  • 主题模板
  • 案例展示
  • 资讯中心
  • 联系我们

PDMS-AVEVA-E3D二次开发教程(14):PMLNETCALLABLE 与 ML.NET——把 .NET 智能嵌进 PML

  • 首页
  • 资讯中心
  • /
  • PDMS-AVEVA-E3D二次开发教程(14):PMLNETCALLABLE 与 ML.NET——把 .NET 智能嵌进 PML

相关资讯

JMeter并发数设置全解析:线程组、TPS与阶梯加压实战 2026/10/4 16:39:29
基于MATLAB的心音分类器实战:从特征提取到模型训练全流程 2026/10/4 16:39:29
程序的机器级表示(二) 2026/10/4 16:39:29

最新资讯

openrig 实战:Claude Code 与 Codex 本地模型接入及代理转发避坑指南
大作业写作规划模板:从一篇《三国志》考辨作业看学术型读书报告的行文逻辑与规范
云计算大数据技术核心梳理:从虚拟化原理到Hadoop与CloudSim仿真
CH9444高速模拟开关:Type-C接口DP/HDMI信号切换实战
检索知识数据库 A评估实验结果报告
从plugin.json到TypeScript SDK:插件体系设计与开发实战指南

今日推荐

MR25H40CDF + PIC18F65K40:工业记录仪高可靠存储实战
基于STM32的数控恒压恒流电源设计:从硬件到PID调参全解析
LT9211 MIPI重定时器原理与双路扇出实战指南

本周热门

MR25H40CDF + PIC18F65K40:工业记录仪高可靠存储实战
基于STM32的数控恒压恒流电源设计:从硬件到PID调参全解析
LT9211 MIPI重定时器原理与双路扇出实战指南

本月精选

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证
2026 大模型集体涨价:用 Python 做企业 Token 成本测算与选型避坑(附配置)

PDMS-AVEVA-E3D二次开发教程(14):PMLNETCALLABLE 与 ML.NET——把 .NET 智能嵌进 PML

发布时间:2026/10/4 16:44:29
PDMS-AVEVA-E3D二次开发教程(14):PMLNETCALLABLE 与 ML.NET——把 .NET 智能嵌进 PML PDMS-AVEVA-E3D二次开发教程14PMLNETCALLABLE 与 ML.NET——把 .NET 智能嵌进 PML版本与事实声明PMLNETCALLABLE的引入版本、导入入口与能力描述取自官方发布说明3.1.5.0 / 2022-04其内部机制描述取自Microsoft .NET 官方客户案例一手源。本篇不臆造调用PMLNETCALLABLE对象的 PML 语法——官方图示所述为经 Machine Learning 按钮导入并在 PML 中可调用但公开文档未给出调用语句形态。因此代码把调用隔离在一个函数里并显式标注集成点其余部分特征提取、契约校验、审计、版本回退全部是可运行的真实实现。ML.NET 自身的 API 以 Microsoft 官方文档为准本篇只讲它在 E3D 语境下的输入契约与工程化周边不讲解训练算法。示例特征、阈值、权重、模型版本号均为示例性数据不代表任何标准规定。一句话结论PMLNETCALLABLE是官方在 3.1.5.0 引入的把训练好的 Microsoft ML.NET 模型导入 PML的对象导入入口在模型模块界面的Developer 标签、Machine Learning 按钮机制上由 C# 消费模型、解释其特征与标签、并经中间语言自动生成程序集供开发者调用因此工程上的重点不是训练而是特征契约、审计留痕与可回退的模型版本管理。〇、认知问题Q1PMLNETCALLABLE到底解决什么问题为什么它不是换个方式写 .NETQ2一个训练好的 ML.NET 模型是怎么变成 PML 里可以调用的东西的中间发生了什么Q3哪些工程判断适合交给模型哪些绝对不能Q4模型是黑盒那么在工程上怎么让它可审计、可回退Q5一张表上的特征从哪来从数据库取特征时最容易犯什么错一、机制解析1.1 官方原文能力、版本与入口官方发布说明3.1.5.02022 年 4 月对这一能力的原文要点该版本引入通过PMLNETCALLABLE对象把训练好的机器学习模型Microsoft ML.NET Models导入 AVEVA PML的能力。ML.NET 模型的导入可以在模型模块的用户界面上执行通过 Developer 标签中的 Machine Learning 按钮。三条信息版本锚点3.1.5.0、对象名PMLNETCALLABLE官方全大写、导入入口Developer 标签 / Machine Learning 按钮。版本锚点尤其重要如果你的产品版本低于 3.1.5.0这条能力不存在铁律 6。1.2 机制从模型文件到可调用对象Microsoft .NET 官方客户案例对内部机制给出了清晰的描述这是理解这件事的关键他们创建了一个PMLNETCALLABLE对象。该对象消费一个训练好的 ML.NET 模型解释模型以取得参数模型的特征与输出模型的标签。有了这些信息就自动创建一个程序集供开发者以任何他们希望的方式使用。底层实现是结合 C# 来消费与理解机器学习模型随后用中间语言Intermediate Language自动创建新的程序集。把它翻译成工程语言这是一条模型文件 → 代码 → 程序集 → 可调用对象的流水线┌──────────────────────┐ │ ① 已训练好的模型文件 │ 在 .NET / ML.NET 侧训练并保存 └──────────┬───────────┘ │ 导入Developer 标签 → Machine Learning 按钮 ┌──────────┴───────────┐ │ ② PMLNETCALLABLE 对象 │ 消费模型读出特征与标签的定义 └──────────┬───────────┘ │ 自动生成C# 消费 IL 生成 ┌──────────┴───────────┐ │ ③ 自动生成的程序集 │ 特征成为输入参数、标签成为输出 └──────────┬───────────┘ │ 在 PML 中调用 ┌──────────┴───────────┐ │ ④ PML 侧的业务代码 │ 只关心喂特征、取结果 └──────────────────────┘为什么这个机制重要——它回答了一个关键的工程问题特征是谁定义的答案是模型自己定义。第 ② 步解释模型以取得参数特征与输出标签意味着你训练时用的特征集合与顺序直接决定了 PML 侧的调用接口。这是本篇最重要的一条工程含义特征契约是模型与 PML 代码之间的接口。训练时改了特征PML 侧的调用就必须同步改两者不同步就会出现参数个数/含义不匹配这类最难查的错误。所以 1.5 节会把特征契约当作第一等公民来管理而不是把注意力放在算法上。1.3 这条通道的定位不是换个方式写 .NET第 13 篇给了三种互操作形态PMLNETCALLABLE是**形态一PML → .NET**的官方实现。它的定位要说清对比项普通 .NET 集成第 13 篇形态二/三PMLNETCALLABLE.NET 代码放哪独立程序集 / 独立进程自动生成的程序集PML 侧要做的事自己想办法调用按生成的接口调用谁来生成胶水代码你自己产品自动生成适合的 .NET 内容任意 .NET 逻辑模型推理这类输入特征→输出标签的映射关键区别在于契约的形状普通集成里你可以自由设计 .NET 侧的接口而PMLNETCALLABLE的接口由模型的特征与标签决定。它的强项是数据进、判断出弱项是过程控制——不要指望用它来做复杂的分支流程编排那是 PML 的活。1.4 适用与不适用一条红线工业场景里引入机器学习最容易出问题的不是技术而是把不该自动化的判定交给了模型。给出一张明确的判据表场景适合理由大量模型的分类与排序如这几百根管道里哪些最可能有问题先看这些✅ 适合输出是优先级人做最终判断模式识别从历史项目数据里学出什么样的情况往往伴随返工✅ 适合探索性、辅助性参数推荐推荐一个初始壁厚/等级再由人确认✅ 适合建议而非决定安全相关判定“这个间距是否满足安全要求”❌绝对不适合单独使用必须由确定性规则判合规放行“是否允许发布”❌ 不适合需要可解释、可追责的依据无标注数据下的预测❌ 不适合没有训练依据等于凭空生成结论红线写入铁律的子条款机器学习结果不得作为放行/拦截的唯一依据。安全、合规、发布类判定必须由第 11 篇的规则机制Rule Manager / 规则表承担模型只能用于排序、推荐、提示且必须在输出中声明这是模型建议需人工确认。为什么这条红线必须硬模型的输出是概率性的而工程交付需要的是可追责的确定性结论。把这两件事混起来会在事故调查时出现没人能说清为什么放它过去的局面。1.5 工程七步从数据到可回退的上线把这条通道落地成可复现的流程步做什么关键产出责任1定问题写清输入什么、输出什么、怎么判定模型有用问题说明含不用于放行声明业务负责人2定特征契约列清特征名、来源属性、类型、单位、顺序特征契约表本篇核心资产业务负责人 开发3采数据从历史项目导出特征 已知结果训练数据集含数据质量报告数据负责人4训练与评估在 .NET / ML.NET 侧训练、交叉验证、保存模型模型文件 评估报告含基线对比开发5导入经 Developer 标签的 Machine Learning 按钮导入为PMLNETCALLABLE对象可调用对象 生成程序集信息开发6接入 PML按特征契约调用、校验输入、记录审计PML 侧调用层本篇代码 14-2开发7上线与回退模型版本登记、A/B 对比、可一键回退模型台账本篇代码 14-3运维 开发注意第 2 步排在第 3 步之前。先定特征契约再采数据而不是有什么数据就用什么。理由特征契约是接口它一旦确定训练与调用两侧才能并行先采数据再定特征会得到一堆方便取到但业务意义不明的列。1.6 审计让黑盒变得可交代模型是黑盒但工程交付不是。让它可以被交代靠三件事审计要求具体做法模型可标识每次推理都记录模型版本号、导入日期输入可复现记录本次推理用到的全部特征值不是元素引用而是特征向量输出可解释记录模型输出的原始值概率/分数不要只记录经过阈值后的结论第三条最容易被忽略如果日志里只有判定为高风险你无法回答它到底有多确定。保留原始分值才能在后评估时看出模型是不是在临界值附近乱跳。另外用官方“Diagnostic Messages From Within PML Files”SOFTCG13.13.07一节把诊断信息写进运行轨迹与第 09 篇的批处理日志机制合流。1.7 特征从哪来从数据库取特征的头号错误特征的值来自数据库属性。从数据库取特征时最容易犯的错误有三类全部与前 13 篇讲过的东西有关错误根因对应篇章特征值为空就填 0未用Defined()判存在unset被当成 0第 04、06 篇单位不统一物理量属性未显式带单位、未确认绝压/表压第 06 篇序错位特征顺序与训练时不一致最致命且最难查本篇 1.2 节序错位为什么最致命假设训练时特征是[口径, 壁厚, 长度]调用时你喂成[壁厚, 口径, 长度]——类型都是数值、数量也对不会报任何错但输出会系统性偏差。这类错误只能靠契约表 调用前校验来防。二、完整代码与逐行剖析代码 14-1特征提取与契约校验PML可运行-- 文件myco_features.pmlf -- 用途从模型元素提取特征按【特征契约表】的顺序与类型组装特征数组 -- 设计动机 -- * PMLNETCALLABLE 的接口由模型的特征与标签定义官方机制描述 -- 因此特征顺序/类型是接口契约必须在代码里有唯一出处 -- * 特征缺失不填 00 是有意义的数值填充会污染推理结果 -- 特征契约顺序即接口。任何改动必须与训练侧同步本篇 1.2 节 -- 字段特征名 | 来源属性名 | 类型 | 单位 | 缺失时是否允许 define function !!MYCO_FeatureContract() is ARRAY !fc ARRAY() !fc[1] |bore| |\t| |BORE| |\t| |REAL| |\t| |mm| |\t| |false| !fc[2] |wallt| |\t| |WALLT| |\t| |REAL| |\t| |mm| |\t| |false| !fc[3] |len| |\t| |XLEN| |\t| |REAL| |\t| |mm| |\t| |true| return !fc endfunction -- 提取返回 |Success|分隔特征数组 或 |Failure: 原因 -- 注意PML 函数只能有一个返回值因此把特征数组拼成文本返回第 03 篇的结果契约范式 define function !!MYCO_ExtractFeatures( !el is DBREF ) is STRING !start !!ce if ( BADREF( !el ) ) then return |Failure: DBREF invalid| endif !!ce !el !fc !!MYCO_FeatureContract() !vals ARRAY() !i 1 !n 0 !missing || !maxIdx 0 do !i from 1 to 3 if ( not ( Defined( !fc[!i] ) ) ) then skip endif !maxIdx !i enddo !i 1 do !i from 1 to !maxIdx !f !fc[!i].Split( \t ) !fname !f[1] !attr !f[2] !allowMissing !f[5] !v !!ce.ATTRIBUTE( !attr ) if ( not ( Defined( !v ) ) ) then -- 缺失不允许缺失则整体失败允许缺失则记入 missing 清单但仍不填 0 if ( !allowMissing eq |false| ) then !!ce !start return |Failure: feature | !fname | missing (attr | !attr |)| endif !missing !missing !fname |;| !v |missing| endif !n !n 1 !vals[!n] !fname || !v.String() enddo !!ce !start !payload || !k 1 do !k from 1 to !n if ( !k gt 1 ) then !payload !payload |,| endif !payload !payload !vals[!k] enddo if ( !missing ne ) then return |Partial: missing| !missing |\n| !payload endif return |Success: | !payload endfunction逐行剖析!!MYCO_FeatureContract()是整篇最重要的一张表。五列分别是特征名、来源属性名、类型、单位、是否允许缺失。它同时服务三方训练侧要按这个顺序造列、调用侧要按这个顺序喂值、评审侧业务负责人要能看懂我们用了哪些量。把它做成函数而不是注释是因为它必须被代码读取、被版本管理、被 diff 查看。!fname || !v.String()这种名字值的成对格式特征值必须以带名字的形式流出不能只流出裸值数组。理由第 1.2 节说的序错位是无声错误带上名字后下游一旦发现名字对不上就能立刻报警。这是防序错位的第一道也是最便宜的一道防线。缺失不填 0!v |missing|这是本段的核心设计。填 0 的后果是灾难性的——例如壁厚 0会变成一个极端值的特征可能把结果推向任意方向而日志里看不出异常。显式标记missing让问题浮出水面第 04、06 篇反复讲的不要用值判空在此的具体后果。契约里区分允许缺失与不允许缺失len长度允许缺失bore/wallt不允许。这个区分是业务判断必须由业务负责人填而不是开发者随手定。两遍扫描数组先取最大下标、再处理延续第 04、12 篇处理稀疏数组的标准姿势。三种返回状态Success/Partial/Failure延续第 05~12 篇的三态契约。Partial表示特征取了但有个别可选特征缺失——这种情况可以继续推理但必须在审计里标注。代码 14-2调用隔离层与审计PML-- 文件myco_predict.pmlf -- 用途把调用 PMLNETCALLABLE 对象这件事隔离在一个函数里 -- 设计动机 -- * 官方公开文档未给出调用语句形态 → 本篇不臆造 -- * 隔离后未来替换模型/升级产品版本只需改一处第 12 篇 IFC 导出的同一思路 -- * 审计要求模型版本、输入特征、原始输出分值三者都要留痕本篇 1.6 节 -- ★ 集成点本函数是唯一与 PMLNETCALLABLE 对象打交道的地方 -- 实现依据官方发布说明 3.1.5.0 与模型模块 Developer 标签下的 Machine Learning 导入流程 -- 调用语句形态请以官方文档与你本机生成的可调用对象为准 define function !!MYCO_RawInvoke( !payload is STRING ) is STRING -- 占位实现返回一个未接线的明确信号避免静默给出假结果 return |Failure: PMLNETCALLABLE integration point not wired (see official docs)| endfunction -- 模型台账版本号与导入日期用于审计与回退由代码 14-3 的台账同步维护 define function !!MYCO_ModelInfo() is STRING !start !!ce -- 三个字段模型标识 | 版本 | 导入日期 !info |MYCO-PIPE-RISK| |\t| |v1.0.0| |\t| |2026-09-22| !!ce !start return !info endfunction -- 业务入口提取特征 → 调模型 → 记录审计 → 返回契约 define function !!MYCO_Predict( !el is DBREF, !auditEnabled is BOOLEAN ) is STRING !start !!ce !fr !!MYCO_ExtractFeatures( !el ) !mi !!MYCO_ModelInfo() -- 特征提取失败不调模型不要让模型去处理坏输入 if ( !fr.Left( 7 ) eq |Failure| ) then !!ce !start return |Failure: feature extraction failed: | !fr endif !payload !fr !raw !!MYCO_RawInvoke( !payload ) -- 原始输出必须原样保留只记结论会导致事后无法评估本篇 1.6 节 if ( !auditEnabled ) then !!ce !start return !raw endif !ce2 !!ce !refNo !ce2.ATTRIBUTE( REFNO ) write( |AUDIT| |\t| !mi |\t| |ref| !refNo.String() |\t| |features| !payload |\t| |raw| !raw ) !!ce !start return !raw endfunction逐行剖析!!MYCO_RawInvoke()是唯一带未接线标记的函数且默认返回|Failure: … integration point not wired …。这个设计是刻意的它保证在集成点尚未按官方文档接好之前脚本会明确失败而不是给出一个看起来像结果的假值。静默给出假结果是本系列在所有篇章里反复对抗的东西第 09 篇的 STALE、第 11 篇的假空碰撞清单、第 11 篇的假通过规则——同一种病。把它单独命名并加注释注释里写清实现依据官方发布说明 3.1.5.0 与 Developer 标签的导入流程以及调用语句形态以官方文档与生成对象为准。隔离的工程价值在于产品升级或换模型时只有这一个函数需要改与第 12 篇把 IFC 导出封成一个函数、第 08 篇把命令规格做成一张表是同一套变动点收敛的手法。!!MYCO_ModelInfo()返回三字段台账行模型标识、版本、导入日期。这三样是审计能不能做成的分水岭——没有版本号你无法回答这个结论是哪版模型给的。特征提取失败时不调模型这是一条重要的边界纪律。不要把坏输入交给模型去处理——模型只能给输出它不会告诉你输入不合法因为它的接口没有这个语义。审计行包含raw原始输出原样记录1.6 节第 3 条。注意raw可能是|Failure: …|——失败也要记因为模型调用失败的频次本身是有用信号。write( AUDIT ... )用制表符分隔与第 09~12 篇的日志格式一致可以直接被第 19 篇的数据管道消费同一套格式在 20 篇里反复复用这样下游解析器只需写一次。!ce2 !!ce再取属性把取当前元素显式化比在同一表达式里连续取值更易读这类微小可读性选择在审计类代码里很值得做因为审计代码是要被人审的。代码 14-3模型台账与一键回退PowerShell可运行# -*- coding: utf-8 -*-# model_ledger.ps1 —— 模型版本台账与回退 设计动机 * 模型是黑盒回退能力是允许它上线的先决条件 * 台账记录上线了什么版本、什么时候、谁批的、评估结果如何 用法 # 登记新模型 .\model_ledger.ps1 -Action register -Model MYCO-PIPE-RISK -Version v1.1.0 -ModelFile .\models\pipe-risk-v1.1.0.zip -Metric AUC0.86 -ApprovedBy process-lead # 回退到指定版本 .\model_ledger.ps1 -Action rollback -Model MYCO-PIPE-RISK -Version v1.0.0 # 查看现状 .\model_ledger.ps1 -Action status -Model MYCO-PIPE-RISK #param([Parameter(Mandatory$true)][ValidateSet(register,rollback,status)][string]$Action,[Parameter(Mandatory$true)][string]$Model,[string]$Version,[string]$ModelFile,[string]$Metric,[string]$ApprovedBy,[string]$Ledger.\model_ledger.csv,[string]$Current.\model_current.json)$ErrorActionPreferenceSilentlyContinue$rows ()if(Test-Path$Ledger){$rows (Import-Csv-LiteralPath$Ledger-Encoding UTF8)}switch($Action){register{if(-not$Version){Write-Warningregister 需要 -Version;exit2}if($ModelFile-and-not(Test-Path-LiteralPath$ModelFile)){Write-Warning模型文件不存在$ModelFile;exit2}if($rows|Where-Object{$_.model-eq$Model-and$_.version-eq$Version}){Write-Warning该模型版本已登记$Model$Version拒绝重复登记;exit2}$shaif($ModelFile){$sha(Get-FileHash-LiteralPath$ModelFile-Algorithm SHA256).Hash}$rows[pscustomobject]{model $Modelversion $Versionmetric $Metricsha256 $shaapproved_by $ApprovedByregistered (Get-Date).ToString(yyyy-MM-dd HH:mm:ss)status registered}$rows|Export-Csv-LiteralPath$Ledger-NoTypeInformation-Encoding UTF8 {model $Model;active_version $Version;switched (Get-Date).ToString(yyyy-MM-dd HH:mm:ss)}|ConvertTo-Json|Set-Content-LiteralPath$Current-Encoding UTF8Write-Host(已登记并切到当前版本{0} {1}sha256{2}-f$Model,$Version,$sha.Substring(0,[Math]::Min(12,$sha.Length)))exit0}rollback{if(-not$Version){Write-Warningrollback 需要 -Version;exit2}$target$rows|Where-Object{$_.model-eq$Model-and$_.version-eq$Version}if(-not$target){Write-Warning台账中不存在该版本$Model$Version;exit2}{model $Model;active_version $Version;switched (Get-Date).ToString(yyyy-MM-dd HH:mm:ss)}|ConvertTo-Json|Set-Content-LiteralPath$Current-Encoding UTF8Write-Host(已回退当前版本至{0} {1}-f$Model,$Version)Write-Host注意PML 侧的可调用对象需按官方 Machine Learning 导入流程重新导入对应模型文件。exit0}status{$mine$rows|Where-Object{$_.model-eq$Model}if(-not$mine){Write-Host台账中无该模型$Model;exit0}$actif(Test-Path$Current){$act(Get-Content-LiteralPath$Current-Raw|ConvertFrom-Json).active_version}Write-Host(模型 {0}登记 {1} 个版本当前生效 {2}-f$Model,$mine.Count,$act)$mine|Sort-Objectregistered-Descending|Select-Objectversion,metric,approved_by,registered|Format-Table-AutoSizeexit0}}逐行剖析register时计算并记录 SHA256这是本段最有价值的一处。模型文件与程序集一样需要指纹——只有版本号不足以证明线上跑的确实是那一份文件。第 13 篇的程序集清点记录的是版本与公钥标记这里记录哈希是同一思路的延续。拒绝重复登记同一版本exit 2保证台账的版本号唯一。如果允许覆盖回退到 v1.0.0就变成了不确定操作——你退到的可能是被覆盖过的那一份。这是回退要可信的前提。model_current.json单独存当前生效版本而不是在台账里改 status 列台账是只追加的历史append-only当前状态是独立的指针。这个结构让回退变成一次指针切换而不是改写历史。rollback明确打印提醒“PML 侧的可调用对象需按官方 Machine Learning 导入流程重新导入对应模型文件。”这句话把文件回退与产品内对象回退这两件事分开说清——这是最容易被漏掉的一步台账回退了产品里还是旧模型。status输出用Format-Table给人看。这与第 11、12 篇脚本明细进 CSV、摘要进屏幕的分工一致。全程$ErrorActionPreference SilentlyContinue与明确退出码与第 09~12 篇的运维脚本风格统一。特征契约表模板CSV交给业务负责人签字order,feature_name,source_attr,data_type,unit,allow_missing,note 1,bore,BORE,REAL,mm,false,公称口径不允许缺失 2,wallt,WALLT,REAL,mm,false,壁厚不允许缺失 3,len,XLEN,REAL,mm,true,管段长度缺失时记入 missing 并在审计中标注逐行剖析order列显式编号因为它就是接口的参数顺序1.2 节。有了它评审时能直接对照训练侧的列顺序。unit列必填铁律 2 在特征层的落地。特征的单位不统一是模型性能莫名其妙下降的常见原因数据本身没问题只是量纲变了。note列写业务解释这份表的读者是业务负责人他们签字的是这些量能不能代表这个问题而不是字段名对不对。三、常见报错与排查报错 3-1产品版本低于 3.1.5.0找不到 Developer 标签下的 Machine Learning 按钮。现象入口不存在。根因PMLNETCALLABLE是3.1.5.02022-04引入的能力官方发布说明低版本没有铁律 6。解法确认产品版本低版本场景下改用第 13 篇的其他互操作形态外部进程 文件契约或普通 .NET 集成不要试图用 PML 手工复现一个模型推理。报错 3-2模型调用成功但输出结果看起来不对。现象结果系统性偏差。根因按概率排序①特征顺序错位训练侧[口径,壁厚,长度]调用侧喂成别的顺序——类型与数量都对不会报错②单位不一致同一特征在训练数据里是某种单位、调用时取到另一种③缺失被填成 0导致极端特征值。解法核对特征契约表的order与训练侧的列顺序逐项对照不要凭记忆核对unit列检查特征提取是否用Defined()判存在而非填 0本篇代码 14-1 的做法。报错 3-3模型输出是黑盒结论无法向审查方解释。现象审计不通过。根因只记录了结论没有记录模型版本、输入特征与原始分值1.6 节三条。解法按代码 14-2 补齐审计三要素特别注意保留原始输出分值——它是事后评估模型是不是在临界值附近乱跳的唯一依据必要时用官方 “Diagnostic Messages From Within PML Files” 把诊断信息写入运行轨迹。报错 3-4新模型上线后表现变差想回退但不知道退到哪一版。现象回退困难。根因没有模型台账或台账没有记录模型文件哈希与审批人。解法按代码 14-3 建立只追加台账含 SHA256、评估指标、审批人回退时必须同时处理两件事——台账指针切换 按官方导入流程把对应模型文件重新导入为可调用对象脚本已打印这条提醒。报错 3-5把模型输出当成了合规放行依据事后无法追责。现象责任真空。根因违反 1.4 节红线——把概率性输出当成了确定性结论。解法把放行/拦截判定全部交回第 11 篇的规则机制模型只用于排序与推荐在模型输出的展示与报表中必须显式标注模型建议需人工确认该声明写入问题说明文档并要求业务负责人签字。四、动手练习练习 1特征契约为管道风险排序这个假想问题写一份特征契约表3~5 个特征。判定标准order列连续且无重复每个特征都有明确的source_attr、data_type、unitallow_missing列至少有 1 个 falsenote列写清业务解释表格能拿给非开发人员看懂并签字。练习 2特征提取用代码 14-1 对一个真实元素提取特征其中故意把WALLT属性名写错。判定标准返回以|Failure: feature wallt missing开头因为该特征allow_missingfalse修正属性名后再跑返回|Success:且 payload 中每个特征都是名字值形式不是裸值。练习 3隔离层验证调用代码 14-2 的!!MYCO_Predict。判定标准在集成点未接线时返回必须是以|Failure:开头的明确信息绝不能返回任何看起来像预测结果的字符串把auditEnabled设为 true 时命令行出现以AUDIT开头的制表符分隔行且该行同时含模型版本、ref、features、raw四个信息。练习 4台账与回退用代码 14-3 依次登记 v1.0.0 与 v1.1.0然后回退到 v1.0.0。判定标准台账含两行且version不重复重复登记同一版本被拒绝退出码 2model_current.json的active_version在回退后为 v1.0.0status输出显示登记 2 个版本当前生效 v1.0.0。思考题无标准答案为什么工业场景里模型用于排序、规则用于放行是更稳的分工而不是让模型直接给出通过/不通过验证要点① 事故调查时两种分工的可追责性差异② 模型在临界值附近的不稳定性意味着什么③ 如果要给模型输出加一道人工确认确认动作应该记录哪些信息才算完整。五、小结与下一篇预告PMLNETCALLABLE是官方 3.1.5.0 引入的对象用于把训练好的 Microsoft ML.NET 模型导入 PML导入入口在模型模块 Developer 标签的 Machine Learning 按钮机制上它消费模型、读出特征与标签定义并自动生成程序集供调用。这条机制最重要的工程含义是特征契约就是接口——顺序、类型、单位在训练侧与调用侧必须严格一致否则会出现不报错但结果偏差的无声故障。机器学习在工业场景的定位是排序、推荐与提示绝不允许作为放行/拦截的唯一依据。落地七步里定问题与定特征契约排在最前审计三要素模型版本、输入特征、原始分值缺一不可上线的前置条件是可一键回退。下一篇《数据对接一与管应力分析软件的接口——CAESAR II》进入跨专业数据对接。我们会完整拆解官方 Pipe Stress Interface 的工作方式——Stress Group 是什么、Write Data to File之后产出的input/output/logs三个目录各装什么、*.cii中性文件与预定义 schema 的 XML 谁给谁用、为什么生成后要立刻Save Work以及最关键的一点_log.html里的假设与默认值例如缺失的重量或壁厚该怎么用。本篇认知问题回显FAQQ1PMLNETCALLABLE 解决什么问题A它是官方在 3.1.5.0 引入的对象用于把训练好的 Microsoft ML.NET 模型导入 AVEVA PML导入可在模型模块界面通过 Developer 标签的 Machine Learning 按钮执行。它解决的是让 PML 侧能用上 .NET 世界的模型推理能力而不是换个方式写 .NET它的接口形状由模型的特征与标签决定强项是数据进、判断出不适合做流程编排。Q2训练好的模型是怎么变成 PML 可调用的东西的A按 Microsoft .NET 官方客户案例的描述PMLNETCALLABLE对象消费训练好的 ML.NET 模型解释模型以取得参数特征与输出标签据此自动创建一个程序集供开发者使用底层是结合 C# 消费与理解模型随后用中间语言IL自动生成新的程序集。因此链路是模型文件经导入变成可调用对象再在 PML 中调用。Q3哪些判断适合交给模型哪些绝对不行A适合的有三类大量对象的分类与排序输出优先级由人做最终判断、模式识别从历史数据学出伴随返工的情况、参数推荐给初始建议由人确认。绝对不适合单独使用的是安全相关判定、合规放行与发布决策以及无标注数据下的预测。红线是机器学习结果不得作为放行或拦截的唯一依据必须由确定性规则机制承担模型输出须标注模型建议需人工确认。Q4模型是黑盒怎么让它可审计、可回退A审计三要素是每次推理都记录模型版本号与导入日期、本次输入的全部特征值、以及模型输出的原始分值不要只记经过阈值后的结论。可回退靠只追加的模型台账登记版本、评估指标、模型文件 SHA256 与审批人并把当前生效版本存为独立指针回退时必须同时做两件事——切换台账指针并按官方导入流程把对应模型文件重新导入为可调用对象。Q5从数据库取特征最容易犯什么错A三类特征缺失时填 0应用 Defined() 判存在缺失应显式标记而不是填 0因为 0 是有意义的数值会污染推理单位不统一物理量属性必须显式带单位并确认绝压表压基准特征顺序错位训练侧与调用侧顺序不一致时类型与数量都正确、不会报任何错但结果系统性偏差只能靠特征契约表与调用前校验来防。

关于恒美微站

恒美微站专注于为个体商户、工作室提供极简自助建站服务,让每个人都能轻松拥有专业网站。

快速链接

  • 关于我们
  • 建站服务
  • 主题模板
  • 案例展示
  • 资讯中心

服务项目

  • 可视化建站
  • 拖拽编辑
  • 主题定制
  • SEO 优化
  • 网站托管

联系方式

  • 📍 地址:北京市朝阳区建国路 88 号
  • 📞 电话:400-888-8888
  • ✉️ 邮箱:info@hmyw.cn
  • 🕐 时间:周一至周日 9:00-18:00

© 2024 恒美微站 hmyw.cn 版权所有 | 京 ICP 备 12345678 号