O Custo Quadrático em Aplicações de Chat

Um alerta para quem desenvolve chats com LLMs

By Pablo Sampaio

Você está criando aplicações com interfaces conversacionais? Sabia que o custo pode crescer quadraticamente com a quantidade de mensagens da conversa?

Essa é uma característica pouco comentada em discussões sobre aplicações com LLMs, apesar de ter implicações importantes.

Neste texto eu explico qual é esse custo e porque ele existe, apresentando a matemática básica do fenômeno.


1 - Caracterizando o Problema

Vamos considerar que um chat em interações, onde cada interação é um par

(requisição do usuário → resposta do assistente).

Em alguns casos, uma mesma situação pode ser resolvida com $N=3$ interações ou com o dobro, que é $N=6$ interações! (Ou mais.)

O que afirmo aqui é o seguinte: o custo não vai crescer nesta mesma proporção! (Não é linear!)

Dobrando o tamanho da conversa, você terá algo em torno do quadráduplo do valor total!

De modo geral, chats $N$ interações terão um custo com algum fator $N^2$.

Para entender o porquê, vamos ver como funciona um chat usando modelos de linguagem.

2 - Chat com Modelos Transformers (LLMs e similares)

Aqui, estamos tratando de aplicações de conversação baseadas em redes neurais Transformers Autorregressivas. Esta é a técnica dos modelos mais famosos atualmente, sejam grandes (como os GPTs, Geminis e Claudes) ou pequenos (como os Gemmas e alguns LLamas e Qwens).

Simplificadamente, estes modelos recebem um texto de entrada e retornam um texto de saída. Cada texto desse é subdividido em tokens, que você pode assumir que são “palavras”. (Na verdade, pode ser partes de palavras, pontuações e símbolos).

Por isso, as aplicações de conversação (chats) vão repetir esse loop:

  1. O usuário envia uma nova mensagem de requisição.
  2. A aplicação coleta o histórico anterior da conversa e adiciona a nova requisição ao final (usando tokens “separadores”).
  3. Esse histórico é enviado ao modelo como “texto de entrada”.
  4. O modelo gera a próxima resposta (do assistente de conversa) como texto de saída.
  5. Essa resposta é acrescentada ao final do histórico. (E exibida ao usuário, geralmente).

Esse processo se repete, com um histórico cada vez maior!

Agora, junte essas duas informações:

  • uma entrada cada vez maior enviada ao modelo
  • modelos cobram (em dólar!) valores que dependem do tamanho da entrada.

Qual a consequência delas?

Um custo quadrático!

Vamos a uma explicação matemática.

3 - Modelo Matemático Simplificado

Para modelar matematicamente, vamos assumir algumas simplificações:

  • Cada mensagem (do usuário ou do assistente) possui o mesmo tamanho:
    $m \text{ tokens}$.

  • Considere que o custo que você paga ao model provider (como a OpenAI) é igual tamanho da entrada enviada ao modelo, em centavos. Ou seja:
    • Se você enviar 10 tokens de entrada, o modelo cobra $ 0,10.
  • Não vamos considerar cobrança por:
    • Token de saída (Calma! É uma simplificação!)
    • Tokens que separam as mensagens.

Nas próximas seções:

  • Vamos descobrir quantos tokens são cobrados a cada interação.
  • Vamos usar isso para definir o custo total de uma conversa.

3.1 - Quantos tokens são cobrados por interação?

Vamos definir uma função $T(n)$ que dá a quantidade de tokens de entrada enviada na interação $n$, para gerar uma resposta do assistente.

Na nossa simplificação, $T(n)$ dá também o próprio custo de gerar uma resposta na interação $n$.

Vamos propor uma fórmula para $T(n)$. Para isso, vamos examinar os valores dessa função à medida que a conversa avança.


Primeira interação

Lembre-se que a “entrada” enviada para o modelo é o histórico de mensagens contendo também a mais recente requisição do usuário.

Na primeira interação, não há mensagens anteiores. Assim, será enviada ao modelo apenas 1 mensagem:

  • a primeira requisição do usuário

Essa mensagem tem $m$ tokens (tamanho padrão que assumimos). Logo a quantidade de tokens enviados ao modelo é:

\[T(1) = 1 \times m\]

Segunda interação

Agora, o histórico terá 2 mensagens anteriores e 1 nova mensagem:

  • a requisição 1 do usuário
  • a resposta 1 do assistente
  • a requisição 2 (nova) do usuário

O total de tokens enviados será:

\[T(2) = 3 \times m\]

Terceira interação

O histórico a ser enviado conterá cinco mensagens:

  • a requisição 1 (do usuário)
  • a resposta 1 (do assistente)
  • a requisição 2
  • a resposta 2
  • a requisição 3 (nova)

Logo, a quantidade de tokens será:

\[T(3) = 5 \times m\]

Quarta interação

(Tente entender sozinho. Pense na quantidade de mensagens passadas e na nova requisição.)

\[T(4) = 7 \times m\]

Fórmula geral

Note que, à medida que aumentamos o $n$ da interação, o fator que multiplica $m$ assume valores sucessivos da sequência dos ímpares positivos.

Sendo bem direto, o padrão geral é dado por:

\[T(n) = (2n - 1) \times m\]

Ou seja, o custo de gerar cada resposta cresce linearmente com o tamanho da conversa até ali.

Ai você me diz: “Mas espera! Não era para crescer de forma quadrática??”

Calma! Até aqui, medimos o custo de gerar apenas 1 resposta!

Vamos analisar o custo total do chat a seguir.


3.2 - Ponto crítico: Qual o custo total do chat?

Agora, queremos quantificar o custo $C(N)$ de gerar respostas em uma conversac om $N$ interações.

Lembrando que:

  • Uma conversa (chat) com $N$ interações acionará o modelo $N$ vezes, para gerar as $N$ respostas do assistente,
  • O custo de cada resposta é dado pelo $T(n)$ que discutimos antes.

Assim, por definição, o custo total da conversa $C(N)$ é dado pela soma dos valores de $T(n)$ de 1 a N, assim:

\[C(N) = T(1) + T(2) + T(3) + \dots + T(N)\]

Substituindo pela fórmula de $T(N)$, isso equivale a:

\[C(N) = 1m + 3m + 5m + \dots + (2N-1)m\]

Fatorando por $m$ (à esquerda):

\[C(N) = m \times (1 + 3 + 5 + \dots + (2N-1))\]

A soma dos N primeiros números ímpares é bem conhecida na Matemática e vale $N^2$. Logo:

\[C(N) = m \times (N^2)\]

Note que o custo total $C(N)$ é uma função quadrática do N! Por isso:

O custo total de um chat cresce quadraticamente com o número de interações.


4. O Que Isso Significa na Prática?

Essa propriedade tem algumas consequências importantes que podem não ser intuitivas.

Cito algumas apenas para exemplificar, sem esgotar o assunto:

4.1 - Custo de conversas longas cresce rápido demais

Com essa relação quadrática, teremos situações assim:

  • Se uma conversa dobrar de tamanho (ex.: de 3 para 6 interações), o seu custo quadruplica.
  • Se ela triplicar de tamanho (ex.: de 3 para 9 interações), o seu custo é multiplicado por nove.
  • Se ela quadruplicar de tamanho (ex.: de 3 para 12 interações), o seu custo é multiplicado por dezesseis!

Enfim, chats longos são estruturalmente caros. (Sem contar do problema de context rot que pode surgir.)

E agora, tem certeza que quer deixar o seu usuário conversar livremente?


4.2. Engenharia de Contexto passa a ser Essencial

Ok, você até pode deixar seu usuário conversar livremente (ou quase isso). Mas, para não pagar caro, você precisa usar alguma técnica para diminuir o impacto.

Essas técnicas fazem parte da chamada Engenharia de Contexto, que trata de como manter o contexto mais relevante possível, com o menor tamanho possível.

Considere que, basicamente, contexto, aqui, é o mesmo que (tokens) de entrada do modelo.

Até aqui, estamos usando todo o nosso histórico como contexto. Mas podemos usar um contexto menor do que o histórico.

Algumas técnicas simples para isso:

  • truncar o histórico
  • sumarizar interações antigas
  • salvar parte da conversa em memória externa
  • iniciar um novo contexto, quando a requisição for nova (sem relação com o assunto anterior)

5. Conclusão

Na prática, o custo real pode diferir das fórmulas acima por alguns motivos:

  • o valor por token varia conforme o modelo
  • é comum ter diferentes valores por token de entrada e por token de saída
  • mecanismos de prompt caching oferecidos por alguns provedores pode baratear o histórico passado

Mesmo levando essas características em consideração, a tendência quadrática continua válida.

Você precisa estar atento a isso ao criar uma aplicação conversacional.

Quando pensamos em escala — milhares ou milhões de conversas — o impacto dessa “matemática” do contexto pode ser muito significativa para o negócio.

Tags: test
Share: X (Twitter) Facebook LinkedIn