大模型流式调用规范(SSE)
随着大语言模型的广泛应用,如何高效地与其进行接口调用成为一个关键问题。传统的请求-响应模式在面对大模型生成大量文本时存在响应延迟高、用户体验差等问题。流式输出(Streaming)是解决该问题的重要手段。
本文将介绍基于 Server-Sent Events(SSE) 协议的大模型流式调用规范,并结合 Spring Boot 给出一个完整的服务端与客户端调用示例。
一、为什么选择SSE?
在与大模型进行对话时,模型通常会逐字逐句生成内容。如果采用传统的HTTP请求,需要等到模型生成完所有内容再响应给客户端,导致延迟较高。而使用SSE协议,可以做到边生成边推送,极大提升交互性和用户体验。
SSE的优势:
单向连接:服务端主动推送,客户端自动接收;
使用HTTP协议,浏览器原生支持;
实现简单,适用于流式文本输出场景。
二、流式调用接口规范(基于SSE)
请求方式
方法:POST
Content-Type:application/json
Accept:text/event-stream
请求示例
POST /chat/stream
{
"prompt": "你好,请介绍一下三国演义。",
"stream": true
}
响应格式(SSE流)
data: {"id":"msg_001","content":"三国演义是中国古代四大名著之一..."}
data: {"id":"msg_001","content":"它讲述了东汉末年群雄割据的故事..."}
data: [DONE]
每行以
data:
开头,后接JSON字符串;最后一行以
data: [DONE]
表示流结束;客户端需要实时解析接收到的
content
字段并展示。
三、Spring Boot服务端示例
下面是一个基于Spring Boot的SSE流式接口实现示例。
1. Controller层
@RestController
@RequestMapping("/chat")
public class ChatController { @PostMapping(value = "/stream", produces = MediaType.TEXT_EVENT_STREAM_VALUE)
public SseEmitter streamChat(@RequestBody ChatRequest request) {
SseEmitter emitter = new SseEmitter(0L); // 不设置超时时间 CompletableFuture.runAsync(() -> {
try {
// 模拟逐句生成的响应
List<String> responses = mockModelResponse(request.getPrompt()); for (String sentence : responses) {
Map<String, String> data = new HashMap<>();
data.put("id", "msg_001");
data.put("content", sentence); emitter.send(SseEmitter.event()
.data(new ObjectMapper().writeValueAsString(data))); Thread.sleep(500); // 模拟生成延迟
} emitter.send("data: [DONE]\n\n");
emitter.complete();
} catch (Exception e) {
emitter.completeWithError(e);
}
}); return emitter;
} private List<String> mockModelResponse(String prompt) {
return List.of(
"三国演义是中国古代四大名著之一。",
"它讲述了东汉末年群雄割据的故事。",
"主要人物包括刘备、关羽、张飞、曹操、孙权等。"
);
}
}
2. 请求类定义
public class ChatRequest {
private String prompt;
private boolean stream; // getters and setters
}
四、客户端调用示例(Java)
使用Spring WebFlux进行客户端流式接收:
WebClient client = WebClient.create(); client.post()
.uri("http://localhost:8080/chat/stream")
.header(HttpHeaders.ACCEPT, MediaType.TEXT_EVENT_STREAM_VALUE)
.bodyValue(Map.of("prompt", "介绍一下三国演义", "stream", true))
.retrieve()
.bodyToFlux(String.class)
.doOnNext(System.out::println)
.blockLast();
五、总结与建议
基于SSE的大模型流式调用,能显著提升响应速度与用户体验。在使用时需要注意:
SSE适合文字类输出,若涉及音频/图片等内容建议使用WebSocket;
服务端处理时需考虑异常与资源释放;
客户端需具备实时处理与拼接能力。
大模型流式调用规范(SSE)的更多相关文章
- PowerDesigner 学习:十大模型及五大分类
个人认为PowerDesigner 最大的特点和优势就是1)提供了一整套的解决方案,面向了不同的人员提供不同的模型工具,比如有针对企业架构师的模型,有针对需求分析师的模型,有针对系统分析师和软件架构师 ...
- PowerDesigner 15学习笔记:十大模型及五大分类
个人认为PowerDesigner 最大的特点和优势就是1)提供了一整套的解决方案,面向了不同的人员提供不同的模型工具,比如有针对企业架构师的模型,有针对需求分析师的模型,有针对系统分析师和软件架构师 ...
- 无插件的大模型浏览器Autodesk Viewer开发培训-武汉-2014年8月28日 9:00 – 12:00
武汉附近的同学们有福了,这是全球第一次关于Autodesk viewer的教室培训. :) 你可能已经在各种场合听过或看过Autodesk最新推出的大模型浏览器,这是无需插件的浏览器模型,支持几十种数 ...
- 洛谷P4014 分配问题【最小/大费用流】题解+AC代码
洛谷P4014 分配问题[最小/大费用流]题解+AC代码 题目描述 有 n 件工作要分配给 n 个人做.第 i 个人做第 j 件工作产生的效益为c ij. 试设计一个将 n 件工作分配给 n 个人做的 ...
- 华为高级研究员谢凌曦:下一代AI将走向何方?盘古大模型探路之旅
摘要:为了更深入理解千亿参数的盘古大模型,华为云社区采访到了华为云EI盘古团队高级研究员谢凌曦.谢博士以非常通俗的方式为我们娓娓道来了盘古大模型研发的"前世今生",以及它背后的艰难 ...
- 文心大模型api使用
文心大模型api使用 首先,我们要获取硅谷社区的连个key 复制两个api备用 获取Access Token 获取access_token示例代码 之后就会输出 作文创作 作文创作:作文创作接口基于文 ...
- AI大模型学习了解
# 百度文心 上线时间:2019年3月 官方介绍:https://wenxin.baidu.com/ 发布地点: 参考资料: 2600亿!全球最大中文单体模型鹏城-百度·文心发布 # 华为盘古 上线时 ...
- 千亿参数开源大模型 BLOOM 背后的技术
假设你现在有了数据,也搞到了预算,一切就绪,准备开始训练一个大模型,一显身手了,"一朝看尽长安花"似乎近在眼前 -- 且慢!训练可不仅仅像这两个字的发音那么简单,看看 BLOOM ...
- DeepSpeed Chat: 一键式RLHF训练,让你的类ChatGPT千亿大模型提速省钱15倍
DeepSpeed Chat: 一键式RLHF训练,让你的类ChatGPT千亿大模型提速省钱15倍 1. 概述 近日来,ChatGPT及类似模型引发了人工智能(AI)领域的一场风潮. 这场风潮对数字世 ...
- 【ASP.NET Core】MVC模型绑定:非规范正文内容的处理
本篇老周就和老伙伴们分享一下,对于客户端提交的不规范 Body 如何做模型绑定.不必多说,这种情况下,只能自定义 ModelBinder 了.而且最佳方案是不要注册为全局 Binder--毕竟这种特殊 ...
随机推荐
- 第8章 LINQ 查询
第8章 LINQ 查询 8.2 流式语法 8.2.2 使用 Lambda 表达式 常用运算符 Where() 筛选器 Order() 排序器 Select() 映射器 Take() 获取前 x 个元素 ...
- galaxy特色胡思乱想
有没有什么办法,让我不伤害任何人,什么也不破坏,被判死刑.我觉得这样比我紫砂要好的多. 我所可怜的是神不能紫砂.--芥川龙之介<某傻子的一生>
- linux下创建idea的桌面快捷方式
!!!使用linux系统安装idea才会用到: 在桌面上,新建文件,命名为:idea.desktop , (或者在别的地方创建后再放到桌面) 使用 vim 编辑该文件(或者不新建,直接vi idea. ...
- FLink09的RichFlatMap和RichMap使用
一.数据源配置 pom文件:https://www.cnblogs.com/robots2/p/16048648.html 二.RichFlatMap代码,输入单行输出多行 package net.x ...
- EasyExcel 通过模板填充数据
EasyExcel 通过模板填充数据两种方式:1.直接通过模板填充.2.通过IO流填充. 模板示例 注意:单个字段填充只写字段名即可,数据集填充需要在字段前加 . {title} 姓名 昵称 手机号 ...
- Netty - [01] 概述
题记部分 一.介绍 Netty 是由JBOSS提供的一个Java开源框架,现为Github上的独立项目. Netty是一个异步的.基于事件驱动的网络应用框架,用以快速开发高性能.高可靠性的网络I/O程 ...
- Spark core 总结
Spark RDD五大特性 1.RDD由一组partition组成 2.每一个分区由一个task来处理 3.RDD之间有一些列依赖关系 4.分区类算子必须作用在kv格式得RDD上 5.spark为ta ...
- WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
开源项目名称:leagueoflegends-OpenSilver 作者:Vicky&James leagueoflegends-opensilver:https://github.com/j ...
- CF889E题解
\(\text{Problem - 889E - Codeforces}\) \(\text{*3000}\) 修正 感谢学长 \(\text{fs}\) 指出状态数原因解释的错误. 题意 给一个序列 ...
- postman 提示Http Status 400 -Bad Request
Http Status 400 -Bad Request 将headers下面的选项全部勾选 新版postman自带的内容