Ferramenta que Cospe HTML (Raw HTML Tool Output) é um smell de IA, ou seja, um sinal de problema em sistemas com LLM, do grupo Acopladores. A ferramenta devolve a página inteira, com menu e rodapé, e o modelo se perde.
Um agente de navegador precisa descobrir o preço de um produto numa loja. A ferramenta fetch_page devolve o HTML da página. O trace (anonimizado):
tool=fetch_page url=loja.exemplo/produto/123result_tokens=31.840result_preview="<!DOCTYPE html><html lang="pt-BR"><head><meta charset=... <nav class="menu-principal">...[140 links de categoria]... <script>window.__STATE__={...}</script>... <footer>...política de privacidade, trabalhe conosco...</footer>"
Para ler um número, o agente pagou mais de 30 mil tokens. Na segunda página, o contexto já estava acima de 60 mil. Na quarta, o modelo citou o preço do “produto relacionado” do rodapé.
Num marketplace brasileiro o padrão se repete: a página do anúncio traz menu, recomendações, perguntas de outros compradores, scripts de tracking e o preço em três lugares (à vista, parcelado, “de / por”). O modelo escolhe um. Às vezes o errado.
Sinais de Ferramenta que Cospe HTML:
Ferramentas devolvem HTML, JSON de API ou logs inteiros, sem filtro.
Resultados de ferramenta têm dezenas de milhares de tokens.
O agente erra informações que estavam no resultado, porque havia ruído demais.
O contexto enche depois de poucas chamadas.
O conteúdo inclui scripts, menus, rodapés e anúncios.
flowchart LR
A(["1. Agente pede a página"]):::llm --> T["2. fetch_page"]:::tool
T --> H["3. HTML inteiro: menu, scripts, rodapé"]:::untrusted
H --> A
A --> X(["4. Preço errado, contexto cheio"]):::io
O agente precisa de um dado pequeno.
A ferramenta busca a fonte.
Devolve tudo, do jeito que veio.
O modelo procura o dado no meio do ruído e às vezes acha o errado.
Por que acontece
A ferramenta foi escrita como um wrapper fino.requests.get(url).text é a implementação mais rápida. Em dez minutos o agente “lê a web”. O preço de não filtrar aparece no trace, não no primeiro commit.
Confiança no modelo para filtrar. “Ele acha o que precisa” é verdade com frequência, a um custo alto e com erros quando o número aparece várias vezes.
Ninguém olhou o tamanho dos resultados. Sem trace com tokens por ferramenta, o peso não aparece. A fatura vem no fim do mês, e o preço errado parece alucinação.
Converter HTML em markdown parece suficiente.html2text tira as tags e deixa o menu, o rodapé e as recomendações. Oito mil tokens de prosa ainda escondem o preço.
O paper “Lost in the Middle” (Liu et al., 2023) mostrou que modelos acham pior a informação que está no meio de um contexto longo, e melhor a que está no começo ou no fim. Uma página de 30 mil tokens coloca o preço do produto exatamente onde o modelo mais erra, no meio, entre <nav> e <footer>.
Quanto custa ignorar
Dinheiro. Cada chamada de ferramenta pode custar mais que todo o resto da tarefa. Quatro páginas a 30 mil tokens de entrada já são mais de 100 mil tokens antes de o agente responder.
Qualidade. Ruído demais leva a dados errados. Preço de anúncio, preço riscado, preço de “quem viu viu também”.
Contexto. Poucas chamadas enchem a janela e derrubam as decisões seguintes. O agente esquece a pergunta original porque o HTML ocupou o espaço.
Segurança. Mais texto de fora no contexto é mais espaço para instruções escondidas. Greshake e colegas (2023) mostraram injeção indireta em conteúdo que o agente busca. Uma página enorme é um outdoor maior para o ataque. Veja Ordem Vinda do Dado.
Uma conta para um preço
Os números abaixo são ilustrativos. Suponha que o agente compara 10 anúncios e cada página crua tem cerca de 30 mil tokens.
Retorno da ferramenta
Tokens por página
Para 10 anúncios (só entrada)
HTML cru
30.000
300.000
Texto limpo, sem menu nem script
800
8.000
Campos titulo, preco, parcelado, url
cerca de 40
400
A extração em código (seletor, JSON-LD, campo da API) transforma a tarefa de “achar um número numa novela” em “ler um registro”. O modelo compara dez preços. Não caça dez agulhas.
Sempre. A ferramenta devolve só os campos úteis, num formato estável: texto principal limpo, ou campos extraídos. Destino também: Adaptador MCP.
Três níveis, do mais barato ao mais geral:
Filtro determinístico. Tira script, style, nav, footer, anúncios. Converte o restante em texto. Já corta a maior parte dos tokens.
Campos extraídos em código. Se você sempre quer preço, título e disponibilidade, a ferramenta devolve isso. Seletor CSS, JSON-LD, endpoint de API. Falha vira erro da ferramenta, não alucinação do modelo.
Resumo dentro da ferramenta. Quando o layout varia demais para um seletor, um modelo pequeno (sem ferramentas de efeito) lê a página e devolve o registro. O agente principal nunca vê o HTML.
A armadilha: normalizar só o HTML e deixar a ferramenta de logs devolver 5 mil linhas, a de API devolver o JSON aninhado de 400 chaves, a de email devolver o MIME inteiro. O smell é saída bruta, não a extensão .html.
O que você ganha
Resultados de ferramenta de centenas de tokens, não dezenas de milhares.
O modelo encontra o dado certo.
Tarefas mais longas cabem no contexto.
Menos superfície para conteúdo malicioso.
Quando ignorar
O conteúdo bruto é a tarefa. Um agente que analisa o HTML de uma página para achar problemas de acessibilidade precisa do HTML. Mesmo assim, remova scripts e estilos, que não entram na análise e incham o contexto.
Volume baixo e páginas pequenas. Se o resultado já é curto (uma API que devolve 80 tokens com o preço), normalizar traz pouco. Meça o tamanho no trace antes de construir um parser.
É esse smell?
Perguntas rápidas
O que é Ferramenta que Cospe HTML?
Ferramenta que Cospe HTML (Raw HTML Tool Output) é um smell de IA, ou seja, um sinal de problema em sistemas com LLM, do grupo Acopladores. A ferramenta devolve a página inteira, com menu e rodapé, e o modelo se perde.