96SEO 2026-05-23 20:40 46
在使用Spring AI框架对接大语言模型进行流式输出时前端中断请求的处理是一个常见但容易被忽视的问题。本文将深入探讨这一问题的成因、影响以及解决方案。

在实际开发中,当用户在前端主动中断SSE连接后后端与LLM的交互并未真正终止,导致响应内容丢失或错乱。这不仅影响用户体验,还可Neng引发数据不一致问题。我们先来kan一个典型的场景:当你在构建一个类似大模型门面的文本聊天页面时可Neng会遇到如下问题:
前端中断了SSE请求之后 发送一个新的交互请求,发现后端返回的推送内容仍是上一个提示词的响应文案。
这种现象让人非常困惑,甚至一度让我误以为是后端没有及时断开与LLM的连接,导致旧的响应流被错误地推送给新的请求。但经过排查,问题其实出在交互提示词链上,而不是连接是否断干净的问题。
问题分析在Spring AI中,聊天记忆机制的处理逻辑是:在与LLM交互前,用户的提示词会被存储到聊天记忆中,而LLM的响应只有在正常完成之后才会被保存到聊天记忆中。因此,当用户在前端主动中断连接时响应的片段并未被保存,导致后续请求中缺少AssistantMessage,从而引发响应错乱。
源码分析通过查kan源码Ke以发现,MessageChatMemoryAdvisor类中的after方法在LLM响应完成后才会将响应内容保存到聊天记忆中。因此,前端中断时响应内容不会被保存,导致后续请求中缺少上下文信息。
@Override
public ChatClientResponse after {
List assistantMessages = new ArrayList;
if != null) {
assistantMessages = chatClientResponse.chatResponse
.getResults
.stream
.map g.getOutput)
.toList;
}
this.chatMemory.add, this.defaultConversationId), assistantMessages);
return chatClientResponse;
}
解决方案
为了解决这一问题,我们需要在流式输出被中断时手动将Yi生成的响应片段保存到聊天记忆中。具体实现方式如下:
在ChatClient的响应流中添加一个订阅,用于获取响应流的Disposable对象。
在新的SSE请求过来时先中断之前的SSE连接,再发起新的SSE连接。
这种方案Ke以实现理想效果,但会抛出一个异常:
java.lang.IllegalStateException: No StreamAdvisors available to execute
at org.springframework.ai.chat.client.advisor.DefaultAroundAdvisorChain.lambda$nextStream$
at reactor.core.publisher.FluxDeferContextual.subscribe
at reactor.core.publisher.Flux.subscribe
at reactor.core.publisher.MonoFlatMapMany$FlatMapManyMain.onNext
at reactor.core.publisher.FluxMap$MapSubscriber.onNext
at reactor.core.publisher.FluxSubscribeOnValue$ScheduledScalar.run
at reactor.core.scheduler.SchedulerTask.call
at reactor.core.scheduler.SchedulerTask.call
这个异常的出现,是因为在DefaultAroundAdvisorChain中,当streamAdvisors为空时会抛出异常。这说明我们不Neng破坏Spring AI的内部机制,因为Spring MVC的返回值处理器需要订阅响应流。
为了解决这一问题,我们需要在ChatClient返回的Flux中添加doOnCancel事件监听,当流正常推送时将中间的缓存用于缓存LLMYi经生成的响应片段,之后再监听到前端主动断开连接时手动将响应片段保存到聊天记忆中。
示例如下:
ChatClient.create
.prompt
.user
.system
.advisors.conversationId.build)
.stream
.content
.map(token -> {
// 这里保存token到缓存中
chatResponseCacheUtil.append;
return token;
})
.timeout)
.doOnCancel -> {
// 这里获取到缓存片段,手动保存到聊天记忆里面
String cacheResponseText = chatResponseCacheUtil.getCache;
savePartialResponse;
chatResponseCache
作为专业的SEO优化服务提供商,我们致力于通过科学、系统的搜索引擎优化策略,帮助企业在百度、Google等搜索引擎中获得更高的排名和流量。我们的服务涵盖网站结构优化、内容优化、技术SEO和链接建设等多个维度。
| 服务项目 | 基础套餐 | 标准套餐 | 高级定制 |
|---|---|---|---|
| 关键词优化数量 | 10-20个核心词 | 30-50个核心词+长尾词 | 80-150个全方位覆盖 |
| 内容优化 | 基础页面优化 | 全站内容优化+每月5篇原创 | 个性化内容策略+每月15篇原创 |
| 技术SEO | 基本技术检查 | 全面技术优化+移动适配 | 深度技术重构+性能优化 |
| 外链建设 | 每月5-10条 | 每月20-30条高质量外链 | 每月50+条多渠道外链 |
| 数据报告 | 月度基础报告 | 双周详细报告+分析 | 每周深度报告+策略调整 |
| 效果保障 | 3-6个月见效 | 2-4个月见效 | 1-3个月快速见效 |
我们的SEO优化服务遵循科学严谨的流程,确保每一步都基于数据分析和行业最佳实践:
全面检测网站技术问题、内容质量、竞争对手情况,制定个性化优化方案。
基于用户搜索意图和商业目标,制定全面的关键词矩阵和布局策略。
解决网站技术问题,优化网站结构,提升页面速度和移动端体验。
创作高质量原创内容,优化现有页面,建立内容更新机制。
获取高质量外部链接,建立品牌在线影响力,提升网站权威度。
持续监控排名、流量和转化数据,根据效果调整优化策略。
基于我们服务的客户数据统计,平均优化效果如下:
我们坚信,真正的SEO优化不仅仅是追求排名,而是通过提供优质内容、优化用户体验、建立网站权威,最终实现可持续的业务增长。我们的目标是与客户建立长期合作关系,共同成长。
Demand feedback