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 内容仅仅是一个字,看完真觉得浪费流量啊,是否我的调用方式不对呢?有其他的参数或调用方式来避免这种浪费吗?

7072 次点击
所在节点    程序员
53 条回复
UIXX
2023-03-07 18:32:54 +08:00
OP 的问题可以总结为:能否省略或者压缩流式响应中的元数据。

我的看法倾向于 8L 的观点,这个接口输出被设计成通用性更强、结构更明显的 chunk 形式,方便调用者直接使用。将其他形式的输出实现交给二次开发者。
zhwithsweet
2023-03-07 18:53:01 +08:00
支持 event source / SSE 的接口是这样的,写得时候图省事,直接把数据体写到 response 里边,出来必要的 { event, id data, retry } 别的感觉是能够压缩
neotheone2333
2023-03-07 21:57:42 +08:00
楼主想要的应该是类似 pb 的那种形式
上面有的人可能没用过除了 JSON 以外的数据交换格式
byzod
2023-03-07 23:50:32 +08:00
虽然但是,ai 答复的后端资源需求是非常高的,传输带宽只是流程上一个优先级非常低的环节,大概率不是性能热点

正经程序员也不会在业务逻辑耗时 2000ms 的时候扭头去想办法把 parser 的时间从 2.5ms 优化到 1ms 吧,虽然这是 60%的性能提升——对于这个环节来说
iseki
2023-03-08 00:07:52 +08:00
但是这样的 API 对接起来容易
iseki
2023-03-08 00:13:33 +08:00
楼主的关注点可能是每个条目都包含了重复的信息,id object 什么的…只能说优化这个挺麻烦,得在现在这种简单的模式基础上再包装一层了
superares
2023-03-08 08:22:00 +08:00
有没有可能一个流就是一个 token ?
vinciarts
2023-03-08 09:22:40 +08:00
弱弱的问一下,为什么要自己服务器转发,而不是直出啊?
conn4575
2023-03-08 13:34:39 +08:00
我觉得 websocket 才是解决方案
yuhangch
2023-03-08 14:05:05 +08:00
@vinciarts #48 不想暴露自己的 token
vinciarts
2023-03-08 14:57:41 +08:00
@yuhangch 这样的话那直接用 versel 或者 netlify 部署就可以啊
brader
2023-03-08 15:46:36 +08:00
@vinciarts 在目前 ChatGPT 的 API 采用直传 token 的授权形式的情况下,不管你采用什么方式,要么你有服务端代理来授权,要么你直接客户端访问,你隐藏的再怎么好,还是有暴露 token 的风险。
上面只是其中之一原因,最近开始,最主要的原因还是需要代理的问题,被 GFW 墙了
vinciarts
2023-03-09 09:36:49 +08:00
@brader 原来如此

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

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

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

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

© 2021 V2EX