最近在開發(fā)跟大模型相關(guān)的業(yè)務(wù),需要用java去請求大模型的對話接口并支持流式的返回,變用到了sse接口。首先介紹一下什么是SSE,SSE ( Server-sent Events )是 WebSocket 的一種輕量代替方案,使用 HTTP 協(xié)議。
嚴格地說,HTTP 協(xié)議是沒有辦法做服務(wù)器推送的,但是當服務(wù)器向客戶端聲明接下來要發(fā)送流信息時,客戶端就會保持連接打開,SSE 使用的就是這種原理。
一、SSE 能做什么?
理論上, SSE 和 WebSocket 做的是同一件事情。當你需要用新數(shù)據(jù)局部更新網(wǎng)絡(luò)應(yīng)用時,SSE 可以做到不需要用戶執(zhí)行任何操作,便可以完成。
這種技術(shù)通常用于實現(xiàn)實時更新、通知和事件驅(qū)動的應(yīng)用程序,例如實時聊天、股票市場更新、新聞通知等。
二、SSE vs. WebSocket
SSE 是單向通道,只能服務(wù)器向客戶端發(fā)送消息,如果客戶端需要向服務(wù)器發(fā)送消息,則需要一個新的 HTTP 請求。這對比 WebSocket 的雙工通道來說,會有更大的開銷。這么一來的話就會存在一個「什么時候才需要關(guān)心這個差異?」的問題,如果平均每秒會向服務(wù)器發(fā)送一次消息的話,那應(yīng)該選擇 WebSocket。如果一分鐘僅 5 - 6 次的話,其實這個差異并不大。
在瀏覽器兼容方面,兩者差不多。在較早之前,每當需要建立雙向 Socket 時就會使用 Flash,在 移動瀏覽器不支持 Flash 的情況下,WebSocket 的兼容是比較難做的。
SSE 我認為最大的優(yōu)勢是便利,實現(xiàn)一個完整的服務(wù)僅需要少量的代碼;可以在現(xiàn)有的服務(wù)中使用,不需要啟動一個新的服務(wù);可以用任何一種服務(wù)端語言中使用;基于 HTTP / HTTPS 協(xié)議,可以直接運行于現(xiàn)有的代理服務(wù)器和認證技術(shù)。有了這些優(yōu)勢,在選擇使用 SSE 時就已經(jīng)為自己的項目節(jié)約了不少成本。
三、下面來寫一下如何用java調(diào)用sse接口
我們可以借助okhttp來實現(xiàn),首先引入okhttp-sse的依賴:
<dependency>
<groupId>com.squareup.okhttp3</groupId>
<artifactId>okhttp-sse</artifactId>
<version>4.12.0</version>
</dependency>
調(diào)用代碼如下:文章來源:http://www.zghlxwxcb.cn/news/detail-804271.html
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);
3.運行效果文章來源地址http://www.zghlxwxcb.cn/news/detail-804271.html
""
"你"
"你好"
"你好??"
"你好??!"
"你好??!很高興"
"你好??!很高興見到"
"你好??!很高興見到你"
"你好??!很高興見到你,"
"你好??!很高興見到你,歡迎"
"你好??!很高興見到你,歡迎問我"
"你好??!很高興見到你,歡迎問我任何"
"你好??!很高興見到你,歡迎問我任何問題"
"你好??!很高興見到你,歡迎問我任何問題。"
到了這里,關(guān)于Java-基于okhttp請求SSE接口流式返回的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!