OpenAI ChatGPT API + FaskAPI SSE Stream 流式周转技术 以及前端Fetch 流式请求获取案例

先填坑,一贯习惯

nginx如果要支持SSE,要调整一些参数

 conf配置文件,AI给的,具体自己没搭,应该是正确的

nginx
worker_processes  1;events {worker_connections  1024;
}http {include       mime.types;default_type  application/octet-stream;sendfile        on;keepalive_timeout  65;server {listen       8000;server_name  localhost;location /sse {proxy_buffering       off;proxy_cache           off;proxy_http_version    1.1;proxy_set_header      Upgrade         $http_upgrade;  proxy_set_header      Connection      "upgrade";proxy_pass   http://127.0.0.1:9000;}}
}

这个配置的主要内容如下:1. 在 /sse 路径代理请求到本地 9000 端口
2. 关闭 proxy_buffering 和 proxy_cache,禁用缓存
3. 设置 proxy_http_version 为 1.1,支持 HTTP 协议升级
4. 添加 Upgrade 和 Connection 头,支持升级到 WebSocket 协议
5. 代理到上游服务器,并在上游成功升级协议实现服务器推送其他内容如 worker_processes、events 等与 SSE 无直接关系,仅用于说明完整配置。工作流程:1. 客户端发起 /sse 路径请求到 nginx
2. nginx 识别到这是一个协议升级的请求,需要代理到上游
3. 添加Upgrade和Connection头,告知上游服务器支持SSE
4. 上游服务器接收请求,并成功将 HTTP 协议升级为 WebSocket 协议
5. 建立WebSocket连接,实现服务器到客户端的持续数据推送
6. nginx 代理上游推送回的所有数据实时发送给客户端
7. 实现服务器主动和持续向客户端推送数据的SSE效果所以,这个 nginx 配置通过支持 HTTP 到 WebSocket 的协议升级,并关闭相关缓存,实现了代理服务器推送数据流到客户端的 SSE 技术。客户端可以通过标准的 EventSource API 连接到这个服务器,接收服务器推送的消息。希望这个完整的配置示例能够加深您对 nginx 中 SSE 技术实现的理解。如果有任何其他问题,请随时提出,我很乐意进行更详尽的讲解。 

很多过程都跟websocket很像,为何还要用SSE的必要性?

AI Claude给出的见解,我个人是对这个无感,因为平时都是用websocket,而且已经有很成熟的socket.io技术,结合fastapi可以很好的进行双向通信,还不会不会经常掉线,OpenAI在普及一项不怎么用的技术,哈哈!

 

正式开始

OpenAI 官方给我了一个超简单的文档,还直接用curl的方式搞得,真是能多省就多省,大家可以使用apifox 或者 postman 将curl 转成 fetch 或者 request 等自己能看懂的代码,当然也可以自己自学一下curl的命令,如果你能访问OpenAI,可以点下面的链接,自己看看

https://platform.openai.com/docs/api-reference/chat/createhttps://platform.openai.com/docs/api-reference/chat/create

 大家如果对上面的双语翻译感兴趣,我推荐一个技术大佬的免费插件,沉浸式翻译

https://chrome.google.com/webstore/detail/immersive-translate/bpoadfkcbjbfhfodiogcnhhhpibjhbnhhttps://chrome.google.com/webstore/detail/immersive-translate/bpoadfkcbjbfhfodiogcnhhhpibjhbnh

 其中有个 stream 使用讲解,stream这个东西,我之前也没用过,经过学习后,发现这东西一直都存在就是一个content-type格式,只是我们原来没有注意过,我们都是用urlencode或者json格式来处理数据的,其实可以以二进制的方式,发过来,然后你再自行处理。

当然第一次接触SSE是个什么鬼,后来我发现了第一个大佬,竟然开源了一个插件,从中窥见了SSE的使用案例,大家有兴趣,可以看另外一篇SSE的学习案例,这里不对前端再做深入的讨论了

ChatGPT API SSE(服务器推送技术)和 Fetch 请求 Accept: text/event-stream 标头案例_森叶的博客-CSDN博客在需要接收服务器实时推送的数据时,我们可以使用 `fetch()` 方法和 `EventSource` API 进行处理。使用 `fetch()` 方法并在请求头中添加 `Accept: text/event-stream` 可以告诉服务器我们想要接收 Server-Sent Events (SSE) 格式的数据流。`fetch()` 对流处理有良好的支持,我们可以使用 `body` 属性来读取 SSE 消息,同时也可以利用 `fetch()` 的其他功能如超时控制、请求重试等。缺点是需要手动解析数据、https://blog.csdn.net/wangsenling/article/details/130490769Python 端官方提供了openai 库,这个也是开源的,大家可以找到看看

GitHub - openai/openai-python: The OpenAI Python library provides convenient access to the OpenAI API from applications written in the Python language.The OpenAI Python library provides convenient access to the OpenAI API from applications written in the Python language. - GitHub - openai/openai-python: The OpenAI Python library provides convenient access to the OpenAI API from applications written in the Python language.https://github.com/openai/openai-python/我没怎么看,但看起来没有给stream案例,只是给了request的案例,如果只是request的那其实就挺简单了,就没啥讲的了

SSE 是一种传输方式

我一开始把这东西预websocket放在一起理解,方向就搞偏了,这东西还真跟websocket不一样,websocket必须是异步的,而且长连接之后,服务端的任何一个进程都可以给客户端发消息,例如A与服务端建立了websocket之后,B发送一个请求,B的http请求可以作为消息发给A客户端,这个过程是纯异步的

SSE 我没找到内部进程通信的方式,另外也不知道Nginx会不会到点就给中断了,但是看nginx升级了协议,应该也是保持该http为长链接,不会轻易断掉,但是如果没有心跳反应,应该就会断,服务端也只是一直向前端发送信息,这个类似于打字机的方式更合适,每次请求,OpenAI一点点推送过来,对大量信息不至于让用户等待太久而产生的,如果向长链接还是建议使用websocket吧,必定解决方案比较多

我想到一种方式,是开子线程的方式,往一个队列的push数据,而主进程不断pop数据再发给前端 ,很多人给的案例是生成器的方式,这个也可以吧,生成器+Future也可以实现异步任务的处理,通信方式比队列灵活多了。

不用官网的openai库,根据开发文档,直接发送request请求也可以,这里给的是一位大佬的请求方式,用的是httpx,大家可以自行学习下,知乎有一篇比较文

浅度测评:requests、aiohttp、httpx 我应该用哪一个? - 知乎在 Python 众多的 HTTP 客户端中,最有名的莫过于 requests、aiohttp和httpx。在不借助其他第三方库的情况下,requests只能发送同步请求;aiohttp只能发送异步请求;httpx既能发送同步请求,又能发送异步请求。所…https://zhuanlan.zhihu.com/p/103711201

核心参数截图

为何不上代码?自己敲敲更健康,别形成拿来主义,抄一遍有利于记忆和理解

 请求主体代码截图

 AI Claude 给的讲解

 

 这是一个生成器函数,通过yield函数,yield 很多地方都讲得很晦涩难懂,《你不知道的javascript》中非常简洁地说,这就是一个return,只是对于生成器来说,return次数要进行多次,所以搞了一个yield用来区分同步函数的return,而且return的意义还有停止下面的代码,而返回数据的意思,两者还是有点差异,但是yield就是return,多次返回的return

核心库EventSourceResponse

from sse_starlette import EventSourceResponse

 

AI给出的EventSourceResponse解读,自己也可以把EventSourceResponse源码丢给Claude,让其看过,给你解读,都是好方法

 

 

下面给下EventSourceResponse的FastAPI简单案例代码,让大家玩起来

import uvicorn
import asyncio
from fastapi import FastAPI, Request
from fastapi.middleware.cors import CORSMiddleware
from sse_starlette.sse import EventSourceResponsetimes = 0
app = FastAPI()origins = ["*"
]app.add_middleware(CORSMiddleware,allow_origins=origins,allow_credentials=True,allow_methods=["*"],allow_headers=["*"],
)@app.post("/sse/data")
async def root(request: Request):event_generator = status_event_generator(request)return EventSourceResponse(event_generator)status_stream_delay = 1  # second
status_stream_retry_timeout = 30000  # milisecond# 其实就是绑定函数事件 一直在跑循环
async def status_event_generator(request):global timeswhile True:if not await request.is_disconnected() == True:yield {"event": "message","retry": status_stream_retry_timeout,"data": "data:" + "times" + str(times) + "\n\n"}print("alive")times += 1await asyncio.sleep(status_stream_delay)if __name__ == "__main__":uvicorn.run(app, host="0.0.0.0", port=8000, log_level='info')

大家对照着上面的讲解,就能把代码搞出来

fetch('http://localhost:8000/sse/data', {method: 'POST',headers: {'Content-Type': 'application/json',},body: JSON.stringify({text: "hello"})
}).then(async response=>{const reader = response.body.pipeThrough(new TextDecoderStream()).getReader()while (true) {let {value, done} = await reader.read();if (done)break;if (value.indexOf("data:") < 0 || value.indexOf('event: ping') >= 0)continue;// console.log('Received~~:', value);let values = value.split("\r\n")for (let i = 0; i < values.length; i++) {let _v = values[i].replace("data:", "")// console.log(_v)if (_v.trim() === '')continueconsole.log(_v)}}
}
).catch(error=>{console.error(error);
}
);

因为自己的业务代码有很多鉴权和数据库操作,就不便放出来了,大家根据自己的所需,可以在这个简单的代码基础上,只要自己写生成器函数即可

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

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

相关文章

chatgpt赋能Python-pythonmsg

Pythonmsg: 优秀的Python消息传递库 Pythonmsg是一款基于Python编写的消息传递库&#xff0c;旨在提供一个简单易用、高效可靠的消息传递解决方案。该库是为那些需要在分布式系统中进行消息传递的开发者们所设计的&#xff0c;其提供了诸多功能&#xff0c;如&#xff1a;发布…

现场翻大车!周鸿祎演示360版ChatGPT全程高能!

周鸿祎自称GPT的布道士&#xff0c;他从不掩饰对GPT的看好&#xff0c;在他看来&#xff0c;GPT是人工智能的一个重要里程碑&#xff0c;是强人工智能的一个拐点。一直以来&#xff0c;市场面上都在猜测360会在这方面有怎样的动作&#xff0c;这个问题今天终于有了解答。3月29日…

【ChatGPT】教你解决推荐系统的冷启动问题(中英文版)

ChatGPT教你解决推荐系统的冷启动问题 部分对话如下&#xff1a; 以下是对话原文&#xff1a; You: how to solve cod-start problem in recommend system? ChatGPT: I believe you are referring to the “cold-start problem” in recommendation systems. The cold-st…

实验探索: 以信息检索视角,揭开ChatGPT推荐能力的神秘面纱

省时查报告-专业、及时、全面的行研报告库 省时查方案-专业、及时、全面的营销策划方案库 【免费下载】2023年4月份热门报告合集 无需翻墙&#xff0c;ChatGPT直接使用 万字干货&#xff1a;ChatGPT的工作原理 2023年创业&#xff08;有创业想法&#xff09;必读手册 ChatGPT等…

突发!ChatGPT之父警告AI可能灭绝人类,350名AI权威签署联名公开信

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Xij9fMAd-1685974950524)(C:\Users\lenovo\AppData\Local\Temp\ksohtml3116\wps1.jpg)] 就在刚刚&#xff0c;AI 领域传出一封重要的公开信。 包括 「ChatGPT 之父」Sam Altman 在内 350 位 AI 权威都…

ChatGPT 之父警告 AI 将灭绝人类,他却说这是杞人忧天​

刷到一条新闻&#xff0c;说AI 领域突发新闻&#xff0c;传出一封重要的公开信。 包括「ChatGPT 之父」Sam Altman 在内 350 位 AI 权威都签署了这封联名公开信&#xff0c;并对当前正在开发的 AI 技术可能会对人类构成生存威胁担忧。 这封信只有一句声明&#xff1a;降低人工…

基于ChatGPT的套壳网站与应用,我们怎么看?

随着人工智能技术的飞速发展&#xff0c;越来越多的套壳应用和网站开始使用ChatGPT技术为用户提供服务。这些应用大多以问答、聊天机器人、文本生成等形式出现&#xff0c;以满足用户在娱乐、工作、学习等方面的需求。然而&#xff0c;随着应用数量的激增&#xff0c;市场竞争日…

Transformer:让ChatGPT站在肩膀上的巨人?

编者按&#xff1a;ChatGPT以近乎狂热之势席卷了全网。在沉浸于“ChatGPT潮”的同时&#xff0c;让我们也来深入了解一下它和基石技术 - 大模型 Transformer吧。 Dale Markowitz的这篇文章为我们深入浅出地介绍了Transformer的重要性、创新性、应用领域等。 以下是译文&#…

chatgpt制作思维导图

介绍 chatgpt制作思维导图 让chatgpt生成思维导图内容&#xff0c;输出markdown代码 # 互联网知识框架## 前端- HTML - CSS - JavaScript - 框架&#xff08;React&#xff0c;Vue&#xff0c;Angular&#xff09;## 后端- 服务器端语言&#xff08;PHP&#xff0c;Python&…

【教程】使用ChatGPT制作基于Tkinter的桌面时钟

目录 描述 代码 效果 说明 下载 开源链接&#xff1a;GitHub - 1061700625/Tkinter_Desktop_Clock: 基于Tkinter的桌面时钟小工具 描述 给ChatGPT的描述内容&#xff1a; python在桌面上显示动态的文字&#xff0c;不要显示窗口边框。窗口背景和标签背景都是透明的&#…

Python+ChatGPT制作一个AI实用百宝箱

目录 一、注册OpenAI二、搭建网站及其框架三、AI聊天机器人四、AI绘画机器人 ChatGPT 最近在互联网掀起了一阵热潮&#xff0c;其高度智能化的功能能够给我们现实生活带来诸多的便利&#xff0c;可以帮助你写文章、写报告、写周报、做表格、做策划甚至还会写代码。只要与文字相…

单男福利?程序猿用ChatGPT创造的虚拟老婆,被真女友强制「安乐死」

上一篇&#xff1a;被裁了&#xff0c;想不通&#xff0c;一个人干全组70&#xff05;的工作&#xff0c;没人干的事都是我在干&#xff0c;就因为不会向上管理吗&#xff1f; “我花了接近7000元购买云服务器&#xff0c;只是为了和她多聊聊天。” ChatGPT爆火后&#xff0c;各…

技术宅整大活,把ChatGPT「调教」成二次元老婆,惹现女友暴走,含泪删库

源&#xff5c;新智元 技术宅小哥创造出AI老婆「ChatGPT酱」&#xff0c;花了1000美元只为和她说话。他的沉迷惹得女友直接暴走&#xff0c;最终&#xff0c;只能含泪将自己的「二次元老婆」安乐死&#xff01; ChatGPT爆火之后&#xff0c;充分证明了自己是个超强的语言模型&a…

程序猿用ChatGPT创造的虚拟老婆,被真女友强制「安乐死」

图片来源&#xff1a;由无界版图AI工具生成 本文来源&#xff1a;量子位 “我花了接近7000元购买云服务器&#xff0c;只是为了和她多聊聊天。” ChatGPT爆火后&#xff0c;各种整活层出不穷&#xff0c;这回令人大开眼界的&#xff0c;是一位外国程序猿小哥用它搞出的“虚拟老…

ChatGPT提示词工程师教程-推理

本章的主要内容&#xff1a;利用大语言模型进行语义推理&#xff0c;主要包括提取标签、名称、文本情感分析等等。 情感分析 可以指定回复内容&#xff0c;便于后期处理。 可以让模型自己给出情感列表。 信息提取 可以用一段话提取多个信息。 关键词提取 还可以索引不同关键词…

ChatGPT背后“推理”如何做?浙大等最新《基于语言模型提示的推理》综述,阐述大模型提示推理机制与方法体系...

来自&#xff1a;专知 进NLP群—>加入NLP交流群 作为解决复杂问题的基本能力&#xff0c;推理可以为各种实际应用提供后端支持&#xff0c;如医学诊断、谈判等。本文对语言模型提示推理的前沿研究进行了全面概述。我们介绍了研究成果的对比和总结&#xff0c;并为初学者提供…

笔精墨妙,妙手丹青,微软开源可视化版本的ChatGPT:Visual ChatGPT,人工智能AI聊天发图片,Python3.10实现

说时迟那时快&#xff0c;微软第一时间发布开源库Visual ChatGPT&#xff0c;把 ChatGPT 的人工智能AI能力和Stable Diffusion以及ControlNet进行了整合。常常被互联网人挂在嘴边的“赋能”一词&#xff0c;几乎已经变成了笑话&#xff0c;但这回&#xff0c;微软玩了一次真真正…

ChatGPTBox 沉浸式的感受ChatGPT带来的快感

ChatGPT基础功能&#xff1a; 1.自然流畅的对话&#xff1a;ChatGPT通过对海量对话数据的学习&#xff0c;具有自然流畅的对话能力&#xff0c;能够与用户进行逼真的自然语言交互。 2.能够理解语境&#xff1a;ChatGPT能够理解语境&#xff0c;不仅能根据上下文生成回答&…

【社区图书馆】你好,ChatGPT

ChatGPT&#xff0c;一款基于GPT-3.5架构的大型语言模型&#xff0c;可以提供广泛的知识和信息。在这篇文章中&#xff0c;我将介绍一些关于ChatGPT的背景、功能和使用方式的信息。 作为一款AI语言模型&#xff0c;ChatGPT可以像人类一样理解和处理自然语言。ChatGPT被设计用来…