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

uniapp 小程序如何实现大模型流式交互?前端SSE技术完整实现解析

文章目录

  • 一、背景概述
  • 二、核心流程图解
  • 三、代码模块详解
    • 1. UTF-8解码器(处理二进制流)
    • 2. 请求控制器(核心通信模块)
    • 3. 流式请求处理器(分块接收)
    • 4. 数据解析器(处理SSE格式)
    • 5. 回调处理三剑客
  • 四、关键问题解决方案
    • 1. 乱码问题处理
    • 2. 数据截断问题
    • 3. 性能优化建议
  • 五、扩展思考
    • 1. 为什么要用SSE而不是WebSocket?
    • 2. 流量控制策略
  • 六、完整技术栈推荐

一、背景概述

在大模型应用中,流式响应技术(Server-Sent Events, SSE)能显著提升用户体验。本文将以代码为核心,讲解基于uni-app框架的流式交互完整实现方案,涵盖数据接收、解码、解析全流程。


二、核心流程图解

用户输入
构建请求体
发送SSE请求
接收数据块
二进制解码
数据清洗
解析JSON
提取内容
实时渲染

三、代码模块详解

1. UTF-8解码器(处理二进制流)

decodeUTF8(data) {// 将二进制数据转为Uint8数组const uint8Array = new Uint8Array(data);// 传统方式转换字符串(兼容旧环境)let string = '';for (let i = 0; i < uint8Array.length; i++) {string += String.fromCharCode(uint8Array[i]);}// 双重解码处理特殊字符(如中文)return decodeURIComponent(escape(string));
}

关键点说明:

  • Uint8Array:将原始二进制数据转为可操作数组
  • escape():将字符串转义为ASCII字符
  • decodeURIComponent:解析URI编码内容(等效于UTF-8解码)

2. 请求控制器(核心通信模块)

getContent() {const sendContent = {"messages": [{"role": "user","content": this.content,}],"section_id": this.id,"token": this.token}// 显示等待状态this.waitingForResponse = true;// 发起流式请求this.streamPost('/api/xxx/xxx', sendContent, this.onDataReceived, this.onError, this.onComplete);
}

参数解析:

参数名类型说明
roleString角色标识(user/assistant)
contentString用户输入的提问内容
section_idNumber会话分区ID
tokenString用户身份验证令牌

3. 流式请求处理器(分块接收)

streamPost(url, data, onData, onError = null, onComplete = null) {const requestTask = uni.request({url: this.$baseUrl + url,method: 'POST',header: {'Accept': 'text/event-stream', // 声明接受事件流'token': uni.getStorageSync('token')},data,enableChunked: true, // 启用分块传输模式responseType: 'arraybuffer', // 接收二进制数据// 分块数据到达时触发success: (res) => { /*...*/ },// 注册分块接收监听器onChunkReceived: (res) => {const decodedData = this.decode(res.data);if (decodedData) {onData(decodedData); // 触发数据回调}}});
}

技术要点:

  • enableChunked: true:启用微信小程序分块接收能力
  • responseType: 'arraybuffer':确保正确处理二进制流
  • onChunkReceived:微信小程序特有分块事件监听

4. 数据解析器(处理SSE格式)

decode(data) {const text = this.decodeUTF8(data);const lines = text.split('\n');let result = '';for (let line of lines) {if (line.startsWith('data: ')) {const jsonData = line.slice(6).trim();// 结束标识处理if (jsonData === '[DONE]') return result;// 清理控制字符(防止JSON解析失败)const cleanedData = jsonData.replace(/[\u0000-\u001F\u007F-\u009F]/g, '');try {const parsedData = JSON.parse(cleanedData);// 提取AI生成内容result += parsedData.choices[0].delta.content || '';} catch (e) {console.error('解析失败:', e);}}}return result;
}

数据示例:

// 原始SSE数据格式
data: {"id":"chatcmpl-123","choices":[{"delta":{"content":"你好"}}]}// 解析后结果
"你好"

5. 回调处理三剑客

// 实时数据渲染
onDataReceived(data) {if (data.trim()) {this.displayText += data; // 增量更新显示内容this.resultCount = this.displayText.length; // 统计字数}
}// 异常处理
onError(error) {console.error('请求异常:', error);uni.showToast({ title: '服务响应异常', icon: 'none' });
}// 完成处理
onComplete() {this.waitingForResponse = false;console.log('会话结束');// 可添加历史记录存储等逻辑
}

四、关键问题解决方案

1. 乱码问题处理

  • 现象:接收到响啊类乱码
  • 解决方案
    1. 检查decodeUTF8是否被正确调用
    2. 验证服务端编码是否为UTF-8
    3. 替换解码方案为new TextDecoder().decode(uint8Array)

2. 数据截断问题

  • 现象:JSON解析报错Unexpected end of JSON input
  • 处理策略
    // 增加数据清洗步骤
    const cleanedData = jsonData.replace(/\n/g, '')      // 移除换行符.replace(/\u2028/g, '')  // 处理行分隔符.replace(/\u2029/g, ''); // 处理段落分隔符
    

3. 性能优化建议

// 使用文档片段批量更新
let fragment = '';
onDataReceived(data) {fragment += data;if (fragment.length > 100) { // 每100字符更新一次this.displayText += fragment;fragment = '';}
}

五、扩展思考

1. 为什么要用SSE而不是WebSocket?

  • SSE优势
    • 基于HTTP协议,无需额外握手
    • 自动重连机制
    • 更简单的服务端实现

2. 流量控制策略

// 节流处理(每500ms更新一次)
let updateTimer = null;
onDataReceived(data) {this.buffer += data;if (!updateTimer) {updateTimer = setTimeout(() => {this.displayText += this.buffer;this.buffer = '';updateTimer = null;}, 500);}
}

六、完整技术栈推荐

层级技术选型
前端框架Vue3 + uni-app
状态管理Pinia
HTTP库uni.request
数据格式JSON + SSE
部署环境微信小程序 + Web

通过以上实现方案,开发者可以构建出高可用的大模型流式交互系统。建议在实际项目中加入加载状态提示错误重试机制历史会话管理等功能模块,以提升完整用户体验。

相关文章:

uniapp 小程序如何实现大模型流式交互?前端SSE技术完整实现解析

文章目录 一、背景概述二、核心流程图解三、代码模块详解1. UTF-8解码器&#xff08;处理二进制流&#xff09;2. 请求控制器&#xff08;核心通信模块&#xff09;3. 流式请求处理器&#xff08;分块接收&#xff09;4. 数据解析器&#xff08;处理SSE格式&#xff09;5. 回调…...

因子分析详解:从理论到MATLAB实战

内容摘要&#xff1a; 本文系统解析因子分析的核心原理与MATLAB实战&#xff0c;涵盖数学模型、载荷矩阵估计、因子旋转及得分计算。通过上市公司盈利能力、消费者偏好等案例&#xff0c;演示数据标准化、因子提取与解释的全流程&#xff0c;并提供完整代码实现。深入对比因子分…...

【组态PLC】基于三菱西门子S7-200PLC和组态王液料混合系统组态设计【含PLC组态源码 M016期】

控制要求 总体控制要求&#xff1a;如面板图所示&#xff0c;本装置为三种液体混合模拟装置&#xff0c;由液面传感器SL1、SL2、SL3&#xff0c;液体A、B、C阀门与混合液阀门由电磁阀YV1、YV2、YV3、YV4&#xff0c;搅匀电机M&#xff0c;加热器H&#xff0c;温度传感器T组成。…...

js:根据后端返回的数组取出每一个数组的keyword字段然后拼接成一个逗号分隔的字符串

问&#xff1a; 现在有一个el-select&#xff0c; 后端接口返回数据为keyword:xxx,referenceNum:1,tagId:132sf32fasdfaf组成的数组&#xff0c; 现在select是多选&#xff0c; 但是但我选择多个下拉框选项后&#xff0c;后端需要前端返回的数据tagIds字段需要时一个字符串…...

基于大模型的肺纤维化预测及临床方案研究报告

目录 一、引言 1.1 研究背景与意义 1.2 研究目的与方法 二、大模型技术概述 2.1 大模型的基本原理 2.2 大模型在医疗领域的应用现状 三、肺纤维化相关知识 3.1 肺纤维化的病因与发病机制 3.2 肺纤维化的临床症状与诊断方法 3.3 肺纤维化的治疗现状与挑战 四、大模型…...

7. 【.NET 8 实战--孢子记账--从单体到微服务--转向微服务】--微服务基础工具与技术--Ocelot 网关--路由

路由是API网关的核心功能&#xff0c;对系统性能和可靠性至关重要。路由通过定义规则&#xff0c;将客户端请求准确地转发到相应的后端服务&#xff0c;确保请求能够正确处理&#xff0c;简化了微服务架构中的服务调用逻辑。有效的路由配置能够提高系统的灵活性和可维护性。 一…...

【GESP】C++二级模拟 luogu-b3995, [GESP 二级模拟] 小洛的田字矩阵

GESP二级模拟题&#xff0c;多层循环、分支语句练习&#xff0c;难度★✮☆☆☆。 题目题解详见&#xff1a;https://www.coderli.com/gesp-2-luogu-b3995/ 【GESP】C二级模拟 luogu-b3995, [GESP 二级模拟] 小洛的田字矩阵 | OneCoderGESP二级模拟题&#xff0c;多层循环、分…...

监督学习——基于线性回归的波士顿房价预测:理论、实践与评估

基于线性回归的波士顿房价预测:理论、实践与评估 文章目录 基于线性回归的波士顿房价预测:理论、实践与评估一、引言二、线性回归基础理论2.1 线性回归原理2.2 线性回归在房价预测中的应用逻辑三、波士顿房价数据集介绍3.1 数据集概述3.2 特征说明3.3 目标变量四、波士顿房价…...

Selenium 调用模型接口实现功能测试

要使用 Selenium 调用模型接口实现功能测试,可按以下步骤进行: 1. 环境准备 安装 Selenium:使用 pip install selenium 安装 Selenium 库。安装浏览器驱动:根据使用的浏览器(如 Chrome、Firefox 等)下载对应的驱动,并将其添加到系统的环境变量中。例如,Chrome 浏览器需…...

回调函数的用法

回调函数的基本用法 回调函数是一种被作为参数传递给另一个函数的函数&#xff0c;接收回调函数作为参数的函数在合适的时候会调用这个回调函数。回调函数为代码提供了更高的灵活性和可扩展性&#xff0c;下面为你详细介绍回调函数的基本用法。 基本概念 回调函数的核心在于函…...

springboot实现文件上传到华为云的obs

一、前言 有时在项目中需要使用一些存储系统来存储文件&#xff0c;那么当项目要接入obs作为存储系统时&#xff0c;就会利用obs来进行文件的上传下载&#xff0c;具体实现如下。 二、如何通过obs实现文件的上传下载&#xff1f; 1.添加相关的obs的maven依赖。 <dependency…...

南京布局产业园剖析:成都树莓集团的战略逻辑

在数字产业飞速发展的当下&#xff0c;成都树莓集团在南京布局产业园&#xff0c;这一举措蕴含着深刻的战略考量&#xff0c;是基于对市场环境、产业趋势以及自身发展需求的综合研判。 一、政策利好与发展机遇 南京作为长三角地区的重要城市&#xff0c;在数字经济发展方面享有…...

C++ QT 6.6.1 QCustomPlot的导入及使用注意事项和示例 | 关于高版本QT使用QCustomPlot报错问题解决的办法

C QT 6.6.1 QCustomPlot的导入及使用注意事项和示例 | 关于高版本QT使用QCustomPlot报错问题解决的办法 记录一下 qmake .pro文件的配置 QT core gui printsupportgreaterThan(QT_MAJOR_VERSION, 4): QT widgetsCONFIG c17# You can make your code fail to compil…...

【算法】哈希表详解

【算法】哈希表详解 1. 哈希表的基本概念2. 哈希表的优缺点3. 哈希表的实现方法4. 哈希表的应用场景5. 哈希表的性能优化6. 哈希表 vs 其他数据结构7. 总结 哈希表&#xff08;Hash Table&#xff09; 是一种高效的数据结构&#xff0c;用于存储键值对&#xff08;Key-Value Pa…...

【红队利器】单文件一键结束火绒6.0

关于我们 4SecNet 团队专注于网络安全攻防研究&#xff0c;目前团队成员分布在国内多家顶级安全厂商的核心部门&#xff0c;包括安全研究领域、攻防实验室等&#xff0c;汇聚了行业内的顶尖技术力量。团队在病毒木马逆向分析、APT 追踪、破解技术、漏洞分析、红队工具开发等多个…...

Docker小游戏 | 使用Docker部署star-battle太空飞船射击小游戏

Docker小游戏 | 使用Docker部署star-battle太空飞船射击小游戏 前言项目介绍项目简介项目预览二、系统要求环境要求环境检查Docker版本检查检查操作系统版本三、部署star-battle网页小游戏下载镜像创建容器检查容器状态检查服务端口安全设置四、访问star-battle网页小游戏五、总…...

【EB-06】SystemCreator dbc转arxml

SystemCreator dbc转arxml 1. SystemCreator 意义2. SystemCreator使用方法2.1 实现步骤2.2 参考官方文档方法1. SystemCreator 意义 EB Tresos 对dbc直接导入的支持不是很完善,dbc也不是AUTOSAR标准的数据库文件,EB建议所有通信矩阵通过ARXML交互比较合理(AUTOSAR定义的)…...

(0)阿里云大模型ACP-考试回忆

这两天通过了阿里云大模型ACP考试&#xff0c;由于之前在网上没有找到真题&#xff0c;导致第一次考试没有过&#xff0c;后面又重新学习了一遍文档才顺利通过考试&#xff0c;这两次考试内容感觉考试题目90%内容是覆盖的&#xff0c;后面准备分享一下每一章的考题&#xff0c;…...

按键精灵鹰眼中控:ios多设备管理工具

在当今数字化时代&#xff0c;高效管理多设备已成为许多企业和个人的迫切需求。无论是游戏多开、自动化测试&#xff0c;还是电商运营&#xff0c;如何同时操作多台设备并确保精准执行&#xff0c;一直是一个难题。现在&#xff0c;按键精灵的鹰眼群控功能为您提供了完美的解决…...

__对于初学者的CCS 汉化

IDE&#xff1a;Code Composer Studio 20.0.2 CCS安装后默认是英文&#xff0c;目前最新的20版其Help工具栏是没有安装软件包的选项。不过&#xff0c;想要汉化还有更简单的方法 安装插件 在左边找到扩展&#xff0c;然后在框内搜索Chinese&#xff0c;可以找到两个语言插件&am…...

golang循环变量捕获问题​​

在 Go 语言中&#xff0c;当在循环中启动协程&#xff08;goroutine&#xff09;时&#xff0c;如果在协程闭包中直接引用循环变量&#xff0c;可能会遇到一个常见的陷阱 - ​​循环变量捕获问题​​。让我详细解释一下&#xff1a; 问题背景 看这个代码片段&#xff1a; fo…...

【机器视觉】单目测距——运动结构恢复

ps&#xff1a;图是随便找的&#xff0c;为了凑个封面 前言 在前面对光流法进行进一步改进&#xff0c;希望将2D光流推广至3D场景流时&#xff0c;发现2D转3D过程中存在尺度歧义问题&#xff0c;需要补全摄像头拍摄图像中缺失的深度信息&#xff0c;否则解空间不收敛&#xf…...

el-switch文字内置

el-switch文字内置 效果 vue <div style"color:#ffffff;font-size:14px;float:left;margin-bottom:5px;margin-right:5px;">自动加载</div> <el-switch v-model"value" active-color"#3E99FB" inactive-color"#DCDFE6"…...

数据链路层的主要功能是什么

数据链路层&#xff08;OSI模型第2层&#xff09;的核心功能是在相邻网络节点&#xff08;如交换机、主机&#xff09;间提供可靠的数据帧传输服务&#xff0c;主要职责包括&#xff1a; &#x1f511; 核心功能详解&#xff1a; 帧封装与解封装 封装&#xff1a; 将网络层下发…...

DBAPI如何优雅的获取单条数据

API如何优雅的获取单条数据 案例一 对于查询类API&#xff0c;查询的是单条数据&#xff0c;比如根据主键ID查询用户信息&#xff0c;sql如下&#xff1a; select id, name, age from user where id #{id}API默认返回的数据格式是多条的&#xff0c;如下&#xff1a; {&qu…...

大模型多显卡多服务器并行计算方法与实践指南

一、分布式训练概述 大规模语言模型的训练通常需要分布式计算技术,以解决单机资源不足的问题。分布式训练主要分为两种模式: 数据并行:将数据分片到不同设备,每个设备拥有完整的模型副本 模型并行:将模型分割到不同设备,每个设备处理部分模型计算 现代大模型训练通常结合…...

C++ Visual Studio 2017厂商给的源码没有.sln文件 易兆微芯片下载工具加开机动画下载。

1.先用Visual Studio 2017打开Yichip YC31xx loader.vcxproj&#xff0c;再用Visual Studio 2022打开。再保侟就有.sln文件了。 易兆微芯片下载工具加开机动画下载 ExtraDownloadFile1Info.\logo.bin|0|0|10D2000|0 MFC应用兼容CMD 在BOOL CYichipYC31xxloaderDlg::OnIni…...

GO协程(Goroutine)问题总结

在使用Go语言来编写代码时&#xff0c;遇到的一些问题总结一下 [参考文档]&#xff1a;https://www.topgoer.com/%E5%B9%B6%E5%8F%91%E7%BC%96%E7%A8%8B/goroutine.html 1. main()函数默认的Goroutine 场景再现&#xff1a; 今天在看到这个教程的时候&#xff0c;在自己的电…...

AI语音助手的Python实现

引言 语音助手(如小爱同学、Siri)通过语音识别、自然语言处理(NLP)和语音合成技术,为用户提供直观、高效的交互体验。随着人工智能的普及,Python开发者可以利用开源库和AI模型,快速构建自定义语音助手。本文由浅入深,详细介绍如何使用Python开发AI语音助手,涵盖基础功…...

tauri项目,如何在rust端读取电脑环境变量

如果想在前端通过调用来获取环境变量的值&#xff0c;可以通过标准的依赖&#xff1a; std::env::var(name).ok() 想在前端通过调用来获取&#xff0c;可以写一个command函数&#xff1a; #[tauri::command] pub fn get_env_var(name: String) -> Result<String, Stri…...