一、实现逻辑用户每次对话时在doFirst中维护当前sessionId此时已经向前端输出部分内容用户点击停止生成调用后端接口将当前sessionId移除掉等大模型下次输出时会执行 takeWhile次数判断当前 sessionId 是否还存在不存在就直接结束了大模型的输出。二、伪代码注意当停止生成时是不会被chatMemory持久化的如果需要持久化需要自己手动保存。// 存储大模型的生成状态这里采用ConcurrentHashMap是确保线程安全// 目前的版本暂时用Map实现如果考虑分布式环境的话可以考虑用redis来实现privatestaticfinalMapString,BooleanGENERATE_STATUSnewConcurrentHashMap();publicFluxChatEventVOchat(Stringquestion,StringsessionId){// 获取对话idvarconversationIdChatService.getConversationId(sessionId);// 生成请求idvarrequestIdIdUtil.fastSimpleUUID();// 获取用户idvaruserIdUserContext.getUser();returnthis.chatClient.prompt().user(question).stream().chatResponse().doFirst(()-GENERATE_STATUS.put(sessionId,true))// 第一次输出内容时执行.doOnError(throwable-GENERATE_STATUS.remove(sessionId))// 出现异常时删除标识.doOnComplete(()-GENERATE_STATUS.remove(sessionId))// 完成时执行删除标识.doOnCancel(()-{// 当输出被取消时保存输出的内容到历史记录中this.saveStopHistoryRecord(conversationId,outputBuilder.toString());}).takeWhile(response-{// 通过返回值来控制Flux流是否继续true继续false终止returnGENERATE_STATUS.getOrDefault(sessionId,false);})}publicvoidstop(StringsessionId){// 移除标记GENERATE_STATUS.remove(sessionId);}/** * 保存停止输出的记录 * * param conversationId 会话id * param content 大模型输出的内容 */privatevoidsaveStopHistoryRecord(StringconversationId,Stringcontent){this.chatMemory.add(conversationId,newAssistantMessage(content));}