【项目方案】OpenAI流式请求实现方案

news2024/7/4 5:30:39

文章目录

      • 实现目的
      • 效果比对
        • 非stream模式
        • stream模式
      • 实现方案
        • 方案思路总体描述
        • 前端
          • 方案对比
          • event-source-polyfill代码示例
          • 前端实现遇到的问题与解决方法
        • 后端
          • 参考资料
          • 时序图
          • 关键代码示例
          • 后端实现时遇到的问题与解决方法

实现目的

streamOpenAI API中的一个参数,用于控制请求的模式。当将stream参数设置为True时,API会以流式方式返回响应,即在请求过程中会立即返回部分结果,而不需要等待完整的响应
这使得实时交互、大规模数据处理和逐步呈现结果成为可能。
ChatGpt回答stream模式与普通模式区别
我们的AI Assistant,本质上也是一个聊天机器人,因此非常需要流式方式返回来以提高交互性和响应速度
通过使用流式方式返回响应,我们可以在用户输入后立即开始处理,并逐步返回部分结果,使用户能够更快地获得反馈,以及更加流畅的交互体验。
同时,它更能够让用户在等待完整响应的同时,逐步阅读和理解部分结果,以便更连贯地进行对话。

效果比对

下面是两种请求方式的交互示意以及效果对比

非stream模式

  • 交互示意
    在这里插入图片描述
  • 实际效果
    非stream模式请求OpenAI——等待时间久,直接显示

stream模式

  • 交互示意

  • 实际效果
    stream模式请求OpenAI——等待时间短,逐步显示

实现方案

方案思路总体描述

前端采用**EventSource**来进行请求服务器端的实时数据更新。EventSource提供了一种简单的、基于事件的方式来接收服务器端的实时事件通知。通过使用EventSource,前端可以建立持久的、基于HTTP的连接,以接收服务器端的实时数据更新。
后端采用**Reactor Flux**技术来处理异步数据流,它是Reactive Streams规范中的一种数据流处理规范。Flux可以处理非阻塞的异步数据流,并具备背压处理能力,从而实现高效的响应式编程。通过使用Flux,后端可以有效地处理大量的异步数据流,并根据消费者的处理能力进行背压控制,确保数据流的稳定和高效处理。
结合前端的EventSource和后端的Flux,我们可以简单地建立起一个实时数据更新的机制。
前端通过EventSource与后端建立持久连接,一旦后端有新的数据更新,就会通过EventSource将数据推送给前端。前端接收到数据后,可以根据需要进行相应的处理和展示。

前端

前端前后换了4种方案,最终使用了event-source-polyfill来进行处理。

方案对比

几种方案的对比如下:

方案 实现参考 优缺点 使用注意
sse.js sse.js 无需第三方依赖,不适用于React 需要显式调用stream()方法发起请求
sse.jsx SSE.jsx 无需第三方依赖,使用于React,但是打包后无效 需要显式调用stream()方法发起请求
react-native-sse https://www.npmjs.com/package/react-native-sse/v/1.0.1 仅适用于RN,不适用于fishx(打包后可用,但是会导致基于React构建的fishx项目启动报错)支持POST\GET 无需显式调用open()方法,否则可能出现连续请求的问题
event-source-polyfill https://www.npmjs.com/package/event-source-polyfill 适用于fishx. 但只支持GET请求(如果想传参则需要采用url带参的形式) 无需显式调用open()方法,否则可能出现连续请求的问题

event-source-polyfill代码示例
import {
    EventSourcePolyfill } from 'event-source-polyfill';

const streamChatWithBSS = (value, now) => {
   
    let es = null;
    try {
   
      // 1.生成带参URL
      const baseUrl = '/chat';
      const params = {
   
      }
      const queryString = Object.keys(params)
        .map(key => `${
     encodeURIComponent(key)}=${
     encodeURIComponent(params[key])}`

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

UE5.1.1 创建C++项目失败

因一直使用Unity开发环境,安装Unreal后,并未详细配置过其开发环境,默认创建蓝图工程无异常,但创建UE C项目时总共遇到两个错误: 错误一 Running /Epic/UE/UE_5.1/Engine/Build/BatchFiles/Build.bat -projectfiles -…

LeetCode 75 第十二题(11)盛最多水的容器

目录 题目: 示例: 分析: 代码: 题目: 示例: 分析: 配合着示例给出的图片我们可以得知找出盛水最多的容器是什么意思,给一个数组,找出数组中两个元素能围成的最大的矩阵面积是多少. 比较直观的想法是套两层for循环暴力解出来,但是这题是中等难度题,一般中等题是没法用暴力得…

OSI七层模型——第2层数据链路层

目录 1 数据链路层的用途 1.1 数据链路层 1.2 IEEE 802LAN/MAN 数据链路子层 1.3 提供介质访问 1.4 数据链路层标准 2 拓扑 2.1 物理和逻辑拓扑 2.2 WAN 拓扑 2.3 点对点 WAN 拓扑 2.4 LAN 拓扑 2.5 半双工和全双工通信 2.6 访问控制方法 2.7 基于竞争的访问 - CS…

Excel录制宏批处理:避免重复工作,轻松提升效率

在处理大量数据时,我们常常需要进行一些重复且繁琐的操作,这不仅费时费力,还容易出错。而Excel的录制宏批处理功能可以帮助我们避免这些重复的工作,提高工作效率。本文将为您介绍如何使用Excel的录制宏批处理功能,让您…

【CesiumJS材质】(1)圆扩散

效果示例 最佳实践: 其他效果: 要素说明: 代码 /** Date: 2023-07-21 15:15:32* LastEditors: ReBeX 420659880qq.com* LastEditTime: 2023-07-27 11:13:17* FilePath: \cesium-tyro-blog\src\utils\Material\EllipsoidFadeMaterialP…

在CSDN学Golang云原生(Kubernetes声明式资源管理Kustomize)

一,生成资源 在 Kubernetes 中,我们可以通过 YAML 或 JSON 文件来定义和创建各种资源对象,例如 Pod、Service、Deployment 等。下面是一个简单的 YAML 文件示例,用于创建一个 Nginx Pod: apiVersion: v1 kind: Pod m…

基于Velocity开发代码生成器

一、引言 在项目开发中,我们有碰到大量的简单、重复的增删改查需求,通过阅读若依框架https://github.com/yangzongzhuan/RuoYi 的代码生成器实现,结合我项目所用的技术栈,开发出本项目的代码生成器。 二、Velocity 简单介绍 1、…

【C++入门】浅谈类、对象和 this 指针

文章目录 一、前言二、类1. 基本概念2. 类的封装3. 使用习惯成员函数定义习惯成员变量命名习惯 三、对象1. 基本概念2. 类对象的存储规则 四、this 指针1. 基本概念2. 注意事项3. 经典习题4. 常见面试题 一、前言 在 C 语言中,我们用结构体来描述一个事物的多种属性…

Markdown常用标签及其用途-有示例

Markdown常用标签及其用途 Markdown是一种轻量级标记语言,具有简洁易读的特点。下面是一些常用的Markdown标签以及它们的用途,并附带一些示例: 标题 用于创建不同级别的标题,可通过添加一到六个#符号来表示不同级别的标题。 #…

yolov5的后处理解析

由于最近实习项目使用到了yolov5, 发现对yolov5的后处理部分不太熟悉,为防止忘记,这里简单做个记录。 在yolov5里,利用FPN特征金字塔,可以得到三个加强特征层,每一个特征层上每一个特征点存在3个先验框&am…

自动化测试到底用Python还是Java?因为这个我和同事闹翻了

现在的软件测试工程师,必备的技能之一就是需要掌握自动化。对于那些不会自动化的测试工程师来说,被淘汰的概率会越来越大。因此大家通过各种途径开始学习自动化。但是刚开始都会面临一个棘手的问题:应该学习哪种编程语言进行自动化测试呢&…

Echarts 显示双Y轴

option 对象 option {yAxis: [{ name: 重量(kg), position: left, type: value },{ name: 金额(元), position: right, type: value }],xAxis: { type: category },legend: {},series: [{name: 剩余量,label: { normal: { show…

2023年全国程序员薪酬排行天梯榜

文章目录 ⭐️ 2023年全国程序员薪酬排行天梯榜 在过去很长的一段时间内,网上总有一个声音:“大厂裁员”、“程序员内卷严重”、“程序员人员过盛”、“35岁中年危机”、“码农吃的青春饭”、“互联网寒冬” 等等等等。 讲道理,我对这种人为的…

ViT-vision transformer

ViT-vision transformer 介绍 Transformer最早是在NLP领域提出的,受此启发,Google将其用于图像,并对分类流程作尽量少的修改。 起源:从机器翻译的角度来看,一个句子想要翻译好,必须考虑上下文的信息&…

Redisson源码分析(1)源码下载及本地调试

目录 前言 源码下载 其他准备 前言 新开个坑,关于Redisson源码分析的,感觉不记一下,看完以后,过段时间又忘了... 源码下载 Redisson:https://github.com/redisson/redisson 本次源码我这下载的是3.17.7版本 3.…

Java期末复习基础题编程题

文章目录 基础题记录实践题记录&&与C比较题目1:题目2:题目3: 基础题记录 编译型语言: 定义:在程序运行之前,通过编译器将源程序编译成机器码(可运行的二进制代码),以后执行这个程序时&…

【图像分类】CNN+Transformer结合系列.2

介绍几篇利用CNNTransformer实现图像分类的论文:CMT(CVPR2022),MaxViT(ECCV2022),MaxViT(ECCV2022),MPViT(CVPR2022)。主要是说明Transformer的局限性&#x…

【DFS】CF598D

Problem - D - Codeforces 题意: 思路: 直接搜索即可,对于每个连通块都去染色,对于每一个色块都维护这个色块的墙壁数 或者麻烦点用并查集维护也行 Code: int n, m, k; bool st[N][N]; char g[N][N]; int ans[N *…

C#时间轴曲线图形编辑器开发2-核心功能实现

目录 三、关键帧编辑 1、新建Winform工程 (1)界面布局 (2)全局变量 2、关键帧添加和删除 (1)鼠标在曲线上识别 (2)键盘按键按下捕捉 (3)关键帧添加、删…

脉冲信号测试应如何选择示波器带宽?

示波器模拟带宽的定义大家都比较熟悉,是针对于正弦波信号定义的。从频域上看,正弦波信号的频谱就是单根谱线,只要示波器的带宽不小于信号的频率,那么就可以有效观测到波形。若要追求更高的幅度测试精度,则可以按照5倍法…