Java如何基于okhttp請求SSE接口流式返回詳解
前言
最近在開發(fā)跟大模型相關的業(yè)務,需要用java去請求大模型的對話接口并支持流式的返回,變用到了sse接口。首先介紹一下什么是SSE,SSE ( Server-sent Events )是 WebSocket 的一種輕量代替方案,使用 HTTP 協(xié)議。
嚴格地說,HTTP 協(xié)議是沒有辦法做服務器推送的,但是當服務器向客戶端聲明接下來要發(fā)送流信息時,客戶端就會保持連接打開,SSE 使用的就是這種原理。
一、SSE 能做什么?
理論上, SSE 和 WebSocket 做的是同一件事情。當你需要用新數(shù)據(jù)局部更新網(wǎng)絡應用時,SSE 可以做到不需要用戶執(zhí)行任何操作,便可以完成。
這種技術通常用于實現(xiàn)實時更新、通知和事件驅動的應用程序,例如實時聊天、股票市場更新、新聞通知等。
二、SSE vs. WebSocket
SSE 是單向通道,只能服務器向客戶端發(fā)送消息,如果客戶端需要向服務器發(fā)送消息,則需要一個新的 HTTP 請求。這對比 WebSocket 的雙工通道來說,會有更大的開銷。這么一來的話就會存在一個「什么時候才需要關心這個差異?」的問題,如果平均每秒會向服務器發(fā)送一次消息的話,那應該選擇 WebSocket。如果一分鐘僅 5 - 6 次的話,其實這個差異并不大。
在瀏覽器兼容方面,兩者差不多。在較早之前,每當需要建立雙向 Socket 時就會使用 Flash,在 移動瀏覽器不支持 Flash 的情況下,WebSocket 的兼容是比較難做的。
SSE 我認為最大的優(yōu)勢是便利,實現(xiàn)一個完整的服務僅需要少量的代碼;可以在現(xiàn)有的服務中使用,不需要啟動一個新的服務;可以用任何一種服務端語言中使用;基于 HTTP / HTTPS 協(xié)議,可以直接運行于現(xiàn)有的代理服務器和認證技術。有了這些優(yōu)勢,在選擇使用 SSE 時就已經(jīng)為自己的項目節(jié)約了不少成本。
三、下面來寫一下如何用java調用sse接口
我們可以借助okhttp來實現(xiàn),首先引入okhttp-sse的依賴:
<dependency>
<groupId>com.squareup.okhttp3</groupId>
<artifactId>okhttp-sse</artifactId>
<version>4.12.0</version>
</dependency>
調用代碼如下:
OkHttpClient client = new OkHttpClient.Builder()
.connectTimeout(10, TimeUnit.SECONDS)
.writeTimeout(50, TimeUnit.SECONDS)
.readTimeout(10, TimeUnit.MINUTES)
.build();
EventSource.Factory factory = EventSources.createFactory(client);
// 請求體
HashMap<String, Object> map = new HashMap<>();
map.put("prompt","哈嘍,你好");
map.put("history", Arrays.asList());
map.put("temperature",0.9);
map.put("top_p",0.7);
map.put("max_new_tokens",4096);
String json = JsonUtil.objectToString(map);
RequestBody body = RequestBody.create(MediaType.parse("application/json; charset=utf-8"),json);
// 請求對象
Request request = new Request.Builder()
.url("http://localhost:8001/chat")
.post(body)
.build();
// 自定義監(jiān)聽器
EventSourceListener eventSourceListener = new EventSourceListener() {
@Override
public void onOpen(EventSource eventSource, Response response) {
super.onOpen(eventSource, response);
}
@Override
public void onEvent(EventSource eventSource, @Nullable String id, @Nullable String type, String data) {
// 接受消息 data
super.onEvent(eventSource, id, type, data);
}
@Override
public void onClosed(EventSource eventSource) {
super.onClosed(eventSource);
}
@Override
public void onFailure(EventSource eventSource, @Nullable Throwable t, @Nullable Response response) {
super.onFailure(eventSource, t, response);
}
};
// 創(chuàng)建事件
EventSource eventSource = factory.newEventSource(request, eventSourceListener);
運行效果
""
"你"
"你好"
"你好??"
"你好??!"
"你好??!很高興"
"你好??!很高興見到"
"你好??!很高興見到你"
"你好??!很高興見到你,"
"你好??!很高興見到你,歡迎"
"你好??!很高興見到你,歡迎問我"
"你好??!很高興見到你,歡迎問我任何"
"你好??!很高興見到你,歡迎問我任何問題"
"你好??!很高興見到你,歡迎問我任何問題。"
總結
到此這篇關于Java如何基于okhttp請求SSE接口流式返回的文章就介紹到這了,更多相關Java請求SSE接口流式返回內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
前端如何調用后端接口進行數(shù)據(jù)交互詳解(axios和SpringBoot)
一般來講前端不會給后端接口,而是后端給前端接口的情況比較普遍,下面這篇文章主要給大家介紹了關于前端如何調用后端接口進行數(shù)據(jù)交互的相關資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下2023-03-03
IDEA?設置?SpringBoot?logback?彩色日志的解決方法?附配置文件
這篇文章主要介紹了IDEA?設置?SpringBoot?logback?彩色日志(附配置文件)的操作方法,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-12-12
springboot項目中application.properties無法變成小樹葉問題解決方案
這篇文章主要介紹了springboot項目中application.properties無法變成小樹葉問題解決,本文通過圖文實例代碼相結合給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-09-09
Java描述數(shù)據(jù)結構學習之鏈表的增刪改查詳解

