Skip to content

fix: o robô parou de reler a persona inteira antes de cada resposta - #16

Merged
kerlonr merged 1 commit into
mainfrom
fix/prompt-que-nao-cabe
Sep 4, 2026
Merged

fix: o robô parou de reler a persona inteira antes de cada resposta#16
kerlonr merged 1 commit into
mainfrom
fix/prompt-que-nao-cabe

Conversation

@kerlonr

@kerlonr kerlonr commented Sep 4, 2026

Copy link
Copy Markdown
Member

A causa que faltava

O log do Ollama tinha a resposta, e não era nenhuma das que apontei antes:

llama-server started in 2.94 seconds        ← o modelo foi recarregado
task.n_tokens = 1968                        ← o prompt tem 1968 tokens
cached n_tokens = 0                         ← o cache do prompt sumiu junto
prompt processing   512/1968   39 tokens/s
prompt processing  1024/1968   34 tokens/s
prompt processing  1456/1968   32 tokens/s
[GIN] 500 | 1m0s | POST "/api/chat"

Os sessenta segundos foram gastos lendo o prompt. Ele nunca chegou a gerar o primeiro token. Não era o modelo lento, nem a voz, nem disputa de núcleos — era a persona sendo relida do zero, a 35 tokens por segundo.

Por que o cache esfriava

KEEP_ALIVE_EM_USO era "5m". Cinco minutos sem pergunta e o Ollama descarregava o modelo, e com ele o cache do prompt. A pergunta seguinte pagava a releitura inteira — ou seja, sempre a primeira pergunta de quem chega perto do robô.

O próprio módulo já dizia que o momento de carregar o modelo é a queda da rede, "ali ninguém está esperando resposta"; descarregar cinco minutos depois desfazia isso. Agora é "-1": enquanto o modelo local for quem responde, ele fica. Custa ~1,2 GB num Pi com 4,4 GB livres.

E a persona não cabia na janela

7198 caracteres ≈ 1950 tokens, com num_ctx em 2048 — 95% da janela. Somando a resposta, o contexto transbordava e o Ollama passava a deslocar a janela no meio da geração. Agora são 4096.

E o log passa a dizer isso

Um prompt grande não dá erro: dá lentidão, e de um jeito que não aponta para ele. Quem investiga olha o modelo, a rede e a voz — tudo menos o arquivo de texto da personalidade.

O arranque agora avisa quando lê-la custa mais de 30 s com o cache frio, em segundos. Trinta e não quinze: num Pi qualquer prompt custa ~1 s por 35 tokens quando o cache esfria, e até uma persona modesta gasta quinze — avisar sobre ela seria avisar sempre. E o aviso mede tempo, não fração da janela: a mesma persona que trava um Pi passa despercebida numa máquina de mesa.

De quebra, a estimativa de tokens passou de 4 para 3,7 caracteres/token — é o que este texto de fato deu, e a regra de bolso subestimava o prompt em quase 10%, justo na direção que faz o aviso não aparecer.

Verificação

  • 758 testes passam (eram 753), nos dois ambientes

🤖 Generated with Claude Code

https://claude.ai/code/session_0173mr3mDsAKQuPUNaPghe9v

O log do Ollama tinha a causa que faltava, e nao era nenhuma das que eu tinha
apontado antes:

    llama-server started in 2.94 seconds        <- o modelo foi recarregado
    task.n_tokens = 1968                        <- o prompt tem 1968 tokens
    cached n_tokens = 0                         <- o cache do prompt sumiu junto
    prompt processing   512/1968   39 tokens/s
    prompt processing  1024/1968   34 tokens/s
    prompt processing  1456/1968   32 tokens/s
    [GIN] 500 | 1m0s | POST "/api/chat"

**Os sessenta segundos foram gastos lendo o prompt.** Ele nao chegou a gerar o
primeiro token. Nao era o modelo lento, nem a voz, nem disputa de nucleos — era
a persona sendo relida do zero, a 35 tokens por segundo.

## Por que o cache esfriava

`KEEP_ALIVE_EM_USO` era "5m". Cinco minutos sem pergunta e o Ollama
descarregava o modelo, e com ele o cache do prompt. A pergunta seguinte pagava
a releitura inteira — ou seja, **sempre a primeira pergunta de quem chega perto
do robo**, que e a que mais importa. E o proprio modulo ja dizia que o momento
de carregar o modelo e a queda da rede, "ali ninguem esta esperando resposta";
descarregar cinco minutos depois desfazia isso.

Agora e "-1": enquanto o modelo local for quem responde, ele fica. Custa um
giga e pouco de RAM num Pi com 4,4 GB livres.

## E a persona nao cabia na janela

Sao 7198 caracteres, ~1950 tokens. `num_ctx` era 2048 — a persona ocupava 95%
da janela, e somando a resposta o contexto transbordava, fazendo o Ollama
deslocar a janela no meio da geracao. Agora sao 4096.

## E o log passa a dizer isso

Um prompt grande nao da erro: da lentidao, e de um jeito que nao aponta para
ele. Quem investiga olha o modelo, a rede e a voz — tudo menos o arquivo de
texto da personalidade. O arranque agora avisa quando le-la custa mais de
trinta segundos com o cache frio, com o numero em segundos.

Trinta, e nao quinze: num Pi qualquer prompt custa ~1 s por 35 tokens quando o
cache esfria, e ate uma persona modesta gasta quinze. Avisar sobre ela seria
avisar sempre. E o aviso mede tempo e nao fracao da janela — a mesma persona que
trava um Pi passa despercebida numa maquina de mesa, e um aviso que aparece nas
duas ensina a ser ignorado.

De quebra, a estimativa de tokens passou de 4 para 3,7 caracteres por token: e
o que este texto de fato deu, e a regra de bolso subestimava o prompt em quase
10% — justo na direcao que faz o aviso nao aparecer.

758 testes passam (eram 753), nos dois ambientes.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0173mr3mDsAKQuPUNaPghe9v
@kerlonr
kerlonr merged commit 59d69d9 into main Sep 4, 2026
5 checks passed
@kerlonr
kerlonr deleted the fix/prompt-que-nao-cabe branch September 4, 2026 03:14
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant