Real-Time Content Personalization via Contextual Bandits & Matryoshka Embeddings

Erstellt am: 14. April 2026

Ein Live-Empfehlungssystem auf Basis von LinUCB-Banditen mit Cholesky-Updates und adaptiven Matryoshka-Embeddings – designed für Inhalte mit einem Time-to-Live < 48h.

Klassische kollaborative Filter scheitern in Umgebungen mit extrem kurzen Inhalts-Lebenszyklen: Wenn ein Artikel verschwindet, bevor genügend Interaktionsdaten vorliegen, kollabiert die Empfehlungsqualität. Dieses Projekt löst das Cold-Start-Paradoxon durch einen Linear Upper Confidence Bound (LinUCB) Algorithmus, der Exploration und Exploitation mathematisch ausbalanciert.

Das Herzstück ist die Payoff-Schätzung pro Artikel aa zum Zeitpunkt tt:

pt,a=θxt,a+αxt,aAt1xt,ap_{t,a} = \theta^\top x_{t,a} + \alpha \sqrt{x_{t,a}^\top A_t^{-1} x_{t,a}}

wobei θ\theta die gelernten Nutzerpräferenzen, xt,ax_{t,a} den Kontextvektor des Artikels und α\alpha den Exploration-Trade-off steuert.

Statt des üblichen Sherman-Morrison-Updates für At1A_t^{-1} nutzt das System eine Cholesky-Zerlegung A=LLA = LL^\top. Dies garantiert bei hochfrequenten Online-Updates numerische Stabilität und positive Definitheit der Kovarianzmatrix – Rundungsfehler werden strukturell eliminiert.

Zur Artikelrepräsentation kommen Matryoshka-Embeddings zum Einsatz. Diese erlauben adaptive Dimensionalität: Ein Vektor vRdv \in \mathbb{R}^d kann auf v[:k]v_{[:k]} mit kdk \ll d gekürzt werden, ohne den semantischen Kern zu verlieren – entscheidend für latenzarme Inferenz bei hunderten Kandidaten in Echtzeit.

Die gesamte Bandit-Logik ist in Julia implementiert und über Oxygen.jl als API-Layer in die Web-Infrastruktur eingebunden. Das Frontend in Nuxt 4 folgt einem Brutalist Design-Paradigma: Ein Card-Deck-Format spielt jede Nutzerinteraktion (Swipe/Click) sofort als Reward-Signal zurück in den Banditen.

Real-Time Content Personalization via Contextual Bandits & Matryoshka Embeddings - Bild 1