text-generation-inference 文档
流式传输
并获得增强的文档体验
开始使用
流式传输
什么是流式传输?
令牌流式传输是指服务器在模型生成令牌时逐个返回令牌的模式。这使得能够向用户显示逐步生成的进度,而不是等待整个生成完成。流式传输是最终用户体验的一个重要方面,因为它减少了延迟,这是流畅体验最关键的方面之一。


通过令牌流式传输,服务器可以在生成整个响应之前就开始逐个返回令牌。用户可以在生成结束之前了解生成质量。这有不同的积极影响:
- 对于超长查询,用户可以提前几个数量级获得结果。
- 看到正在进行的生成允许用户在生成方向与预期不符时停止生成。
- 在早期阶段显示结果时,感知延迟会降低。
- 在对话式 UI 中使用时,体验感觉更自然。
例如,一个系统每秒可以生成 100 个令牌。如果系统生成 1000 个令牌,在非流式设置下,用户需要等待 10 秒才能获得结果。另一方面,在流式设置下,用户会立即获得初始结果,尽管端到端延迟将是相同的,但他们可以在五秒钟后看到一半的生成。下面您可以看到一个交互式演示,并排显示非流式传输与流式传输。点击下面的“**生成**”。
如何使用流式传输?
使用 Python 进行流式传输
要使用 `InferenceClient` 进行令牌流式传输,只需传入 `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
# 10
`huggingface_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 使用服务器发送事件(SSE)。在 SSE 设置中,客户端发送带有数据的请求,打开 HTTP 连接并订阅更新。之后,服务器将数据发送到客户端。无需进一步请求;服务器将继续发送数据。SSE 是单向的,这意味着客户端在第一次请求后不会向服务器发送其他请求。SSE 通过 HTTP 发送数据,使其易于使用。
SSE 与以下不同:
- 轮询:客户端不断调用服务器以获取数据。这意味着服务器可能会返回空响应并导致开销。
- Webhook:双向连接。服务器可以将信息发送到客户端,但客户端也可以在第一次请求后将数据发送到服务器。Webhook 更复杂,因为它们不仅仅使用 HTTP。
如果同时有太多请求,TGI 会返回一个带有 `overloaded` 错误类型(`huggingface_hub` 返回 `OverloadedError`)的 HTTP 错误。这允许客户端管理过载的服务器(例如,它可以向用户显示繁忙错误或通过新请求重试)。要配置最大并发请求数,您可以指定 `--max_concurrent_requests`,从而允许客户端处理背压。
< > 在 GitHub 上更新