Text Generation Inference 文件
串流
並獲得增強的文件體驗
開始使用
串流 (Streaming)
什麼是串流 (Streaming)?
Token 串流是一種模式,伺服器會在模型生成的同時,將 Token 一個接一個地回傳。這使得我們可以向使用者展示生成的過程,而不必等待整個生成過程結束。串流是終端使用者體驗中不可或缺的一環,因為它減少了延遲,而延遲是影響流暢體驗最關鍵的因素之一。

透過 Token 串流,伺服器可以在生成完整回應之前,就開始逐一回傳 Token。使用者在生成結束前就能感受到生成的品質。這能帶來多種正面的影響:
- 對於極長的查詢,使用者可以提早數個數量級獲得結果。
- 可以看到生成過程,讓使用者若發現結果不如預期,可以隨時停止生成。
- 當結果在早期階段顯示時,感知的延遲會降低。
- 在對話式 UI 中使用時,體驗會感覺更自然。
例如,系統每秒可以生成 100 個 Token。如果系統要生成 1000 個 Token,在非串流的設定下,使用者需要等待 10 秒才能看到結果。另一方面,在串流設定下,使用者可以立即獲得初步結果,雖然端對端延遲是一樣的,但他們在 5 秒後就能看到一半的生成結果。下方有一個互動式演示,展示了非串流與串流的對比。請點擊下方的產生 (generate)。
如何使用串流?
使用 Python 進行串流
若要使用 InferenceClient 串流 Token,只需傳入 stream=True 並迭代回應即可。
from huggingface_hub import InferenceClient
client = InferenceClient(base_url="http://127.0.0.1:8080")
output = client.chat.completions.create(
messages=[
{"role": "system", "content": "You are a helpful assistant."},
{"role": "user", "content": "Count to 10"},
],
stream=True,
max_tokens=1024,
)
for chunk in output:
print(chunk.choices[0].delta.content)
# 1
# 2
# 3
# 4
# 5
# 6
# 7
# 8
# 9
# 10huggingface_hub 函式庫也提供了 AsyncInferenceClient,以防您需要同時處理多個請求。
from huggingface_hub import AsyncInferenceClient
client = AsyncInferenceClient(base_url="http://127.0.0.1:8080")
async def main():
stream = await client.chat.completions.create(
messages=[{"role": "user", "content": "Say this is a test"}],
stream=True,
)
async for chunk in stream:
print(chunk.choices[0].delta.content or "", end="")
asyncio.run(main())
# This
# is
# a
# test
#.使用 cURL 進行串流
若要使用與 OpenAI Chat Completions 相容的 Messages API v1/chat/completions 端點進行 curl 呼叫,您可以加入 -N 旗標。這會停用 curl 的預設緩衝,並在資料從伺服器抵達時即時顯示。
curl localhost:8080/v1/chat/completions \
-X POST \
-d '{
"model": "tgi",
"messages": [
{
"role": "system",
"content": "You are a helpful assistant."
},
{
"role": "user",
"content": "What is deep learning?"
}
],
"stream": true,
"max_tokens": 20
}' \
-H 'Content-Type: application/json'使用 JavaScript 進行串流
首先,我們需要安裝 @huggingface/inference 函式庫。
npm install @huggingface/inference
無論您使用 Inference Providers(我們的無伺服器 API)還是 Inference Endpoints,您都可以呼叫 InferenceClient。
import { InferenceClient } from '@huggingface/inference';
const client = new InferenceClient('hf_YOUR_TOKEN', { endpointUrl: 'https://YOUR_ENDPOINT.endpoints.huggingface.cloud' });
// prompt
const prompt = 'What can you do in Nuremberg, Germany? Give me 3 Tips';
const stream = client.textGenerationStream({ inputs: prompt });
for await (const r of stream) {
// yield the generated token
process.stdout.write(r.token.text);
}串流運作原理為何?
底層上,TGI 使用伺服器推送事件 (Server-Sent Events, SSE)。在 SSE 設定中,客戶端發送包含資料的請求,開啟一個 HTTP 連線並訂閱更新。隨後,伺服器會將資料主動推送給客戶端。無需額外的請求;伺服器會持續發送資料。SSE 是單向的,這意味著客戶端不會再向伺服器發送其他請求。SSE 透過 HTTP 發送資料,因此非常容易使用。
SSE 與以下技術不同:
- 輪詢 (Polling):客戶端持續呼叫伺服器以獲取資料。這意味著伺服器可能會回傳空的回應並造成額外開銷。
- Webhook:這是一種雙向連線。伺服器可以向客戶端發送資訊,客戶端在第一次請求後也能將資料傳回給伺服器。Webhook 的運作較為複雜,因為它們不只使用 HTTP。
如果同時有太多請求,TGI 會回傳一個帶有 overloaded 錯誤類型的 HTTP 錯誤 (huggingface_hub 會回傳 OverloadedError)。這允許客戶端處理伺服器過載的情況(例如,它可以向使用者顯示忙碌錯誤或使用新請求進行重試)。若要設定最大並發請求數,您可以指定 --max_concurrent_requests,允許客戶端處理背壓 (backpressure)。