Modell / Datensatz
AkaliKong/MiniOneRec avatar
AkaliKong/MiniOneRec

MiniOneRec: generative Empfehlung als dreistufige Pipeline mit SID, SFT und GRPO

Minimal reproduction of OneRec

1.820 Sterne271 ForksPythonApache-2.0
GitHub

Auf einen Blick

Was ist das?
AkaliKong/MiniOneRec ist eine minimale, Apache-2.0-lizenzierte Reproduktion von OneRec. Der Artikel ordnet den Ablauf von der SID-Konstruktion über SFT bis zum GRPO-basierten RL ein und benennt, wo die Dokumentation dünn bleibt.
Für wen ist es gedacht?
MiniOneRec passt zu Teams, die generative Empfehlung auf einem kleinen Maßstab nachvollziehen und den vollständigen Ablauf von SID-Konstruktion über SFT bis RL selbst nachbauen wollen. Wer einen produktionsreifen Recommender mit Service-SLA sucht, ist hier falsch.
Darf ich es kommerziell nutzen?
Ja. Apache-2.0 ist eine freizügige Lizenz: Sie dürfen darauf aufbauende Software nutzen, verändern und verkaufen, solange Sie die Urheberrechts- und Lizenzhinweise beibehalten.
Wird es noch gepflegt?
Ja. Die letzten Commits kamen vor 9 Tagen.
In welcher Sprache ist es geschrieben?
Hauptsächlich Python, laut der Sprachstatistik von GitHub.

Die Antworten beruhen auf den GitHub-Daten des Projekts (zuletzt abgeglichen am 15. September 2026) und auf unserer Analyse. Sie sind keine Rechtsberatung.

TIEFGEHENDE OPEN-SOURCE-ANALYSE

Welches Problem MiniOneRec adressiert und für wen es gedacht ist

Klassische Recommender sagen einen Rang vorher. Generative Empfehlung formuliert dieselbe Aufgabe als Textgenerierung: Das Modell gibt nicht einen Score aus, sondern die nächste Item-Kennung als Tokenfolge. Genau an dieser Stelle setzt MiniOneRec an. Das Projekt beschreibt sich selbst als erste vollständig quelloffene Rahmenumgebung für generative Empfehlung und deckt laut README den Ablauf von der SID-Konstruktion über Supervised Fine-Tuning bis zum empfehlungsorientierten Reinforcement Learning ab. Die Zielgruppe lässt sich aus dem Repository-Aufbau recht klar ableiten. Wer sft.sh, rl.sh und evaluate.sh als Einstiegspunkte liest, erkennt Skripte, die einen kompletten Trainingslauf auf einer Maschine mit mehreren GPUs starten. Das ist Forschungscode, kein Bibliothekspaket. Es gibt keine veröffentlichten Releases, keinen Paketnamen und keine Homepage. Wer MiniOneRec einsetzen will, klont das Repository. Für Ingenieure, die prüfen wollen, ob generative Empfehlung auf ihrem eigenen Katalog funktioniert, ist dieser Zuschnitt sinnvoll: Der Katalog wird in diskrete Codes übersetzt, das Sprachmodell lernt darauf, und die Auswertung liefert HR@K und NDCG@K. Wer dagegen eine fertige Empfehlungs-API oder ein vortrainiertes Modell für einen fremden Katalog sucht, findet hier nur den Bauplan und die Checkpoints des Referenzmodells.

Wie die SID-Konstruktion aus Produkttext diskrete Codes macht

Der erste Schritt ist derjenige, der generative Empfehlung überhaupt erst möglich macht. Das README beschreibt ihn so: Titel und Beschreibung eines Artikels werden zu einem Satz verkettet, dieser Satz läuft durch einen eingefrorenen Text-Encoder, und das resultierende Embedding wird mit einem dreistufigen RQ-VAE quantisiert. Das Ergebnis ist eine SID, eine kurze Folge diskreter Token, die den Artikel im Vokabular des Sprachmodells repräsentiert. Die drei Stufen sind keine willkürliche Wahl. Ein einzelnes Codebuch würde bei großen Katalogen entweder zu grob oder zu groß. Die residuale Quantisierung erlaubt es, die grobe Semantik in der ersten Stufe und feinere Unterschiede in den folgenden Stufen abzulegen. Das Projekt dokumentiert mehrere Varianten dieses Verfahrens, darunter RQ-Kmeans und constrained-RQ-Kmeans, deren Implementierung laut Änderungsprotokoll im November 2025 aktualisiert wurde, sowie RQ-Kmeans+, das auf GPR zurückgeht und nach eigener Angabe die erste offene Reproduktion dieses Verfahrens ist. Für die Text-zu-Embedding-Stufe existiert ein Skript rq/text2emb/amazon_text2emb.py, das seit dem 19. November 2025 eine Multi-GPU-Parallelisierung auf Basis von Accelerate nutzt. Diese Parallelisierung ist ein Hinweis auf die tatsächliche Größenordnung des Problems: Embeddings für einen vollständigen Produktkatalog zu berechnen ist der rechenintensivste Teil der Vorverarbeitung, nicht das Training selbst.

SFT als nächste-Token-Vorhersage mit Sprachausrichtung

Nach der Quantisierung wird die Nutzerhistorie chronologisch als Tokenfolge behandelt. Das Modell lernt per nächste-Token-Vorhersage, die SID des wahrscheinlich nächsten Artikels zu erzeugen. Interessant ist, was das README als zweite Komponente dieses Schritts nennt: Das SFT wird gemeinsam mit Sprachausrichtungszielen trainiert, die zwischen natürlicher Sprache und dem SID-Raum in beide Richtungen abbilden. Die Begründung im Text lautet, dass der Empfehler so Weltwissen aus dem Sprachmodell erbt und gleichzeitig auf diskrete Item-Codes geerdet bleibt. Das ist eine bewusste Designentscheidung mit einem Preis. Ein reines SID-Modell würde nur Codefolgen lernen und dabei die sprachliche Struktur des Basismodells verlieren. Die Ausrichtungsziele halten diese Struktur am Leben, kosten aber Trainingskapazität, die sonst in die Empfehlungsaufgabe fließen würde. Ob sich das rechnet, lässt sich aus dem Material nicht beantworten. Ein Detail aus dem Änderungsprotokoll ist hier wichtiger als es zunächst wirkt: Am 1. Dezember 2025 wurde ein Fehler in data.py behoben, durch den die SID-Item-Ausrichtungsaufgabe die Antworten im Voraus sehen konnte. Der Eintrag erklärt, dies sei auf einen früheren Versuch zurückgegangen, Teil-Trajektorien zur Steuerung der vollständigen SID-Item-Generierung zu nutzen, und habe die Modellleistung nicht beeinflusst. Wer ältere Commits verwendet, sollte das wissen. Seit dem 7. November 2025 gibt es außerdem die Option, die LLM-Parameter im SFT einzufrieren und nur die Embeddings des neu hinzugefügten SID-Vokabulars zu trainieren. Das ist die günstigste Konfiguration im gesamten Repository und für kleine Kataloge der naheliegende Einstieg.

GRPO mit constrained beam search und zwei Reward-Termen

Die dritte Stufe ist empfehlungsorientiertes RL auf Basis von GRPO. Das README beschreibt den Mechanismus konkret: Für jeden Prompt werden mehrere Kandidaten erzeugt, ihre Rewards werden innerhalb der Gruppe normalisiert, um die Gradienten zu stabilisieren, und eine KL-Strafe hält die aktualisierte Policy nahe an der Referenz. Weil der Aktionsraum eine geschlossene Liste von Item-SIDs ist, wechselt das System zu constrained beam search. Diese Einschränkung garantiert nach Angabe des README, dass jeder Beam eindeutig und gültig ist, und verbessert dadurch Sampling-Effizienz und Diversität. Das ist der architektonisch stärkste Teil des Entwurfs. Ein freies Sprachmodell würde einen erheblichen Anteil seiner Generierungen auf nicht existierende Artikel verwenden. Die Einschränkung auf gültige SIDs beseitigt dieses Problem an der Wurzel, statt es nachträglich wegzufiltern. Der Reward selbst kombiniert einen binären Korrektheitsterm mit einer rangbewussten Komponente, die hochwahrscheinliche, aber falsche Artikel stärker bestraft, und kann laut README um Kollaborative-Filtering-Scores erweitert werden. Dass der rangbewusste Term existiert, ist eine Reaktion auf ein bekanntes Problem: Ein rein binärer Reward behandelt den zweitbesten Artikel genauso falsch wie einen völlig unpassenden. Die Datei LogitProcessor.py setzt die eingeschränkte Dekodierung um, minionerec_trainer.py enthält den GRPO-Trainer. Zwei parallele Implementierungen, sft_gpr.py und rl_gpr.py, folgen dem GPR-Ansatz mit Value-Aware Fine-Tuning und Hierarchy Enhanced Policy Optimization, also gewichteter Verlustfunktion auf Basis simulierter Item-Werte.

Inbetriebnahme: Skripte, Konfiguration und ein bekanntes Problem mit Instruct-Checkpoints

Der Einstieg läuft über Shell-Skripte. sft.sh startet das Supervised Fine-Tuning, rl.sh die RL-Phase, evaluate.sh die Offline-Top-K-Auswertung. Die Trainingsschleifen liegen in sft.py und rl.py, die Auswertung in evaluate.py und berechnet HR@K und NDCG@K. Die zugehörigen YAML-Dateien liegen im Verzeichnis configs/. Damit ist der Ablauf klar umrissen, ohne dass man eine API dokumentieren müsste. Der wichtigste praktische Hinweis steht im Ankündigungsblock vom 4. Januar 2026 und betrifft ein Reproduktionsproblem. Wenn die Ergebnisse mit einem Instruct-Modell von den berichteten Metriken abweichen, soll man prüfen, ob die CC-Metrik im Auswertungslog ungleich null ist, nachzulesen in calc.py. Ein Wert ungleich null bedeutet laut Projekt, dass das Modell noch viele ungültige Artikel erzeugt und die eingeschränkte Dekodierung nicht greift. Das Projekt vermutet einen Zusammenhang mit den Versionen von Abhängigkeiten wie der Transformer-Bibliothek und gibt an, die Ursache weiter zu untersuchen. Als Übergangslösung wird empfohlen, statt des Instruct-Modells ein Basismodell wie Qwen2.5-base zu verwenden. Das ist bemerkenswert offen formuliert und für jeden, der den Lauf plant, die erste Prüfung: CC im Log kontrollieren, bevor man irgendeine Zahl aus dem Ergebnis interpretiert. Wer diesen Hinweis überliest, vergleicht möglicherweise zwei Läufe, von denen einer gar nicht eingeschränkt dekodiert hat.

Wo MiniOneRec das falsche Werkzeug ist

Die Grenze des Projekts liegt nicht in der Methode, sondern im Zuschnitt. Es gibt keine veröffentlichten Releases, das Repository wird über den main-Branch verteilt, und das Änderungsprotokoll zeigt eine dichte Folge von Korrekturen an genau den Teilen, die das Ergebnis bestimmen: SID-Konstruktion, Datenpipeline, Dekodierung. Allein im November 2025 wurden drei verschiedene SID-Verfahren aktualisiert und ein Datenleck in data.py behoben. Wer auf einem festen Commit aufsetzt, arbeitet mit einem Stand, der nach Einschätzung der Maintainer selbst überholt sein kann. Der zweite Punkt ist die Abhängigkeit von der Basis. Das Projekt gibt an, das Problem mit der Dekodierung sei vermutlich versionsabhängig und noch nicht universell gelöst. Für einen Produktivbetrieb wäre das ein Ausschlusskriterium, denn die Gültigkeit der Empfehlungen hängt direkt an dieser einen Komponente. Drittens: Der gesamte Ablauf setzt voraus, dass man einen eigenen Katalog quantisiert und ein Sprachmodell darauf feintunt. Für einen Katalog, der sich wöchentlich ändert, bedeutet das eine wiederkehrende Vorverarbeitungskette, deren teuerster Teil laut Repository die Embedding-Berechnung ist. Und schließlich ist MiniOneRec ausdrücklich eine minimale Reproduktion. Wer Skalierungseigenschaften untersuchen will, findet hier den Mechanismus, aber keine Infrastruktur für verteiltes Training über viele Knoten.

Der Unterschied zu klassischen zweistufigen Recommender-Systemen

Die naheliegende Alternative ist das etablierte Muster aus Kandidatengenerierung und anschließendem Ranking. Dort durchsucht ein Retrieval-Modell einen ANN-Index nach ähnlichen Einbettungen, und ein separates Ranking-Modell ordnet die Kandidaten. Der Unterschied liegt nicht in der Genauigkeit, sondern in der Struktur des Fehlers. Ein ANN-Index liefert immer einen Nachbarn, weil die Suche im kontinuierlichen Raum per Konstruktion ein Ergebnis hat. MiniOneRec generiert stattdessen eine Tokenfolge und muss diese durch constrained beam search auf gültige SIDs begrenzen, weil das Modell sonst Artikel erfinden kann, die es nicht gibt. Genau deshalb existiert LogitProcessor.py und genau deshalb ist die CC-Metrik im Log die zentrale Kontrollgröße. Der zweite Unterschied ist die Wissensbasis. Ein zweistufiges System lernt Item-Ähnlichkeit aus Interaktionsdaten. MiniOneRec erbt über die Sprachausrichtungsziele im SFT Weltwissen aus dem Basismodell, was bei dünn besuchten Artikeln ein Vorteil sein kann. Der Preis dafür ist, dass die Qualität an der Wahl des Basismodells hängt. Das Projekt selbst nennt Qwen2.5-base und ein Instruct-Modell als Optionen und dokumentiert, dass die beiden sich unterschiedlich verhalten. Ein zweistufiges System kennt diese Abhängigkeit nicht.

Wartung, Lizenz und was vor dem ersten Lauf zu klären ist

Das Repository steht unter Apache-2.0. Diese Lizenz erlaubt kommerzielle Nutzung und Modifikation, verlangt aber, dass Änderungen kenntlich gemacht und die Lizenzhinweise beibehalten werden. Für abgeleitete Werke, die auf den veröffentlichten Checkpoints aufbauen, ist zusätzlich zu prüfen, unter welchen Bedingungen die Basismodelle selbst stehen, denn MiniOneRec lizenziert nur den eigenen Code. Das ist keine Rechtsberatung, sondern ein Hinweis auf die Stelle, an der man sie einholen sollte. Der Wartungsaufwand ergibt sich aus dem Änderungsprotokoll. Zwischen Ende Oktober 2025 und Mai 2026 gab es unter anderem einen neuen TS-Rec-Codebestand, Unterstützung für den Amazon23-Datensatz, drei überarbeitete SID-Verfahren, eine Accelerate-basierte Parallelisierung der Embedding-Berechnung und die Option, das LLM im SFT einzufrieren. Wer den Code forkt, übernimmt damit eine sich bewegende Grundlage. Ein Upstream-Merge ist bei einer so dichten Änderungsfolge kein Routinevorgang, besonders wenn man die SID-Konstruktion für einen eigenen Katalog angepasst hat. Konkret zu prüfen sind vor dem ersten Lauf drei Dinge: ob die CC-Metrik im Auswertungslog bei null bleibt, welche SID-Variante aus configs/ für den eigenen Katalog passt, und ob der gewählte Commit nach dem data.py-Fix vom 1. Dezember 2025 liegt.

Redaktionelles Fazit

MiniOneRec passt zu Teams, die generative Empfehlung auf einem kleinen Maßstab nachvollziehen und den vollständigen Ablauf von SID-Konstruktion über SFT bis RL selbst nachbauen wollen. Wer einen produktionsreifen Recommender mit Service-SLA sucht, ist hier falsch. Vor dem ersten Lauf sollte man prüfen, ob das Instruct-Checkpoint die in calc.py geloggte CC-Metrik bei null hält, und andernfalls auf ein Basismodell wie Qwen2.5-base wechseln.

Offizielle Quellen

  1. AkaliKong/MiniOneRec on GitHub
  2. Issues
  3. License: Apache-2.0
  4. README
Community-Notizen

Community-Notizen