gpt3-5 的强势登场把国内那批老头子们吓坏了,在我刚得知 api 开放的消息的同时也得知它已经被墙掉了。不过好在我有自己的小水管,体验了一会儿发现速度确实快了不少,但也没有那么夸张。
在 V2 上冲浪了一会儿发现一个 V 友的项目 https://chatgpt.ddiu.me/ ,点进去体验了一会儿发现他的怎么快了这么多,简直秒回。后来经过探索得知此项目部署在 Vercel 上,并且 V 友已经开源出来可以自己部署了,我跟着部署了之后速度也是变得飞快。
其实到这里就该止步了,但是我就是有点别扭,不太喜欢把常用的工具放网页上(其实也有一部分原因是功能不够但是我又不会前端后端),于是我就琢磨着用 Rust 写一个本地 GUI 工具,估计也就五六兆大小的 APP 。并且要求这个 app 有这三个特点:
我琢磨了一会儿突然想到,我直接从 Vercel 下手不就得了,完美满足上述条件啊。于是用 python 的 flask 库对 openai api 进行了简单的转发(我是后来才知道那叫 api 转发,有比较好的实现方法)并部署在了 vercel 上。
服务端 app. py
from flask import Flask, request, jsonify
import openai
app = Flask(__name__)
openai.api_key = "sk-XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
@app.route('/chat', methods=['POST'])
def chat():
messages = request.json['messages']
res = openai.ChatCompletion.create(model="gpt-3.5-turbo",messages=messages)
return jsonify(res.choices[0])
if __name__ == '__main__':
app.run(debug=True, host='0.0.0.0', port=7248)
客户端 post.py
import requests
url = 'https://chatapi.leeese.cn/chat'
history = [{'role': 'system', 'content': 'You are a helpful assistant.'}]
while True:
user_input = input('\nUser input: ')
if not user_input:
break
history.append({'role': 'user', 'content': user_input})
response = requests.post(url, json={'messages': history})
print("\nGPT Output:" + response.json()['message']['content'])
history.append(response.json()['message'])
大家可以直接用客户端的代码关了梯子玩一玩多轮对话体验一下速度,这接口我继续开着。
如果你玩了之后发现速度还是没有网页版那么快,那就对了,这也是我发帖的原因。其实速度还差在 openai 接口有个 stream 的参数,参数默认是 False ,即当 gpt 模型得到完整输出后才会一股脑返回给你。而这个参数开启时服务器那边会一个词一个词地给你返回消息(专业名词 server-sent events ),你一边阅读它一边生成,其实两种方法差不多同时得到所有输出,但是第二种方法提前拿到了输出,导致了体验上不小的差距。但是这个参数开启后我并不知道如何修改服务端和客户端的代码以达到实时传输模型输出的效果,就像网页上文字一行一行出现一样。我目前只知道传输过程中涉及了 websockes 协议,我现在的想法是能不能通过这个协议再由 vercel 实时获取并推送到本地。
我不是专业搞这个的,大家看我上边的 hello world 代码也应该看得出来水平,大家就不要专门评论笑话我了😄。 不过我还是很想知道这条路能不能走通走爽,希望各位看官不吝赐教。
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.