Fast Ask: o Qwen que a Ramp treinou com RL para ler planilhas

Fast Ask: o Qwen que a Ramp treinou com RL para ler planilhas
17,8%das chamadas de ferramentas do agente principal eram para explorar
14tipos de tarefa em três famílias
66,25%de acerto exato, contra 61,88% do Opus 4.6
1,05×o tempo do Haiku 4.5
Fast Ask: how Ramp trained a small model with RL to read spreadsheets
Também explico isso neste vídeo, em inglês, no meu canal Articulator EN. Este vídeo não tem versão em português, mas você pode ativar as legendas traduzidas automaticamente.

O problema: explorar custa carolink

A Ramp tem um produto, o Ramp Sheets, com um agente que trabalha sobre planilhas. E um agente de planilhas é tão bom quanto a informação que ele recupera: se lê pouco, não encontra a resposta; se lê demais, fica lento, caro e fácil de distrair com abas que não têm nada a ver com a pergunta.

Olhando os próprios traces, eles viram quanto essa exploração custava:

  • 17,8% de todas as chamadas de ferramentas do agente principal iam para abrir abas, ler intervalos e descartar planilhas irrelevantes, antes de ter os dados para responder.
  • Cerca de 75% dessas chamadas eram seguidas imediatamente por outra leitura. Os autores dizem que isso sugere que o agente muitas vezes não encontrava a informação certa na primeira tentativa. É uma interpretação deles, não uma medida de falhas.

O argumento deles é que ajustar o prompt não muda o laço de fundo: continuaria sendo um modelo grande, generalista e lento navegando a planilha e filtrando o que sobra. Então levaram a busca para um subagente especializado, o Fast Ask. Ele recebe uma pergunta como «qual foi a receita de março a maio?», navega pela pasta de trabalho, lê os intervalos necessários e devolve uma resposta compacta ao agente principal.

O agente principal gasta 17,8% das suas chamadas de ferramentas explorando a planilha
Quase uma em cada cinco chamadas do agente principal era para explorar.

O modelo por trás é um Qwen3.5-35B-A3B ajustado, com cerca de 3 bilhões de parâmetros ativos.

Por que um subagentelink

Os autores dão três razões pelas quais a recuperação merece um modelo especialista:

Protege o contexto

Se o modelo principal lê todas as abas, queima tokens em linhas irrelevantes e pode se ancorar em uma isca. O subagente devolve só as células que importam ou o valor já calculado.

A latência importa

Para o usuário, um agente que tem o dado na hora é muito diferente de um que gasta turnos explorando a pasta de trabalho.

Dá para verificar

A mais importante. Muitas perguntas sobre uma planilha se resolvem em um valor exato: uma data, um número de fatura, um valor em centavos, um sim ou um não, uma linha.

Essa terceira razão é a que abre a porta para o aprendizado por reforço: se a resposta é um valor exato, cada tentativa pode ser pontuada de forma determinística, sem rótulos humanos e sem outro modelo fazendo papel de juiz. A tarefa era estreita, muito repetida, sensível à latência e objetivamente pontuável. São as quatro condições que levo do artigo para decidir quando vale a pena treinar um modelo próprio.

A configuração do treinamentolink

Para poder treinar com reforço, eles trataram a interação com a planilha como um ambiente: muitas tarefas aparentadas, uma interface de ferramentas pequena e uma função de recompensa determinística. O modelo não aprende com demonstrações do comportamento correto; ele descobre as próprias estratégias para navegar pelas pastas de trabalho, recuperar dados e calcular respostas.

  • Modelo base: Qwen/Qwen3.5-35B-A3B.
  • Infraestrutura: a plataforma Lab da Prime Intellect, com o treinamento hospedado e o framework verifiers. O ambiente de treinamento replica o harness com que o modelo é implantado em produção.
  • Treinamento: 100 passos, lote de 256 e 8 rollouts (tentativas) por exemplo.
  • Avaliação: a cada 20 passos, com 128 exemplos reservados, avaliando o modelo base junto com o treinado.
  • Sem modo de raciocínio: foi desativado para que a comparação fosse a do cenário de baixa latência que importa em produção.

Se você quiser ver de que peças é feito um ambiente desse tipo e como cada framework as resolve (entre eles o Verifiers, da Prime Intellect), contei isso no post sobre ambientes de RL para LLMs.

Planilhas sintéticas e 14 tipos de tarefalink

Cada tarefa é uma pasta de trabalho sintética de empresa, uma pergunta em linguagem natural e uma resposta verdadeira. As pastas imitam fluxos reais de finanças: consolidação de receita, conciliação de faturas, análise de gastos, buscas filtradas por data e agregações que cruzam várias tabelas.

Os dados sintéticos permitem gerar muitas variações do mesmo problema, controlar a resposta com exatidão e mudar a redação sem mudar a habilidade que está sendo treinada. Eles definiram 14 tipos de tarefa em três famílias:

FamíliaTipos de tarefa
Receita (4)net_revenue, variance_vs_target, top_order_contribution, counterfactual_fx
Conciliação (6)invoice_balance, customer_balance, overdue_invoices, last_payment_date, is_invoice_fully_reconciled, invoice_location
Operações (4)spend_month_total, budget_vs_actual, shared_vendor_uuid, netted_amount_2026

De cada tarefa geraram três variantes com redação diferente (um pedido para um relatório a investidores, um acompanhamento de cobranças, uma pergunta para um modelo de captação), para que o modelo não decore um template. As de conciliação variam ainda pela forma como a fatura é descrita, então o espaço de perguntas delas é maior do que três por tipo. Um exemplo do artigo:

I am tightening our investor memo. What cumulative net recognized revenue did South land across 2025-03 to 2025-05, in USD cents?

Essa pasta tem onze planilhas: Orders, OrderLines, Shipments, Returns, OrderMonthNet, FxExposure, Contracts, FXRates, Targets, HiringPlan e CapTable. As duas últimas não têm nada a ver com a pergunta, e isso não é por acaso.

Os lotes são montados em rodízio equilibrado: cada passada embaralha o conjunto e emite os 14 tipos antes de repetir qualquer um, de modo que todos são treinados por igual. E o mundo sintético é coerente por dentro: clientes, fornecedores, produtos, níveis de contrato e métodos de pagamento saem de vocabulários fixos, ao longo de milhares de pastas geradas.

As armadilhaslink

A dificuldade regula quanta pressão de navegação o modelo sofre. As tarefas fáceis costumam deixar um caminho direto até a resposta. As médias e difíceis complicam de três maneiras:

Abas-isca

Planilhas como HiringPlan ou CapTable, com recrutadores, vagas abertas e pools de opções. Parecem finanças, mas não contêm nada que sirva para a pergunta. Quem lê sem critério gasta nelas o orçamento de turnos.

Resumos pela metade

Planilhas de resumo como RegionalPnL ou SpendSummary em que faltam justamente as colunas calculadas que dariam a resposta. Parecem um atalho, mas é preciso verificar ou agregar a partir dos dados de origem. No nível difícil, elas somem.

Faturas sem nome

Em cerca de 15-20% das tarefas de conciliação, a pergunta não cita a fatura pelo código INV-####, e sim por pistas do pagamento (sistema, método, data, valor) ou por uma assinatura (cliente, mês, valor, vencimento). Antes de responder, é preciso resolver de que fatura se trata.

As três armadilhas das planilhas sintéticas: abas-isca, resumos pela metade e faturas sem nome
As armadilhas estão ali de propósito: são as falhas de navegação que o modelo vai encontrar fora do ambiente.

Três ferramentas e quinze turnoslink

O modelo tem três ferramentas e um orçamento de 15 turnos:

  • get_workbook_metadata devolve os nomes das planilhas, as cores das abas e o intervalo usado aproximado.
  • read_ranges devolve os dados das células, com um teto de 1.000 células por chamada. Pedidos maiores são rejeitados.
  • run_python executa Python isolado, só com a biblioteca padrão. O estado persiste entre chamadas dentro de uma mesma tentativa.

Serem tão poucas é proposital: com apenas três ferramentas, fica mais fácil para a recompensa distinguir uma trajetória eficiente de uma que desperdiça turnos.

A recompensalink

Para cada pergunta, o modelo gera oito trajetórias. Uma trajetória é o trace completo: as chamadas de ferramentas, as leituras, o Python executado e a resposta final. O verificador pontua cada uma com uma função que cabe em uma linha:

R(y) = 1,0 · correct(y) + 0,1 · efficiency(y) + 0,05 · concise(y)

A recompensa copia o que o Fast Ask precisa em produção: dar a resposta certa, dar rápido e não colocar texto a mais no contexto do agente principal.

  • Acertar manda. O termo de 1,0 só é ativado se a linha final ANSWER: puder ser interpretada no tipo esperado e coincidir exatamente com o gabarito.
  • Eficiência e concisão são ajustes finos. Não salvam uma resposta errada, mas ordenam as corretas: acertar em cinco turnos pontua um pouco mais do que acertar depois de passear por planilhas irrelevantes.
A função de recompensa: 1,0 por acertar, 0,1 por eficiência e 0,05 por concisão
Diga o que você premia e eu digo o que o seu agente aprende.

GRPO: a vantagem frente ao grupolink

Eles treinaram com GRPO, um método de gradiente de política que estima a vantagem a partir de grupos de tentativas geradas para a mesma pergunta. Em vez de treinar um modelo de valor separado, ele compara a recompensa de cada tentativa com a das outras do grupo. Com G = 8 tentativas, a vantagem da tentativa i pode ser escrita assim:

A_i = R(y_i) − (1/G) · Σ_k R(y_k)

Ou seja, a sua vantagem é a sua nota menos a média do grupo. Para a mesma pergunta, uma tentativa acerta em cinco turnos e outra gasta o orçamento em abas-isca e falha: essa diferença é o sinal de aprendizado. Deixando de lado a correção off-policy, a atualização tem esta forma:

∇J(θ) ≈ Σ_i Σ_t A_i · ∇ log π_θ(y_i,t | x, y_i,<t)

Cada token de uma trajetória é reforçado ou atenuado conforme a vantagem da trajetória inteira. É isso que faz o reforço combinar com agentes que usam ferramentas: ninguém rotula qual era a próxima chamada correta, só se pontua o resultado final. A matemática empurra a probabilidade para o que fez a resposta ser correta: ler primeiro os metadados, desviar das abas-isca, usar os resumos quando valem, voltar às linhas de origem quando não valem e emitir uma linha ANSWER: que possa ser interpretada.

É o mesmo algoritmo com que o NapMem foi treinado para navegar pela própria memória.

Assíncrono e off-policylink

No Fast Ask, uma tentativa é uma trajetória de vários turnos: olhar os metadados, ler intervalos, executar Python e responder. Gerar essas tentativas é muito mais lento do que carregar dados em um ajuste fino supervisionado comum. Se o treinamento tivesse que parar depois de cada atualização para esperar trajetórias recém-geradas, as GPUs passariam muito tempo paradas.

A pilha prime-rl da Prime Intellect resolve isso com treinamento assíncrono e off-policy: os geradores de tentativas continuam produzindo trajetórias enquanto o treinador atualiza o modelo. Algumas trajetórias vêm de uma versão um pouco mais antiga da política, e o objetivo corrige essa defasagem, que é limitada, com pesos de importância:

ρ_t(θ) = π_θ(y_t | x, y_<t) / π_gen(y_t | x, y_<t)

A razão ρ responde a uma pergunta simples: quão mais ou menos provável é que o modelo atual produza este token, comparado com o modelo que o gerou? Para manter as atualizações estáveis, a Prime Intellect usa um objetivo ponderado por importância e com recorte, no estilo AIPO:

J(θ) = Σ_i,t min( ρ_i,t(θ) · A_i ,  clip(ρ_i,t(θ), 1 − ε, 1 + ε) · A_i )

O recorte limita quanto pode pesar um token cuja probabilidade mudou muito desde que foi gerado, de modo que uma trajetória antiga não puxe o modelo mais do que deveria.

Resultadoslink

Eles avaliaram o modelo base e o treinado junto com a família Claude, em tarefas reservadas. As métricas são o acerto exato e o tempo real por tentativa, relativo ao do Haiku 4.5:

ModeloAcerto exatoTempo frente ao Haiku 4.5
Fast Ask (Qwen treinado)66,25%1,05×
Claude Opus 4.661,88%1,44×
Claude Sonnet 4.659,38%1,60×
Qwen3.5-35B-A3B base56,25%1,34×
Claude Haiku 4.551,88%1,00×
  • Dez pontos sobre o modelo base (de 56,25% para 66,25%), e ainda levando menos tempo: de 1,34× para 1,05×.
  • Pouco mais de quatro pontos sobre o Opus 4.6 (66,25 − 61,88 = 4,37), com um tempo muito próximo do Haiku 4.5.
  • O treinamento durou cerca de 26 horas para os 100 passos.
Acerto exato e tempo do Fast Ask frente ao Opus 4.6, ao Sonnet 4.6, ao Qwen base e ao Haiku 4.5
Mais acerto que o Opus e quase o tempo do Haiku, nesta tarefa e na avaliação deles.

O que o modelo aprendeulink

Segundo os autores, quase toda a melhora veio de duas coisas: o modelo aprendeu a dar respostas no formato exato, que podem ser interpretadas, e a planejar trajetórias mais enxutas, que desperdiçam menos turnos.

E há um dado que me parece o mais fino do artigo: o total de células lidas por tentativa ficou mais ou menos estável durante todo o treinamento (no gráfico deles, em torno de 2.400). O modelo não aprendeu a ler menos; aprendeu a distribuir melhor as leituras. Na mesma figura, as células por turno sobem, de umas 200 para umas 350, enquanto o total não se mexe: ele lê o mesmo em menos viagens. Essa última parte é leitura minha do gráfico; o texto só fala do total.

O que não bate e o que não dá para concluirlink

Comparando o texto com as figuras do próprio artigo, há dois detalhes que não batem:

  • A curva de recompensa. O texto diz que a recompensa subiu de cerca de 0,2 para cerca de 0,8 nos primeiros 40 passos e depois estabilizou. No gráfico animado que acompanha o artigo, a curva começa perto de 0,5, cai para perto de 0,3 e sobe aos poucos até rondar 0,8 perto do passo 100. Coincidem em onde termina, não no caminho.
  • O tamanho da avaliação. O artigo fala em 128 exemplos reservados para as avaliações intermediárias. Mas as porcentagens da tabela final são múltiplos exatos de 1/160 (106, 99, 95, 90 e 83 acertos em 160) e não de 1/128. Então a tabela parece vir de outro conjunto, de 160 exemplos, que o artigo não descreve. É uma dedução minha, não um dado dos autores.

Nenhuma das duas muda a conclusão, mas convém ler os números com os seus limites:

  • Não é «o Qwen ganha do Opus» em geral. É uma tarefa de recuperação específica, na avaliação dos autores, com tarefas sintéticas do mesmo ambiente e sem modo de raciocínio.
  • Não se sabe se vale igual para planilhas reais. O artigo não traz resultados com pastas de clientes.
  • O custo não está quantificado. Eles dizem que é «uma fração do custo e da latência» de um modelo de fronteira, sem dar o número do custo.
  • A velocidade é «aproximadamente» a do Haiku: 1,05×, não 1,00×.

Em resumolink

O pós-treinamento com reforço funcionou aqui porque o ambiente tornou a busca em planilhas mensurável e repetível: decisões repetidas com um resultado claro, sem trajetórias rotuladas por humanos nem um LLM como juiz. Os autores insistem que o trabalho importante não esteve na arquitetura nem no tamanho do modelo, e sim no design do ambiente: as tarefas certas, uma interface mínima de ferramentas e uma recompensa colada em como o produto funciona em produção.

E apresentam isso como um padrão que pretendem repetir: treinar subagentes pequenos e verificáveis para gargalos estreitos, e deixar os modelos de fronteira gastarem tokens em julgar, não em buscar.

Em uma frase

Se uma tarefa é estreita, se repete muito, a latência importa e a resposta pode ser verificada, um modelo pequeno treinado em um bom ambiente pode fazê-la melhor do que um grande.

Que gargalo do seu agente cumpre as quatro?

Fonteslink

Continuar lendo

Últimos posts -->

Você viu esses projetos?

Gymnasia

Gymnasia Gymnasia
Expo
React Native
TypeScript
OpenAI
Anthropic

App de fitness com dois agentes que são executados integralmente no dispositivo, sem backend, de forma que os dados do usuário nunca saem do celular. Um coach conversacional BYOK com tools locais e system prompt remoto com fallback offline, e um estimador de refeições que tira os macronutrientes de uma foto do prato, com leitura de códigos de barras contra o OpenFoodFacts.

LangGraph Deep Researcher

LangGraph Deep Researcher LangGraph Deep Researcher
Python
LangGraph
FastAPI
React
TypeScript
Docker

Sistema multiagente de pesquisa construído com LangGraph. Um supervisor decompõe sua pergunta em tópicos e lança subagentes de busca em paralelo; cada um comprime seus achados antes de repassá-los a um agente redator que escreve o relatório final em markdown com suas fontes. Streaming ao vivo por WebSockets, modelo configurável por papel e chaves de API próprias que nunca são armazenadas no servidor.

Tau

Tau Tau
Python
LangChain

Sistema multiagente de tutoria para estudantes do ensino médio, com um agente por disciplina e material de curso elaborado e validado por uma equipe de professores. Chegou a ser usado com alunos reais em um colégio privado na Espanha e em uma escola de ensino médio na Colômbia.

Ver todos os projetos -->
>_ Disponível para projetos

Tem um projeto com IA?

Vamos conversar.

maximofn@gmail.com

Especialista em Machine Learning e Inteligência Artificial. Desenvolvo soluções com IA generativa, agentes inteligentes e modelos personalizados.

Quer assistir alguma palestra?

Últimas palestras -->

Quer melhorar com essas dicas?

Últimos tips -->

Use isso localmente

Os espaços do Hugging Face nos permitem executar modelos com demos muito simples, mas e se a demo quebrar? Ou se o usuário a deletar? Por isso, criei contêineres docker com alguns espaços interessantes, para poder usá-los localmente, aconteça o que acontecer. Na verdade, se você clicar em qualquer botão de visualização de projeto, ele pode levá-lo a um espaço que não funciona.

Flow edit

Flow edit Flow edit

Edite imagens com este modelo de Flow. Baseado em SD3 ou FLUX, você pode editar qualquer imagem e gerar novas

FLUX.1-RealismLora

FLUX.1-RealismLora FLUX.1-RealismLora
Ver todos os contêineres -->
>_ Disponível para projetos

Tem um projeto com IA?

Vamos conversar.

maximofn@gmail.com

Especialista em Machine Learning e Inteligência Artificial. Desenvolvo soluções com IA generativa, agentes inteligentes e modelos personalizados.

Você quer treinar seu modelo com esses datasets?

short-jokes-dataset

HuggingFace

Dataset com piadas em inglês

Uso: Fine-tuning de modelos de geração de texto humorístico

231K linhas 2 colunas 45 MB
Ver no HuggingFace →

opus100

HuggingFace

Dataset com traduções de inglês para espanhol

Uso: Treinamento de modelos de tradução inglês-espanhol

1M linhas 2 colunas 210 MB
Ver no HuggingFace →

netflix_titles

HuggingFace

Dataset com filmes e séries da Netflix

Uso: Análise de catálogo Netflix e sistemas de recomendação

8.8K linhas 12 colunas 3.5 MB
Ver no HuggingFace →
Ver mais datasets -->