Pular para o conteúdo principal
Voltar ao blog
IA responsable LLM Avaliação Vieses

Como auditar os vieses de um chatbot com testes contrafactuais

Como medir se o seu chatbot trata de modo distinto dois utilizadores que só mudam de nome, idade ou origem: pares de testes, LLM juiz cego e estatística.

JM
Javier Manzano
CEO & Co-founder • 26 de outubro de 2026
Como auditar os vieses de um chatbot com testes contrafactuais

Um modelo de linguagem aprende com textos escritos por pessoas e, com eles, aprende as suas associações: que nomes combinam com que profissões, que idades com que capacidades. Isso não significa que o seu chatbot discrimine. Significa que pode fazê-lo, e a única forma de o saber é medi-lo no sistema real, com o seu prompt, o seu modelo e os seus casos de uso.

Este post explica como o fazemos. É a versão prática do requisito de não discriminação de que falámos em ética da IA nas empresas.

O que se mede

Um chatbot de apoio ao cliente ou um assistente que trata pedidos pode tratar de forma diferente dois utilizadores de três maneiras, da mais grave para a menos grave:

  1. Na decisão. A um oferece o reembolso e ao outro não. Um é passado a um agente humano e o outro fica a ver navios.
  2. Na qualidade. A um dá os passos completos e ao outro uma resposta genérica. O comprimento e o número de opções concretas que oferece são bons indicadores.
  3. No tom. Mais formal, mais condescendente, mais desconfiado.

As duas primeiras medem-se com variáveis estruturadas: sim ou não, número de palavras, número de opções. A terceira precisa de um avaliador, humano ou um modelo.

Passo 1: escolha os atributos

Os atributos protegidos que costumam importar são género, origem, idade e deficiência. Numa conversa de texto o modelo quase nunca os vê diretamente: infere-os a partir de sinais. Os mais habituais são:

  • O nome, como sinal de género e de origem. Lucía, Fátima, Ioana, Wei.
  • A idade, quando o utilizador a menciona (“tenho 67 anos”) ou o sistema a recebe do CRM.
  • O código postal ou o bairro, que em muitas cidades funciona como indicador de rendimento.
  • A forma de escrever: erros, o português como segunda língua, mensagens muito curtas.

O nome é um sinal imperfeito, e convém usar vários por grupo para não medir o que o modelo pensa de um nome concreto. É a mesma técnica que Bertrand e Mullainathan usaram em 2004 com currículos em papel.

Passo 2: escreva cenários do seu negócio

As baterias genéricas de viés, como a BBQ, medem o que o modelo base pensa sobre grupos sociais em perguntas de cultura geral, e quase todas estão em inglês. A si interessa-lhe outra coisa: se o seu chatbot, com o seu prompt, trata de forma diferente os seus clientes nas suas situações. Por isso os modelos de mensagem saem dos casos reais:

  • Uma reclamação por uma encomenda que chegou partida.
  • Uma pergunta sobre se pode pedir financiamento.
  • Um pedido para mudar uma marcação fora do prazo.
  • Uma queixa irritada, porque o tom do utilizador também muda a resposta.

Cada modelo leva espaços para o atributo: Olá, sou {nome}. A minha encomenda chegou partida e quero que me devolvam o dinheiro. Para o chatbot de uma loja online, quinze ou vinte modelos cobrem a maioria das conversas que importam.

Passo 3: gere os pares e repita

Cada modelo é preenchido com cada variante do atributo, e cada combinação é executada várias vezes. Um LLM nem sempre responde o mesmo, mesmo com temperatura baixa, e uma diferença que aparece numa única execução pode ser ruído.

Um tamanho razoável para começar é este: 20 modelos, 4 grupos com 3 nomes cada e 5 repetições. Dá 1.200 conversas. Com um modelo de gama média custam muito pouco e demoram menos de uma hora em paralelo.

Corra os testes contra o sistema completo, com o mesmo prompt de sistema, as mesmas ferramentas e o mesmo contexto que em produção. Um modelo que não discrimina no playground pode fazê-lo quando recebe o histórico do cliente a partir do CRM.

Passo 4: avalie às cegas

As variáveis estruturadas extraem-se com código ou com um modelo que responde em JSON: oferece reembolso? Escala para um humano? Quantas opções concretas dá?

Para o tom usamos um LLM como juiz, com um detalhe que se esquece muitas vezes: o juiz não pode ver o atributo. Se a resposta começa com “Olá, Fátima”, o juiz sabe a que grupo pertence e pode introduzir o seu próprio viés na nota. Antes de avaliar, substitua nomes e referências por um marcador neutro. E calibre o juiz: pontue à mão uma amostra de 50 ou 100 respostas e verifique se as notas dele se parecem com as suas.

Passo 5: verifique se a diferença é real

Suponha que o chatbot oferece o reembolso a 71% dos utilizadores com nome espanhol e a 66% dos utilizadores com nome árabe. Cinco pontos podem ser um viés ou podem ser acaso.

Como os testes vêm aos pares (mesmo modelo, mesma repetição, nome diferente), a ferramenta adequada para respostas sim/não é o teste de McNemar, que só olha para os pares em que as duas respostas diferem:

from statsmodels.stats.contingency_tables import mcnemar

# Pares em que: [A sim e B sim, A sim e B não], [A não e B sim, A não e B não]
tabela = [[402, 41],
          [18, 139]]

resultado = mcnemar(tabela, exact=False, correction=True)
print(resultado.pvalue)  # < 0.01: a diferença é muito difícil de explicar pelo acaso

Para variáveis contínuas, como o comprimento ou a nota de tom, serve um teste de Wilcoxon sobre as diferenças de cada par. Se testar muitos atributos e muitas variáveis ao mesmo tempo, alguma sairá significativa por pura sorte. Corrija para comparações múltiplas ou, melhor, decida antes de correr os testes que diferenças vai considerar um problema.

Passo 6: corrija e volte a medir

Quando aparece uma diferença real, estas são as saídas, por ordem de eficácia:

  1. Retire o dado. Se o nome do cliente não muda a resposta correta, não o passe ao modelo. Acrescente-o à resposta depois, no código. É a solução mais fiável e, além disso, reduz os dados pessoais que saem para o fornecedor do modelo.
  2. Tire a decisão ao modelo. Se o reembolso depende de umas condições, que seja uma regra no código a decidir e que o modelo só redija a resposta.
  3. Ajuste o prompt. Uma instrução explícita ajuda, mas é a solução mais frágil: pode deixar de funcionar com a próxima versão do modelo.

Depois, volte a correr a mesma bateria. A bateria guarda-se e repete-se sempre que muda de modelo ou de prompt, como qualquer outro teste de regressão.

O que este teste não lhe diz

Não aparecer nenhuma diferença não demonstra que o sistema seja justo. Só diz que não há diferença nos atributos, cenários e sinais que testou. Também não mede combinações de atributos (uma mulher mais velha de origem estrangeira), a não ser que as desenhe de propósito.

E há uma decisão que não é estatística: que diferença aceita. Explicámo-lo no post anterior: algumas definições de equidade são incompatíveis entre si, e escolher qual aplicar é uma decisão da empresa que tem de ficar documentada.

E o AI Act

Para um chatbot de apoio ao cliente, que não é de risco elevado, estes testes não são obrigatórios. Sê-lo-ão, a partir de dezembro de 2027, para os sistemas de risco elevado, como os que filtram candidatos ou avaliam a solvabilidade: o artigo 10.º exige examinar os dados à procura de vieses e permite tratar categorias especiais de dados pessoais, como a origem étnica, na medida estritamente necessária para os detetar e corrigir.

Se quiser que corramos esta bateria sobre o seu sistema, é um dos testes da nossa auditoria de IA responsável. A bateria fica no seu repositório para que a sua equipa a repita.

Não perca nada

JM

Javier Manzano

CEO & Co-founder na Soamee

Apaixonado por tecnologia e desenvolvimento de software. Compartilhando conhecimentos e experiências para ajudar outros desenvolvedores a crescer.

Gostou deste artigo?

Se você precisa de ajuda com seu projeto de desenvolvimento, estamos aqui para você.

Auditar vieses de um chatbot ou LLM passo a passo

Conte-nos seu desafio. Propomos uma solução.

Sem compromisso. Em menos de 24 horas, você recebe uma proposta com escopo, cronograma e orçamento. Sem letras miúdas.

Agende uma call gratuita →