使用post请求建立长连接实现sse,接收后端主动发来的消息,实现chat-gpt的弹字效果,EventSource的应用

最近在做一个chat相关的功能,然后由于接口返回特别特别慢,所以需要搞一个慢慢等待的效果,就是接口一个单词一个单词的返回,然后前端收到一个展示一个,提升用户体验。

看其他文档都说使用EventSource即可,就是传说中的sse【server-send-events】。记录下使用方法。

import { fetchEventSource } from '@microsoft/fetch-event-source'
  getStream(payload: any, url: string) {
    const token = access_token;

    let that = this;

    let headers: any = {
      Authorization: `Bearer ${token}`,
    };
    if (url == 'content') {
      headers = {
        'Content-Type': 'application/json',
        Authorization: `Bearer ${token}`,
      };
    }
    try {
      this.fetchSource = fetchEventSource(
        `${serviceUrl}/api/v1/${url}`,
        {
          method: 'POST',
          headers: headers,
          signal: this.ctrl.signal,
          openWhenHidden: true,
          body: url == 'summarize-content' ? JSON.stringify(payload) : payload,
          async onopen(response) {
            that.output = '';
            if (
 
<think>嗯,用户问的是如何在Spring Boot中集成Spring AI,并用Stream流的方式处理。首先,我得回忆一下Spring AI的相关知识。Spring AI是Spring官方提供的AI集成框架,方便在Spring应用中接入各种大模型,比如OpenAI、Azure OpenAI等。 接下来,我需要考虑如何将Spring AI集成到Spring Boot项目中。通常,这需要添加相关的依赖,然后配置API密钥等信息。记得在pom.xml里添加spring-ai-openai-spring-boot-starter依赖,这样就能使用OpenAI的服务了。 然后是Stream流处理的部分。用户可能希望实现类似流式传输的效果,比如逐字输出生成的文本,而不是一次性返回全部结果。这时候,Spring AI的流式API就派上用场了。需要调用模型的流式方法,比如OpenAiChatClient的stream方法,返回一个Flux流对象。 接下来,如何将Flux流通过HTTP响应流式传输给前端呢?这里可能需要使用Spring WebFlux的支持,返回一个ResponseEntity<Flux<String>>,这样前端就能逐步接收数据了。但要注意,不是所有前端都能处理这种流式响应,可能需要使用EventSource或其他技术来接收数据。 另外,用户可能对响应格式有要求,比如返回JSON数组或者特定格式的数据。这时候,需要处理每个数据块,包装成合适的格式,比如用Server Sent Events(SSE)的格式,每个数据块作为一个事件发送。 还需要考虑异常处理,比如API调用失败时的错误处理,以及流处理中的错误传递。使用Flux的onErrorResume等方法可以捕获异常,并返回错误信息给前端。 测试的时候,可以使用curl或者Postman来发送请求,观察流式响应的效果。同时,要注意OpenAI的流式响应格式,确保正确解析每个数据块。 可能用户在实际应用中会遇到的问题,比如依赖冲突、配置错误、流式响应不被支持等,需要提示用户检查依赖版本,确认配置是否正确,以及前端是否支持流式处理。 总结一下,步骤应该是:添加依赖、配置API信息、创建Controller使用流式处理方法、处理响应流,并考虑异常处理和前端适配。这样用户就能在Spring Boot中集成Spring AI,并用Stream流处理生成的内容了。</think>以下是Spring Boot集成Spring AI并使用Stream流式处理的实现步骤详解: 1️⃣ 添加依赖 ```xml <dependency> <groupId>org.springframework.ai</groupId> <artifactId>spring-ai-openai-spring-boot-starter</artifactId> <version>0.8.1</version> <!-- 版本需与Spring Boot版本对应 --> </dependency> ``` 2️⃣ 配置API信息(application.yml) ```yaml spring: ai: openai: api-key: your-api-key base-url: https://api.openai.com/v1 chat: options: model: gpt-3.5-turbo temperature: 0.7 ``` 3️⃣ 创建Stream处理Controller ```java import org.springframework.ai.chat.ChatResponse; import org.springframework.ai.chat.prompt.Prompt; import org.springframework.ai.openai.OpenAiChatClient; import org.springframework.http.MediaType; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RestController; import reactor.core.publisher.Flux; @RestController public class AiStreamController { private final OpenAiChatClient chatClient; public AiStreamController(OpenAiChatClient chatClient) { this.chatClient = chatClient; } // 流式响应接口 @PostMapping(value = "/ai/stream", produces = MediaType.TEXT_EVENT_STREAM_VALUE) public Flux<String> streamChat(@RequestBody String prompt) { return chatClient.stream(new Prompt(prompt)) .map(ChatResponse::getResults) .flatMapIterable(list -> list) .map(result -> result.getOutput().getContent()) .onErrorResume(e -> Flux.just("错误:" + e.getMessage())); } } ``` 4️⃣ 流式处理核心逻辑解析: - `MediaType.TEXT_EVENT_STREAM_VALUE`:声明SSE(Server-Sent Events)响应格式 - `chatClient.stream()`:获取Flux流式响应 - 响应映射链: 1. 提取响应结果列表 2. 将列表展开为单个结果流 3. 提取每个结果的文本内容 4. 添加错误处理兜底 5️⃣ 测试验证(使用curl): ```bash curl -N -X POST http://localhost:8080/ai/stream \ -H "Content-Type: text/plain" \ -d "用三个成语描述夏天的特征" ``` 典型响应示例: ```text data: 烈日炎炎 data: 蝉声阵阵 data: 绿树成荫 ``` 💡 注意事项: 1. 前端需支持SSE处理(使用EventSource API) 2. OpenAI的stream响应格式需要正确解析 3. 生产环境需添加以下配置: - 响应超时设置 - 速率限制 - 身份验证 - 响应缓存控制 扩展应用场景: ✅ 实时聊天机器人 ✅ 长文本生成(逐步输出) ✅ 动态数据可视化 ✅ 实时日志分析 常见问题排查: 1. 流响应中断 ➡️ 检查网络连接和超时设置 2. 无响应 ➡️ 验证API密钥和模型配置 3. 乱码问题 ➡️ 统一符编码为UTF-8 4. 响应延迟 ➡️ 调整temperature参数降低随机性 该实现方案通过响应式编程实现了: - 内存高效处理 - 实时性传输 - 背压控制 - 错误恢复机制 最新版本已支持: - Azure OpenAI服务 - 自定义Prompt工程 - 多模态流处理 - 对话历史管理 建议结合Spring WebFlux实现全链路响应式处理,最大化提升系统吞吐量。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值