随着大语言模型的广泛应用,如何高效地与其进行接口调用成为一个关键问题。传统的请求-响应模式在面对大模型生成大量文本时存在响应延迟高、用户体验差等问题。流式输出(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)的更多相关文章

  1. PowerDesigner 学习:十大模型及五大分类

    个人认为PowerDesigner 最大的特点和优势就是1)提供了一整套的解决方案,面向了不同的人员提供不同的模型工具,比如有针对企业架构师的模型,有针对需求分析师的模型,有针对系统分析师和软件架构师 ...

  2. PowerDesigner 15学习笔记:十大模型及五大分类

    个人认为PowerDesigner 最大的特点和优势就是1)提供了一整套的解决方案,面向了不同的人员提供不同的模型工具,比如有针对企业架构师的模型,有针对需求分析师的模型,有针对系统分析师和软件架构师 ...

  3. 无插件的大模型浏览器Autodesk Viewer开发培训-武汉-2014年8月28日 9:00 – 12:00

    武汉附近的同学们有福了,这是全球第一次关于Autodesk viewer的教室培训. :) 你可能已经在各种场合听过或看过Autodesk最新推出的大模型浏览器,这是无需插件的浏览器模型,支持几十种数 ...

  4. 洛谷P4014 分配问题【最小/大费用流】题解+AC代码

    洛谷P4014 分配问题[最小/大费用流]题解+AC代码 题目描述 有 n 件工作要分配给 n 个人做.第 i 个人做第 j 件工作产生的效益为c ij. 试设计一个将 n 件工作分配给 n 个人做的 ...

  5. 华为高级研究员谢凌曦:下一代AI将走向何方?盘古大模型探路之旅

    摘要:为了更深入理解千亿参数的盘古大模型,华为云社区采访到了华为云EI盘古团队高级研究员谢凌曦.谢博士以非常通俗的方式为我们娓娓道来了盘古大模型研发的"前世今生",以及它背后的艰难 ...

  6. 文心大模型api使用

    文心大模型api使用 首先,我们要获取硅谷社区的连个key 复制两个api备用 获取Access Token 获取access_token示例代码 之后就会输出 作文创作 作文创作:作文创作接口基于文 ...

  7. AI大模型学习了解

    # 百度文心 上线时间:2019年3月 官方介绍:https://wenxin.baidu.com/ 发布地点: 参考资料: 2600亿!全球最大中文单体模型鹏城-百度·文心发布 # 华为盘古 上线时 ...

  8. 千亿参数开源大模型 BLOOM 背后的技术

    假设你现在有了数据,也搞到了预算,一切就绪,准备开始训练一个大模型,一显身手了,"一朝看尽长安花"似乎近在眼前 -- 且慢!训练可不仅仅像这两个字的发音那么简单,看看 BLOOM ...

  9. DeepSpeed Chat: 一键式RLHF训练,让你的类ChatGPT千亿大模型提速省钱15倍

    DeepSpeed Chat: 一键式RLHF训练,让你的类ChatGPT千亿大模型提速省钱15倍 1. 概述 近日来,ChatGPT及类似模型引发了人工智能(AI)领域的一场风潮. 这场风潮对数字世 ...

  10. 【ASP.NET Core】MVC模型绑定:非规范正文内容的处理

    本篇老周就和老伙伴们分享一下,对于客户端提交的不规范 Body 如何做模型绑定.不必多说,这种情况下,只能自定义 ModelBinder 了.而且最佳方案是不要注册为全局 Binder--毕竟这种特殊 ...

随机推荐

  1. 第8章 LINQ 查询

    第8章 LINQ 查询 8.2 流式语法 8.2.2 使用 Lambda 表达式 常用运算符 Where() 筛选器 Order() 排序器 Select() 映射器 Take() 获取前 x 个元素 ...

  2. galaxy特色胡思乱想

    有没有什么办法,让我不伤害任何人,什么也不破坏,被判死刑.我觉得这样比我紫砂要好的多. 我所可怜的是神不能紫砂.--芥川龙之介<某傻子的一生>

  3. linux下创建idea的桌面快捷方式

    !!!使用linux系统安装idea才会用到: 在桌面上,新建文件,命名为:idea.desktop , (或者在别的地方创建后再放到桌面) 使用 vim 编辑该文件(或者不新建,直接vi idea. ...

  4. FLink09的RichFlatMap和RichMap使用

    一.数据源配置 pom文件:https://www.cnblogs.com/robots2/p/16048648.html 二.RichFlatMap代码,输入单行输出多行 package net.x ...

  5. EasyExcel 通过模板填充数据

    EasyExcel 通过模板填充数据两种方式:1.直接通过模板填充.2.通过IO流填充. 模板示例 注意:单个字段填充只写字段名即可,数据集填充需要在字段前加 . {title} 姓名 昵称 手机号 ...

  6. Netty - [01] 概述

    题记部分 一.介绍 Netty 是由JBOSS提供的一个Java开源框架,现为Github上的独立项目. Netty是一个异步的.基于事件驱动的网络应用框架,用以快速开发高性能.高可靠性的网络I/O程 ...

  7. Spark core 总结

    Spark RDD五大特性 1.RDD由一组partition组成 2.每一个分区由一个task来处理 3.RDD之间有一些列依赖关系 4.分区类算子必须作用在kv格式得RDD上 5.spark为ta ...

  8. WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战

    开源项目名称:leagueoflegends-OpenSilver 作者:Vicky&James leagueoflegends-opensilver:https://github.com/j ...

  9. CF889E题解

    \(\text{Problem - 889E - Codeforces}\) \(\text{*3000}\) 修正 感谢学长 \(\text{fs}\) 指出状态数原因解释的错误. 题意 给一个序列 ...

  10. postman 提示Http Status 400 -Bad Request

    Http Status 400 -Bad Request 将headers下面的选项全部勾选 新版postman自带的内容