岛屿可以找到海
岛屿可以找到海

chatgpt流式返回数据

用普通方式请求chatgpt返回数据没啥亮点很简单,但是显然已经不能满足使用时的速度和逼格了

这时候只需要再请求时添加一个参数即可获得openai接口的流式返回了

'stream' => true,
https://blog.dykyzdh.cn/wp-content/uploads/2023/07/1b7edb3ba5bb5ac7cad3216887f513c-1024x517.png


这时候需要用到curl的一个选项 CURLOPT_WRITEFUNCTION

CURLOPT_WRITEFUNCTION 是一个 cURL 选项,用于指定一个回调函数,该函数将被 cURL 库调用来处理接收到的响应数据。通过使用 CURLOPT_WRITEFUNCTION,你可以自定义处理响应数据的方式。

具体怎么用呢:

curl请求openai的代码这里就省略了

curl_setopt($ch, CURLOPT_WRITEFUNCTION, function ($ch,$data)  {
  // 在这里处理接收到的响应数据
  // $data 参数是接收到的数据
  // 可以将数据保存到文件、输出到屏幕等等
  echo $data;
  return strlen($data);//返回接收到的数据长度
}

由于接口返回的数据是一个完整的字符串,所以我们需要处理一下才可以转换成可以操作的数组

// 1、把所有的 'data: {' 替换为 '{' ,'data: [' 换成 '['
$buffer = str_replace('data: {', '{', $buffer);
$buffer = str_replace('data: [', '[', $buffer);

// 2、把所有的 '}\n\n{' 替换维 '}[br]{' , '}\n\n[' 替换为 '}[br]['
$buffer = str_replace("}\n\n{", '}[br]{', $buffer);
$buffer = str_replace("}\n\n[", '}[br][', $buffer);

// 3、用 '[br]' 分割成多行数组
$lines = explode('[br]', $buffer);

然后呢就可以将处理好的数据返回给前端,此时返回的数据是一个字一个字的过去,前端只需要将拿到的数据追加到页面中即可

我这里用的webman框架,前后端通过 webman/push插件进行通信,轻松就将数据推送给前端

后端将数据发送到前端的方式有很多,这里就不作赘述了,最后来看一下效果

https://blog.dykyzdh.cn/wp-content/uploads/2023/07/2023-07-05-17-51-42_1_-00_00_03-00_00_20.gif

注:PHP环境需大于8.1

发表回复

textsms
account_circle
email

岛屿可以找到海

chatgpt流式返回数据
用普通方式请求chatgpt返回数据没啥亮点很简单,但是显然已经不能满足使用时的速度和逼格了 这时候只需要再请求时添加一个参数即可获得openai接口的流式返回了 'stream' => true…
扫描二维码继续阅读
2023-07-06