La explosión de contenido de video en la producción moderna ha creado un cuello de botella crítico para los equipos creativos: la incapacidad de localizar rápidamente momentos clave dentro de miles de horas de metraje. Los sistemas de búsqueda tradicionales, basados en palabras clave, son insuficientes para la riqueza y complejidad del video, que es inherentemente multimodal. Este problema fundamental de la computación, la recuperación eficiente de información en medios densos y heterogéneos, se agrava por la escala masiva de los archivos de producción.

La solución no reside en un algoritmo único, sino en la orquestación de un conjunto de modelos de IA especializados (reconocimiento de personajes, entornos visuales, diálogo) y la unificación de sus salidas dispares. El desafío técnico es armonizar estas señales (etiquetas textuales, vectores de alta dimensión) en una inteligencia cohesiva y en tiempo real que permita consultas complejas con latencia sub-segundo, transformando la búsqueda de video de una tarea punitiva a un proceso creativo fluido. La necesidad de ahora surge de la madurez de los modelos de IA multimodales y la demanda de herramientas que escalen con el volumen de contenido generado.

Arquitectura del Sistema

La arquitectura de búsqueda de video de Netflix se basa en un pipeline de tres etapas desacoplado para garantizar resiliencia y escalabilidad. La primera etapa, 'Transactional Persistence', ingiere anotaciones crudas de modelos especializados (ej. detección de escenas, personajes) y las almacena en Apache Cassandra. Esta capa prioriza la integridad de los datos y un alto throughput de escritura, capturando cada salida de modelo de forma segura. Las anotaciones incluyen rangos de tiempo, vectores de embedding y etiquetas.

La segunda etapa, 'Offline Data Fusion', es el corazón lógico del sistema. Una vez que Cassandra persiste los datos, se publica un evento a través de Apache Kafka, lo que dispara un job de procesamiento asíncrono. Este pipeline realiza la "fusión" de datos, normalizando las salidas dispares de los modelos al mapearlas en 'temporal buckets' de tamaño fijo (intervalos de un segundo). Se realiza una intersección temporal precisa para fusionar anotaciones superpuestas de diferentes modelos en registros unificados. Por ejemplo, si un personaje y una escena se detectan en el mismo segundo, se combinan en un único registro enriquecido. Estos registros fusionados se escriben de nuevo a Cassandra, creando un índice optimizado de intersecciones multimodales por segundo.

La tercera etapa, 'Indexing for Real Time Search', ingiere los 'temporal buckets' enriquecidos de Cassandra en Elasticsearch. Se utilizan operaciones de upsert con una clave compuesta (ID de activo + 'time bucket') para garantizar la consistencia de los datos y establecer una única fuente de verdad. Elasticsearch estructura cada 'temporal bucket' como un documento anidado, permitiendo consultas eficientes y complejas. El servicio de búsqueda en tiempo real procesa las consultas de usuario, detecta el tipo de consulta, extrae filtros y transforma texto en embeddings vectoriales. Utiliza algoritmos como k-Nearest Neighbors (k-NN) o Approximate Nearest Neighbor (ANN) como HNSW para la búsqueda semántica, y técnicas de análisis de texto de Elasticsearch (match-phrase, n-gram analysis, stemming, Levenshtein fuzzy matching) para la precisión lingüística. Finalmente, los resultados de Elasticsearch se post-procesan para reconstruir los límites de tiempo originales, ofreciendo resultados basados en lógica de 'Union' o 'Intersection' según la intención de la consulta.

Pipeline de Ingestión y Fusión de Anotaciones

  1. 1 Modelos de IA Generan anotaciones crudas (texto, embeddings, rangos de tiempo)
  2. 2 Servicio de Anotaciones Ingesta y valida anotaciones
  3. 3 Apache Cassandra Persistencia transaccional de anotaciones crudas
  4. 4 Apache Kafka Publica evento para procesamiento asíncrono
  5. 5 Pipeline Offline de Fusión Normaliza, discretiza en 'temporal buckets' y fusiona anotaciones
  6. 6 Apache Cassandra Persistencia de 'temporal buckets' enriquecidos
  7. 7 Elasticsearch Indexación para búsqueda en tiempo real (upsert con clave compuesta)

Flujo de Consulta de Búsqueda en Tiempo Real

  1. 1 Servicio de Búsqueda Recibe consulta de usuario
  2. 2 Preprocesamiento de Consulta Detección de tipo, extracción de filtros, transformación a vector
  3. 3 Elasticsearch Ejecuta consulta optimizada contra 'temporal buckets' indexados
  4. 4 Motor de Ranking Aplica k-NN/ANN, métricas de similitud, umbrales de confianza
  5. 5 Análisis Textual Phrase/proximity matching, N-gram, stemming, fuzzy matching
  6. 6 Agregaciones Clustering y agrupación de resultados para combatir fatiga
  7. 7 Post-procesamiento Reconstruye límites de tiempo originales (Union/Intersection)
  8. 8 Servicio de Búsqueda Devuelve resultados curados al usuario
CapaTecnologíaJustificación
storage Apache Cassandra Almacenamiento distribuido de alta disponibilidad para anotaciones crudas y 'temporal buckets' fusionados, priorizando la integridad de datos y el alto throughput de escritura.
messaging Apache Kafka Sistema de mensajería distribuido para desacoplar la ingesta de datos del procesamiento offline, garantizando la resiliencia y escalabilidad del pipeline.
data-processing Custom Offline Pipeline Capa de lógica central para la fusión de datos, realizando intersecciones temporales, discretización en 'temporal buckets' y enriquecimiento de anotaciones.
storage Elasticsearch Motor de búsqueda distribuido para indexación en tiempo real de 'temporal buckets' enriquecidos, soportando consultas complejas, búsqueda semántica y análisis textual avanzado. Uso de upsert con clave compuesta (asset ID + time bucket) para consistencia de datos. Estructura de documentos anidados para 'temporal buckets'.
{
"type": "SCENE_SEARCH",
"time_range": {
"start_time_ns": 4000000000,
"end_time_ns": 9000000000
},
"embedding_vector": [
-0.036, -0.33, -0.29 ...
],
"label": "kitchen",
"confidence_score": 0.72
}
Ejemplo de la salida de una anotación de modelo de búsqueda de escena, incluyendo rango de tiempo, vector de embedding, etiqueta y puntuación de confianza.
{
"associated_ids": {
"MOVIE_ID": "81686010",
"ASSET_ID": "01325120–7482–11ef-b66f-0eb58bc8a0ad"
},
"time_bucket_start_ns": 4000000000,
"time_bucket_end_ns": 5000000000,
"source_annotations": [
{
"annotation_id": "7f5959b4–5ec7–11f0-b475–122953903c43",
"annotation_type": "CHARACTER_SEARCH",
"label": "Joey",
"time_range": {
"start_time_ns": 2000000000,
"end_time_ns": 8000000000
}
},
{
"annotation_id": "c9d59338–842c-11f0–91de-12433798cf4d",
"annotation_type": "SCENE_SEARCH",
"time_range": {
"start_time_ns": 4000000000,
"end_time_ns": 9000000000
},
"label": "kitchen",
"embedding_vector": [
0.9001, 0.00123 ....
]
}
]
}
Ejemplo de un registro fusionado que muestra la superposición de anotaciones de personaje y escena dentro de un 'temporal bucket' de un segundo.
{
"entity_id": {
"entity_type": "ASSET",
"id": "1bba97a1–3562–4426–9cd2-dfbacddcb97b"
},
"range_intervals": [
{
"intersection_time_range": {
"start_time_ns": 4000000000,
"end_time_ns": 8000000000
},
"union_time_range": {
"start_time_ns": 2000000000,
"end_time_ns": 9000000000
},
"source_annotations": [
{
"annotation_id": "fc1525d0–93a7–11ef-9344–1239fc3a8917",
"annotation_type": "SCENE_SEARCH",
"metadata": {
"label": "kitchen"
}
},
{
"annotation_id": "5974fb01–93b0–11ef-9344–1239fc3a8917",
"annotation_type": "CHARACTER_SEARCH",
"metadata": {
"character_name": [
"Joey"
]
}
}
]
}
]
}
Ejemplo de la respuesta final de una consulta, mostrando los rangos de tiempo de intersección y unión, junto con las anotaciones fuente.

Fundamentos Teóricos

El problema de la búsqueda de información en medios multimodales y la necesidad de fusionar datos heterogéneos tiene raíces profundas en la investigación de recuperación de información (Information Retrieval, IR) y bases de datos. La gestión de datos temporales y la intersección de intervalos es un problema clásico en bases de datos temporales, con trabajos seminales como los de Clifford y Tansel (1985) sobre modelos de datos temporales. La discretización de eventos continuos en 'temporal buckets' es una técnica común para simplificar la indexación y la consulta de datos de series temporales, similar a los conceptos de 'binning' en procesamiento de señales y bases de datos.

La búsqueda semántica basada en embeddings vectoriales se apoya en los avances en procesamiento de lenguaje natural (NLP) y visión por computadora, con modelos como Word2Vec (Mikolov et al., 2013) y BERT (Devlin et al., 2018) sentando las bases para la representación de significado en espacios de alta dimensión. Los algoritmos de Approximate Nearest Neighbor (ANN), como HNSW (Malkov & Yashunin, 2016), son cruciales para escalar la búsqueda de similitud en estos espacios vectoriales masivos, un problema que se aborda en la literatura de geometría computacional y algoritmos de búsqueda eficiente. La combinación de búsqueda textual y vectorial refleja la evolución de los sistemas de IR hacia enfoques híbridos, buscando equilibrar la precisión de las palabras clave con la relevancia semántica contextual.