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