第9章 制作可离线运行的现场感知终端

工作阶段: 进入现场——把一个可追溯训练、可验证导出的环境小模型放进可重复运行的本地终端。
公共核心项目: 完成“离线现场感知终端”:用虚拟或预录环境窗口跑通设备接口、本地组合偏离模型、独立规则、提示状态和故障降级;有条件时再只替换适配层接入真实设备。
核心技术: 虚拟设备接口、传感器适配、模型导出与端侧推理、资源预算、超时、故障检测和安全降级。
输入输出链: 物理现象或回放数据 → 设备适配层 → 预处理 → 本地模型 → 概率或异常分数 → 独立规则 → 提示与日志 → 人工确认。
应用中的AI: 使用本章独立训练的温湿度与噪声组合偏离小模型;专业迁移只复用接口、导出验证和模型外规则方法,不假称已经直接复用前章模型。
协助开发的AI: 根据学生提供的任务合同、官方设备资料和真实日志,生成并解释适配代码、模型转换代码和故障测试。
人的责任: 核实型号、接口、电压、单位、采样频率和使用边界;审查代码差异;决定是否部署以及何时停止。
主要交付物: 可运行工程、任务合同、H0虚拟/预录两路实现、真实设备适配接口、本地模型、冻结测试、参考报告和系统卡。
明确边界: 终端只观察、记录和提示,不直接控制市电、燃气、压力、加热、高速运动、门锁、交通工具或医疗设备。
跨章关系: 沿用第1章任务合同、第2章数据约定以及第7、8章的模型训练与独立测试方法;本章环境模型另行训练,并未直接加载前章视觉或声音制品;输出可在第10章接入受控工作流。

学习目标

学完本章,你将能够:

  1. 画出从物理现象到人工确认的完整信号链,并指出模型、规则和设备各自承担什么;
  2. 区分H0预录或虚拟接口、H1电脑或USB设备、H2边缘设备三种实现路径;
  3. 根据经过核实的官方资料,与AI协同生成并限定修改设备适配代码;
  4. 比较模型在云端、本地电脑和端侧设备上的精度、延迟、内存、断网能力与维护负担;
  5. 用断网、设备断开、输入超范围和资源不足样例验证安全降级。

项目导入

前面章节已经学习模型训练和独立测试的方法,但“有一个模型文件”还不是现场应用。本章没有把不相干的视觉或声音模型硬接到环境任务,而是独立生成温度、湿度和噪声教学数据,训练一个环境组合小模型,再把它导出到本地终端。现场设备仍可能没有接好,输入单位可能变化,模型也可能因资源不足或陌生环境失效,因此终端必须把设备、模型、规则、日志和人的行动连成一条可以检查的链。

本章公共项目是一个低风险的异常观察终端。它每隔固定时间读取一段声音、振动或环境数据,调用本地模型输出概率或异常分数;确定性规则检查输入是否完整、分数是否达到提示阈值、模型是否超时;满足条件时只在屏幕上提示并写入日志,由巡检人员确认。它不自动停机、不切断电源,也不代替法定报警和专业检测。

硬件不是进入本章的门槛。H0使用预录数据或虚拟接口,在普通电脑上完成完整链路;H1使用电脑自带摄像头、麦克风或小组共享的USB传感器;H2把同一接口迁移到边缘设备。三条路径共享输入输出契约、测试集和安全规则,学生即使没有设备也能完成核心学习。

本章成果

AI协同开发路线

学生先向协助开发的AI提交任务合同、模型输入形状、标签、官方设备资料、运行系统和“不允许控制危险设备”等边界。AI需要追问接口类型、采样频率、单位、窗口长度、日志位置和超时条件,再提出“设备层—预处理层—模型层—规则层—输出层”的文件方案。AI生成H0完整首版,学生使用回放数据运行,逐层查看输入形状、模型分数和日志。确认H0稳定后,先要求AI只修改设备适配文件接入H1;迁移H2若需更换端侧模型格式或推理运行库,再把“模型运行适配”作为第二个独立变更。两次均保持输入输出契约、规则和测试不变,审查差异后用同一组正常、边界、陌生和故障样例回归。

第一节 设计传感器、模型、规则和输出的完整信号链

一、从物理现象画到人的行动

终端的起点不是模型,而是现场需要观察的物理现象。设备异响、振动幅度、环境温湿度或画面状态先被传感器转换为数字数据,再经过裁剪、缩放、切窗或归一化,才能满足模型输入要求。模型输出的是概率、类别或异常分数,不是“设备一定故障”的事实。规则检查数据有效性和阈值,界面显示证据,最后由责任人确认。

信号链至少标出九项:被观察现象、传感器、原始单位、采样频率、预处理、模型输入形状、模型输出、规则状态和人工动作。例如声音模型要求16 kHz、1秒窗口,设备却以48 kHz持续录音,适配层就必须重采样并切成模型需要的长度。若单位、频率或数组顺序错误,即使程序没有报错,模型结果也可能失去意义。

模型和规则承担不同责任。模型处理环境变化较大、难以用单一阈值描述的模式;规则负责“传感器读数是否存在”“分数是否为有效数值”“是否连续达到阈值”“模型是否超时”等确定性条件。安全规则独立保存,不能由语言模型在运行时改写。

二、为三种硬件路径建立同一接口

H0、H1和H2的采集差别应集中在设备适配层。上层程序统一调用read_window()取得带时间戳、单位和质量标记的数据。H0从CSV、WAV、JPEG或虚拟数据读取;H1从电脑自带设备或USB传感器读取;H2从边缘设备接口读取。若H2不能直接加载原模型格式,可以另换端侧模型运行适配器,但输入输出契约、预处理定义、规则、测试和日志语义不能随之改变。

路径 设备条件 核心任务 必须说明的限制
H0 普通电脑、预录数据或虚拟接口 跑通信号链、模型、规则和故障测试 不能证明真实采样稳定性
H1 摄像头、麦克风或USB传感器 比较位置、设备与采样差异 需要授权、端口和驱动检查
H2 边缘设备加传感器 断网推理、资源预算和持续运行 设备型号、功耗和维护具有现场差异

控制变量实验先固定模型、测试窗口和提示阈值,只把H0回放输入换成H1采集输入,比较形状、单位、分数和延迟。若同时更换模型、阈值和设备,就无法判断变化来自哪里。

三、把本章项目真正跑通

本章不要求学生先购买传感器,也不把“讲几个端侧概念”当作项目完成。配套工程位于resources/ch09/project/,默认完成的是一个可离线运行的“环境异常观察终端”:它接收温度、湿度和噪声三个数值,先检查字段、单位约定、有效范围和独立安全边界,再加载本地模型计算组合偏离分数,最后输出RECORD、REVIEW或明确的停止状态。输出只供巡检人员查看与复核,不连接任何控制设备。

这是一个从数据到交付的完整项目,而不是单独的模型演示。generate_training_data.py用固定算法和种子生成冻结CSV;train_export_model.py完成Keras训练、float JSON与INT8 JSON导出和一致性检查;models/同时保存.keras原模型和两种JSON;benchmark_runtime.py在独立冷启动进程中测量运行资源;config.json保存有效范围、安全范围、0.60模型门槛和推理时限;src/实现设备、标准库模型运行器、规则主链和命令行入口;data/还保存回放窗口与封存测试;tests/、evaluate.py和acceptance.py分别负责单元检查、逐例评估和整包验收;模型卡、系统卡与三类报告记录边界和真实结果。学生因此可以回答“数据怎样生成、模型怎样训练、参数怎样导出、失败时怎样停止、别人怎样复现”,而不只是看到一个界面。

设备层的核心不是某个品牌驱动,而是同一份输入契约。虚拟设备、JSONL预录设备和真实设备适配器都只公开read_window(),并交付SensorWindow:

@dataclass(frozen=True)
class SensorWindow:
    window_id: str
    timestamp: str
    temperature_c: float
    humidity_pct: float
    noise_db: float
    quality: str = "ok"

class Device(Protocol):
    def read_window(self) -> SensorWindow: ...

真实设备路径并没有虚构接线和驱动代码,而是用RealDeviceAdapter(reader)接收一个已经依据官方资料审核的只读函数。读取函数返回字段不全、类型错误或设备异常时,适配器统一抛出DeviceLostError。这样做把“设备怎么读”和“模型怎样处理”分开:接入新设备时只改适配层,模型、规则、日志状态和封存测试保持不变。默认H0路径安全可运行;H1、H2只有在教学实施单位具备具体设备、教师与现场责任人核对电气条件后才开展。

本地模型也不是人工在JSON里填写几项权重。生成脚本固定产生3000条教学样例:2400条训练、600条验证,正常和复核各1500条。标签规则公开为三个标准化绝对偏离的加权和达到2.30,但它只构造一个学生能够核查的学习任务,不代表真实工作现场分布。Keras模型直接接收三项原始读数,先按固定中心和尺度归一化;6个固定ReLU单元把每个特征拆成正、负偏离,最后一个Sigmoid层的权重和偏置由训练数据更新:

x_i = (value_i - center_i) / scale_i
h = [ReLU(x_1), ReLU(x_2), ReLU(x_3), ReLU(-x_1), ReLU(-x_2), ReLU(-x_3)]
score = sigmoid(bias + Σ(weight_j × h_j))

固定隐藏表示使偏离机制可检查,训练输出层则让学生看到真实的优化、验证和导出过程。600条合成验证数据在0.60门槛上的准确率为0.976667,仍只说明模型拟合这条教学规则。score不是设备故障概率,更不能直接推导停机决定。完整训练CSV、Keras制品、脚本、版本、哈希、误差和限制都保存在工程中,不能再用“模型导出”替代来源证据。

为什么不只写三个阈值?配套工程保留了raw_threshold_baseline()作为人工可解释基线。当温度、湿度和噪声分别都没有越过单项阈值时,基线会给出RECORD;但三项同时发生中等程度偏离时,组合模型可能给出REVIEW。这说明小模型可以表达多个弱信号的合成,并不说明它必然优于规则。若真实项目的固定测试表明规则更稳定、维护更简单,就应采用规则基线,不必为了“看起来像AI”而部署模型。

主链严格规定检查顺序:先读取新窗口;再检查有效范围;然后检查独立安全边界;质量未知时转人工;模型存在且结构有效时才计算分数;推理超过预算则停止;最后才用模型门槛决定记录或复核。这个顺序很重要。假如温度已经越过独立安全边界,程序不需要等待模型“同意”;假如设备没有新窗口,程序不能沿用上一次正常值;假如模型文件缺失,程序不能悄悄退回一个看似合理的固定分数。

result = terminal.run_once(device, network_available=False)
# 每条结果都显式带出:
# status、reason、score、baseline_status、inference_ms、
# model_bytes、network_required、human_confirmation_required

学生第一次运行时,在项目目录执行:

python acceptance.py
python -m src.main
python -m src.main --source replay --count 3

运行src.main可以看最小成功样例,--source replay逐条读取预录窗口;acceptance.py检查28项必需文件、全部Python语法、Notebook结构、冻结数据逐字节复现、三种模型制品哈希、12条导出一致性、8个单元测试和10条系统样例。默认H0只使用Python标准库,不访问网络,不要求TensorFlow、云账号或真实硬件。模型环境可用时运行python acceptance.py --require-model,程序会在output/model_rebuild/隔离重训、重导出、重新基准并加载Keras复核,不能用已有JSON冒充本次重建。Notebook用于逐格观察证据、输入、模型和状态,完整程序仍以脚本与src/为准。

四、按四类样例理解系统,而不是只看成功画面

正常类检查常见读数和断网输入,两者都应RECORD;边界类放在模型门槛附近,用来观察一个阈值变化怎样影响复核量;陌生类把quality设为未知,要求系统进入REVIEW而不是猜测;故障类覆盖设备无新数据、模型缺失、强制超时和输入越界,分别进入STOP_DEVICE_LOST、STOP_MODEL_MISSING、STOP_TIMEOUT和STOP_BAD_INPUT。此外还有独立安全样例,必须在模型之前进入STOP_SAFETY。

参考环境的实际报告显示10条固定系统样例10条通过,状态分布为3条RECORD、2条REVIEW以及5种停止状态各1条。正常样例的INT8 JSON模型分数约为0.000002;组合异常样例中,简单阈值基线仍给出RECORD,模型分数0.894227达到0.60复核门,转为REVIEW;边界样例分数0.554551,仍为RECORD。报告同时保存2416字节INT8 JSON、模型与模型构建报告的SHA-256以及本机观测延迟。延迟会随电脑和运行负荷变化,所以学生要重新运行并记录,不能照抄参考数值。

这四类测试不是为了凑数量。正常类说明最小闭环可用;边界类暴露决策对门槛的敏感性;陌生类验证系统是否知道“自己不知道”;故障类验证失败是否可见、可停止、可恢复。学生完成控制变量实验时只改变model_threshold,先预测哪些非封存练习窗口会改变状态,再运行比较复核量。与AI协同修改时,只委托它改一个设备适配器或新增一个故障测试,要求列出差异并重跑acceptance.py;不得把降低安全边界或删除失败样例当作“修复”。

第二节 根据官方资料协同生成设备适配代码

一、先建立设备事实包

让AI连接设备前,学生需要建立“设备事实包”,包括准确型号、官方资料版本、接口类型、供电要求、操作系统、驱动、采样格式、单位、最小示例和已经观察到的日志。网页讨论、相似型号代码和模型记忆只能帮助提出检索方向,不能替代官方资料和真机读数。

设备事实包还要写明禁止事项。例如不改变安全联锁、不写入固件、不接触市电、不自动执行控制动作、不把密钥或私人录音写进仓库。AI若建议使用未核实的端口、函数或接线,学生应要求它指出依据;无法定位依据就保持虚拟接口并停止真机连接。

二、限定AI只修改适配层

学生给AI的修改委托可以写为:“保持Sample数据契约、模型、阈值、日志字段和测试不变;只把ReplayDevice.read_window()替换为设备X的读取实现。所有接口必须依据随附官方资料;资料未说明的地方返回quality='unknown',不得猜测。”

修改后先看文件差异,再上设备。检查点包括:是否新建了不必要的网络连接;是否改变了单位、采样频率或数组顺序;是否捕获异常却假装成功;是否把设备密钥写入代码;是否绕过质量标记。然后在不加载模型的情况下打印十次原始读数,与设备自带工具或参考输入比较,确认适配层的事实正确。

三、用日志而不是猜测调试

“设备没有反应”不足以让AI定位问题。有效反馈应包含运行命令、操作系统、准确设备型号、端口列表、完整异常类型、关键日志和已经排除的条件。学生一次只解决一个层次:先确认设备被发现,再确认能读数据,再核对单位与频率,最后接模型。这样可以防止AI一次改动驱动、模型和阈值,造成新的不确定性。

故障基线采用虚拟设备。若真实适配出现问题,切回H0仍应通过全部模型与规则测试;这能判断故障位于设备层,而不是整个项目。H0不是“低配演示”,而是定位问题和保证可教学性的正式路径。

第三节 导出模型并比较本地运行的资源与性能

一、导出前先冻结输入输出契约

模型导出前记录输入形状、数据类型、归一化方式、标签顺序和输出含义。配套工程在environment_anomaly_model.keras之外同时导出float JSON和逐张量对称INT8 JSON;标准库运行器依据JSON中的中心、尺度、层形状、激活、整数参数和量化scale执行相同计算。转换后使用12条未参加训练的固定样例比较三种制品,不能只看文件是否生成。参考结果中float JSON相对Keras最大概率误差为8.4e-08,INT8最大误差为0.012003321,0.60门槛上的决策均为12/12一致。

比较表至少包含模型版本、文件大小、启动时间、单次推理延迟、峰值内存、固定测试指标、断网能力和所需运行环境。参考工程只实测同一台本地电脑上的Keras和标准库JSON,不虚构云端或边缘板性能;云端与H2数据必须在真正运行后另行补充。部署位置是工作选择,不是越靠近设备越先进。

二、先比较不压缩版本,再改变一个变量

公共核心把同一Keras稠密层先导出为float JSON,再把每个kernel和bias分别做对称INT8量化。结果纠正了一个常见预设:Keras制品为24,401字节,float JSON为2,265字节,INT8 JSON为2,416字节。INT8比float JSON多151字节,即增加6.667%,因为这个网络参数极少,每张量scale与JSON元数据抵消了整数表示节省。因此本项目不能得出“量化一定减小文件”的结论。INT8运行时还会解量化为Python浮点数,也不等同于硬件整数加速。

参考性能报告在Windows 11、Python 3.12.13中各运行3个独立冷启动进程。Keras的冷进程墙钟中位数为2650.6965毫秒、单次推理中位数0.9295毫秒、峰值常驻内存304,234,496字节;float JSON标准库运行时分别为72.7705毫秒、0.0022毫秒和19,992,576字节;INT8 JSON标准库运行时分别为68.6432毫秒、0.0022毫秒和19,927,040字节。float与INT8的推理中位数相同,INT8冷启动低5.672%、峰值内存低0.328%,不足以证明稳定收益。Keras与JSON的巨大差别主要说明这个极小模型中框架启动成本占主导,不代表更大的网络、另一台电脑或真实边缘设备仍有相同比例。

平均延迟不能掩盖最慢情况。现场终端还要记录首次启动、连续运行和高负载时的延迟。若模型偶尔超过规定时间,规则应标记超时并要求人工观察,而不是继续沿用旧结果。简单规则已经满足任务时,可以不部署小模型;模型增加的维护成本也是验收证据。

三、形成部署判断

采用本地或端侧的常见理由包括断网可用、隐私、低延迟和费用可控;不采用的理由可能是模型精度下降、设备资源不足、更新困难或现场维护能力不足。判断应与任务合同连接:企业展示可以接受短暂延迟,生产巡检的提示延迟和漏报后果则不同。任何路径都必须保留人工覆盖。

部署前还要完成一次持续运行观察。学生让终端连续处理一组有明确时间顺序的回放窗口,记录每轮延迟、内存变化、停止状态和日志文件增长,检查程序是否逐渐变慢、重复提示或丢失记录。短时间成功不能代表能够稳定工作;持续观察发现的问题也必须回到相同输入上复现,才能交给AI限定修改。

第四节 在断网、低资源和设备故障下安全降级

一、为失败规定可观察状态

安全降级不是显示一行“出错了”,而是让系统进入预先定义的状态。至少包含:RECORD正常记录、REVIEW需要人工复核、STOP_BAD_INPUT输入无效、STOP_TIMEOUT推理超时、STOP_DEVICE_LOST设备断开、STOP_MODEL_MISSING模型缺失和STOP_RUNTIME_ERROR运行异常。停止状态不继续产生业务建议,也不沿用上一次分数。

固定失败集包括:断开网络;删除或损坏模型文件;遮挡摄像头或输入全静音;拔出传感器;提供空数组、错误单位和超范围数值;压低可用内存;输入训练集合中没有的对象。每个样例写明期望状态、日志字段和人工动作。失败后恢复设备时,系统先做自检,再重新读取,不能自动补写缺失记录。

二、把安全保护放在模型之外

低置信度、资料冲突和传感器失效时默认不行动。即使模型输出高分,独立规则仍要检查数据质量、连续次数、超时和动作白名单。物理停止、人工开关和专业报警不能依赖同一个模型或同一段可被AI修改的代码。

本章终端只提示和记录。若专业迁移确需控制设备,必须另行完成风险评估、独立安全联锁和专业审批,且不属于本书公共项目。学生不能因“代码由AI生成”而降低接线、权限和安全审查标准。

三、专业迁移卡

专业迁移卡A:智能制造巡检。 输入改为经授权的设备声音与振动,H2采用隔离的边缘节点;高代价错误是把明显异常记为正常。交付物增加设备位置、负载和维护班次字段,终端只生成“待复核”记录,由设备责任人决定停机或检修。

专业迁移卡B:生物培养环境观察。 输入改为温湿度、光照或其他经专业教师审核的环境数据;高代价错误是单位错配、探头断线后继续给出正常结论。交付物增加校准记录、批次与实验负责人,终端不控制培养设备,只提示复核。

专业迁移卡C:数字媒体互动展示。 输入改为摄像头手势或授权声音,错误后果主要是互动失灵和采集隐私。交付物增加采集范围、删除方式和观众提示;输出仅改变低压界面效果,不控制门锁、照明市电或机械装置。

四、形成终端交付卡

终端交付卡写明H0/H1/H2路径、设备与模型版本、输入输出契约、模型性能、资源预算、日志位置、固定测试、已知失效、恢复步骤、禁止动作和责任人。接手者应能在无网络条件下运行H0,制造一次设备断开并看到正确停止状态。若只有原开发者知道怎样恢复,项目尚未达到可交接状态。

本章小结

模型进入现场后,真正的工作对象变成设备、数据、模型、规则、日志和人的完整链路。H0、H1和H2使用同一接口,使没有硬件的学生也能学习机制,并使真实设备故障可以被定位在适配层。

AI可以依据核实资料协助生成代码,但设备事实、代码差异、安全保护和部署决定必须由人检查。本地运行的价值要用断网能力、延迟、隐私、资源和维护证据说明。低置信度、设备故障和陌生输入时默认不行动,是终端进入专业现场的基本条件。

关键术语

目标测试

一、单项选择题

  1. H0路径的主要价值是( )。A.证明真机长期稳定 B.在无新增硬件时完成全链路并定位设备层问题 C.绕过模型测试 D.自动控制设备
  2. 设备适配代码最可靠的事实依据是( )。A.模型记忆 B.相似产品帖子 C.准确型号的官方资料和真实日志 D.代码越长越好
  3. 模型输出异常分数后,最适合由确定性规则完成的是( )。A.重新训练模型 B.检查单位、超时和提示阈值 C.推断设备故障原因 D.决定专业责任
  4. 比较量化前后模型时,正确的控制变量做法是( )。A.同时换测试集和设备 B.固定模型任务、设备和测试集,只改变量化 C.只比较文件名 D.把测试数据加入训练

二、判断并改错

  1. “真实设备无法连接时,H0路径没有教学价值。”请判断并改正。
  2. “模型输出高置信度后,可以绕过独立安全规则直接控制现场设备。”请判断并改正。

三、简答与操作题

  1. 选择一种声音、图像或环境感知任务,画出从物理现象到人工确认的完整信号链,并标明模型和规则的位置。
  2. 为一个H1设备拟定事实包,至少列出型号、接口、单位、采样频率、官方资料和两项禁止事项。
  3. 设计一个只改变部署位置的对照实验,列出至少四项性能或使用指标。
  4. 为设备断开、模型缺失和输入超范围分别写出期望状态、日志内容和人工恢复动作。

答案编号:A2-09-01—A2-09-10。完整答案与评分要点统一放入书后“目标测试参考答案”。