El Problema: Ayudar a Viajeros Exploratorios a Encontrar su Próximo Destino
¡Hola Devs! ¿Alguna vez abres Airbnb sin tener idea de a dónde ir? No solo estás navegando — estás explorando. Estos usuarios "exploratorios" se comportan diferente: buscan de forma amplia ("Francia"), visitan la app con menos frecuencia y raramente reservan de inmediato. Pero representan una oportunidad enorme de engagement y conversión.
El equipo de ingeniería de Airbnb enfrentó un desafío único: ¿cómo recomendar destinos a usuarios que ni ellos mismos saben a dónde quieren ir? La solución es un modelo sofisticado de recomendación que mezcla comportamiento de corto plazo (búsquedas recientes, vistas) con preferencias de largo plazo (reservas pasadas, patrones estacionales).
Este post detalla la arquitectura, estrategia de entrenamiento y despliegue real de este sistema. Si estás construyendo motores de recomendación o funcionalidades de personalización, los insights aquí son directamente aplicables.
Para entender cómo construir agentes de conocimiento sin embeddings, checa nuestra guía sobre uso de filesystem y bash.

Arquitectura del Modelo: Transformers para Intención de Viaje
La idea central es simple pero poderosa: tratar cada acción del usuario como un token, inspirado en modelos de lenguaje. ¡Vamos a ver cómo funciona!
- Entradas: Secuencias de acciones del usuario (reservas, vistas, búsquedas) + señales contextuales (hora actual, estacionalidad)
- Embedding: Cada acción se representa con la suma de los embeddings de ciudad, región y "días hasta hoy"
- Transformer: Un encoder transformer estándar procesa estas secuencias para capturar dependencias de corto y largo plazo
# Pseudocódigo simplificado del forward pass del modelo
import torch
import torch.nn as nn
class DestinationTransformer(nn.Module):
def __init__(self, num_cities, num_regions, d_model=256, nhead=8):
super().__init__()
self.city_embed = nn.Embedding(num_cities, d_model)
self.region_embed = nn.Embedding(num_regions, d_model)
self.time_embed = nn.Linear(1, d_model) # días hasta hoy
self.transformer = nn.TransformerEncoder(
nn.TransformerEncoderLayer(d_model, nhead),
num_layers=6
)
# Cabezas multi-tarea: predecir ciudad y región
self.city_head = nn.Linear(d_model, num_cities)
self.region_head = nn.Linear(d_model, num_regions)
def forward(self, city_ids, region_ids, days_to_today):
# Embed cada acción
x = self.city_embed(city_ids) + self.region_embed(region_ids) + self.time_embed(days_to_today.unsqueeze(-1))
# Codificación transformer
x = self.transformer(x)
# Predicciones multi-tarea
city_logits = self.city_head(x[:, -1, :]) # usa el último token
region_logits = self.region_head(x[:, -1, :])
return city_logits, region_logits
Equilibrando Usuarios Activos e Inactivos
Una de las decisiones de diseño más interesantes es cómo manejan diferentes estados de usuario:
- Usuarios activos (ej.: alguien que buscó en el Área de la Bahía la semana pasada): Los ejemplos de entrenamiento usan datos actualizados de reservas, vistas y búsquedas de 1 a 7 días antes de la reserva real.
- Usuarios inactivos (ej.: alguien que reservó el año pasado y no ha vuelto): Los ejemplos de entrenamiento usan solo datos de reservas de 8 a 365 días antes de la reserva, simulando la etapa inicial de exploración.
Esta estrategia de entrenamiento dual asegura que el modelo funcione bien tanto para "sé a dónde voy" como para "solo estoy viendo".

Mejorando el Entendimiento Geográfico con Aprendizaje Multi-Tarea
Los datos de geolocalización de Airbnb son ricos: ciudades como Ciudad de México y Querétaro pertenecen a la misma región (Centro de México). Para codificar esto, el modelo usa aprendizaje multi-tarea:
- Dos cabezas de predicción: una para nivel de ciudad, otra para nivel de región
- Backbone transformer compartido: aprende representaciones útiles tanto para predicciones granulares como gruesas
- Restricción de consistencia: incentiva al modelo a alinear las predicciones de ciudad y región
Esta aproximación es elegante porque no requiere ingeniería manual de features — el modelo aprende la jerarquía a partir de los datos.
Aplicaciones en el Mundo Real
El modelo alimenta dos funcionalidades:
- Autosuggest: Cuando los usuarios tocan la barra de búsqueda, ven recomendaciones personalizadas de ciudades. Pruebas A/B mostraron ganancias significativas de reservas en regiones donde el inglés no es el idioma principal.
- Correos de Búsqueda Abandonada: Si un usuario sale sin reservar, correos de seguimiento destacan listados de destinos predichos. Esto reengancha a los usuarios y genera conversiones.
Para un caso de estudio real sobre escalabilidad de sistemas seguros, ve cómo WhatsApp escaló Rust para billones de usuarios.
![]()
Limitaciones y Cuidados
- Cold start: Usuarios sin historial reciben recomendaciones genéricas. El modelo depende mucho de datos históricos.
- Privacidad: Los usuarios pueden optar por salir de la personalización, pero el valor por defecto es activo. Siempre respeta el consentimiento del usuario.
- Sesgo estacional: El modelo puede sobreajustarse a patrones estacionales (ej.: siempre recomendar destinos de playa en verano).
- Interpretabilidad: Los transformers son cajas negras. Depurar recomendaciones incorrectas es difícil.
Próximos Pasos para Aprender
- Explora redes neuronales de grafos para codificar jerarquías de ubicación de forma más explícita.
- Prueba aprendizaje por refuerzo para optimizar el engagement a largo plazo, no solo la reserva inmediata.
- Experimenta con aprendizaje contrastivo para separar mejor diferentes intenciones de viaje (ej.: negocios vs. ocio).
Conclusión
El modelo de recomendación de destinos de Airbnb es una clase magistral de cómo aplicar arquitecturas transformer a un problema real de personalización. Las lecciones clave: trata las acciones del usuario como tokens, equilibra usuarios activos e inactivos con diseño inteligente de datos de entrenamiento y usa aprendizaje multi-tarea para codificar conocimiento de dominio. El resultado es un sistema que genuinamente ayuda a los usuarios a descubrir a dónde ir — y genera un impacto medible en el negocio.