很多人一提到 AI 产品体验,第一反应都是放在模型本身:模型够不够强、结果够不够聪明、输出够不够像人写的。
这些当然重要。但如果你真的开始把 AI 功能接到页面里,很快就会发现一个残酷的现实:用户感受到的 AI 体验,不只是模型质量,还包括页面在等待、成功、失败时到底表现成什么样。
模型决定内容质量,而前端状态设计(State Design)决定体感质量。
💡 省流助手
- AI 交互特征:高延迟、高不确定性、高并发风险。
- 核心逻辑:AI 页面体验本质上是状态管理问题(idle | loading | success | error)。
- 工程细节:必须处理重复点击与请求竞态(Race Condition),拒绝控制台“悄悄报错”。
- 终极体感:Loading 不是加分项,而是基础设施;错误提示不是技术细节,而是体验设计。
为什么很多 AI 页面“模型挺强,体感很渣”?
因为它们往往只做了“接口搬运工”,却没有处理交互状态。一个典型的“小白式”AI 页面通常长这样:
- 有个输入框和按钮。
- 点一下发请求。
- 等接口回来把结果塞进页面。
看起来功能全了,但用户用起来会非常痛苦:
- 反馈缺失:点完按钮没反应,不知道发没发成功。
- 焦虑等待:AI 生成慢,转圈圈转到怀疑人生。
- 报错无感:请求失败了,页面没提示,用户以为卡死了。
- 并发混乱:用户连点三次,页面结果疯狂闪烁。
代码范式:从“小白调用”到“专家级封装”
前端开发者不应只关注 fetch,更应关注状态机。
❌ 错误做法:只管成功路径(脆弱的交互)
// 这种写法在网络波动、模型超时或用户连点时会瞬间崩溃
const handleGenerate = async () => {
const res = await fetch('/api/ai');
const data = await res.json();
setResult(data.content); // 没 Loading,没错误处理,点快了还会乱序
};
✅ 正确做法:状态驱动交互(稳健的工程)
const [status, setStatus] = useState('idle'); // idle | loading | success | error
const abortControllerRef = useRef(null);
const handleGenerate = async () => {
// 1. 物理防重:请求中禁用
if (status === 'loading') return;
// 2. 处理竞态:取消前序未完成的请求
if (abortControllerRef.current) abortControllerRef.current.abort();
abortControllerRef.current = new AbortController();
setStatus('loading');
try {
const res = await fetch('/api/ai', {
signal: abortControllerRef.current.signal
});
if (!res.ok) throw new Error('模型服务暂时拥挤,请稍后再试');
const data = await res.json();
setResult(data.content);
setStatus('success');
} catch (err) {
if (err.name === 'AbortError') return; // 忽略被取消的请求
setStatus('error');
toast.error(err.message); // 3. 错误可视化,拒绝“悄悄报错”
}
};
生产环境避坑指南
如果想让你的 AI 页面真正具备生产价值,这 3 个坑一定要填平:
1. 彻底解决重复点击与竞态覆盖
在 AI 场景下,用户极易因为焦虑而反复修改 Prompt 并点击生成。如果第二个请求比第一个更早返回,页面结果就会发生“闪烁覆盖”。
- 方案:使用
AbortController取消旧请求,或者在按钮点击后强制disabled。
2. 拒绝死板的 Loading,引入安抚机制
普通 Loading 超过 3 秒,用户流失率会飙升。
- 进阶:对于长文本生成,建议采用 SSE(Server-Sent Events)流式输出。让内容像打字机一样一点点出来,这种“实时感知”能极大缓解等待焦虑。
3. 错误提示:不要只给开发者看
“请求失败”对用户来说是无解的。
- 建议:区分错误类型。是输入包含敏感词(提示修改输入)?还是模型配额超限(提示稍后再试)?提供一个**“重新生成”**的显眼按钮,比任何报错文案都管用。
给前端开发者的建议
下次你接 AI 接口时,除了问“请求怎么发”,请多问这 4 个问题:
- Loading 期间:用户是否有明确的视觉反馈(按钮置灰、骨架屏、打字机动画)?
- 成功之后:结果呈现是否自然(是否需要 markdown 渲染、语法高亮)?
- 失败之后:是否有友好的引导(是一句红字,还是一个重试按钮)?
- 连点之后:逻辑是否依然严丝合缝(会不会出现旧数据覆盖新数据)?
结语
AI 产品的“最后一公里”,往往就在前端的状态管理里。用户感知的不是你的 Prompt 有多高级,而是他在等待、报错、成功时的每一秒钟是否感到“确定”。
AI 页面体验的关键,不只是模型质量,更是你对交互细节的工程化掌控。
标签:AI、前端、状态管理、React、用户体验