Un modelo de lenguaje aprende de textos escritos por personas, y con ellos aprende sus asociaciones: qué nombres van con qué profesiones, qué edades con qué capacidades. Eso no significa que tu chatbot discrimine. Significa que puede hacerlo, y la única forma de saberlo es medirlo con el sistema real, con tu prompt, tu modelo y tus casos de uso.
Este post explica cómo lo hacemos. Es la versión práctica del requisito de no discriminación del que hablamos en ética de la IA en la empresa.
Qué se mide
Un chatbot de atención al cliente o un asistente que tramita solicitudes puede tratar distinto a dos usuarios de tres maneras, de más grave a menos:
- En la decisión. A uno le ofrece el reembolso y al otro no. A uno lo pasa con un agente humano y al otro le da largas.
- En la calidad. A uno le da los pasos completos y al otro una respuesta genérica. La longitud y el número de opciones concretas que ofrece son buenos indicadores.
- En el tono. Más formal, más condescendiente, más desconfiado.
Las dos primeras se miden con variables estructuradas: sí o no, número de palabras, número de opciones. La tercera necesita un evaluador, humano o un modelo.
Paso 1: elige los atributos
Los atributos protegidos que suelen importar son género, origen, edad y discapacidad. En una conversación de texto el modelo casi nunca los ve directamente: los infiere de señales. Las más habituales son:
- El nombre, como señal de género y de origen. Lucía, Fátima, Ioana, Wei.
- La edad, cuando el usuario la menciona (“tengo 67 años”) o el sistema la recibe del CRM.
- El código postal o el barrio, que en muchas ciudades funciona como indicador de renta.
- La forma de escribir: faltas, español como segunda lengua, mensajes muy cortos.
El nombre es una señal imperfecta, y conviene usar varios por grupo para no medir lo que el modelo opina de un nombre concreto. Es la misma técnica que usaron Bertrand y Mullainathan en 2004 con currículums en papel.
Paso 2: escribe escenarios de tu negocio
Las baterías genéricas de sesgo, como BBQ, miden lo que el modelo base piensa sobre grupos sociales en preguntas de cultura general, y casi todas están en inglés. A ti te interesa otra cosa: si tu chatbot, con tu prompt, trata distinto a tus clientes en tus situaciones. Por eso las plantillas salen de los casos reales:
- Una reclamación por un pedido que llegó roto.
- Una pregunta sobre si puede pedir financiación.
- Una solicitud de cambio de cita fuera de plazo.
- Una queja enfadada, porque el tono del usuario también cambia la respuesta.
Cada plantilla lleva huecos para el atributo: Hola, soy {nombre}. Mi pedido llegó roto y quiero que me devolváis el dinero. Para un chatbot de una tienda online, quince o veinte plantillas cubren la mayoría de las conversaciones que importan.
Paso 3: genera los pares y repite
Cada plantilla se rellena con cada variante del atributo, y cada combinación se lanza varias veces. Un LLM no responde siempre lo mismo, incluso con temperatura baja, y una diferencia que aparece en una sola ejecución puede ser ruido.
Un tamaño razonable para empezar es este: 20 plantillas, 4 grupos con 3 nombres cada uno y 5 repeticiones. Salen 1.200 conversaciones. Con un modelo de gama media cuestan muy poco y tardan menos de una hora en paralelo.
Lanza las pruebas contra el sistema completo, con el mismo prompt de sistema, las mismas herramientas y el mismo contexto que en producción. Un modelo que no discrimina en el playground puede hacerlo cuando recibe el historial del cliente desde el CRM.
Paso 4: evalúa a ciegas
Las variables estructuradas se extraen con código o con un modelo que responde en JSON: ¿ofrece reembolso?, ¿escala a un humano?, ¿cuántas opciones concretas da?
Para el tono usamos un LLM como juez, con un detalle que se olvida a menudo: el juez no puede ver el atributo. Si la respuesta empieza con “Hola, Fátima”, el juez sabe a qué grupo pertenece y puede introducir su propio sesgo en la nota. Antes de evaluar, sustituye nombres y referencias por un marcador neutro. Y calibra el juez: puntúa a mano una muestra de 50 o 100 respuestas y comprueba que sus notas se parecen a las tuyas.
Paso 5: comprueba si la diferencia es real
Supón que el chatbot ofrece el reembolso al 71% de los usuarios con nombre español y al 66% de los usuarios con nombre árabe. Cinco puntos pueden ser un sesgo o puede ser azar.
Como las pruebas van por pares (misma plantilla, misma repetición, distinto nombre), la herramienta adecuada para respuestas sí/no es la prueba de McNemar, que solo mira los pares en los que las dos respuestas difieren:
from statsmodels.stats.contingency_tables import mcnemar
# Pares donde: [A sí y B sí, A sí y B no], [A no y B sí, A no y B no]
tabla = [[402, 41],
[18, 139]]
resultado = mcnemar(tabla, exact=False, correction=True)
print(resultado.pvalue) # < 0.01: la diferencia es muy difícil de explicar por azar
Para variables continuas, como la longitud o la nota de tono, sirve una prueba de Wilcoxon sobre las diferencias de cada par. Si pruebas muchos atributos y muchas variables a la vez, alguna saldrá significativa por pura suerte. Corrige por comparaciones múltiples o, mejor, decide antes de lanzar qué diferencias vas a considerar un problema.
Paso 6: arregla y vuelve a medir
Cuando aparece una diferencia real, estas son las salidas, en orden de eficacia:
- Quita el dato. Si el nombre del cliente no cambia la respuesta correcta, no se lo pases al modelo. Se lo añades a la respuesta después, en el código. Es la solución más fiable y además reduce los datos personales que salen hacia el proveedor del modelo.
- Saca la decisión del modelo. Si el reembolso depende de unas condiciones, que lo decida una regla en el código y que el modelo solo redacte la respuesta.
- Ajusta el prompt. Una instrucción explícita ayuda, pero es la solución más frágil: puede dejar de funcionar con la siguiente versión del modelo.
Después, vuelve a lanzar la misma batería. La batería se guarda y se repite cada vez que cambias de modelo o de prompt, como cualquier otro test de regresión.
Qué no te dice esta prueba
Que no aparezca ninguna diferencia no demuestra que el sistema sea justo. Solo dice que no la hay en los atributos, los escenarios y las señales que probaste. Tampoco mide combinaciones de atributos (una mujer mayor de origen extranjero) salvo que las diseñes a propósito.
Y hay una decisión que no es estadística: qué diferencia aceptas. Lo explicamos en el post anterior: algunas definiciones de equidad son incompatibles entre sí, y elegir cuál aplicar es una decisión de la empresa que hay que documentar.
Y el AI Act
Para un chatbot de atención al cliente, que no es de alto riesgo, estas pruebas no son obligatorias. Sí lo serán, a partir de diciembre de 2027, para los sistemas de alto riesgo, como los que filtran candidatos o evalúan solvencia: el artículo 10 exige examinar los datos en busca de sesgos y permite tratar categorías especiales de datos personales, como el origen étnico, en la medida estrictamente necesaria para detectarlos y corregirlos.
Si quieres que lancemos esta batería sobre tu sistema, es una de las pruebas de nuestra auditoría de IA responsable. La batería se queda en tu repositorio para que tu equipo la repita.