Seu agente não precisa de um modelo maior
O instinto de jogar o modelo mais forte em todo problema é caro e muitas vezes errado. A maior parte dos passos de um agente é execução, não estratégia, e execução não precisa do modelo mais inteligente: precisa de um modelo que siga instruções com fidelidade. A boa notícia é que um modelo pequeno, bem instruído, rende muito mais do que parece, e tem um motivo concreto para isso. Um bom prompt age como uma atualização de pesos de baixo rank no modelo, no limite um LoRA de rank um, sem retreino e sem parâmetros extras. Este post prova essa equivalência com a matemática da atenção, explica por que o ajuste é de baixo rank, e por que só funciona em modelos treinados para obediência. É a conta que mostra por que o harness funciona.
Toda vez que o agente erra um passo, o reflexo é o mesmo: troca pelo modelo mais forte. É caro, e na maioria das vezes é a resposta errada. Porque a maior parte do que um agente faz não é pensar, é executar: extrair um campo, seguir um formato, aplicar uma regra. E execução não precisa do modelo mais inteligente, precisa de um que obedeça.
O instinto da indústria é resolver tudo com o modelo mais forte disponível. Mas a tese deste post é outra. Num agente, a maior parte dos passos é execução, não estratégia: extrair um campo, seguir um formato, aplicar uma regra, repassar uma decisão. Execução não exige um modelo que saiba elucubrar; exige um modelo que siga instruções com fidelidade. A habilidade que importa não é ter o maior modelo, é saber quando o menor já resolve. E um modelo pequeno, bem instruído, rende mais do que a intuição sugere.
Tem um motivo concreto para isso, e é o que a Pumpkin entende sobre harnessing. Quando você embrulha um modelo pequeno numa boa camada de instruções e estrutura (o harness), você não está só pedindo com jeitinho. Você está induzindo no modelo uma modificação de baixo rank nos pesos efetivos, a mesma coisa que um LoRA faz, só que em tempo de execução e sem tocar em nenhum parâmetro. É por isso que harnessing funciona, e a gente vai abrir essa conta por inteiro. O princípio se apoia em quatro afirmações, e cada uma tem matemática por trás:
- Um prompt é uma atualização de pesos em tempo de execução, não só texto que influencia.
- Essa atualização é de baixo rank, no limite um LoRA de rank um.
- Isso só funciona em modelos treinados para obediência, e dá para dizer exatamente o que esse treino faz.
- Logo, a competência de um modelo grande pode ser transferida para um pequeno via harness, em tempo de execução. Destilação online.
Vamos uma por uma.
O problema econômico: por que "tudo no modelo de fronteira" não fecha
Antes da matemática, o porquê de a gente se importar. Modelos de fronteira custam, por token, ordens de magnitude mais que modelos pequenos. Um agente pode fazer em torno de dezenas a centenas de chamadas por tarefa. Se cada chamada usa o modelo mais caro, o custo explode, e a maior parte desse gasto vai para passos que um modelo pequeno faria igual, desde que bem instruído.
A divisão natural é uma cadeia: no topo, pouca chamada e muita cognição (planejar, decidir, dar a estrutura); na base, muita chamada e pouca cognição (executar a estrutura com fidelidade). O erro é usar cognição de topo na base. A oportunidade é fazer o topo, caro e raro, produzir a estrutura que a base, barata e frequente, executa.
Isso só é viável se a base conseguir, de fato, absorver a competência do topo via estrutura, sem que você precise treinar um modelo novo para cada tarefa. A pergunta é se isso é real ou se só um prompt bom ajuda. A resposta está nas próximas seções.
Um prompt é uma atualização de pesos em tempo de execução
Comece pelo bloco de self-attention, onde tudo acontece. Considere uma posição de query, com vetor (a projeção da entrada pela matriz ). Cada token do contexto vira uma key e um value (projeções por e ). Essas três matrizes de projeção são os slow weights: aprendidos no treino, fixos na inferência. A saída da atenção para essa query, que vamos chamar de , é uma soma ponderada dos values: cada value entra com um peso (o quanto a query presta atenção naquele token, sempre entre 0 e 1, e o conjunto soma 1), e é a dimensão dos vetores, que aparece só para manter a escala estável:
Lendo a fórmula: é a saída, os são os pesos de atenção, e a soma percorre todos os tokens do contexto (o índice numera os tokens; o no denominador é o mesmo percurso, só para normalizar).
Agora separe o contexto em duas partes: o prefixo (a instrução, os exemplos, a skill, o que o harness coloca para ensinar o modelo na hora) e o conteúdo (o que você de fato quer que ele processe). A soma se parte:
(A notação quer dizer "somando sobre os tokens que estão no prefixo"; , sobre os que estão no conteúdo.) O prefixo não é um bloco à parte: ele entra na mesma conta da query, e a contribuição dele desloca a saída.
O passo decisivo é reescrever a atenção como uma matriz. Para isso, troca-se o softmax por uma versão linear: uma função transforma a query e cada key antes do produto. Pense em como o que ocupa o lugar da exponencial do softmax: em vez do peso , o peso passa a ser simplesmente . Com essa troca, a saída vira:
Repare no que aconteceu: a saída é uma matriz multiplicando a query. Essa matriz não estava nos pesos do modelo, ela foi construída pelo contexto, na hora. É o que a literatura chama de fast weight: um peso temporário, induzido pela entrada, por cima dos slow weights fixos. Cada token contribui com um termo , que é um produto externo: uma matriz de rank 1, isto é, que aponta numa única direção (o rank de uma matriz é o número de direções independentes que ela ocupa).
A conclusão da afirmação 1: o prompt não muda os pesos do modelo, mas produz, na saída, o efeito de uma matriz extra agindo sobre a query. Dar um prefixo é, matematicamente, somar um aos pesos efetivos. É por isso que in-context learning também se chama fast learning: o modelo se adapta na hora, sem passo de gradiente, sem retreino. A adaptação vive no contexto e equivale a um delta de peso.
Um prompt não é texto que influencia o modelo. É uma matriz que o contexto constrói e soma aos pesos efetivos, em tempo de execução. Some o contexto, some a matriz.
A atualização é de baixo rank, no limite um LoRA de rank um
Daqui em diante, ("delta W") é o ajuste que o contexto soma aos pesos efetivos: o símbolo é a notação usual para "a variação", a diferença entre os pesos com e sem o prefixo. O que vem a seguir mostra que esse tem rank baixo.
A matriz não é qualquer matriz: ela é uma soma de produtos externos, um por token. E vale uma regra simples: a soma de matrizes de rank 1 tem rank no máximo . Separe de novo o prefixo do conteúdo:
O prefixo induz um cujo rank é, no máximo, (as barras significam "a quantidade de tokens em "), ou seja, limitado pelo número de tokens do prefixo. Um prefixo curto, ou um prefixo cujas direções se concentram (que é o que um bom harness produz), gera um delta de rank baixo.
No limite de uma única direção dominante, o delta colapsa num só produto externo:
Compare com o LoRA. O LoRA grava nos pesos um ajuste , com e , de rank no máximo . No caso mínimo, :
São a mesma forma. O fast weight do prefixo, , é estruturalmente idêntico a um LoRA de rank um, , com e . A diferença é só o lugar do delta: o LoRA grava nos pesos (permanente, slow); o prompt induz nas ativações (passageiro, fast). Mesmo subespaço, permanências diferentes.
E por que importa na prática? Porque o modelo pequeno já expõe, pela própria atenção, uma porta de baixo rank onde o contexto escreve. Você não precisa retreinar nada para instalar um comportamento, a estrutura do transformer já oferece o encaixe. O harness é o que escreve nesse encaixe.
Nota: atenção linear vs. softmax. A identidade é exata para atenção linear. No softmax real, a normalização (o denominador da ) acopla os termos, então o delta de peso não fatora de forma perfeitamente limpa: ele é uma aproximação, válida na vizinhança de operação, não uma igualdade fechada. O que sobrevive ao softmax é o essencial: o contexto induz uma modificação dependente da entrada, e o rank dela é limitado pelo número de tokens do prefixo. A afirmação forte (é um LoRA) é uma idealização; a afirmação robusta (é uma atualização de baixo rank induzida pelo contexto) se segura no modelo real.
Por que só funciona em modelos obedientes: a história dos valores singulares
Se o prompt instala um delta de baixo rank, por que ele funciona em uns modelos e em outros não? Por que escrever "seja direto" num modelo bem treinado o deixa direto, e num modelo cru não muda quase nada? A resposta está na SVD (decomposição em valores singulares), que fatora qualquer matriz nas suas direções mais importantes. Aplicada ao delta induzido:
Cada termo da soma é uma direção de controle. Os vetores singulares e formam um par de direções (uma de entrada, uma de saída) que diz para que lado o delta empurra; o valor singular associado diz com que força. Quanto maior o , mais aquela direção desloca a saída: o deslocamento ao longo de é proporcional a .
O ponto é o seguinte. Num modelo pouco treinado para obediência, os valores singulares ao longo das direções de controle são fracos: o prefixo empurra, mas é pequeno, e o deslocamento some no ruído. O modelo não obedece, não porque ignore o prompt, mas porque o canal de controle tem ganho baixo. O que o instruction tuning faz (datasets de instrução, RLHF) é amplificar esses valores singulares. Ele reformata a atenção para que, quando um contexto relevante chega, o correspondente seja grande, e o deslocamento aconteça de verdade.
Em uma frase: um modelo obediente é um modelo cujas direções de controle foram treinadas para ter valores singulares fortes. É a história da low-rank representation, e é função de compressão: o modelo aprende a concentrar a dirigibilidade em poucas direções de ganho alto, em vez de espalhá-la inutilmente por milhares de eixos. Consequência prática direta: você não escolhe qualquer modelo pequeno para a base. Você escolhe um modelo instruction-tuned, justamente porque ele foi treinado para ser um bom receptor do LoRA que o harness instala. Obediência, aqui, é ganho alto no canal de baixo rank.
Competência transferida via harness: destilação online
Junte as três afirmações. Um prompt é uma atualização de pesos (1), de baixo rank (2), que um modelo obediente recebe com ganho alto (3). Agora pense em quem escreve esse prompt. Quando o harness que embrulha o modelo pequeno carrega a competência de um modelo maior, seja porque um modelo maior o escreveu, seja porque foi destilado de exemplos dele, é essa competência que define qual delta de baixo rank o modelo pequeno passa a rodar a cada chamada. O modelo pequeno roda esse delta sem nunca ter sido treinado, sem um passo de gradiente, sem um parâmetro a mais. A inteligência do modelo grande chega ao comportamento do pequeno pela estrutura, não pelos pesos.
Há uma evidência prática de que esse delta é uma coisa concreta: os steering vectors. Você roda o modelo com e sem uma instrução, subtrai as ativações, tira a média, e fica com um vetor direção. Depois soma esse vetor direto numa camada, sem repetir o prompt, e o modelo se comporta como se tivesse recebido a instrução. O steering vector é o delta do prompt isolado e descolado do texto: a prova de que o efeito é um vetor de baixo rank que dá para extrair e reaplicar. É o intermediário entre o prompt (fast, nas ativações) e o LoRA (slow, nos pesos).
Isso é destilação, transferir a competência de um modelo grande para um pequeno, mas de um tipo específico. Vale separar dos dois sabores. A destilação clássica treina um modelo-aluno pequeno com as saídas de um professor grande, e a competência fica gravada nos pesos do aluno: é offline, custa um treino, e o resultado é estático. A destilação online injeta a competência em tempo de execução, como fast weight, e ela muda a cada contexto: nada fica gravado nos pesos do modelo pequeno, você troca o harness e troca o comportamento, na hora. É mais barata (sem treino), mais flexível (muda por chamada) e compõe (vários deltas de baixo rank coexistem no mesmo subespaço).
De onde essa competência vem, como ela é produzida e como ela é mantida ao longo de uma tarefa é, de novo, a parte que depende do caso. O princípio é que ela cabe num delta de baixo rank que o modelo pequeno sabe receber. O resto é craft.
Onde a Pumpkin entra
A gente focou no prompt porque é onde a matemática fica mais limpa: o prompt é a parte do harness que se lê, com clareza, como um delta de baixo rank. Mas o prompt é só uma das partes. Um harness não é um prompt bem escrito, é o aparato inteiro em volta do modelo, e ele tem várias peças. Um modelo é probabilístico; um sistema precisa ser confiável; o harness é o que faz a ponte, cercando o miolo probabilístico de estrutura determinística.
Uma coisa o princípio deixa clara: modelo maior nem sempre é melhor. Em parte porque um modelo maior continua sendo um núcleo probabilístico, e boa parte da confiabilidade que você precisa vem das peças determinísticas do harness, que modelo nenhum substitui. Tem casos em que a resposta é o modelo de fronteira. Tem muito mais casos em que não é, e é aí que o harness compensa.
Na Pumpkin a gente monta as peças do harness em torno do seu caso: o que o modelo precisa ver, quais instruções instalam o delta certo, onde os checkpoints determinísticos seguram o erro, como o fluxo roteia entre um modelo pequeno e um grande, e como medir tudo isso em produção. O resultado é um agente confiável e escalável: confiável porque o miolo probabilístico vem cercado de estrutura determinística, escalável porque a maior parte do trabalho roda em modelos pequenos com um bom harness, cujo preço é estável. Saber que um prompt é um LoRA é o ponto de partida. Fazer isso virar um sistema que aguenta o mundo real é o que a gente entrega.
Formalizado. A identidade fast weight (a saída da atenção como uma matriz construída por soma de produtos externos) é exata para atenção linear (Schlag, Irie e Schmidhuber, 2021); o limite de rank pelo número de tokens é álgebra linear; a forma do LoRA e a SVD são definições.
Robusto (suporte empírico e teórico). Que o contexto induz uma atualização de baixo rank dependente da entrada também no softmax, sustentado indiretamente por in-context learning como otimização implícita (von Oswald et al., 2023; Akyürek et al., 2022) e pela dimensão intrínseca baixa do fine-tuning (Aghajanyan et al., 2020). Os steering vectors (Turner et al., 2023; Rimsky et al., 2023) são a evidência prática de que o delta do prompt é uma direção extraível e reaplicável.
Interpretação (consistente, não um teorema fechado). Que o instruction tuning amplifica os valores singulares das direções de controle. É a leitura mecanística do que torna modelos dirigíveis, coerente com a low-rank representation, apresentada como modelo mental, não como resultado provado em forma fechada.
Um modelo maior é sempre melhor para um agente?
Por que um prompt funciona como uma atualização de pesos?
O que significa dizer que o efeito de um prompt é de baixo rank?
Por que o efeito do prompt só funciona em modelos obedientes?
O que é destilação online?
Quando ainda vale usar o modelo de fronteira?
- Schlag, Irie e Schmidhuber. Linear Transformers Are Secretly Fast Weight Programmers. ICML, 2021. (a identidade fast weight)
- Hu et al. LoRA: Low-Rank Adaptation of Large Language Models. ICLR, 2022. (o delta de baixo rank explícito nos pesos)
- Aghajanyan, Zettlemoyer e Gupta. Intrinsic Dimensionality Explains the Effectiveness of Language Model Fine-Tuning. ACL, 2020. (fine-tuning vive em dimensão baixa)
- von Oswald et al. Transformers Learn In-Context by Gradient Descent. ICML, 2023. (in-context learning como otimização implícita)
- Akyürek et al. What Learning Algorithm Is In-Context Learning?. ICLR, 2022. (ICL implementando regressão e atualização)
- Li e Liang. Prefix-Tuning: Optimizing Continuous Prompts for Generation. ACL, 2021. (o prefixo como parâmetro de baixo custo)
- Turner et al. Activation Addition: Steering Language Models Without Optimization. 2023. (steering vectors)
- Rimsky et al. Steering Llama 2 via Contrastive Activation Addition. 2023. (extração e reaplicação de direções de controle)
- Ba et al. (2016); Schmidhuber (1992). (origem da ideia de fast weights)