Le backfill de la synthèse AI est bloqué, il régénère constamment le même sujet

J’essaie de rattraper les 90 derniers jours. J’ai réussi à rattraper environ 500 sujets sur 2000, mais la progression est maintenant bloquée car le même sujet est traité à chaque exécution du travail (toutes les 5 minutes). Je ne sais pas pourquoi : le sujet a déjà un résumé valide et n’a pas de nouveaux messages depuis 12 jours. La table AI Audit Logs montre que chaque requête est réussie. Le statut de Sidekiq est OK. Rien de pertinent dans /logs. Comment déboguer cela ?

SELECT request_tokens,
       response_tokens,
       raw_response_payload,
       topic_id,
       created_at AS summary_created_at,
       language_model
FROM ai_api_audit_logs
WHERE raw_request_payload LIKE '%Franklin Lexington%'
ORDER BY created_at DESC
LIMIT 40

Tous les payloads de réponse bruts semblent valides. Chacun est légèrement différent comme prévu. Voici un exemple (j’ai masqué la majeure partie du contenu textuel) :


{
  "id": "msg_016C2dHZik2Miwe16pRHFe9z",
  "type": "message",
  "role": "assistant",
  "model": "claude-3-5-sonnet-20241022",
  "content": [
    {
      "type": "text",
      "text": "Le Franklin Lexington Private Markets Fund (FLEX) est un nouveau fonds de second marché de capital-investissement... [MASQUÉ]"
    }
  ],
  "stop_reason": "end_turn",
  "stop_sequence": null,
  "usage": {
    "input_tokens": 13848,
    "cache_creation_input_tokens": 0,
    "cache_read_input_tokens": 0,
    "output_tokens": 416
  }
}

Je ne sais pas si c’est un indice, mais est-ce que 103 signifie qu’il pense n’avoir résumé que jusqu’au message 103, et qu’il y a 108 messages, donc il a besoin d’un nouveau résumé ?

Requête générée par SQL Helper :

-- [params]
-- integer :summary_type = 0
-- integer :max_age_days = 30
-- integer :min_word_count = 100

WITH topic_candidates AS (
  SELECT 
    t.id as topic_id,
    t.title,
    t.created_at,
    t.word_count,
    t.highest_post_number,
    t.last_posted_at,
    ais.id as summary_id,
    ais.content_range,
    ais.created_at as summary_created_at,
    UPPER(ais.content_range) as content_range_upper
  FROM topics t
  LEFT OUTER JOIN ai_summaries ais ON 
    t.id = ais.target_id AND
    ais.target_type = 'Topic' AND
    ais.summary_type = :summary_type
  WHERE 
    -- Word count threshold
    t.word_count >= :min_word_count
    -- Age restriction
    AND t.updated_at > CURRENT_TIMESTAMP - (:max_age_days || ' DAYS')::INTERVAL
    -- Either no summary exists OR summary needs updating
    AND (
      ais.id IS NULL OR 
      (
        UPPER(ais.content_range) < t.highest_post_number + 1
        AND ais.created_at < (CURRENT_TIMESTAMP - INTERVAL '5 minutes')
      )
    )
)
SELECT 
  topic_id,
  title,
  word_count,
  highest_post_number,
  created_at,
  last_posted_at,
  summary_id,
  content_range,
  summary_created_at,
  content_range_upper
FROM topic_candidates
ORDER BY summary_created_at DESC NULLS FIRST, last_posted_at DESC
1 « J'aime »

Il y a 5 messages cachés ou supprimés dans ce sujet. 108-103=5. Est-il possible que cela ne gère pas correctement les messages cachés et supprimés ? Oui, 108 est le message le plus élevé, mais seulement 103 sont jamais transmis, il pense donc continuellement qu’il y a 5 nouveaux messages à résumer.

@Falco @sam

1 « J'aime »

J’ai un autre sujet qui continue également de régénérer le résumé. Ce sujet n’a pas de messages cachés ou supprimés, mais il est épinglé, ce qui crée un message “ce sujet a été épinglé globalement…”. Donc, le message maximum est de 8, mais ce dernier message n’est pas vraiment transmis ?

Oui, je pense que tu es sur la bonne voie, @Roman

best_replies n’est pas garanti d’inclure le dernier message public d’un sujet. Nous devrions ajouter le dernier message inconditionnellement, même lors de la sélection de best_replies.

1 « J'aime »

Merci d’avoir examiné la question. Et pour clarifier l’impact, il ne s’agit pas seulement de l’inefficacité de la régénération du même résumé à plusieurs reprises, cela arrête complètement le remplissage. Supposons que vous ayez défini le remplissage sur 24 sujets par heure. Toutes les 5 minutes, il essaie 2 sujets. Finalement, les deux sujets rencontrent un problème - sujets supprimés ou sujet épinglé ou autre chose - et il continue de réessayer les mêmes 2 sujets toutes les 5 minutes. Il n’essaie même pas d’autres sujets.

2 « J'aime »

Doit-il aussi avoir .where("NOT deleted") ? Je ne comprends pas la différence entre caché et supprimé, mais j’ai à la fois des éléments cachés et supprimés dans mon sujet problématique.

Salut Mark,

Je suis actuellement en train d’examiner la situation et d’essayer de comprendre ce qui se passe. Ce que @sam a souligné est vrai : le fait que best_replies n’inclue pas le dernier message pourrait entraîner le blocage du job. Je suis sur le point de terminer une correction pour cela et d’introduire une mesure de sécurité pour transformer le job en une opération nulle et enregistrer une erreur s’il y a un bug dans la requête. Ce n’est pas idéal et cela ne devrait pas arriver, mais c’est mieux que de régénérer le même résumé encore et encore.

D’un autre côté, j’examine l’exemple Franklin Lexington... que vous avez partagé, qui, je le soupçonne, est un problème différent car :

  1. Il a déjà un résumé (149).
  2. UPPER(ais.content_range) < t.highest_post_number + 1 devrait être FALSE. UPPER devrait retourner 109, ce qui est égal à highest_post_number + 1.

La fin de l’intervalle content_range devrait être plus basse pour que le job soit bloqué à cause de cela. Nous ne nous soucions pas vraiment des messages cachés ou supprimés pour décider si un résumé est obsolète ; nous voulons seulement éviter de résumer ceux-là.
Avez-vous activé ai_summary_gists_enabled ? Si oui, pouvez-vous confirmer que vous avez deux résumés pour ce sujet, un de type 0 et un de type 1 ? De plus, dans la requête ai_api_audit_logs que vous avez partagée, quelle est la valeur dans la colonne feature_name ?

Je vous tiendrai au courant de mes découvertes.

Merci d’avoir examiné cela. Je serai heureux de fournir les journaux d’erreurs lorsque votre correctif sera prêt.

https://meta.discourse.org/t/summarize-gists/340269/3

Je ne vois pas comment l’activer, donc je ne pense pas qu’il soit activé.

« summarize »

Cela permettra de débloquer la file d’attente et de rendre le travail plus résistant à ce type de problèmes :

Pourriez-vous s’il vous plaît me faire savoir comment les choses se présentent après la mise à jour de votre site ?

3 « J'aime »

Il ne régénère plus les résumés pour les sujets qui en avaient déjà un, ce qui est une bonne chose.

Cependant, il ne résume pas de nombreux sujets, même lorsqu’il y a de nouveaux messages, à cause de :

Ainsi, le remplissage pense qu’il a terminé, mais peut-être que 75 % des sujets les plus récents n’ont pas de résumé, même s’ils ont de nouveaux messages, simplement parce qu’ils ont été créés il y a plus de 90 jours. Je suis sûr que ce n’est pas l’intention. Veuillez le changer ou m’aider à comprendre pourquoi.

J’ai forké le dépôt d’IA afin de pouvoir changer created_at en updated_at et avancer. Je suis heureux de signaler que cela a réussi à résumer les plus de 400 sujets que je m’attendais à ce qu’il résume. Certains ont échoué lors de la première passe de remplissage, peut-être parce que nous étions hors quota pour cette minute, mais cela a réussi à les résumer lors de la seconde passe.

En particulier, le sujet Franklin Lexington a maintenant un résumé.

Encore une fois, le remplissage ne fonctionnera pas bien pour les autres pour le moment, en raison du problème created_at.

1 « J'aime »

Oui, je suis d’accord, nous devons examiner updated_at ou last_posted_at, ce qui est légèrement moins radical.

En fin de compte, si nous effectuons un remplissage a posteriori, nous devrions le baser sur la modification du contenu.

2 « J'aime »

Si la différence concerne les modifications, je voterais pour régénérer lors des modifications. Nous avons un wiki comme premier message de chaque sujet que les membres modifient par wiki avec des informations critiques qui pourraient affecter le résumé.

Mais si vous choisissez de ne pas le faire, je peux continuer à exécuter ma version.

Désolé pour le silence radio. J’essaierai de trouver du temps pour travailler dessus bientôt.

1 « J'aime »

Ceci a été fusionné ce matin :

Le travail de remplissage utilise maintenant last_posted_at au lieu de created_at. J’ai également modifié la logique pour déterminer si un résumé est obsolète en vérifiant si le last_revised_at d’un des messages est plus récent que le résumé, afin de prendre en compte les modifications.

4 « J'aime »

Ce sujet a été automatiquement fermé après 3 jours. De nouvelles réponses ne sont plus autorisées.