diff --git a/lib/retrieval.rb b/lib/retrieval.rb index 6b2e6ff..6ffe757 100644 --- a/lib/retrieval.rb +++ b/lib/retrieval.rb @@ -281,8 +281,13 @@ module DepiedencapAiCitations def self.effective_question(post) return "" if post.blank? - latest = post.raw.to_s.gsub(/<[^>]+>/, " ").squish - condense_query(latest, history_for(post)) + # Mémoïsé par post : PlaygroundHook (génération) puis Sanitizer (for_post + # + suggested_category) appellent tous effective_question — un seul appel + # de condensation par message utilisateur au lieu de trois. + Discourse.cache.fetch("dpec_effq:#{post.id}", expires_in: CACHE_TTL) do + latest = post.raw.to_s.gsub(/<[^>]+>/, " ").squish + condense_query(latest, history_for(post)) + end end def self.history_for(post) @@ -303,8 +308,8 @@ module DepiedencapAiCitations # Réécrit le dernier message en requête autonome à partir de l'historique # (ex. "Ok, box calf goodyear" après "mes Carmina" → "entretien Carmina - # box calf Goodyear"). Modèle dédié léger (pas Qwen 30B : pas de mode - # thinking à gérer, latence courte) — indispo/erreur → dernier message tel quel. + # box calf Goodyear"). Même LLM que la génération (qwen3:30b MoE, rapide + # à ~3B actifs, think:false forcé) — indispo/erreur → dernier message tel quel. def self.condense_query(latest, history) return latest if history.blank? diff --git a/lib/sanitizer.rb b/lib/sanitizer.rb index f8fc6cb..610605f 100644 --- a/lib/sanitizer.rb +++ b/lib/sanitizer.rb @@ -25,8 +25,13 @@ module DepiedencapAiCitations return if post.custom_fields["depiedencap_ai_citations"] == "t" - question = user_question(post) user_post = originating_user_post(post) + # La suggestion de catégorie doit voir la requête reformulée (qui porte + # l'intention, ex. « entretenir »), pas le dernier message brut — + # sinon un tour de suivi (« ok, box calf goodyear ») suggère la mauvaise + # catégorie. effective_question est mémoïsé par post : pas d'appel en plus. + question = + user_post ? Retrieval.effective_question(user_post) : user_question(post) # Mêmes reformulation/cache que ce que le LLM a vu (PlaygroundHook) : sans # ça, la question réécrite par condense_query pour la génération et la # question brute utilisée ici pour les citations divergeraient.