侧边栏壁纸
博主头像
CoderKim

一名后端开发工程师,喜欢学习和分享。

  • 累计撰写 50 篇文章
  • 累计创建 75 个标签
  • 累计收到 7 条评论

目 录CONTENT

文章目录

使用Java语言调用OpenAI接口流式输出内容

CoderKim
2023-04-13 / 0 评论 / 0 点赞 / 452 阅读 / 713 字 / 正在检测是否收录...

前言

其实第一次使用 ChatGPT 时,我就比较好奇他输出内容时是如何一个字一个字往出蹦的,而不是像一般接口一样一下子将所有信息都展示出来。

起初我的猜想是前端故意做了这种效果,可交互了几次之后发现内容输出的速度不规律,时快时慢,不像是前端效果,那这个功能应该如何实现呢?

后来 OpenAI 公开了 GPT-3.5 的调用接口后,我在其官方文档中确认了之前的猜想,确实是后端一边生成一边给数据的,其用的 Python 语言,官方还给了使用示例,感兴趣的可以参考一下,openai-cookbook/How_to_stream_completions.ipynb

Python 可以,Java 当然也可以,作为一个使用 Java 语言为主力语言的后端开发者,当然是想要用 Java 完成啊。最近发现了一个开源项目,项目链接:elunez/openai-java,就是用的 Java 语言,接下来我们看看它是如何实现的。

使用 WebSocket 方式

我们先贴上调用接口的代码:

可以看到,在构建请求参数时,需要加上steam: true ,告诉 OpenAI 此对话请求需流式返回;

调用接口时,使用了Hutool 提供的工具类 ,调用executeAsync() 方法发送异步请求。

注:

异步请求后获取的 HttpResponse 为异步模式,执行完此方法后发送请求到服务器,但是并不立即读取响应内容。 此时保持 Http
连接不关闭,直调用获取内容方法为止。

那么接下来,我们就从 HttpResponse 对象中循环获取内容即可:

通过调用 HttpResponse 对象的bodyStream()方法构建字符流,然后从字符流中循环读取,最终通过正则匹配将返回的数据取出并进行处理后,发送给webSocketServer 实现服务器主动推送。

前端实时展示 webSocket 中的消息即可。

其他方式

除了 WebSocket,还有一些其他方式,比如Spring SseEmitter,参考PlexPt/chatgpt-java: ChatGPT Java SDK。支持 GPT3.5、 GPT4 API。开箱即用。 (github.com)

当然,世界上最好的语言——PHP,当然也能实现,这里贴出一个链接:qiayue/php-openai-gpt-stream-chat-api-webui: 不使用任何框架,php + html + css + js 原生实现 openai gpt chat 接口对接,实现流式数据传输和接收,附带简洁网页demo。 (github.com),这个代码里注释特别详细,参考价值极大,我就不在此复述了。

0

评论区