Skip to content

Query Types

Query TypeDefiniciónContexto MatemáticoComplejidad
Snapshot kNNVecinos más cercanos en un instante exactokNN(v,t0)kNN(v, t_0)O(logN)O(\log N) via ST-HNSW
Range kNNkNN sobre una ventana temporalkNN(v,[t1,t2])kNN(v, [t_1, t_2])O(logNW)O(\log N \cdot W) con W = timestamps en rango
Evolutionary PathTrayectoria de un ID a través del tiempo{v(t)t[t1,t2]}\{v(t) \mid t \in [t_1, t_2]\}O(P)O(P) con P = puntos en path
Vector VelocityRapidez de cambio semánticovtv(t+δ)v(t)δ\frac{\partial v}{\partial t} \approx \frac{v(t+\delta) - v(t)}{\delta}O(1)O(1) con deltas pre-computados
Vector AccelerationCambio de la velocidad de drift2vt2\frac{\partial^2 v}{\partial t^2}O(1)O(1) con deltas de segundo orden
ExtrapolationPredicción de posición futurav(t+Δt)v(t)+tt+Δtfθ(v,τ)dτv(t + \Delta t) \approx v(t) + \int_t^{t+\Delta t} f_\theta(v, \tau) d\tauDepende del solver ODE
Change Point DetectionDetectar cuándo un concepto sufre drift bruscoPELT offline / BOCPD onlineO(N)O(N) / O(1)O(1) amortizado
Drift QuantificationMagnitud y dirección del cambiov(t2)v(t1)\|v(t_2) - v(t_1)\| con métricas múltiplesO(D)O(D)
Temporal Analogy”¿Qué era en 2020 lo que X es en 2024?”v2020+(vX2024vX2020)v_{2020} + (v_X^{2024} - v_X^{2020})O(logN)O(\log N) + kNN
Cohort DivergenceCuándo dos conceptos empiezan a divergird(vA(t),vB(t))d(v_A(t), v_B(t)) como serie temporal → CPDO(TD)O(T \cdot D)

4.1 Neural Ingestion Engine (The Pipeline)

Section titled “4.1 Neural Ingestion Engine (The Pipeline)”

En lugar de un Message Queue pasivo, proponemos un Stream Processor con normalización temporal y delta-compression.

  • Tech: Integración de Fluvio (alternativa moderna a Kafka escrita en Rust) para procesamiento zero-copy. Alternativamente, Redpanda vía cliente Rust para compatibilidad con ecosistemas Kafka existentes.
  • Feature: Delta-Embeddings. Solo se almacena el cambio Δv=v(tnew)v(tprev)\Delta v = v(t_{new}) - v(t_{prev}) si Δv>ϵ\|\Delta v\| > \epsilon, optimizando almacenamiento. La reconstrucción del vector completo es v(tn)=v(t0)+i=1nΔviv(t_n) = v(t_0) + \sum_{i=1}^{n} \Delta v_i — similar a video coding con keyframes + deltas.
  • Keyframes periódicos: Cada KK updates (configurable), se almacena el vector completo para limitar la acumulación de error y acelerar la reconstrucción.

Aquí convergen las ideas de HNSW, TANNS y nuestra innovación.

La distancia combinada entre dos nodos incorpora proximidad semántica y temporal:

dST(u,v)=αdsem(u,v)+(1α)dtime(tu,tv)d_{ST}(u, v) = \alpha \cdot d_{sem}(u, v) + (1 - \alpha) \cdot d_{time}(t_u, t_v)

donde α\alpha es configurable por query, dsemd_{sem} puede ser coseno, euclídea o hiperbólica, y dtimed_{time} es una función de decaimiento temporal.

Implementación de un factor de decaimiento λ\lambda donde la fuerza de las conexiones decae exponencialmente:

w(euv,t)=w0(euv)eλ(ttcreation)w(e_{uv}, t) = w_0(e_{uv}) \cdot e^{-\lambda(t - t_{creation})}

Las conexiones antiguas se debilitan pero no desaparecen, permitiendo búsquedas históricas rápidas. Las conexiones “tibias” actúan como “puentes temporales” que conectan épocas diferentes del espacio semántico.

Adoptamos las ideas de Wang et al. (ICDE 2025):

  • Grafo unificado con listas de vecinos versionadas por timestamp.
  • Backup neighbors para mantener conectividad cuando los nodos expiran.
  • Historic Neighbor Tree (HNT) para comprimir el historial de vecinos.

Para datasets que exceden la RAM, particionamos por rangos temporales y construimos índices Vamana por partición, mergeándolos en un índice global siguiendo la estrategia divide-and-conquer de DiskANN. Las particiones temporales recientes residen en RAM (hot), las históricas en SSD con PQ comprimido.

4.3 Storage Layer: Tiered Temporal Storage

Section titled “4.3 Storage Layer: Tiered Temporal Storage”
TierTechnologyDatosLatencia
HotLSM-Tree + RAM (RocksDB)Vectores última hora/día< 1ms
WarmParquet columnar (arrow-rs/polars)Vectores última semana/mes< 10ms
ColdObject Store (S3/MinIO) + ZarrArchivo histórico con PQ agresiva< 100ms

Detalles del Hot Layer:

  • RocksDB con prefijo de timestamp como key prefix para range scans eficientes.
  • Column families separadas para vectores completos, deltas, y metadata.
  • Bloom filters por rango temporal para evitar lecturas innecesarias.

Detalles del Warm Layer:

  • Formato columnar permite análisis de series temporales eficiente (e.g., calcular velocidad de drift sobre ventanas).
  • Parquet con encoding dictionary para metadata repetitiva.

Detalles del Cold Layer:

  • Product Quantization adaptativa: PQ con codebooks re-entrenados periódicamente para reflejar la distribución actual de los datos.
  • Formato Zarr para lectura paralela masiva en pipelines de investigación (compatible con NumPy/Dask).

La situación de SIMD en Rust (2025) ofrece varias opciones:

  • Auto-vectorización del compilador: Funciona bien para código bien estructurado, pero no toca operaciones float sin flags explícitos.
  • pulp (por el autor de faer): Soporta SSE, AVX2, AVX-512, NEON, WASM. API genérica sobre instruction sets.
  • gemm/faer: Para operaciones matriciales de alto rendimiento.
  • simsimd: Librería C con bindings Rust, optimizada específicamente para distancias vectoriales.

Para CVX, implementaremos kernels de distancia especializados para cada métrica soportada (coseno, L2, dot product, Poincaré) con dispatch dinámico basado en las capacidades del CPU detectadas en runtime.

  • burn: Framework de deep learning en Rust con backend-agnostic (Wgpu, NdArray, Candle, CUDA). Ideal para implementar los componentes de Neural ODE.
  • candle (HuggingFace): Minimalist ML framework, más ligero que burn, con soporte para modelos pre-entrenados (LLaMA, CLIP, T5) y CUDA nativo.

Para el solver ODE, usaremos burn para la forward pass de fθf_\theta y un solver adaptativo Dormand-Prince (RK45) implementado en Rust puro con soporte SIMD.