
2024年您產品必備的10大AI API推薦
這種高效的通信方式使得服務器可以主動發送信息,而不再依賴客戶端的反復請求。
服務器發送事件(SSE)是一種基于HTTP的網絡技術,允許服務器通過持久連接向客戶端實時推送數據。這意味著服務器可以主動發送信息給瀏覽器或其他客戶端,而不需要客戶端頻繁地請求更新。
data:
開頭)。\n\n
進行分隔,這樣可以形成多個消息的連續流。流式大語言模型(LLM)API利用SSE技術,通過持久連接向客戶端發送實時數據。使用此技術的API通常返回的內容類型為 content-type: text/event-stream
。
這種格式允許數據以塊的形式傳輸,每個數據塊以 \r\n\r\n
分隔。每個數據塊的內容通常包含以 data:
開頭的JSON格式行。此外,一些API可能會使用 event:
行來標識特定的事件類型。
SSE技術為實時數據傳輸提供了一個高效且易于實現的解決方案,特別適用于流式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 也支持流式響應,示例如下:
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 返回較大數據塊,需要指定內容以獲取長響應:
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 數據展示了多部分生成內容和相應的使用元數據。
對于 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,開發者能夠構建更加響應迅速和用戶友好的應用。
文章轉自微信公眾號@吳建明利馳軟件