“停止生成”和“重新生成”怎么做?
先理解原理和示例,再练习完整口述与追问。
回答要点
前端通过 AbortController 取消 fetch 或关闭连接,并把消息标记为已停止;旧请求的迟到回调不能继续修改新消息。服务端是否停止生成和计费,取决于其取消机制,不能由前端单方面保证。
重新生成应有独立请求标识,明确是替换答案还是保留多个版本;网络失败、用户停止和模型正常结束要分开处理。
原理拆解
停止生成需要同时处理网络、后端任务和 UI 版本。AbortController 可停止客户端读取,但服务端是否停止模型推理取决于取消传播与提供方能力。每次生成使用 generationId,防止旧请求仍到达的事件写入新消息。重新生成应明确替换哪条回答、保留哪些历史和如何标记旧版本。
示例与推演
用户停止 A 后立即重新生成 B:先把 A 标为 cancelled 并取消读取,创建 B 的新 ID;任何后续 A 事件因 ID 不匹配被忽略。已经收到的文本保留并标注未完成。刷新恢复时根据服务端任务状态与协议决定续接,不凭本地布尔值继续追加。
易错点
cancelled、error、completed 不应混成同一“结束”。客户端停止不保证不计费,不能对用户作无法验证的费用承诺。
参考回答可直接练习口述
每次生成绑定 requestId 和 AbortController,点击停止时取消当前 fetch、把消息标记为 stopped,并让该请求的后续回调失效。关闭连接只保证前端不再继续消费,不保证模型后端立刻终止,需要服务端取消能力。重新生成使用新请求标识,明确是替换当前回答还是增加一个答案版本;正常完成、主动停止、网络失败和服务端拒绝分开记录。