Gorse 0.5.x Migration de Configuration depuis 0.4
Problème
Gorse 0.5 a introduit des changements de configuration incompatibles avec 0.4. Les anciennes sections de configuration sont silencieusement ignorées (pas d'erreur, pas d'avertissement), ce qui donne l'impression que des fonctionnalités comme le filtrage collaboratif, les tendances et les voisins d'articles sont configurées alors qu'elles sont en réalité désactivées.
Le problème le plus critique : [recommend.collaborative] utilise par défaut type = "none" dans 0.5, ce qui signifie que le filtrage collaboratif est silencieusement désactivé à moins que vous ne définissiez explicitement type = "mf".
Contexte / Conditions de Déclenchement
- Gorse 0.5.x est déployé mais les recommandations semblent aléatoires ou de mauvaise qualité
- Le filtrage collaboratif ne semble pas fonctionner malgré une configuration ayant
[recommend.collaborative] - La configuration contient d'anciennes sections 0.4 :
[recommend.popular],[recommend.neighbors],[recommend.online],[recommend.offline] - Mise à niveau de Gorse 0.4 vers 0.5
- Gorse master démarre correctement mais les anciennes fonctionnalités de configuration ne prennent pas effet
Solution
Sections 0.4 Supprimées (silencieusement ignorées dans 0.5)
| Section 0.4 | Remplacement 0.5 |
|---|---|
[recommend.popular] |
[[recommend.non-personalized]] (tableau TOML de tables) |
[recommend.neighbors] |
[[recommend.item-to-item]] + [[recommend.user-to-user]] |
[recommend.online] (explore/exploit) |
[recommend.ranker] (FM ou basé LLM) |
[recommend.offline] |
Cache [recommend.ranker] cache_expire + [recommend.fallback] |
Clés 0.4 Supprimées (n'existent pas dans 0.5)
enable_item_neighbor_indexenable_user_neighbor_indexitem_neighbor_typeneighbor_typeexplore_recommendpopular_window
Correctif Critique : Activer le Filtrage Collaboratif
# Style 0.4 (CASSÉ dans 0.5 — CF silencieusement désactivé) :
[recommend.collaborative]
fit_period = "60m"
fit_epoch = 100
# Style 0.5 (FONCTIONNE — doit ajouter type = "mf") :
[recommend.collaborative]
type = "mf"
fit_period = "60m"
fit_epoch = 100
Modèle de Configuration Complet 0.5
[recommend]
cache_size = 100
cache_expire = "72h"
context_size = 100
[recommend.data_source]
positive_feedback_types = ["reaction", "comment", "repost"]
read_feedback_types = ["view"]
positive_feedback_ttl = 0
item_ttl = 0
# Filtrage collaboratif — DOIT définir type = "mf" pour activer
[recommend.collaborative]
type = "mf"
fit_period = "60m"
fit_epoch = 100
optimize_period = "360m"
optimize_trials = 10
[recommend.collaborative.early_stopping]
patience = 10
# Tendances/populaire — syntaxe tableau TOML [[...]] pour plusieurs classements
[[recommend.non-personalized]]
name = "trending_weekly"
score = "count(feedback, .FeedbackType == 'reaction') + count(feedback, .FeedbackType == 'comment') * 2"
filter = "(now() - item.Timestamp).Hours() < 168"
# Similarité d'articles basée sur le contenu (nécessite des Labels sur les articles)
[[recommend.item-to-item]]
name = "similar_content"
type = "tags" # correspond aux Labels d'articles
# Similarité d'articles collaborative
[[recommend.item-to-item]]
name = "also_liked"
type = "users" # les utilisateurs qui ont aimé X ont aussi aimé Y
# Similarité d'utilisateurs
[[recommend.user-to-user]]
name = "similar_users"
type = "items" # les utilisateurs qui partagent des articles aimés
# Ranker FM fusionne toutes les sources de candidats
[recommend.ranker]
type = "fm" # ou "llm" pour reclassement basé LLM
recommenders = ["latest", "collaborative", "non-personalized/trending_weekly", "item-to-item/similar_content", "item-to-item/also_liked", "user-to-user/similar_users"]
fit_period = "60m"
fit_epoch = 100
[recommend.ranker.early_stopping]
patience = 10
[recommend.fallback]
recommenders = ["latest"]
[recommend.replacement]
enable_replacement = true
positive_replacement_decay = 0.8
read_replacement_decay = 0.6
Principales Différences de Configuration 0.5
-
[[recommend.non-personalized]]utilise le langage Expr pour les fonctions de score/filtre- Disponible :
count(feedback, .FeedbackType == 'X'),item.Timestamp,now() - Filtre :
(now() - item.Timestamp).Hours() < N
- Disponible :
-
[[recommend.item-to-item]]types :"tags"(similarité de labels),"users"(collaborative),"embedding" -
[[recommend.user-to-user]]types :"items"(articles partagés),"tags","embedding" -
[recommend.ranker]types :"none","fm"(machines à factorisation),"llm"- La liste
recommendersutilise le format"category/name"pour référencer des recommandeurs spécifiques
- La liste
-
Types de feedback personnalisés : Toute chaîne est valide dans
positive_feedback_types(p. ex."extended_view","bookmark")
Vérification
Après la mise à jour de la configuration :
- Redémarrez Gorse master et vérifiez les logs pour les erreurs d'analyse de configuration
- Visitez le tableau de bord Gorse (port 8088) — les nouveaux recommandeurs devraient apparaître
- Vérifiez l'endpoint
/api/dashboard/configpour confirmer que la configuration a été acceptée - Après fit_period (60m par défaut), vérifiez que l'entraînement du modèle s'exécute dans les logs worker
Remarques
- Gorse 0.5 n'avertit PAS des clés de configuration non reconnues — elles sont silencieusement ignorées
- La syntaxe
[[double.bracket]]est un tableau TOML de tables — permet plusieurs entrées - La syntaxe
[single.bracket]est une table régulière — une seule autorisée [recommend.ranker].recommendersdoit référencer les recommandeurs par leur chemin"category/name"- Les types de feedback personnalisés sont supportés — Gorse ne valide pas les noms de types de feedback
Références
- Modèle de configuration Gorse 0.5 : https://github.com/gorse-io/gorse (branche master config)
- Documentation Gorse : https://gorse.io/docs/config