Fetch处理大模型流式数据请求与解析

为什么有的大模型可以一次返回多个 data

  1. Server-Sent Events (SSE):允许服务器连续发送多个 data: 行,每个代表一个独立的数据块。

  2. 流式响应:大模型服务通常以流式响应方式返回数据,提高响应速度。

  3. 批量处理:服务器可能将多个数据块打包发送,减少网络开销。

一、问题分析

从上图中只能简易看出这种数据特点前两个特点:
  • 分段返回
  • 每段有多条类似json数据
  • 每段的最后一条json数据有可能不完整

 二、解决方案

/*** 异步函数 fetchEventGpt,用于向服务器发送获取 GPT 数据的请求** @param data 要发送的数据对象* @returns 返回响应体内容*/
const fetchEventGpt = async (data: any) => {const response = await fetch('/getGPT', {method: 'Post',headers: { 'Content-Type': 'application/json' },body: JSON.stringify(data),})// 等待直到请求完成console.log(response)return response.body
}/*** 异步解析流数据并返回 Response 对象。** 该函数通过 fetchEventGpt 发送请求,获取 ReadableStream 流数据,然后通过 ReadableStream API 进行解析。* 解析过程中,会将流数据分片并尝试解析 JSON 对象,处理可识别内容,并将结果通过 controller.enqueue 返回。* 如果解析结束,会清空缓存区并关闭连接。** @return {Response} Response 对象,包含解析后的流数据*/
const parseStream = async () => {const response = await fetchEventGpt({messages: [{role: 'user',content: '核能',},{role: 'assistant',content:'<br/>根据您提供的文章内容,以下是对“核能”的相关信息的整理:<br/><br/>1. 知识产权归属 :本文件及其附件的知识产权属于核电运行研究(上海)有限公司和中核()供应链管理有限公司,未经书面许可不得擅自使用。<br/><br/>2. 民用核设施事故责任 :根据《民法典》第一千二百三十七条,民用核设施或运入运出核设施的核材料发生事故造成他人损害的,营运单位应承担侵权责任。但是,如果损害是由战争、武装冲突、暴乱等情形或者受害人故意造成的,则营运单位不承担责任。<br/><br/>3. 招标代理机构招标人 :本次招标的代理机构为中核(上海)供应链管理有限公司,招标人为核电运行研究(上海)有限公司。<br/><br/>4. 招标投标系统检测 :根据第九条,实验室应按照《招标投标系统检测技术规范》等进行检测,检测内容包括数据项、业务规则、功能、接口、性能、安全性、可靠性、易用性、运行环境等,并对相关文档进行审核。<br/><br/>5. 招标项目目标 :项目的目标是突破微波干燥处理核电厂放射性废物的关键技术,研制微波干燥成套装备,解决核电厂放射性废物处理难题。<br/><br/>6. 投标文件提交方式 :电子投标文件应通过中核集团电子采购平台提交,纸质版投标文件提交地点为中核(上海)供应链管理有限公司。<br/><br/>以上内容涉及核能相关的法律法规、招标流程、技术规范等方面,希望能对您。 ',},{role: 'user',content: '核能',},],classify: '',}).catch(() => {return new Error('请求失败')})if (!(response instanceof ReadableStream)) {return new Error('请求失败')}const reader = response.getReader() as anyconst decoder = new TextDecoder('utf-8')const encoder = new TextEncoder()let jsonBuffer = ''const readableStream = new ReadableStream({async start(controller) {function push() {reader.read().then(({ done, value }: any) => {if (done) {controller.close()return}// 1、流返回的块数据const chunk = decoder.decode(value, { stream: true })// 2、更新到缓存区jsonBuffer += chunk// 3、尝试分片解析jsonlet boundaryIndex = 0// 当前片内容let result = ''while ((boundaryIndex = jsonBuffer.indexOf('\n')) >= 0) {// 3.1 数据块切片const jsonString = jsonBuffer.slice(0, boundaryIndex)// 3.2 更新缓存区jsonBuffer = jsonBuffer.slice(boundaryIndex + 2)try {const jsonStr = jsonString.replace('data:', '')const jsonObject = JSON.parse(jsonStr) // 解析 JSON// 处理可识别内容 - 伪代码,根据实际对象处理const content = jsonObject?.data?.contentcontroller.enqueue(encoder.encode(content))// 解析结束 - 我们业务是根据此字段标识,根据实际情况调整if (jsonObject?.data?.isEnd === true) {// 清空缓存区jsonBuffer = ''break}} catch (error) {console.log('json解析出错', error)}}if (jsonBuffer) {try {const jsonObject = JSON.parse(jsonBuffer)} catch (error) {console.log(error)}}push()}).catch((err: any) => {controller.error(err)})}push()},})return new Response(readableStream)
}

 三、解析之后的结果

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/497956.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

怎么在电脑桌面上设置备忘录,桌面工作提醒小工具哪个好?

在现代的工作和生活中&#xff0c;我们经常需要记录重要的事项和提醒。而在电脑上设置备忘录&#xff0c;无疑是最方便和有效的方法之一。那么&#xff0c;怎么在电脑桌面上设置备忘录&#xff1f;又有哪个工作提醒小工具值得推荐呢&#xff1f; 以Windows系统为例&#xff0c…

EasyExcel简介和读写操作

EasyExcel简介 官网地址&#xff1a;EasyExcel官方文档 - 基于Java的Excel处理工具 | Easy Excel 官网 EasyExcel 的主要特点如下&#xff1a; 1、高性能&#xff1a;EasyExcel 采用了异步导入导出的方式&#xff0c;并且底层使用 NIO 技术实现&#xff0c;使得其在导入导出大…

【网络协议】路由信息协议 (RIP)

未经许可&#xff0c;不得转载。 路由信息协议&#xff08;Routing Information Protocol&#xff0c;简称 RIP&#xff09;是一种使用跳数&#xff08;hop count&#xff09;作为路由度量标准的路由协议&#xff0c;用于确定源网络和目标网络之间的最佳路径。 文章目录 什么是…

MySQL5.7.26-Linux-安装(2024.12)

文章目录 1.下载压缩包1.访问MySQL版本归档2.找到5.7.26并下载3.百度网盘 2.Linux安装1.卸载原来的MySQL8.0.26&#xff08;如果没有则无需在意&#xff09;1.查看所有mysql的包2.批量卸载3.删除残留文件**配置文件**&#xff08;默认路径&#xff09;&#xff1a; 4.**验证卸载…

《云原生安全攻防》-- K8s安全配置:CIS安全基准与kube-bench工具

在本节课程中&#xff0c;我们来了解一下K8s集群的安全配置&#xff0c;通过对CIS安全基准和kube-bench工具的介绍&#xff0c;可以快速发现K8s集群中不符合最佳实践的配置项&#xff0c;及时进行修复&#xff0c;从而来提高集群的安全性。 在这个课程中&#xff0c;我们将学习…

Flink源码解析之:如何根据算法生成StreamGraph过程

Flink源码解析之&#xff1a;如何根据算法生成StreamGraph过程 在我们日常编写Flink应用的时候&#xff0c;会首先创建一个StreamExecutionEnvironment.getExecutionEnvironment()对象&#xff0c;在添加一些自定义处理算子后&#xff0c;会调用env.execute来执行定义好的Flin…

RoboMIND:多体现基准 机器人操纵的智能规范数据

我们介绍了 RoboMIND&#xff0c;这是机器人操纵的多体现智能规范数据的基准&#xff0c;包括 4 个实施例、279 个不同任务和 61 个不同对象类别的 55k 真实世界演示轨迹。 工业机器人企业 埃斯顿自动化 | 埃夫特机器人 | 节卡机器人 | 珞石机器人 | 法奥机器人 | 非夕科技 | C…

sentinel集成nacos启动报[check-update] get changed dataId error, code: 403错误排查及解决

整合nacos报403错误 因为平台写的一个限流代码逻辑有问题&#xff0c;所以准备使用sentinel来限流。平台依赖里面已经引入了&#xff0c;之前也测试过&#xff0c;把sentinel关于nacos的配置加上后&#xff0c;启动一直输出403错误 [fixed-10.0.20.188_8848-test] [check-upda…

【Redis】 数据淘汰策略

面试官询问缓存过多而内存有限时内存被占满的处理办法&#xff0c;引出 Redis 数据淘汰策略。 数据淘汰策略与数据过期策略不同&#xff0c; 过期策略针对设置过期时间的 key 删除&#xff0c; 淘汰策略是在内存不够时按规则删除内存数据。 八种数据淘汰策略介绍 no evision&…

【畅购商城】详情页模块之评论

目录 接口 分析 后端实现&#xff1a;JavaBean 后端实现 前端实现 接口 GET http://localhost:10010/web-service/comments/spu/2?current1&size2 { "code": 20000, "message": "查询成功", "data": { "impressions&q…

Kafka高性能设计

高性能设计概述 Kafka高性能是多方面协同的结果&#xff0c;包括集群架构、分布式存储、ISR数据同步及高效利用磁盘和操作系统特性等。主要体现在消息分区、顺序读写、页缓存、零拷贝、消息压缩和分批发送六个方面。 消息分区 存储不受单台服务器限制&#xff0c;能处理更多数据…

HTML——13.超链接

<!DOCTYPE html> <html><head><meta charset"UTF-8"><title>超链接</title></head><body><!--超链接:从一个网页链接到另一个网页--><!--语法&#xff1a;<a href"淘宝网链接的地址"> 淘宝…

LVS 负载均衡原理 | 配置示例

注&#xff1a;本文为 “ LVS 负载均衡原理 | 配置” 相关文章合辑。 部分内容已过时&#xff0c;可以看看原理实现。 使用 LVS 实现负载均衡原理及安装配置详解 posted on 2017-02-12 14:35 肖邦 linux 负载均衡集群是 load balance 集群的简写&#xff0c;翻译成中文就是负…

Docker 快速搭建 GBase 8s数据库服务

1.查看Gbase 8s镜像版本 可以去到docker hub网站搜索&#xff1a;gbase8s liaosnet/gbase8s如果无法访问到该网站&#xff0c;可以通过docker search搜索 docker search gbase8s2.拉取Gbase 8s镜像 以下演示的版本是目前官网最新版本Gbase8sV8.8_3.5.1 docker pull liaosn…

使用Lodash工具库的orderby和sortby进行排序的区别

简介 _.orderBy 和 _.sortBy 是 Lodash 库中用于排序数组的两个函数。 区别 _.orderBy 允许你指定一个或多个属性来排序&#xff0c;并为每个属性指定排序方向&#xff08;升序或降序&#xff09;。默认所有值为升序排&#xff0c;指定为"desc" 降序&#xff0c…

uniapp中Nvue白屏问题 ReferenceError: require is not defined

uniapp控制台输出如下 exception function:createInstanceContext, exception:white screen cause create instanceContext failed,check js stack ->Uncaught ReferenceError: require is not defined 或者 exception function:createInstanceContext, exception:white s…

STM32-笔记16-定时器中断点灯

一、实验目的 使用定时器 2 进行中断点灯&#xff0c;500ms LED 灯翻转一次。 二&#xff0c;定时器溢出时间计算 Tout&#xff1a;定时器溢出时间 Ft&#xff1a;定时器的时钟源频率 ARR&#xff1a;自动重装载寄存器的值&#xff08;可设置ARR从0开始&#xff0c;但是计数到…

Visual Studio 使用 GitHub Copilot 与 IntelliCode 辅助编码 【AI辅助开发系列】

&#x1f380;&#x1f380;&#x1f380;【AI辅助编程系列】&#x1f380;&#x1f380;&#x1f380; Visual Studio 使用 GitHub Copilot 与 IntelliCode 辅助编码Visual Studio 安装和管理 GitHub CopilotVisual Studio 使用 GitHub Copilot 扩展Visual Studio 使用 GitHu…

【数据结构】数据结构整体大纲

数据结构用来干什么的&#xff1f;很简单&#xff0c;存数据用的。 &#xff08;这篇文章仅介绍数据结构的大纲&#xff0c;详细讲解放在后面的每一个章节中&#xff0c;逐个击破&#xff09; 那为什么不直接使用数组、集合来存储呢 ——> 如果有成千上亿条数据呢&#xff…

开放世界目标检测 Grounding DINO

开放世界目标检测 Grounding DINO flyfish Grounding DINO 是一种开创性的开放集对象检测器&#xff0c;它通过结合基于Transformer的检测器DINO与基于文本描述的预训练技术&#xff0c;实现了可以根据人类输入&#xff08;如类别名称或指代表达&#xff09;检测任意对象的功…