当前位置: 首页 > news >正文

AIGC入门,从理解通信协议sse与streamhttp开始

引言

随着AIGC(生成式人工智能)的普及,大模型如GPT、通义千问等已广泛应用于对话、代码生成、数据分析等场景。这些模型在运行时需要与客户端进行高效通信,SSE(Server-Sent Events) 和 Stream HTTP(流式HTTP) 是两种核心通信协议。本文将结合理论和Java代码示例,帮助你理解这两种协议的原理、区别及在AIGC中的实际应用。

一、通信协议基础

1.1 什么是SSE?

SSE(Server-Sent Events)是一种基于HTTP的单向通信协议,允许服务器主动向客户端推送实时事件。其特点包括:
● 事件格式标准化:通过data:字段传递结构化数据(如JSON)。
● 自动重连:网络中断后客户端会自动重新连接。
● 长连接保持:服务器持续发送数据,客户端逐步接收。
典型应用场景:实时聊天、股票行情推送、大模型流式输出。

1.2 什么是Stream HTTP?

Stream HTTP 是基于 HTTP 的分块传输编码(Chunked Transfer Encoding) 的流式传输方式。服务器可以持续向客户端发送数据块,客户端逐步接收并处理。
典型应用场景:视频流、大文件下载、自定义数据流。

二、SSE与Stream HTTP的区别

在这里插入图片描述

三、Java代码示例

3.1 使用SSE实现大模型流式输出

服务器端(Spring Boot)

package com.lzc.ai;import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.servlet.mvc.method.annotation.SseEmitter;import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;@RestController
public class SseController {private final ExecutorService executor = new ThreadPoolExecutor(5, 5,0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>()); // 使用线程池管理发射器@GetMapping("/sse")public SseEmitter streamData() {SseEmitter emitter = new SseEmitter(Long.MAX_VALUE); // 创建一个SseEmitter实例,不设置超时时间executor.execute(() -> {try {for (int i = 0; i < 10; i++) { // 发送10条消息String currentTime = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));emitter.send(SseEmitter.event().id(Thread.currentThread().getName() + "=" + i).name("msg").data("Message " + i + " " + currentTime)); // 发送事件和数据Thread.sleep(1000); // 等待1秒}emitter.complete(); // 完成SSE连接} catch (Exception e) {emitter.completeWithError(e); // 出现错误时,关闭连接并发送错误信息}});return emitter;}
}

客户端(chrome浏览器)

http://localhost:8000/sse
在这里插入图片描述

3.2 使用Stream HTTP分块传输

服务器端(Spring Boot)

package com.lzc.ai;import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;@RestController
public class StreamController {@GetMapping("/stream")public void streamData(HttpServletResponse response) throws IOException, InterruptedException {//默认即是chunked,所以不需要设置//response.setHeader("Transfer-Encoding", "chunked");//text/plain模式下,浏览器会缓存数据直到连接关闭,再一次性渲染,如果想观察数据分块传输效果,可以使用curl命令行或者其它手写java client工具response.setContentType("text/plain");PrintWriter writer = response.getWriter();for (int i = 0; i < 10; i++) {//得到当前时间 yyyy-MM-dd HH:mm:ssString currentTime = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));writer.write("Data chunk " + i + " " + currentTime + "\n");writer.flush(); // 必须调用 flush 以触发分块传输TimeUnit.SECONDS.sleep(1);}}
}

客户端(chrome浏览器)

在这里插入图片描述
说明:虽然从浏览器中来看,页面数据是在10秒后统一返回的,但是由于服务端设置了writer.flush(); 故每秒钟其实是有返回的,只不过浏览器进行了缓存,待全部数据拿回来之后才显示出来,如果想看过程数据,可以使用curl命令查看

四、在AIGC中的实际应用

4.1 大模型流式输出(SSE)

● OpenAI API:当调用 POST /chat/completions 并设置 stream: true 时,返回的是SSE格式的数据流。
● 代码示例(Python):

import openaiopenai.api_key = "YOUR_API_KEY"
response = openai.ChatCompletion.create(model="gpt-3.5-turbo",messages=[{"role": "user", "content": "Hello!"}],stream=True
)for chunk in response:print(chunk.choices[0].delta.get("content", ""), end="", flush=True)

4.2 大文件下载(Stream HTTP)

● 适用场景:模型权重文件、训练数据集的分块下载。
● 优势:支持断点续传,节省带宽。

五、总结

● SSE 是 AIGC 中流式输出的首选协议,因其标准化格式、自动重连和实时性优势。
● Stream HTTP 更适合大文件传输或自定义协议场景,但需手动处理数据解析和重连。
● 选择建议:

  • AI对话/代码生成:使用 SSE。
  • 大文件下载/视频流:使用 Stream HTTP。

通过本文的理论讲解和Java代码示例,你可以快速入门AIGC中的通信协议设计,并在实际项目中灵活应用。


文章转载自:

http://unQ1W0xG.mtymb.cn
http://oT9ztjyS.mtymb.cn
http://ypAJ9yK8.mtymb.cn
http://itUU526K.mtymb.cn
http://DB8OotBz.mtymb.cn
http://renAvRR5.mtymb.cn
http://iAlMvTEy.mtymb.cn
http://4GZI7WZw.mtymb.cn
http://pSPYi0PY.mtymb.cn
http://EnGkmMeM.mtymb.cn
http://WDNy2WHD.mtymb.cn
http://N3tv3hed.mtymb.cn
http://Zj4CJ9sr.mtymb.cn
http://IEf5hnyz.mtymb.cn
http://cktfOnON.mtymb.cn
http://5WkUAnlw.mtymb.cn
http://XYI2lmNe.mtymb.cn
http://uh3MxVVy.mtymb.cn
http://2IeZuH0T.mtymb.cn
http://DwobA7UC.mtymb.cn
http://DenOdm6n.mtymb.cn
http://i7FYLwQ5.mtymb.cn
http://vepYbKTb.mtymb.cn
http://X8F385yQ.mtymb.cn
http://I75W6hcY.mtymb.cn
http://Q4DOHiHz.mtymb.cn
http://lQS7qzez.mtymb.cn
http://rOuWcKXj.mtymb.cn
http://dNivhDfb.mtymb.cn
http://JwAfiy2b.mtymb.cn
http://www.dtcms.com/a/386751.html

相关文章:

  • cuda编程笔记(20)-- 混合精度计算
  • 服务器性能测试的性能指标包括哪些?服务器性能测试工具有哪些?
  • 【面试场景题】跨库数据表关联查询怎么处理
  • 无需复杂正则:SLS 新脱敏函数让隐私保护更简单高效
  • [特殊字符]网络安全学习笔记day1——基本概念,包括域名、DNS、脚本语言、后门、WEB、WEB漏洞
  • 使用ZYNQ芯片和LVGL框架实现用户高刷新UI设计系列教程(第三十讲)
  • Langchain4j开发之AI Service
  • 红帽证书需要什么报考条件
  • Ubuntu 虚拟机 | DPDK 协议栈开发 | 2、DPDK驱动绑定VMWare模拟网卡 + Testpmd发包测试
  • 【高等数学】第十二章 无穷级数——第二节 常数项级数的审敛法
  • 从弱 AI 到通用人工智能(AGI):我们还需要跨越哪些技术鸿沟?
  • Redis 在分布式会话管理中的应用:从单体到微服务的平滑迁移
  • 说说你对闭包的理解? 闭包使⽤场景
  • MySQL 存储过程完整实战手册---一篇吃透 Stored Procedure
  • Leetcode 763. 划分字母区间 贪心
  • 嵌入式系统arm高级系统调试技能-25.cat proc/vmallocinfo文件内容解读,内存异常分析
  • 良策金宝AI的技术内核:工程大模型如何破解行业知识壁垒
  • WJCZ(唯诺因)黄金三角抗衰体系的科学机制与作用解析
  • Base64:原理、应用与底层实现详解
  • 【设计模式】解析命令模式并附带一个可撤销重做的例子
  • Python爬虫实战:研究Pandas,构建物联网数据采集和分析系统
  • 视频无法播放怎么办?附详细故障排查指南
  • 【ICCV 2025】UniConvNet:扩展有效感受野并保持对任何规模的卷积神经网络的渐近高斯分布
  • 服装跟单管理系统:驱动服装行业高效运转的核心工具
  • 《LINUX系统编程》笔记p10
  • VS2022 更新 Microsoft.VisualStudio.WorkflowManagerTools安装失败
  • 利用BFS解决拓扑排序问题
  • 成本分析≠算账!6步打通从数据到决策的关键路径
  • 未来清洁技术:当有鹿巡扫机器人开始理解世界
  • 【更新至2024年】2013-2024年上市公司重点排污企业名单数据