ChatGPT 的/v1/chat/completions 接口流式响应设计有点不科学

2023-03-07 10:26:18 +08:00
 brader

当启用 stream=true 的时候,以流响应,返回的数据大体如下:

data: {"id":"chatcmpl-6r3B875xFqmzK9lMm8sousVO3iBN4","object":"chat.completion.chunk","created":1678101622,"model":"gpt-3.5-turbo-0301","choices":[{"delta":{"role":"assistant"},"index":0,"finish_reason":nul
l}]}

data: {"id":"chatcmpl-6r3B875xFqmzK9lMm8sousVO3iBN4","object":"chat.completion.chunk","created":1678101622,"model":"gpt-3.5-turbo-0301","choices":[{"delta":{"content":"\n\n"},"index":0,"finish_reason":null}
]}

data: {"id":"chatcmpl-6r3B875xFqmzK9lMm8sousVO3iBN4","object":"chat.completion.chunk","created":1678101622,"model":"gpt-3.5-turbo-0301","choices":[{"delta":{"content":"作"},"index":0,"finish_reason":null}]}

data: {"id":"chatcmpl-6r3B875xFqmzK9lMm8sousVO3iBN4","object":"chat.completion.chunk","created":1678101622,"model":"gpt-3.5-turbo-0301","choices":[{"delta":{"content":"为"},"index":0,"finish_reason":null}]}

data: {"id":"chatcmpl-6r3B875xFqmzK9lMm8sousVO3iBN4","object":"chat.completion.chunk","created":1678101622,"model":"gpt-3.5-turbo-0301","choices":[{"delta":{"content":"一个"},"index":0,"finish_reason":null}}

...

data: [DONE]

每一个 event data 的 json 串,得到的 content 内容仅仅是一个字,看完真觉得浪费流量啊,是否我的调用方式不对呢?有其他的参数或调用方式来避免这种浪费吗?

7039 次点击
所在节点    程序员
53 条回复
youthfire
2023-03-07 12:25:05 +08:00
我昨天也在看这个 stream ,发现比非流式慢很多。
以下理解不知道对不对:
按照官方说法,free-20RPM,credit card (48hrs)-60RPM,credit card (aft 48hrs)-3500RPM
我现在理解是 60RPM 相当于 1s 吐一个字呗,因为它一次请求就返回一个字的内容。非流式只有在 3500RPM 才有实用价值吧。
问 ai ,它解释非流式默认 600RPM ,那的确就是必须绑卡 48 小时后才有实用价值,否则还不如老老实实非流式了。
另外我想说,stream=True 返回的是生成器,不加应该直接可以用 response['choices'][0]['message']['content'].strip(),但是我发现设定 stream=False 返回的也是生成器,不能取值,不知道是不是我方法不对,第一次接触这类。
tool2d
2023-03-07 12:26:49 +08:00
@brader 其实不臃肿,你试一下用 gzip 流式压缩这些重复字符串,

我这里 60k 左右的文本数据回答,可以压缩到 2k 之内。

就是 openai 把这项特性关了,只打开了 chunk 传输,贼讨厌。
tool2d
2023-03-07 13:05:59 +08:00
我又想了一下。

既然 openai 在 http 协议上不支持压缩( accept-encoding: gzip, deflate, br ),那么干脆换个思路,让 openai 用 HTTPS 代理文本内容的时候,用 SSL 开启压缩功能(HANDSHAKE_SERVER_HELLO 里的 compression flag)就可以了。

这样 openai 的服务器代码,也可以不需要改动。
string2020
2023-03-07 13:06:34 +08:00
装个锤子,正常开发人员都会知道带宽根本没影响。
你自己一点测试都不做,凭空优化(不,你根本优化不了。api 的代码你都控制不了。凭空要求 openai 优化)。
最好的情况是,openai 帮你做了优化。
最后响应时间从 100ms 优化到了 100ms 。带宽从 1%占用优化到了 1%占用。
你浪费了大家时间。
otakustay
2023-03-07 13:08:43 +08:00
楼主的意思是用 stream 是好的,但没必要 stream 里每一份 data 都包一个 json ,可以每个 data 就一个内容字符串就行了
我是认同楼主的想法的,json 重复内容太多了
tool2d
2023-03-07 13:10:29 +08:00
@youthfire "但是我发现设定 stream=False 返回的也是生成器,不能取值,不知道是不是我方法不对"

我这里可以正常取值,就是普通的 json 。
devliu1
2023-03-07 13:11:15 +08:00
@brader 同意楼主观点,冗余信息过多
string2020
2023-03-07 13:19:31 +08:00
离大谱。想到了,父母让女儿找富二代的笑话。
xingjue
2023-03-07 13:35:15 +08:00
离大谱。想到了,父母让女儿找富二代的笑话。
vishun
2023-03-07 15:05:24 +08:00
@string2020 #24 ?? 我都怀疑你是否是开发人员了?又不是只有一个用户在访问,怎么可能没有影响?
dobelee
2023-03-07 15:17:38 +08:00
可以理解为元数据。做成长连接也得有基础协议的元数据。
string2020
2023-03-07 15:21:03 +08:00
@vishun 什么东西。这里说的带宽是指什么你懂吗?
vishun
2023-03-07 16:53:37 +08:00
@string2020 #32 说下指什么?
string2020
2023-03-07 17:05:17 +08:00
@vishun 这里说的是楼主的服务器和 openai 之间的下行带宽,和用户关系在哪?
wqhui
2023-03-07 17:42:12 +08:00
像极了人,人说话也是一个字一个字的说(doge
wtfedc
2023-03-07 17:52:49 +08:00
@string2020 如果有 1000k 的用户同时用,中间做日志存储,如果再有实时分析,怎么可能 IO 没影响。带宽不是问题,你这意思是不够用就加硬件呗,反正不是自己花钱。程序员要都是你这想法,淘宝 JD 都不一定能开起来。
string2020
2023-03-07 17:57:44 +08:00
大兄弟。在这个提问中,用户就只有楼主自己,占用的带宽是服务器的下行带宽,下行带宽一般情况下免费的 1%都不会用到。你该不会是在为 openai 考虑吧?
yuezk
2023-03-07 18:01:54 +08:00
你如果抓一下 ChatGPT 的接口,你会发现每个 data 都会重复前面的内容,还不如 OpenAI 的接口省带宽。

```
event: add
id: 1
data: {"message":{"id":"chatcmpl-6rOOU6qBvhphYF8aL0Rw1VMitV5U8","role":"assistant","user":null,"create_time":null,"update_time":null,"end_turn":null,"weight":0,"recipient":"all","metadata":null,"content":{"content_type":"text","parts":["I"]}},"error":null}

event: add
id: 2
data: {"message":{"id":"chatcmpl-6rOOU6qBvhphYF8aL0Rw1VMitV5U8","role":"assistant","user":null,"create_time":null,"update_time":null,"end_turn":null,"weight":0,"recipient":"all","metadata":null,"content":{"content_type":"text","parts":["I'm"]}},"error":null}

event: add
id: 3
data: {"message":{"id":"chatcmpl-6rOOU6qBvhphYF8aL0Rw1VMitV5U8","role":"assistant","user":null,"create_time":null,"update_time":null,"end_turn":null,"weight":0,"recipient":"all","metadata":null,"content":{"content_type":"text","parts":["I'm sorry"]}},"error":null}

event: add
id: 4
data: {"message":{"id":"chatcmpl-6rOOU6qBvhphYF8aL0Rw1VMitV5U8","role":"assistant","user":null,"create_time":null,"update_time":null,"end_turn":null,"weight":0,"recipient":"all","metadata":null,"content":{"content_type":"text","parts":["I'm sorry,"]}},"error":null}

event: add
id: 5
data: {"message":{"id":"chatcmpl-6rOOU6qBvhphYF8aL0Rw1VMitV5U8","role":"assistant","user":null,"create_time":null,"update_time":null,"end_turn":null,"weight":0,"recipient":"all","metadata":null,"content":{"content_type":"text","parts":["I'm sorry, I"]}},"error":null}

event: add
id: 6
data: {"message":{"id":"chatcmpl-6rOOU6qBvhphYF8aL0Rw1VMitV5U8","role":"assistant","user":null,"create_time":null,"update_time":null,"end_turn":null,"weight":0,"recipient":"all","metadata":null,"content":{"content_type":"text","parts":["I'm sorry, I'm"]}},"error":null}
```
string2020
2023-03-07 18:04:51 +08:00
(带宽费用)[!https://imgur.com/HT9oEzk]
string2020
2023-03-07 18:15:03 +08:00
阿里云都是免费的,不知道要省啥

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/921810

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX