A auditoria precisa começar pela decisão que vai apoiar
Uma auditoria de presença em IA é o registro de como determinados sistemas descrevem sua marca e de quais fontes usam em perguntas relevantes, feito para apoiar uma decisão definida antes da coleta, como corrigir uma informação ou priorizar páginas. Depois de definir a decisão, monte uma amostra reproduzível, sem apresentá-la como retrato de todas as conversas de clientes.
Para uma empresa de manutenção, a decisão pode ser descobrir se a região atendida aparece corretamente. Para um fornecedor de software, pode ser entender quais requisitos das comparações ainda não são respondidos no site. Essas necessidades pedem perguntas diferentes, critérios diferentes e responsáveis diferentes pela correção.
LLM é um modelo que gera linguagem a partir de padrões aprendidos e do contexto recebido. Produtos que usam esses modelos podem acrescentar busca, ferramentas e histórico, por isso a auditoria deve identificar o produto e a configuração, em vez de registrar apenas o nome genérico do modelo.
Escolha perguntas que separem marca, categoria e compra
Separe perguntas sobre a marca, sobre a categoria e sobre requisitos de compra: as primeiras testam identificação, e as demais investigam opções e adequação. Misturar tudo numa taxa única pode fazer uma marca conhecida parecer competitiva mesmo quando ela nunca aparece em escolhas de categoria.
Um conjunto piloto hipotético pode reunir quatro perguntas de identificação, quatro de comparação e quatro de condição comercial. Essa quantidade serve para demonstrar o método, sem representar um tamanho estatístico suficiente para qualquer conclusão. Escolha as perguntas a partir do atendimento e da pesquisa, evitando apenas as que favorecem a empresa.
Registre a versão da lista e preserve um núcleo estável entre coletas. Quando a oferta mudar, acrescente perguntas novas numa série identificada. O roteiro de perguntas e evidências em vários sistemas ajuda a organizar esse material sem depender de um único comando amplo.
Guarde as condições, a repetição e a resposta original
Registre cada tentativa com pergunta, produto, modo, idioma, país, horário e uso de pesquisa na web, e guarde o texto completo e os endereços citados. Se a coleta falhar, mantenha a linha e o motivo: apagar falhas deixa a amostra mais bonita e menos explicável.
Repita cada pergunta, porque a resposta muda de uma geração para outra. Segundo o CITECHOICE, estudo de Sriram Selvam e Anneswa Ghosh divulgado no arXiv em 14 de setembro de 2026, gerar a resposta de novo, em 30 conjuntos de transcrições fixas, mudou 15% das decisões de citar ou não citar uma fonte. Uma leitura única pode mostrar ganho ou perda que é só variação do motor.
Abra conversas novas para reduzir o efeito do histórico e mantenha o mesmo procedimento na comparação, sem afirmar independência apenas porque as conversas foram reiniciadas: respostas podem compartilhar fontes, versões de sistema e outros fatores. Uma coleta via API facilita repetição e armazenamento, mas deve ser identificada como tal, porque não reproduz automaticamente o produto usado pelo consumidor. Se a decisão depende da experiência no aplicativo, inclua observação desse ambiente e respeite seus limites de uso.
Antes de automatizar, execute uma pequena amostra manual e confira se o registro contém as informações necessárias. Isso evita multiplicar um erro de captura por milhares de linhas.
Escolha a ferramenta pelo registro que ela entrega
A ferramenta certa é a que permite refazer a conta fora dela. Planilha e coleta manual servem para investigar poucos casos e aprender a classificar respostas; uma plataforma pode reduzir trabalho repetido quando há muitas perguntas; e um monitor próprio exige manutenção, custo de chamadas e tratamento das mudanças dos produtos.
Compare alternativas usando o mesmo piloto. Peça a exportação de respostas, falhas, referências e configuração, além dos gráficos. Se não for possível reconstituir uma taxa fora da ferramenta, o número ficará dependente do fornecedor. Na busca tradicional vale a mesma cautela: segundo o Google Search Central, na página "Do you need an SEO?" (consulta em 17/10/2026), o Google não avalia nem endossa ferramentas de SEO de terceiros, e elas não têm acesso aos dados internos de ranking do Google.
No Portal Leadlovers sobre medição de busca, a distinção entre fontes e etapas ajuda a separar essa amostra dos dados nativos. GSC e GA4 podem complementar a análise, mas não substituem o registro do que foi perguntado aos assistentes.
Classifique a resposta com regras e denominador explícitos
Defina antes da coleta o que conta como menção, citação e erro factual, porque são eventos diferentes. Taxa de menção é a proporção de respostas válidas em que aparece o nome ou uma variante válida da marca. Taxa de citação é a proporção de respostas válidas com a referência definida pelo protocolo; abra o endereço para conferir se ele sustenta a afirmação. Registre recomendação e adequação como dimensões separadas.
| Campo | Regra operacional do exemplo | Tratamento |
|---|---|---|
| Válida | A resposta foi obtida e arquivada | Entra no denominador principal |
| Menção | Nome inequívoco da marca no texto | Conta uma vez por resposta |
| Citação | Referência à fonte da marca | Conferir endereço e apoio à afirmação |
| Erro factual | Fato contradiz referência atual do negócio | Registrar fato e fonte da correção |
| Falha | Sem resposta utilizável | Fica fora da taxa, com contagem própria |
Num exemplo hipotético, 36 tentativas geram 32 respostas válidas e quatro falhas. Oito respostas mencionam a marca e seis citam seu site; quatro fazem as duas coisas. A taxa de menção fica em 8 de 32 respostas e a de citação em 6 de 32, contadas em unidades porque a base é pequena.
| Medida do exemplo hipotético | Respostas | Base |
|---|---|---|
| Menção da marca | 8 | 32 válidas |
| Citação do site | 6 | 32 válidas |
| Menção e citação juntas | 4 | 32 válidas |
| Falhas, fora da taxa | 4 | 36 tentativas |
As duas taxas não devem ser somadas: há sobreposição e elas descrevem eventos diferentes. Se a proposta usa participação de voz, declare se o denominador são respostas, menções ou marcas de um conjunto. O guia de erros de medição aprofunda essas armadilhas.
Conte menções e citações com um script em Python
Com as respostas já guardadas, um script curto separa as duas contagens que interessam: em quantas a marca foi mencionada e em quantas houve link para o domínio dela. O exemplo abaixo usa só a biblioteca padrão do Python, lê o material salvo e não consulta assistentes, não abre links nem consome créditos de API. Recomendar a empresa ou dizer algo verdadeiro sobre ela continua dependendo da leitura do conteúdo.
Monte um lote de teste
Exemplo hipotético: as quatro observações abaixo foram criadas para testar o programa. O produto, as respostas e os resultados são fictícios. Copie as quatro linhas para um arquivo chamado observacoes.jsonl, mantendo cada registro inteiro na sua linha.
{"lote":"2026-10-06-a","banco":"v1","produto":"assistente-teste","modelo":"nao_informado","modo":"busca","idioma":"pt-BR","data":"2026-10-06T12:00:00+00:00","repeticao":1,"id":"o1","prompt_id":"p1","status":"ok","texto":"A Brasil GEO aparece nesta comparação.","fontes_coletadas":true,"fontes":["https://brasilgeo.ai/guia"]}
{"lote":"2026-10-06-a","banco":"v1","produto":"assistente-teste","modelo":"nao_informado","modo":"busca","idioma":"pt-BR","data":"2026-10-06T12:00:00+00:00","repeticao":1,"id":"o2","prompt_id":"p2","status":"ok","texto":"Outra empresa é mencionada.","fontes_coletadas":true,"fontes":["https://brasilgeo.ai.exemplo.org/guia"]}
{"lote":"2026-10-06-a","banco":"v1","produto":"assistente-teste","modelo":"nao_informado","modo":"busca","idioma":"pt-BR","data":"2026-10-06T12:00:00+00:00","repeticao":1,"id":"o3","prompt_id":"p3","status":"erro","texto":"","fontes_coletadas":false,"fontes":[]}
{"lote":"2026-10-06-a","banco":"v1","produto":"assistente-teste","modelo":"nao_informado","modo":"busca","idioma":"pt-BR","data":"2026-10-06T12:00:00+00:00","repeticao":1,"id":"o4","prompt_id":"p4","status":"ok","texto":"A BRASIL GEO também é mencionada.","fontes_coletadas":false,"fontes":[]}Antes de rodar qualquer coisa, confira o lote com os olhos. A marca aparece em o1 e o4. Em o2, a URL começa com o nome do domínio, mas pertence a exemplo.org. A linha o3 registra uma falha, não uma resposta sem menção.
Portanto, esperamos quatro tentativas, uma falha, três respostas válidas e duas menções. As fontes foram conferidas em duas respostas; só uma delas cita o domínio alvo. Guardar esse resultado esperado ajuda a perceber um erro de cópia ou de interpretação quando o programa devolver o relatório.
Rode o script na mesma pasta
Salve o código abaixo como auditoria_geo.py, na mesma pasta de observacoes.jsonl. Use Python 3.11 ou posterior. Você não precisa instalar bibliotecas extras para este exemplo.
O script compara nomes sem distinguir maiúsculas de minúsculas, ajusta espaços repetidos e normaliza formas Unicode equivalentes. Isso permite contar a menção em BRASIL GEO sem modificar a resposta guardada. Para os links, ele aceita o domínio exato e seus subdomínios; o endereço que imita o começo do nome fica de fora.
import hashlib
import json
import re
import sys
import unicodedata
from collections import Counter, defaultdict
from datetime import datetime
from urllib.parse import urlsplit
GRUPO = ("lote", "banco", "produto", "modelo", "modo", "idioma")
def normalizar(texto):
texto = unicodedata.normalize("NFKC", texto).casefold()
return re.sub(r"\s+", " ", texto).strip()
def pertence(url, dominio):
partes = urlsplit(url)
if partes.scheme not in ("http", "https") or not partes.hostname:
raise ValueError("Fonte deve ser uma URL HTTP ou HTTPS completa.")
host = partes.hostname.lower().rstrip(".")
return host == dominio or host.endswith("." + dominio)
def taxa(numerador, denominador):
return round(100 * numerador / denominador, 2) if denominador else None
def analisar(linhas, marca, dominio):
marca = normalizar(marca)
dominio = dominio.lower().strip().rstrip(".")
if not marca or not dominio or any(c in dominio for c in "/:@ "):
raise ValueError("Informe marca e domínio simples, sem protocolo.")
padrao = re.compile(r"(?<!\w)" + re.escape(marca) + r"(?!\w)")
grupos, ids, chaves = defaultdict(Counter), {}, set()
duplicadas = 0
for numero, linha in enumerate(linhas, 1):
if not linha.strip():
continue
r = json.loads(linha)
campos = ("id", *GRUPO, "prompt_id", "data", "status")
if not isinstance(r, dict) or any(
not isinstance(r.get(c), str) or not r[c].strip() for c in campos
):
raise ValueError(f"Linha {numero}: identificação incompleta.")
data = datetime.fromisoformat(r["data"])
if data.tzinfo is None:
raise ValueError(f"Linha {numero}: data precisa de fuso horário.")
if r["status"] not in ("ok", "erro"):
raise ValueError(f"Linha {numero}: status inválido.")
if type(r.get("repeticao")) is not int or r["repeticao"] < 1:
raise ValueError(f"Linha {numero}: repetição inválida.")
if not isinstance(r.get("texto"), str):
raise ValueError(f"Linha {numero}: texto inválido.")
if r["status"] == "ok" and not r["texto"].strip():
raise ValueError(f"Linha {numero}: resposta válida está vazia.")
if type(r.get("fontes_coletadas")) is not bool:
raise ValueError(f"Linha {numero}: declare a coleta das fontes.")
if not isinstance(r.get("fontes"), list) or any(
not isinstance(u, str) for u in r["fontes"]
):
raise ValueError(f"Linha {numero}: fontes precisam ser uma lista.")
if not r["fontes_coletadas"] and r["fontes"]:
raise ValueError(f"Linha {numero}: fontes contradizem o estado.")
assinatura = hashlib.sha256(json.dumps(
r, sort_keys=True, ensure_ascii=False
).encode("utf-8")).hexdigest()
if r["id"] in ids:
if ids[r["id"]] != assinatura:
raise ValueError(f"Linha {numero}: ID com conteúdo conflitante.")
duplicadas += 1
continue
chave = tuple(r[c] for c in GRUPO) + (r["prompt_id"], r["repeticao"])
if chave in chaves:
raise ValueError(f"Linha {numero}: execução repetida com outro ID.")
ids[r["id"]] = assinatura
chaves.add(chave)
c = grupos[tuple(r[c] for c in GRUPO)]
c["tentativas"] += 1
if r["status"] == "erro":
c["falhas"] += 1
continue
c["validas"] += 1
c["mencoes"] += int(bool(padrao.search(normalizar(r["texto"]))))
if r["fontes_coletadas"]:
c["fontes_observadas"] += 1
resultados = [pertence(u, dominio) for u in r["fontes"]]
c["citacoes_dominio"] += int(any(resultados))
saida = []
for chave, c in sorted(grupos.items()):
item = dict(zip(GRUPO, chave))
for campo in ("tentativas", "falhas", "validas", "mencoes",
"fontes_observadas", "citacoes_dominio"):
item[campo] = c[campo]
item["mencao_pct"] = taxa(c["mencoes"], c["validas"])
item["cobertura_fontes_pct"] = taxa(c["fontes_observadas"], c["validas"])
item["citacao_fontes_observadas_pct"] = taxa(
c["citacoes_dominio"], c["fontes_observadas"]
)
saida.append(item)
return {"duplicadas_ignoradas": duplicadas, "grupos": saida}
if __name__ == "__main__":
if len(sys.argv) != 4:
raise SystemExit(
'Uso: python auditoria_geo.py observacoes.jsonl "Marca" dominio'
)
with open(sys.argv[1], encoding="utf-8-sig") as arquivo:
relatorio = analisar(arquivo, sys.argv[2], sys.argv[3])
print(json.dumps(relatorio, ensure_ascii=False, indent=2))
Para se localizar no código, acompanhe três funções:
analisarrecebe as linhas do arquivo, confere campos e duplicatas e reúne as contagens de cada grupo.pertenceconfere se o endereço pertence ao domínio escolhido ou a um subdomínio dele. Ela examina a URL, sem abrir o link.taxatransforma a contagem em porcentagem. Sem denominador, retornaNone, que aparece comonullno relatório JSON.
Abra o terminal nessa pasta e execute:
python auditoria_geo.py observacoes.jsonl "Brasil GEO" brasilgeo.aiNo Windows, se sua instalação usa o lançador Python, substitua python por py -3. O relatório aparece no terminal em JSON. Confira os totais previstos na seção anterior e guarde a saída junto do lote.
Se o programa interromper a análise, leia a mensagem antes de tentar novamente. Ele verifica identificação, data com fuso, estados da coleta e conflitos entre registros. Uma cópia idêntica com o mesmo ID é ignorada e contada; o mesmo ID com outro conteúdo, ou a mesma execução com outro ID, causa erro. Corrija uma cópia de trabalho e preserve o arquivo original para conseguir explicar o ajuste.
Leia cada taxa pelo denominador
No nosso lote fictício, a citação de domínio ficou em 50%. Aqui isso quer dizer uma de duas respostas com as fontes conferidas. A terceira resposta válida ainda tem fontes desconhecidas; por isso não entrou nessa conta. Já a taxa de menção usa as três respostas válidas, porque temos o texto delas.
| Valor na saída do script (de 0 a 100) | Conta do exemplo | O que podemos dizer |
|---|---|---|
| Menção: 66.67 | 2 menções / 3 respostas válidas | O nome completo apareceu em duas das três respostas |
| Cobertura de fontes: 66.67 | 2 áreas de citação conferidas / 3 respostas válidas | Falta conferir as fontes de uma resposta |
| Citação entre fontes observadas: 50 | 1 resposta com domínio alvo / 2 com fontes conferidas | Uma das duas respostas conferidas citou o domínio |
Se aparecer null, não leia como zero: faltou denominador para calcular a taxa. Um lote só com falhas, por exemplo, não tem respostas válidas para medir menções. A ideia de declarar o que foi observado acompanha a orientação do guia de governança de métricas do Portal Leadlovers.
Agora volte a algumas respostas, tanto às que entraram na contagem quanto às que ficaram de fora. O programa procura o nome completo com limites de palavra; não resolve apelidos, grafias alternativas ou homônimos. A frase ilustrativa "não recomendo a Brasil GEO" contém o nome e seria contada como menção. Para saber se houve recomendação, crítica ou erro factual, você precisa ler a resposta.
Faça o mesmo com links encurtados ou intermediários. O script não segue redirecionamentos; confira o destino antes de decidir como registrar a fonte. Uma citação também não garante que a página sustente a afirmação feita pelo assistente.
Ao comparar outra coleta, mantenha o banco de perguntas, os produtos e as condições relevantes. Repita para observar a variação, mas confira também se as perguntas representam o seu público. E, se precisar reunir grupos, some os numeradores e denominadores adequados antes de calcular: tirar a média dos percentuais pode dar outra resposta. Essas taxas descrevem o lote coletado, não a presença da marca em todas as respostas de IA.
Confira se os controles funcionam
Antes de trocar o exemplo por um lote real, faça duas pequenas alterações numa cópia de observacoes.jsonl. Você já sabe o resultado original; agora consegue verificar se os controles funcionam.
- Copie a primeira linha sem mudar nada. Rode novamente. As contagens do grupo devem continuar iguais, e
duplicadas_ignoradasdeve passar a 1. - Na cópia acrescentada, altere o texto e mantenha o ID. Rode outra vez. O programa deve interromper a análise com a mensagem de ID com conteúdo conflitante. Desfaça essa alteração antes de seguir.
- Use um pequeno lote real autorizado. Confira algumas menções, os domínios e as fontes desconhecidas à mão. Se encontrar uma descrição errada da empresa, guarde a resposta e investigue a afirmação e suas fontes; a contagem sozinha não explica a causa.
Para outra pessoa repetir a análise, entregue o arquivo de entrada, a versão do script, a marca e o domínio usados. Registre os ajustes que fez sem apagar a evidência original. A mesma entrada deve produzir as mesmas contagens.
Se a frequência de citação mudar na próxima coleta, você terá uma diferença observada para investigar, ainda sem provar o que a causou. Visitas, contatos e contratos pedem seus próprios registros. O ganho deste primeiro exercício é conseguir mostrar de onde saiu cada número e o que ainda falta conferir.
Compare concorrentes sem trocar a regra no meio
Use as mesmas perguntas e condições para todas as marcas comparadas. Uma pergunta que inclui o nome de uma empresa tende a responder sobre ela e não deve sustentar um ranking de categoria, por isso análises de marca e de categoria ficam separadas.
A posição da fonte na resposta também engana quem compara sem controle. No mesmo CITECHOICE, de 14/09/2026, Selvam e Ghosh mediram diferença de 42,3 pontos percentuais na taxa de citação entre a 1ª e a 5ª fonte nas respostas observadas, contra 7,9 com a ordem controlada e 0,0 no conjunto reservado.
Peça a uma segunda pessoa que classifique uma parte das respostas sem ver a classificação anterior. Divergências mostram onde a regra está ambígua; resolva o critério e registre a mudança, em vez de escolher sempre a interpretação mais favorável. Em períodos diferentes, informe mudanças de produto, modelo ou disponibilidade de pesquisa, mostre o tamanho da amostra junto das taxas e lembre que variação em poucas respostas não comprova que uma intervenção causou a diferença.
Transforme o resultado em uma fila de correções
Priorize erros que afetam uma compra ou a identidade da empresa e depois as lacunas que o site consegue resolver. Uma resposta com endereço errado já permite investigar uma fonte concreta, enquanto uma recomendação ausente sem causa identificada pode exigir mais observação.
- Separe erros factuais, lacunas de informação e problemas de citação, com a resposta original arquivada.
- Priorize os erros que afetam compra ou identidade da empresa.
- Vincule cada problema a uma página ou cadastro, com responsável e evidência de conclusão.
- Confira o conteúdo publicado depois da correção.
- Repita a coleta comparável e registre se o erro permanece.
O método para reduzir informações falsas conecta a auditoria ao trabalho de origem. Defina hoje uma decisão e um pequeno conjunto de perguntas para investigá-la. O piloto estará pronto quando outra pessoa conseguir localizar as respostas originais e refazer as contagens; amplie somente depois que o registro e os critérios funcionarem nesse conjunto.