
O streaming é a vitória mais fácil para UX e custo. Os usuários veem as palavras mais cedo, cancelam quando têm o suficiente e você gasta menos tokens. O streaming reduz a latência, o que é essencial para uma experiência tranquila para o usuário final. Você só precisa de duas coisas: um servidor que transmitee um cliente que lê partes sem armazenar em buffer.
Experimente o Compute hoje
Lance um vLLM servidor de inferência ligado Computar. Você obtém um endpoint HTTPS com rotas no estilo OpenAI que são transmitidas por padrão. Aponte seu SDK OpenAI existente para o novo URL base e comece a medir o TTFT.
Eventos enviados pelo servidor (SSE). Stream unidirecional via HTTP. O SSE transmite dados do servidor para o cliente por meio de uma conexão HTTP. Simples, compatível com proxy, ótimo para streaming de tokens. A API EventSource é padronizada como parte do HTML Living Standard pelo WHATWG. Funciona com o EventSource em navegadores e com respostas de streaming na maioria dos clientes HTTP.
WebSockets. Mensagens bidirecionais em um soquete persistente. Os WebSockets usam o protocolo WebSocket e são gerenciados por meio de um objeto WebSocket, permitindo a comunicação bidirecional em tempo real entre cliente e servidor. Útil quando o cliente precisa enviar eventos no meio do fluxo (digitação, sincronização do cursor, edições colaborativas). O streaming de tokens é o modo no qual o servidor retorna os tokens um por um à medida que o modelo os gera.
Regra prática: usa SSE para bate-papo a menos que você realmente precise de mensagens bidirecionais. Com o streaming de tokens, o servidor pode começar a retornar tokens antes de gerar toda a resposta.
importar OpenAI de “openai”;
const client = new OpenAI ({baseUrl: "https://YOUR-ENDPOINT/v1 “, apiKey: process.env.key});
const stream = await client.chat.completions.create ({
modelo: “f3-7b-instruct”,
messages: [{role: “user”, content: “Elabore uma breve atualização sobre o status do projeto.”}],
stream: verdadeiro,
máximo de tokens: 200
});
para await (const trecho do stream) {
const delta = chunk.choices?. [0]?. delta?. conteúdo;
if (delta) process.stdout.write (delta);
}
de openai import OpenAI
client = OpenAI (base_url=” https://YOUR-ENDPOINT/v1 “, API_key="your_key”)
com client.chat.completions.stream (
model="f3-7b-instruct”,
messages= [{"role” :"user”, "content” :"Escreva um resumo de um parágrafo. “}],
max_tokens = 200,
) como stream:
para evento em stream:
se event.type == “token”:
imprimir (event.token, end= "”)
Cancele rapidamente quando os usuários param de ler:
const controller = novo abortController ();
//sinal de passagem: client.chat.completions.create ({..., stream: true, signal: controller.signal})
//mais tarde
controller.abort ();
O servidor WebSocket estabelece uma conexão websocket persistente com os clientes, permitindo a comunicação bidirecional em tempo real. Durante o handshake inicial, o servidor e o cliente trocam cabeçalhos HTTP, incluindo SEC-WebSocket-Key, SEC-WebSocket-Version e SEC-WebSocket-Protocol, para atualizar a conexão HTTP para uma conexão WebSocket e garantir a segurança e a conformidade do protocolo.
//Esboço do servidor usando ws
importar {websocketServer} de “ws”;
const wss = novo WebSocketServer ({porta: 8080});
wss.on (“conexão”, (ws) => {
ws.on (“mensagem”, assíncrona (msg) => {
const {prompt} = JSON.parse (msg.toString ());
//chame seu endpoint compatível com OpenAI com stream=true
para await (símbolo const de generateStream (prompt)) {
ws.send (token);//contrapressão: verifique ws.bufferedAmount
}
});
ws.on (“fechar”, () => {
//Lidar com a limpeza quando a conexão é fechada
//Libere recursos ou realize qualquer limpeza necessária aqui
});
});
Quando a conexão é fechada, o servidor WebSocket aciona um evento de fechamento, permitindo que você gerencie a limpeza e os recursos gratuitos associados a essa conexão websocket.
Alça contrapressão: faça uma pausa quando ws.BufferedAmount for grande; retome quando for drenado. Em navegadores, use a API de streams com reader.read () e respeite os sinais ReadableStreamDefaultReader.
Experimentos de computação hoje
Implemente um vLLM ponto final ligado Computar. O streaming está ativado por padrão. Coloque-o perto de dois usuários, defina limites de saída restritos e veja o TTFT e o TPS melhorarem.
Use o SSE para a maioria dos bate-papos. Use WebSockets somente quando precisar de mensagens bidirecionais. Cancele imediatamente, limite as saídas e desative o proxy de buffer. Medida tempo até o primeiro token e tokens por segundoe, em seguida, ajuste os limites e os limites do lote antes de trocar o hardware.
Um fluxo HTTP unidirecional que o servidor envia para o cliente. O streaming de tokens é bem mapeado para o SSE.
O SSE é unidirecional e simples; os WebSockets são bidirecionais e são melhores para aplicativos interativos. Para sair de bate-papo, o SSE geralmente é suficiente.
Sim, use stream: true ou um cliente SSE. Você receberá tokens incrementais até que o modelo pare ou você cancele.
Interrompa a solicitação HTTP (SSE) ou feche o WebSocket. Sempre libere recursos do servidor ao cancelar.
Um intermediário está armazenando a resposta em buffer. Desative o buffer da rota e mantenha a conexão ativa.
Sim — EventSource para SSE ou fetch () com API Streams para ler partes.