做 AI 对话功能,正常流程谁都会写。真正决定体验好坏的,是异常态有没有兜干净。我把上线后被用户和测试轮番教育出来的 6 种异常态列一份清单,照着兜,能少挨不少骂。
1. 请求超时 / 模型半天不吐字
模型偶尔会卡,首字迟迟不来。别让界面无限转圈。我设了 15 秒兜底:超时就把"思考中"换成"AI 好像走神了,点这里重试",给用户一个明确出口,别让人干等。
2. 流式中途断流
SSE 读到一半连接断了,前面已经渲染了半句话。这时别把半句话留在那像没事一样。我会在最后一条消息尾部追一个浅灰的"(回答被中断)"标记,并保留"继续"按钮。用户知道发生了什么,比悄悄断掉强。
3. 内容审核拦截
问到敏感内容,后端返回的是审核拒答而不是正常回复。前端要识别这个状态码,给一句温和的"这个问题我暂时没法回答",而不是把后端的原始错误 JSON 糊到对话框里。
4. 空回答
模型偶尔返回一个空字符串或纯空格。如果不判空,界面上就出现一个空的 AI 气泡,特别诡异。收到空内容时,我替换成"没太理解,换个说法再问问?"。
5. 超长输入
用户粘贴一篇几千字的文档进来。前端先做字数预检,超限当场提示并截断或拒绝,别等请求打到后端再报 400,那时候用户已经等了一圈了。
6. 网络离线
navigator.onLine 为 false 或 fetch 直接抛网络错误。这种要和"模型出错"区分开——文案给"网络断了,连上再试",而不是甩锅给 AI。
一点实话
这 6 条里,2 和 4 是我上线后才被测试同学逐个挖出来补的,当初自测根本没覆盖到,因为正常用很难触发。建议提前对着这份清单写用例。
模型这层我走的讯飞 MaaS,省了自建推理的麻烦,腾出手专门磨这些异常态。你们还兜过哪些奇葩状态?评论区补充,凑个更全的清单。