
La transmisión es la ganancia más fácil para la experiencia de usuario y el costo. Los usuarios ven las palabras antes, cancelan cuando tienen suficiente y gastan menos fichas. La transmisión reduce la latencia, que es fundamental para una experiencia fluida para el usuario final. Solo necesitas dos cosas: un servidor que transmite, y un cliente que lee fragmentos sin almacenamiento en búfer.
Prueba Compute hoy
Lanza un VLLM servidor de inferencia en Calcular. Obtienes un punto final HTTPS con rutas al estilo de OpenAI que se transmiten de forma predeterminada. Dirija su SDK de OpenAI existente a la nueva URL base y comience a medir el TTFT.
Eventos enviados por el servidor (SSE). Transmisión unidireccional a través de HTTP. El SSE transmite datos del servidor al cliente a través de una conexión HTTP. Sencillo, compatible con servidores proxy, ideal para la transmisión de tokens. La API EventSource está estandarizada por WHATWG como parte del HTML Living Standard. Funciona con EventSource en los navegadores y con las respuestas en streaming en la mayoría de los clientes HTTP.
WebSockets. Mensajes bidireccionales a través de un socket persistente. Los WebSockets utilizan el protocolo WebSocket y se administran mediante un objeto WebSocket, lo que permite una comunicación bidireccional en tiempo real entre el cliente y el servidor. Resulta útil cuando el cliente debe enviar eventos a mitad de camino (escritura, sincronización del cursor, ediciones colaborativas). La transmisión de tokens es el modo en el que el servidor devuelve los tokens uno por uno a medida que el modelo los genera.
Regla empírica: utilizar SSE para chatear a menos que realmente necesites mensajes bidireccionales. Con la transmisión de tokens, el servidor puede empezar a devolver los tokens antes de generar la respuesta completa.
importar OpenAI desde «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: «Redacte una breve actualización sobre el estado del proyecto».}],
transmisión: verdadera,
número máximo de tokens: 200
});
para await (parte constante de la transmisión) {
const delta = chunk.choices?. ¿[0]?. ¿delta?. contenido;
si (delta) process.stdout.write (delta);
}
desde openai importar OpenAI
client = OpenAI (base_url=» https://YOUR-ENDPOINT/v1 «, API_KEY="Your_key»)
con client.chat.completions.stream (
model="f3-7b-instruct»,
messages= [{"role» :"user», "content» :"Escribe un resumen de un párrafo. «}],
max_tokens=200,
) como transmisión:
para un evento en streaming:
si event.type == «token»:
print (event.token, end= "»)
Cancela rápido cuando los usuarios dejan de leer:
const controller = new abortController ();
//señal de paso: client.chat.completions.create ({..., stream: true, signal: controller.signal})
//más adelante
controlador.abort ();
El servidor WebSocket establece una conexión websocket persistente con los clientes, lo que permite la comunicación bidireccional en tiempo real. Durante el protocolo de enlace inicial, el servidor y el cliente intercambian encabezados HTTP, incluidos SEC-Websocket-Key, SEC-Websocket-Version y SEC-Websocket-Protocol, para actualizar la conexión HTTP a una conexión WebSocket y garantizar la seguridad y el cumplimiento del protocolo.
//Bosquejo de servidor usando ws
importar {WebSocketServer} desde «ws»;
const wss = new WebSocketServer ({puerto: 8080});
wss.on («conexión», (ws) => {
ws.on («mensaje», asíncrono (mensaje) => {
const {prompt} = JSON.parse (msg.toString ());
//llame a su punto final compatible con OpenAI con stream=true
para await (token constante de GenerateStream (prompt)) {
ws.send (token);//contrapresión: compruebe ws.BufferedAmount
}
});
ws.on («cerrar», () => {
//Gestiona la limpieza cuando se cierra la conexión
//Libera recursos o realiza cualquier limpieza necesaria aquí
});
});
Cuando se cierra la conexión, el servidor WebSocket desencadena un evento de cierre, lo que le permite gestionar la limpieza y liberar los recursos asociados a esa conexión de Websocket.
Manejar contrapresión: pausa cuando ws.BufferedAmount es grande; reanuda cuando se agota. En los navegadores, utilice la API de transmisiones con reader.read () y respete las señales de ReadableStreamDefaultReader.
Prueba Compute hoy
Implemente un VLLM punto final activado Calcular. La transmisión está activada de forma predeterminada. Colócala cerca de los usuarios, establece límites de salida estrictos y observa cómo mejoran TTFT y TPS.
Usa SSE para la mayoría de los chats. Usa WebSockets solo cuando necesites mensajes bidireccionales. Cancela rápidamente, limita las salidas y desactiva el almacenamiento en búfer del proxy. Mida tiempo hasta el primer token y fichas por segundo, luego ajusta los límites de los límites de los lotes y los límites antes de cambiar el hardware.
Transmisión HTTP unidireccional que el servidor envía al cliente. La transmisión de tokens se corresponde bien con el SSE.
El SSE es unidireccional y sencillo; los WebSockets son bidireccionales y mejores para las aplicaciones interactivas. Para la salida de chat, el SSE suele ser suficiente.
Sí, use stream: true o un cliente SSE. Recibirás fichas incrementales hasta que el modelo se detenga o hasta que lo canceles.
Anule la solicitud HTTP (SSE) o cierre el WebSocket. Libere siempre los recursos del servidor al cancelar.
Un intermediario está almacenando en búfer la respuesta. Deshabilite el almacenamiento en búfer de la ruta y mantenga activa la conexión.
Sí: EventSource para SSE o fetch () con la API de Streams para leer fragmentos.