直接回答
“空输出”应先拆分成可观察阶段,再决定应用是否重试。用户可能没有提交有效输入;预处理可能生成了空载荷;渲染后的提示可能只剩控制结构;运行时可能没有文本或提前结束;流收集器可能没有观察到事件;解析器可能拒绝或丢弃结果;界面也可能映射到了错误状态。这些都是不同故障。应使用固定、非隐私夹具,在每个边界采集最早可用证据;不能把空屏等同于模型生成了空响应。 为任务建立追踪记录,包括请求 ID、制品/运行时身份、提示模板版本、输入模态、预处理结果、运行时启动、可观察时的每个输出块、结束/停止状态、测试夹具里的安全原始输出、解析结果和 UI 状态。生产诊断不要仅为了排查空结果就保存用户提示词或答案,应只保留阶段码、长度和错误类别。LiteRT-LM Kotlin 指南展示了对话调用与流式收集用法,但具体集成仍需核对包装层实际会发出什么以及如何表示取消;不能编造事件或停止 API。 设计能够区分管线阶段的控制用例。一个有确定非空预期属性的本地测试夹具,可以验证应用状态路径;无输入控制验证表单校验;故意拒绝的结构化结果可以测试解析器;取消用例应确认界面不会把“第一个输出块前取消”说成“模型返回空”。运行时正常调用后返回空最终文本,要与从未进入原生执行的请求区分开。超时与错误状态也要保留。 检查状态转换和单请求所有权。陈旧收集器可能把新结果覆盖为空;符合生命周期的收集器可能停止观察,但原生任务仍在执行;重试可能在首个请求结束前替换请求状态。比较请求 ID 和任务所有者,确认结果只应用到当前请求,并验证流结束和界面结束不是同一概念。如果解析前有输出、解析后为空,应查 schema 校验或停止标记过滤;如果解析结果存在但页面空白,应查 UI 状态映射和本地化回退。 最后,重试策略要对应已定位的阶段。无输入时提示输入,模型资产缺失时引导修复,运行时错误时展示分类操作,真正空的模型响应则作为输出属性记录。避免无穷重试消耗资源或重复工作。本文提供排错流程,不声称任何输出比率或模型质量;结论只对应准确夹具、应用、制品、运行时和任务。 错误恢复最好由用户能够理解的状态驱动。例如,若结果已被解析器拒绝,界面应提示格式验证失败,而不是让用户再次下载模型;若流在页面离开后被取消,则需说明请求已停止,不要显示空白完成态。旧任务返回时,应用应检查请求 ID 并隔离过期结果。把状态机与错误码设计成一一对应,可以让日志、测试和用户提示保持同一含义。 支持排查应使用合成任务和阶段元数据。可以保留任务是否启动、是否收到块、终止原因、解析类别、请求 ID 和应用构建,不必保存用户真实输入。若内部接口不暴露某个阶段,就注明不可观察;不要填入猜测。只有有明确重试策略的错误才自动重试,其余情况让用户决定取消、编辑输入或再次尝试。这样既能快速找到空值在哪层出现,也避免将排障变成后台反复提交敏感内容。
用户认为生成完成,但屏幕没有文本
本地助手在一次请求后没有显示内容。应用刚修改了流收集和解析校验,目前还没有证据说明原生输出是否发出,或页面是否在状态恢复时丢了结果。
决策
用稳定请求身份的固定夹具跟踪输入、运行时、事件、停止、解析和界面状态,定位前不启用自动重试。
预期结果
团队识别第一个出现空值的阶段,并给出对应恢复方式,而不是盲目重放私人输入。
需要收集的证据
只有将以下证据与同一模型文件和测试运行关联起来,结论才可复核:
- BENCHMARK-01:定量结果需要原始配置数据,空输出排查应记录准确阶段。
- COVE-LIFECYCLE-01:ModelManager 有显式生命周期状态;模型加载与后续任务结果必须分开记录。
发布结论只对所记录的配置和验收集有效;扩大适用范围需要更多记录。
实施流程
- 建立固定非空控制用例. 使用预期属性明确的短合成任务,并添加无输入和解析拒绝控制。固定制品、运行时、提示模板、应用构建和请求 ID。
- 跟踪输入与渲染提示. 记录是否有输入、预处理是否接受,以及最终渲染请求是否含有预期内容。不能用字符数猜内部 token 或上下文状态。
- 观察运行时与流生命周期. 仅在集成暴露时记录原生调用启动、输出块、结束状态、取消、超时和错误阶段。区分无事件、空最终响应和首块前取消。
- 比较原始、解析与展示结果. 在合成测试中比较安全原始输出、解析结果和界面状态。检查停止处理、schema 拒绝、请求所有权、陈旧收集器和本地化显示回退。
- 按阶段实施有界重试. 无输入时提示补充;资产缺失时引导修复;运行时异常时显示分类操作;真实空响应单独记录。限制重试,并确保旧请求不会覆盖新结果。
让每个阶段的状态都可观察。失败信息应指出阶段、模型、运行时和恢复动作,同时避免记录用户私密内容。
验收标准
- 空 UI、空最终输出、无流事件、解析拒绝、取消和运行时失败属于不同状态。
- 每个结果关联请求 ID、准确制品/运行时/提示夹具;旧任务不能覆盖新 UI 状态。
- 只对已分类且可恢复的阶段重试,并设有次数限制。
- 生产诊断仅保留脱敏阶段元数据,不保存私密提示词或生成文本。
决策对照表
| 维度 | 选择或证据 | 解读方式 |
|---|---|---|
| 运行时没有输出事件 | 检查调用启动、收集、取消、超时与错误 | 应用可能根本没有收到结果,不能称为空模型回答。 |
| 原始输出有内容,解析为空 | 检查 schema、停止过滤和解析拒绝 | 推理之后的管线转换移除或拒绝了内容。 |
| 解析结果存在但页面为空 | 检查请求所有权及 UI 状态映射 | 显示路径可能丢失有效文本,与运行时输出无关。 |
需要避免的失败模式
- 把空界面直接当成模型返回了空字符串。
- 未确认请求状态就重复提交,导致旧任务覆盖新结果。
还要避免静默回退、版本未固定、缺少取消处理,以及把不同配置的结果混在一起下结论。失败运行也应与成功记录一并保存。
最小复现记录
| 层级 | 记录内容 |
|---|---|
| 设备 | 厂商、型号、芯片、内存档位、操作系统版本 |
| 软件 | 应用版本和 Git 提交号 |
| 模型 | 系列、变体、版本、格式、文件长度、摘要、量化方式 |
| 运行时 | 名称、版本、请求后端及实际后端证据 |
| 工作负载 | 样例版本、输入摘要、提示词摘要、输出策略 |
| 结果 | 完成、失败、取消、回退及保护隐私的诊断信息 |
发布检查表
- ☐ 主要搜索问题已回答,且没有未经支持的数字。
- ☐ 所有模型文件和运行时版本均已固定。
- ☐ 代表性任务和失败处理策略均有说明。
- ☐ 生命周期、取消、清理和回退均已测试。
- ☐ 用户内容与网络边界均有说明。
- ☐ 结论只适用于被记录的配置。
- ☐ 新增测试结果时链接到原始方法或证据。
来源与相关证据
中文部署与排错专题见。奇连 AI 端侧专题。
常见问题
空白界面是否证明模型返回空字符串?
不能。输入校验、运行时调用、流观察、取消、解析拒绝和 UI 映射都可能造成空白。应比较最早的安全可观察边界,并保留阶段记录。
每次空结果都应该自动重试吗?
不应该。只有明确分类且可恢复的阶段才适合重试。无输入、解析拒绝、超时和真实空输出需要不同操作和规则;重试还需设有次数上限。
调试空结果时能否记录完整提示词?
优先使用合成夹具和脱敏阶段元数据。生产提示词和回答可能私密;确认调用是否启动或解析器是否拒绝,不需要保留完整内容。