PHP怎么在AI模型响应后流式输出?
目前市面上的AI模型基本上都是流式输出的,这样做的好处:
- 好看;
- 模型每秒输出的token受限,如果内容过长,不可能一下子全部输出,所以是以流的形式返回。
那么如果用PHP我们对接了AI模型,也想以流的形式返回给前端怎么办呢?
PHP的CURL就可以做到这一点,自定义一个写入函数即可。
以智谱开放平台的对接为例,直接上代码:
// 发送HTTP请求
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "https://open.bigmodel.cn/api/paas/v4/chat/completions");
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data));
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
"Content-Type: application/json",
"Authorization: Bearer {$token}"
]);
curl_setopt($ch, CURLOPT_WRITEFUNCTION, function($ch, $response) {
echo $response; // 直接输出数据
flush(); // 确保即时输出
return strlen($response); // 返回接收到的数据长度
});
curl_exec($ch);
//输出错误码
if (curl_errno($ch)) {
return false;
}
curl_close($ch);
有一点需要注意,return strlen($response);
这一行返回的长度必须是上面echo
的字符串的长度,不然会报类似Failed writing body (63 != 159)
的错误。
上面的示例是把智谱返回的流直接输出了,需要的话可以先做下处理。