文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

使用SSE技术调用OPENAI接口并实现流式输出,用PHP语言实现

2023-08-31 21:42

关注

作为AI语言模型服务提供商,OpenAI 提供了一系列的 API 接口,其中大部分需要通过 HTTP 请求访问。对于大量数据的请求,传统的同步请求会导致网络响应变慢,无法满足实时数据处理和分析的需求。因此,为了优化这些接口的调用效率,我们可以利用 SSE(Server Sent Events) 技术来实现流式输出,保证数据能够实时到达客户端,提高数据处理效率。

在 PHP 语言中,我们可以借助 GuzzleHttp Library 以及 ReactPHP Library 等工具库,通过 SSE 技术来实现 OpenAI 的 API 接口的调用和流式输出。以下是具体的代码实现:

use GuzzleHttp\Client;use GuzzleHttp\Event\CompleteEvent;use GuzzleHttp\Event\MessageCompleteEvent;use GuzzleHttp\Message\Response;use GuzzleHttp\Stream\Stream;use React\EventLoop\Factory as EventLoopFactory;use React\EventLoop\LoopInterface;$openaiAccessToken = 'YOUR_OPENAI_ACCESS_TOKEN'; // 请替换为真实的 Access Token,可以去chat.xingtupai.com获取function openaiApiRequestWithSse($query): void{    global $openaiAccessToken;    $loop = EventLoopFactory::create();    $client = new Client();    $request = $client->createRequest('POST', 'https://api.openai.com/v1/engines/davinci-codex/completions');    $request->setHeader('Content-Type', 'application/json');    $request->setHeader('Authorization', "Bearer {$openaiAccessToken}");    $request->setBody(Stream::factory(json_encode($query)));    $client->send($request)->then(function (Response $response) use ($loop) {        echo 'data: ';        $stream = $response->getBody()->detach();        stream_set_blocking($stream, false);        $loop->addReadStream($stream, function ($stream, LoopInterface $loop) {            $data = '';            while ($buffer = fgets($stream, 2048)) {                $event = new MessageCompleteEvent(                    new CompleteEvent(),                    $response = new Response(200),                    Stream::factory($buffer)                );                $data .= $buffer;                if (strpos($buffer, "\n\n") !== false) {                    $loop->removeReadStream($stream);                    $event->response = new Response(200, [], Stream::factory($data));                    echo $data . PHP_EOL;                    break;                }            }        });    });    $loop->run();}

让我们详细解释上述代码。首先,我们初始化了一个 Guzzle HTTP 客户端,然后创建了一个 OpenAI 的 API 请求。接下来,请求中我们设置了请求头 Authorization,将 OpenAI 提供的 Access Token 传递过去,确保我们有 API 访问权限。然后,我们讲请求体中的查询条件 JSON 序列化,并将请求正文体设置为序列化的 JSON 字符串,以用于后续的请求。

接下来,我们发送了这个请求,然后对从 OpenAI 返回的响应流(response stream)进行了处理。注意到在这里我们设置了对响应流的事件监听,以便解析响应结果并实现流式输出。具体来说,我们调用了 EventLoop 的 addReadStream 方法,将 OpenAI 的响应流和响应流监听函数参数一起传递到事件循环中。在事件循环中,我们通过循环和 fgets 函数,获取响应流中的数据并按行读取。然后我们用一个 while 循环判断读取到的数据是否包含了两个换行符,如果数据中包含两个换行符,则说明当前这段数据已经读取完毕,并组成了一条完整的数据结果。于是,我们调用了 EventLoop 的 removeReadStream 方法,将当前这个响应流的监听从事件循环中移除。最后,我们输出了当前这个响应数据结果。

通过上述的代码实现,我们就可以轻松地将 OpenAI 的 API 接口进行 SSE 调用,实现流式输出,并有效提高数据处理效率。
 

来源地址:https://blog.csdn.net/weixin_58881595/article/details/130246714

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯