使用post请求建立长连接实现sse,接收后端主动发来的消息,实现chat-gpt的弹字效果,EventSource的应用

每日鸡汤:每个你想要学习的瞬间都是未来的你向自己求救

最近在做一个chat相关的功能,然后由于接口返回特别特别慢,所以需要搞一个慢慢等待的效果,就是接口一个单词一个单词的返回,然后前端收到一个展示一个,提升用户体验。

说实话我是第一次做这类需求,他们给完接口文档我一脸懵?啥?post请求一次,也能实现接收后端主动来发来的消息?就跟websocket一样。

一问才知道原来真可以,真的是每天都能学习到新鲜的知识,使用EventSource即可,就是传说中的sse【server-send-events】

没错,本菜鸟都干了好几年了,还没做过这种需求,我做的比较多的就是前端轮训一个接口用setTimeout 或者setInterval

EventSource - Web API 接口参考 | MDNEventSource 接口是 web 内容与服务器发送事件通信的接口。https://developer.mozilla.org/zh-CN/docs/Web/API/EventSource注意,前端要想能收到后端发来的消息,毫无疑问我们肯定要监听消息!!牢记【监听】在前端开发中的重要性,监听接口返回,监听事件触发等等,认真听才可以让我们收到别人给我们的消息

可以看一下mdn的官方文档用法很简单,但是问题是原生的EventSource 不能使用post方法,只能使用get方法,而且还不能自定义请求header,所以我们可以使用npm包,常用的有

  1. event-source-polyfill  这个可以自定义请求头
  2. @microsoft/fetch-event-source 这个可以使用post请求,也可以自定义请求头功能强大,建议用这个

在开发中遇到了一问题,我按照@microsoft/fetch-event-source的例子写好了代码,怎么都接收不到请求,还以为这个插件有问题,或者我写错了,结果研究半天才发现是后端代码写错了,他根本没有一个一个给我返回,而是等了好长时间所有数据准备完毕才返回,这样导致请求都超时了,自然就收不到数据。

所以如果你也遇到了问题,不妨考虑一下是否是这个原因,这个插件的demo亲测是没有问题的,我用的版本是"@microsoft/fetch-event-source": "^2.0.1",

参考

【20230816更新】

还有一个问题就是错误处理,接口报错了怎么办,第一个想到的肯定是在onerror里面捕获,但是在打印出来onerror里面抛出的错误是

Expected content-type to be text/event-stream, Actual: application/problem+json

这个不是我们想要的,其实需要在onopen里面处理,可以看一下官方文档,同志们一定要好好看官方文档啊!!

还有一个问题

@microsoft/fetch-event-source 默认在浏览器当前标签页面不处于活动状态的时候就取消当前请求,切回来的时候再重新请求,这样很多时候不符合我们的需求,可以在请求参数加上openWhenHidden: true,

fetchEventSource(url, {
	method: 'POST',
	headers: {
		'Content-Type': 'application/json',
	},
	body: JSON.stringify(params),
	// 加上这句话
	openWhenHidden: true,
	//...
}

  • 6
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
实现一个 ChitGPT,需要进行以下步骤: 1. 安装必要的库:pytorch、transformers、tqdm。 2. 加载预训练模型:通过 transformers 库中的 GPT2LMHeadModel 类加载预训练的 GPT 模型。可以选择加载不同大小的模型。 3. 加载 tokenizer:通过 transformers 库中的 GPT2Tokenizer 类加载相应的 tokenizer。 4. 定义对话逻辑:编写代码实现对话逻辑,包括输入问题、生成回答、输出回答等。 下面是一个简单的 ChitGPT 实现,仅供参考: ```python import torch from transformers import GPT2LMHeadModel, GPT2Tokenizer # 加载预训练模型和 tokenizer model = GPT2LMHeadModel.from_pretrained('gpt2-medium') tokenizer = GPT2Tokenizer.from_pretrained('gpt2-medium') # 与 ChitGPT 相关的函数 def generate_response(prompt, max_length=100): # 将输入句子编码成 token input_ids = tokenizer.encode(prompt, return_tensors='pt') # 生成回答 output = model.generate( input_ids=input_ids, max_length=max_length, do_sample=True, top_p=0.92, temperature=0.85 ) # 将生成的 token 解码成文本 response = tokenizer.decode(output[0], skip_special_tokens=True) return response # 对话循环 while True: # 获取用户输入 prompt = input('You: ') # 生成回答 response = generate_response(prompt) # 输出回答 print('ChitGPT: ' + response) ``` 上述代码实现了一个简单的对话循环,用户输入问题后,ChitGPT 会生成回答并输出。你可以根据自己的需求对其进行修改和优化。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值