fix: o robô parou de reler a persona inteira antes de cada resposta - #16
Merged
Conversation
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
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
A causa que faltava
O log do Ollama tinha a resposta, e não era nenhuma das que apontei antes:
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_USOera"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_ctxem 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
🤖 Generated with Claude Code
https://claude.ai/code/session_0173mr3mDsAKQuPUNaPghe9v