第9章 制作可离线运行的现场感知终端
工作阶段: 进入现场——把一个可追溯训练、可验证导出的环境小模型放进可重复运行的本地终端。
公共核心项目: 完成“离线现场感知终端”:用虚拟或预录环境窗口跑通设备接口、本地组合偏离模型、独立规则、提示状态和故障降级;有条件时再只替换适配层接入真实设备。
核心技术: 虚拟设备接口、传感器适配、模型导出与端侧推理、资源预算、超时、故障检测和安全降级。
输入输出链: 物理现象或回放数据 → 设备适配层 → 预处理 → 本地模型 → 概率或异常分数 → 独立规则 → 提示与日志 → 人工确认。
应用中的AI: 使用本章独立训练的温湿度与噪声组合偏离小模型;专业迁移只复用接口、导出验证和模型外规则方法,不假称已经直接复用前章模型。
协助开发的AI: 根据学生提供的任务合同、官方设备资料和真实日志,生成并解释适配代码、模型转换代码和故障测试。
人的责任: 核实型号、接口、电压、单位、采样频率和使用边界;审查代码差异;决定是否部署以及何时停止。
主要交付物: 可运行工程、任务合同、H0虚拟/预录两路实现、真实设备适配接口、本地模型、冻结测试、参考报告和系统卡。
明确边界: 终端只观察、记录和提示,不直接控制市电、燃气、压力、加热、高速运动、门锁、交通工具或医疗设备。
跨章关系: 沿用第1章任务合同、第2章数据约定以及第7、8章的模型训练与独立测试方法;本章环境模型另行训练,并未直接加载前章视觉或声音制品;输出可在第10章接入受控工作流。
学习目标
学完本章,你将能够:
- 画出从物理现象到人工确认的完整信号链,并指出模型、规则和设备各自承担什么;
- 区分H0预录或虚拟接口、H1电脑或USB设备、H2边缘设备三种实现路径;
- 根据经过核实的官方资料,与AI协同生成并限定修改设备适配代码;
- 比较模型在云端、本地电脑和端侧设备上的精度、延迟、内存、断网能力与维护负担;
- 用断网、设备断开、输入超范围和资源不足样例验证安全降级。
项目导入
前面章节已经学习模型训练和独立测试的方法,但“有一个模型文件”还不是现场应用。本章没有把不相干的视觉或声音模型硬接到环境任务,而是独立生成温度、湿度和噪声教学数据,训练一个环境组合小模型,再把它导出到本地终端。现场设备仍可能没有接好,输入单位可能变化,模型也可能因资源不足或陌生环境失效,因此终端必须把设备、模型、规则、日志和人的行动连成一条可以检查的链。
本章公共项目是一个低风险的异常观察终端。它每隔固定时间读取一段声音、振动或环境数据,调用本地模型输出概率或异常分数;确定性规则检查输入是否完整、分数是否达到提示阈值、模型是否超时;满足条件时只在屏幕上提示并写入日志,由巡检人员确认。它不自动停机、不切断电源,也不代替法定报警和专业检测。
硬件不是进入本章的门槛。H0使用预录数据或虚拟接口,在普通电脑上完成完整链路;H1使用电脑自带摄像头、麦克风或小组共享的USB传感器;H2把同一接口迁移到边缘设备。三条路径共享输入输出契约、测试集和安全规则,学生即使没有设备也能完成核心学习。
本章成果
- 一幅标明采样、预处理、模型、规则、输出、日志和人工接管点的信号链图;
- 一套能在H0运行、可替换为H1或H2适配层的完整最小工程;
- 一套可复现训练数据、Keras原模型、float JSON、INT8 JSON和固定导出一致性报告;
- 一份如实记录模型大小、启动时间、推理延迟和峰值内存的实测比较,包括量化未缩小本项目JSON的负结果;
- 一组断网、设备断开、输入超范围、模型缺失和低置信度故障记录;
- 一张说明使用范围、禁止动作、安全降级和人工覆盖方式的终端卡。
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可以依据核实资料协助生成代码,但设备事实、代码差异、安全保护和部署决定必须由人检查。本地运行的价值要用断网能力、延迟、隐私、资源和维护证据说明。低置信度、设备故障和陌生输入时默认不行动,是终端进入专业现场的基本条件。
关键术语
- 设备适配层:把具体设备数据转换为项目统一输入契约的程序层。
- 虚拟接口:用预录或模拟数据实现与真实设备相同调用方式的接口。
- 端侧推理:在靠近数据来源的本地设备上运行已训练模型。
- 资源预算:模型运行可使用的时间、内存、存储、功耗等限制。
- 模型导出:把训练模型转换为目标运行环境可加载的格式。
- 量化:用较低精度表示模型参数或计算,以降低资源需求的方法。
- 安全降级:系统失效时进入限制功能或停止状态,而不是继续输出不可靠结果。
- 人工覆盖:责任人能够独立于模型暂停、拒绝或接管系统的机制。
- 信号链:物理现象经过采集、处理、模型、规则到输出和行动的完整路径。
目标测试
一、单项选择题
- H0路径的主要价值是( )。A.证明真机长期稳定 B.在无新增硬件时完成全链路并定位设备层问题 C.绕过模型测试 D.自动控制设备
- 设备适配代码最可靠的事实依据是( )。A.模型记忆 B.相似产品帖子 C.准确型号的官方资料和真实日志 D.代码越长越好
- 模型输出异常分数后,最适合由确定性规则完成的是( )。A.重新训练模型 B.检查单位、超时和提示阈值 C.推断设备故障原因 D.决定专业责任
- 比较量化前后模型时,正确的控制变量做法是( )。A.同时换测试集和设备 B.固定模型任务、设备和测试集,只改变量化 C.只比较文件名 D.把测试数据加入训练
二、判断并改错
- “真实设备无法连接时,H0路径没有教学价值。”请判断并改正。
- “模型输出高置信度后,可以绕过独立安全规则直接控制现场设备。”请判断并改正。
三、简答与操作题
- 选择一种声音、图像或环境感知任务,画出从物理现象到人工确认的完整信号链,并标明模型和规则的位置。
- 为一个H1设备拟定事实包,至少列出型号、接口、单位、采样频率、官方资料和两项禁止事项。
- 设计一个只改变部署位置的对照实验,列出至少四项性能或使用指标。
- 为设备断开、模型缺失和输入超范围分别写出期望状态、日志内容和人工恢复动作。
答案编号:A2-09-01—A2-09-10。完整答案与评分要点统一放入书后“目标测试参考答案”。