WebAssembly AI 插件开发与浏览器端推理:输出异常时走确定性的回退路径
Wasm 插件出错时,我最在意的不是“多快切回去”,而是页面还能不能给出明确、可用的结果。不同浏览器和模型的耗时差别很大,先写一个固定毫秒数没有意义;超时阈值应该由实际设备上的测试决定。
这里的 AI 输入可以是用户明确提交、并在进入插件前做过长度限制和脱敏的文本。输出则限定为分类标签或结构化建议。无论输出正常还是降级,都不把 Cookie、完整页面内容或原始输入写进日志。人工测试会覆盖空输入、格式异常、模型返回不符合约定和超时几种情况。
graph TD Input[经校验的输入] --> Wasm[Wasm 推理] Wasm -->|结果符合 schema| Output[展示结果] Wasm -->|超时或结果无效| Fallback[本地规则或提示重试] Fallback --> Output先把返回值写清楚
下面的示例用Result表示插件边界。真正的超时控制通常放在 JavaScript 或宿主运行时一侧;不能指望catch_unwind解决所有 Wasm 运行问题。
use serde::Serialize; #[derive(Serialize)] struct InferenceResponse { degraded: bool, label: String, } fn infer(payload: &str) -> Result<InferenceResponse, &'static str> { if payload.trim().is_empty() { return Err("输入为空"); } if payload.len() > 4_096 { return Err("输入超过本地限制"); } Ok(InferenceResponse { degraded: false, label: "needs_review".to_owned(), }) } fn fallback() -> InferenceResponse { InferenceResponse { degraded: true, label: "unknown".to_owned() } }降级不是掩盖错误
- 前端应标出结果是否来自降级规则,别把两者混成同一种“AI 结论”。
- 本地规则只处理可以明确处理的输入;不能判断时,显示“暂时无法判断”比编造答案好。
- 每次改模型、Wasm 包或超时配置后,我会用合成测试数据人工核对结果。生产数据不应拿来当调试样本。