Cómo construir un sistema de recomendación sin rastrear usuarios
Un sistema de recomendación sin rastreo se basa en características del contenido y señales locales de la sesión, no en perfiles cruzados. Así lo construimos — y la precisión que cedemos.
Se puede construir un sistema de recomendación genuinamente útil sin rastrear a un solo usuario. El truco está en dejar de intentar saber quién es alguien a lo largo de varias visitas y, en su lugar, ordenar un catálogo finito usando lo que los propios artículos contienen, más el puñado de señales que la sesión actual ofrece gratis. Se pierden los últimos puntos de precisión que aporta la elaboración de perfiles cruzados entre usuarios. Para la mayoría de los productos, esa pérdida no compensa una responsabilidad de vigilancia.
Qué significa de verdad "un sistema de recomendación sin rastreo"
Un recomendador sin rastreo de usuarios es un sistema de ordenación que produce sugerencias con apariencia personalizada sin construir un perfil persistente y cruzado de una persona identificable. Sin cookie que te siga, sin huella digital del dispositivo, sin ID de usuario cosido entre visitas, sin datos de comportamiento enviados a terceros. El modelo nunca necesita responder "¿quién es este?" — solo "dados estos artículos y lo que acaba de ocurrir en esta sesión, ¿qué debo mostrar a continuación?".
Conviene ser preciso, porque la industria lo difumina a propósito. Hay tres grandes familias de recomendadores:
- Filtrado colaborativo — "a la gente como tú también le gustó X". Esta es la que exige rastreo: solo funciona si tienes un historial largo y vinculado a la identidad de muchos usuarios para encontrar a tus vecinos.
- Basado en contenido — "este artículo se parece a cosas con las que estás interactuando ahora mismo". Puntúa los artículos por sus propias características, así que no necesita historial de otras personas ni un perfil a largo plazo tuyo.
- Basado en conocimiento/reglas — "dadas estas restricciones, estos candidatos son válidos y están ordenados". Lógica de dominio pura, cero datos de comportamiento.
La recomendación que prioriza la privacidad vive casi por completo en la segunda y la tercera familias, pegadas con lo que la sesión en vivo revela legítimamente. Ese es todo el espacio de diseño, y es mayor de lo que se supone.
La versión corta
- Ordena un catálogo finito y propio — tú escribiste los artículos, así que puedes describirlos con riqueza.
- Personaliza a partir de señales locales de la sesión: la ruta actual, los artículos tocados en esta visita, el idioma declarado, el contexto aproximado. Todo descartado al cerrar la pestaña.
- Puntúa con características de contenido y un modelo pequeño y explicable — no con un historial cruzado de usuarios.
- Mantén cualquier estado aprendido en el dispositivo o agregado por encima de un umbral de privacidad antes de que toque un servidor.
- Acepta un pequeño coste de precisión a cambio de no tener banner de consentimiento, ni quebradero de cabeza con el DPA, y de tener un sistema que puedes explicar a un regulador.
1. Recomendar es sobre todo ordenar, y ordenar es sobre todo contenido
Lo argumentamos en detalle en nuestro alegato a favor del ML frente a la IA: la mayoría de las "funciones de IA" son listas de sugerencias ordenadas disfrazadas de chatbot. El mismo replanteamiento disuelve el problema de privacidad. Si el trabajo es "ordenar este conjunto conocido de artículos", entonces la señal más rica disponible casi siempre son los propios artículos — no un dosier sobre el usuario.
Mira Delicious Diamonds, la casa de chocolate de lujo para la que trabajamos. El "también te podría gustar" en una página de praliné no necesita conocer tu historial de compras por toda la web abierta. Necesita saber que el praliné que estás viendo es de origen único de Madagascar, 72% de cacao, en la franja de precio de regalo, con nota cítrica — y que otros tres artículos del catálogo comparten la mayoría de esos atributos. Es una búsqueda de vecinos basada en contenido sobre unos cientos de SKU. Corre en un milisegundo y es correcta en una primera visita, con un tarro de cookies vacío, para un navegador sin sesión iniciada detrás de una VPN.
El filtrado colaborativo cruzado es la forma cara e invasiva de aproximar algo que las características de contenido a menudo te dan directamente. Cuando tu catálogo es pequeño y está bien descrito, no necesitas a la multitud.
Construir características de contenido sin vigilancia
El trabajo pasa de la recogida de datos a la descripción de datos. Para cada artículo guardas un vector de características construido con cosas que ya posees:
- Atributos estructurados — categoría, etiquetas, franja de precio, origen, dificultad, duración, peso de la evidencia.
- Embeddings de texto del título y la descripción, calculados una vez en el momento de publicar con un modelo local pequeño. Usamos un modelo de embedding de frases en el servidor; sin inferencia por petición, sin API externa.
- Señales editoriales — "combina con", "forma parte de la colección", peso del curador.
La similitud es entonces la distancia coseno sobre esos vectores, opcionalmente reponderada por reglas de negocio. Nada de ello hace referencia a una persona. Se calcula cuando cambia el contenido, se cachea, y se sirven los vecinos precalculados como una búsqueda estática.
2. Señales locales de la sesión: personalización que olvida a propósito
La pura similitud de contenido es impersonal. El término medio honesto es la sesión — la única unidad de contexto que puedes usar sin convertirte en un rastreador, porque empieza y termina con la visita.
Dentro de una sola sesión sabes legítimamente: las páginas visitadas en esta visita, los artículos añadidos al carrito o marcados como favoritos, los términos de búsqueda escritos, el idioma de interfaz declarado, y contexto aproximado como la clase de viewport o la hora del día. A partir de ahí puedes mantener un vector de interés de la sesión — una media móvil de los vectores de características de los artículos con los que el visitante ha interactuado en esta visita — y ordenar candidatos por su cercanía a él. Navega por tres tabletas intensas y ricas en cacao y la página se inclina discretamente hacia la intensidad frente al dulzor, sin tener ni idea de quién eres y sin recordarte mañana.
La disciplina que hace esto orientado a la privacidad en lugar de rastreo con otro nombre:
- Sin identificador persistente. La sesión se indexa con un token efímero en
sessionStorage(muere con la pestaña) o una cookie de sesión de primera parte sin valor a largo plazo — nunca un ID de usuario cosido. - Sin unión entre sesiones. Deliberadamente no conectamos esta visita con la anterior. Volver mañana es una hoja en blanco. Eso es una función, no un defecto.
- El estado se queda del lado del cliente siempre que se pueda. En Jofit, nuestra app de bienestar, el vector de interés de la sesión vive en el navegador y se envía al ordenador como un vector corto y opaco, no como un registro de eventos que el servidor retenga.
Esto refleja cómo gestionamos el sitio que estás leyendo. Como escribimos en no rastreamos usuarios, nuestra analítica es un único beacon anónimo por sesión sin retención de IP más allá de siete días. El recomendador sigue la misma regla: la sesión es la unidad, y nada le sobrevive.
3. Enfoques en el dispositivo y agregados para los casos más difíciles
A veces contenido más sesión genuinamente no basta — quieres que el modelo aprenda. Hay dos maneras de obtener aprendizaje sin construir dosieres por usuario en un servidor.
Personalización en el dispositivo
Envía el ordenador al cliente y deja que el estado personal nunca lo abandone. Los vectores de características del catálogo son públicos; los pesos de preferencia del usuario se calculan y guardan localmente (IndexedDB, almacenamiento en el dispositivo) y se aplican en el momento del renderizado. El servidor envía el mismo conjunto neutro de candidatos a todos; el dispositivo lo reordena. Así es exactamente como el ordenador de Jofit puede adaptarse al historial de adherencia de una persona — ese historial es de la propia persona, en su propio dispositivo, y nuestros servidores nunca ven el rastro.
El coste es real y conviene nombrarlo: no puedes calcular, desde un solo dispositivo, cosas que requieren a la población, como tendencias reales o valores por defecto de arranque en frío. Esos los derivas de agregados.
Señales solo agregadas
Puedes usar a la multitud sin rastrear individuos si solo lees a la multitud en agregado, y solo por encima de un umbral. "Este artículo fue visto por suficientes sesiones distintas esta semana como para contar como popular" es una señal global segura para la privacidad, siempre que guardes contadores, no eventos — incrementa un recuento, nunca una fila vinculada a una identidad. Todo lo que esté por debajo de un recuento mínimo (digamos, menos de 50 sesiones distintas) se suprime, para que ningún agregado pueda singularizar a una persona. Es el mismo instinto de k-anonimato que hace segura nuestra analítica por beacon.
Para equipos que quieran ir más lejos, el aprendizaje federado y la privacidad diferencial formalizan esto: entrenar en el dispositivo, enviar solo actualizaciones de modelo con ruido, nunca comportamiento en bruto. Recurriríamos a eso en un gran producto B2C. Para un sitio de estudio o una tienda de unos cientos de SKU, es sobreingeniería — contenido más sesión más agregados con umbral ya te da el 90% de la calidad percibida.
4. El compromiso de precisión, dicho con honestidad
Aquí está la parte que la mayoría de los proveedores no imprime. Renunciar al rastreo cruzado te cuesta precisión, y el tamaño del coste depende por completo de tu catálogo.
Lo que cedes:
- La serendipia del filtrado colaborativo — "quien compró taladros también compró esta cosa sin relación". Los recomendadores basados en contenido se quedan más cerca de lo que ya estás viendo; es menos probable que te sorprendan con el salto entre categorías que aflora una enorme matriz de comportamiento.
- Personalización verdaderamente a largo plazo — un modelo que te recuerda a lo largo de meses y estaciones. El olvido local de la sesión significa que cada visita reaprende desde cero.
- Optimización a escala de población sobre datos a nivel individual — el tipo de exprimido que mueve una métrica una fracción de punto porcentual a escala de miles de millones de eventos.
Lo que conservas, o ganas:
- Corrección en la primera visita. Los recomendadores de contenido y sesión no tienen problema de arranque en frío a nivel de usuario — funcionan para alguien nunca visto antes, que es la mayoría de tu tráfico.
- Explicabilidad. "Recomendado porque comparte origen y porcentaje de cacao con lo que estás viendo" es una frase que puedes mostrar al usuario y defender ante un regulador. Un embedding de filtrado colaborativo no lo es.
- Sin puerta de consentimiento en el camino crítico. Como nada se rastrea, el recomendador corre antes de que se responda a cualquier banner de cookies. Bajo el RGPD, la elaboración de perfiles que usa rastreo generalmente requiere consentimiento; ordenar un catálogo por sus propios atributos más estado de sesión efímero no. Es una ventaja legal y de UX, no solo ética.
- Menor coste y latencia. Vecinos precalculados y un pequeño vector de sesión son baratos. Sin feature store de historiales de usuario, sin reentrenamiento nocturno sobre un lago de comportamiento.
La regla de decisión que usamos: si el catálogo es pequeño y está bien descrito, el basado en contenido gana de plano y la brecha de precisión es despreciable. Cuanto más grande y más insípido el catálogo, y cuanto más dependa tu margen de exprimir el último punto porcentual de conversión, más te habría aportado el filtrado colaborativo — y con más honestidad tienes que sopesar eso frente a la responsabilidad de datos que crea.
5. Una arquitectura de referencia que puedes lanzar este sprint
En concreto, en nuestra stack — PHP 8.3, Cockpit CMS, sin paso de build, renderizado en el servidor — un recomendador que prioriza la privacidad son tres piezas modestas:
- Construcción de características offline. Al publicar contenido, calcula el vector de características de cada artículo (atributos + embedding de texto) y los top-N vecinos de contenido. Guárdalos como JSON junto al contenido. Sin coste en tiempo de ejecución, sin unión de base de datos en el camino caliente.
- Vector de sesión. Un pequeño acumulador del lado del cliente mantiene una media móvil de los vectores de características de los artículos tocados en esta visita, en
sessionStorage. Se envía al endpoint de ordenación como un array corto y opaco —{ session_vec: [...], context: { lang, viewport } }— nunca un registro de eventos. - Ordenador. Un endpoint de servidor mezcla similitud de contenido, cercanía de sesión y popularidad agregada con umbral en una sola puntuación, aplica reglas de negocio estrictas, y devuelve la lista ordenada. Sin estado. No registra nada vinculado a la identidad.
Eso es todo. Cabe en un sprint, corre en alojamiento compartido, y no hay ninguna parte que te incomodara explicar en una política de privacidad.
La conclusión
La mayoría de los productos no necesitan rastrear usuarios para recomendar bien — necesitan describir bien su catálogo y respetar la frontera de la sesión. Recurre al filtrado colaborativo solo cuando tu catálogo sea demasiado grande y demasiado genérico para que las características de contenido carguen con el peso, y solo después de haber valorado la vigilancia que exige. Para todos los demás, un ordenador basado en contenido y local de la sesión es más rápido de construir, más barato de operar, legal sin el baile del consentimiento, y lo bastante honesto como para explicárselo a la persona a la que sirve. Los pocos puntos de precisión que dejas sobre la mesa son el seguro más barato que comprarás jamás.