Como transmitir respostas de LLM com SSE e fragmentos de utilização
Tradução automática
Este artigo foi traduzido automaticamente a partir da versão original em inglês.
Para transmitir uma resposta de LLM de forma incremental, analise o protocolo de eventos do servidor, reúna os deltas de conteúdo e atualize a apresentação à medida que chega texto utilizável. Muitas APIs usam Server-Sent Events, ou SSE. Uma leitura HTTP pode conter parte de um evento ou vários eventos. Um evento pode conter vários tokens do modelo.
As implementações do cliente precisam de armazenamento em memória intermédia e de tratamento da conclusão, além de uma primeira atualização rápida.
Analise os eventos antes dos dados do modelo
O formato SSE usa linhas como data: e termina um evento com uma linha em branco. As leituras de rede podem dividir essas linhas ou combinar vários eventos. Guarde o texto incompleto em memória intermédia, reconheça os eventos completos e depois analise os dados específicos da API. Várias linhas data: pertencem ao mesmo evento.
No OpenAI Chat Completions, o conteúdo chega como deltas que o cliente reúne numa mensagem. Trate os deltas de tool calls ou os deltas estruturados de acordo com os seus campos, em vez de tratar todos os eventos como texto corrido. O marcador [DONE] é uma convenção da API, não um requisito geral de SSE.
Uma ordem útil de processamento no cliente é:
- Descodifique os bytes recebidos sem perder um carácter UTF-8 dividido entre leituras.
- Guarde os dados em memória intermédia até ter um evento SSE completo.
- Interprete esse evento segundo o esquema da API selecionada.
- Acrescente o conteúdo ou os campos estruturados à resposta reunida.
- Atualize a apresentação num limite adequado do conteúdo em memória intermédia.
Separe a apresentação, a conclusão e a utilização
Apresente o texto corrido rapidamente sempre que possível. Guarde construções Markdown ou linhas de código incompletas em memória intermédia se a formatação imediata causar alterações repetidas da disposição. Registe o início do pedido e o primeiro conteúdo gerado separadamente do momento de abertura da ligação ou de um evento que contenha apenas metadados.
Na API Chat da OpenAI, stream_options: {"include_usage": true} pede um fragmento final de utilização antes de [DONE]. Esse fragmento tem uma lista de escolhas vazia. As transmissões interrompidas ou canceladas podem nunca o entregar, pelo que a ausência de dados de utilização não pode ser interpretada como zero tokens.
Os servidores compatíveis com a OpenAI podem implementar outros formatos de dados ou comportamentos de conclusão. Teste eventos fragmentados, vários eventos por leitura, deltas vazios, cancelamento, erros do servidor e a ausência dos dados finais de utilização com a implementação cuja versão foi fixada. Preserve o texto já recebido e distinga uma resposta incompleta de uma conclusão bem-sucedida.
Guia de engenharia: transmissão incremental na prática relaciona o comportamento do cliente com TTFT, TPOT e o escalonamento do prefill.