這種高效的通信方式使得服務器可以主動發送信息,而不再依賴客戶端的反復請求。

什么是SSE?

服務器發送事件(SSE)是一種基于HTTP的網絡技術,允許服務器通過持久連接向客戶端實時推送數據。這意味著服務器可以主動發送信息給瀏覽器或其他客戶端,而不需要客戶端頻繁地請求更新。

工作步驟

  1. 連接建立:客戶端(如瀏覽器)向服務器發送請求,以建立一個持久的SSE連接。此連接將保持打開狀態,直到客戶端或服務器明確關閉。
  2. 數據推送:連接建立后,服務器可以隨時向客戶端發送數據。數據通常以文本格式傳輸,并按照特定格式進行組織(例如,以 data: 開頭)。
  3. 事件格式:服務器發送的數據塊可以包含不同的事件類型和內容。每個數據塊以 \n\n 進行分隔,這樣可以形成多個消息的連續流。
  4. 自動重連:若連接因故障中斷,瀏覽器會自動嘗試重連,以繼續接收數據流。

流式LLM API的工作原理

流式大語言模型(LLM)API利用SSE技術,通過持久連接向客戶端發送實時數據。使用此技術的API通常返回的內容類型為 content-type: text/event-stream。

這種格式允許數據以塊的形式傳輸,每個數據塊以 \r\n\r\n 分隔。每個數據塊的內容通常包含以 data: 開頭的JSON格式行。此外,一些API可能會使用 event: 行來標識特定的事件類型。

優勢

SSE技術為實時數據傳輸提供了一個高效且易于實現的解決方案,特別適用于流式API和需要快速反饋的應用場景。

OpenAI API 示例

使用 curl 調用 OpenAI API 示例,發送提示并請求流式響應:

curl https://api.openai.com/v1/chat/completions \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $OPENAI_API_KEY" \
-d '{
"model": "gpt-4o-mini",
"messages": [{"role": "user", "content": "Tell me a joke"}],
"stream": true,
"stream_options": {
"include_usage": true
}
}' \
--no-buffer

返回輸出

data: {"id":"chatcmpl-abc123","model":"gpt-4o-mini","choices":[{"delta":{"role":"assistant","content":"Why don't scientists trust atoms? Because they make up everything!"},"finish_reason":null}]}
data: {"id":"chatcmpl-abc123","model":"gpt-4o-mini","choices":[{"delta":{"role":"assistant","content":"\n"},"finish_reason":null}]}
data: {"id":"chatcmpl-abc123","model":"gpt-4o-mini","choices":[{"delta":{"role":"assistant","content":"And that's the punchline!"},"finish_reason":"stop"}]}

這個請求發送給 OpenAI API,請求一個笑話的響應。

返回的數據以 data: 開頭,后面跟著 JSON 格式的內容,表示不同的響應塊。每個數據塊都帶有創建時間、模型信息和生成的內容。

Anthropic Claude API 示例

Anthropic 的 Claude API 也支持流式響應,示例如下:

curl https://api.anthropic.com/v1/messages \
-H "Content-Type: application/json" \
-H "x-api-key: $ANTHROPIC_API_KEY" \
-H "anthropic-version: 2023-06-01" \
-d '{
"model": "claude-3-sonnet-20240229",
"messages": [{"role": "user", "content": "Tell me a joke"}],
"stream": true,
"max_tokens": 1024
}' \
--no-buffer

輸出

event: message_start
data: {"id":"chatcmpl-def456","model":"claude-3-sonnet-20240229","choices":[{"delta":{"role":"assistant","content":"Okay, here's a joke: Why did the scarecrow win an award? Because he was outstanding in his field!"},"finish_reason":null}]}
event: content_block_delta
data: {"id":"chatcmpl-def456","model":"claude-3-sonnet-20240229","choices":[{"delta":{"role":"assistant","content":"\n"},"finish_reason":null}]}
event: message_end
data: {"id":"chatcmpl-def456","model":"claude-3-sonnet-20240229","choices":[{"delta":{"role":"assistant","content":"And that's why! ??"},"finish_reason":"stop"}]}

顯示了多個事件的輸出,包括消息開始、內容塊更新和消息結束,提供了更豐富的事件跟蹤。

返回數據中包含多個事件類型(如 message_start、content_block_delta),每個事件指示生成的內容或狀態更新。

Google Gemini API 示例

Google Gemini 的流式 API 返回較大數據塊,需要指定內容以獲取長響應:

curl "https://generativelanguage.googleapis.com/v1beta/models/gemini-pro:streamGenerateContent?alt=sse&key=${GOOGLE_API_KEY}" \
-H 'Content-Type: application/json' \
-d '{
"contents": [
{
"parts": [
{"text": "Tell me a very long joke"}
]
}
]
}' \
--no-buffer

輸出

data: {"content":[{"text":"Why did the chicken cross the road? To get to the other side!"},{"text":"And on the other side, it found a whole farm of jokes!"}],"meta":{"usage":{"tokens":50}}}
data: {"content":[{"text":"The chicken decided to tell a joke about itself."}],"meta":{"usage":{"tokens":30}}}

返回的 JSON 數據展示了多部分生成內容和相應的使用元數據。

使用HTTPX訪問流

對于 Python 用戶,HTTPX 庫提供了流式數據處理的簡便方法。

使用 httpx-sse 包可以輕松地顯示流輸出到控制臺。

import httpx

async def stream_openai():
async with httpx.AsyncClient() as client:
async with client.stream("POST", "https://api.openai.com/v1/chat/completions", json=data) as response:
async for line in response.aiter_lines():
print(line)

講解:此示例展示了如何使用異步 HTTP 客戶端進行流式請求,逐行讀取并處理返回的數據。

總結

通過服務器發送事件(SSE),LLM API 能夠高效地進行實時數據傳輸。這種機制使得用戶能夠獲取分步更新,增強了交互體驗。

不同的 API 實現雖然略有不同,但基本的通信格式和流程是一致的。使用 SSE,開發者能夠構建更加響應迅速和用戶友好的應用。

文章轉自微信公眾號@吳建明利馳軟件

上一篇:

一文詳談RAG優化方案與實踐

下一篇:

大模型的“手和腳”——連接外部應用的通道函數調用(function calling),AI Agent的實現方式之一
#你可能也喜歡這些API文章!

我們有何不同?

API服務商零注冊

多API并行試用

數據驅動選型,提升決策效率

查看全部API→
??

熱門場景實測,選對API

#AI文本生成大模型API

對比大模型API的內容創意新穎性、情感共鳴力、商業轉化潛力

25個渠道
一鍵對比試用API 限時免費

#AI深度推理大模型API

對比大模型API的邏輯推理準確性、分析深度、可視化建議合理性

10個渠道
一鍵對比試用API 限時免費