AI要約バックフィルが停止し、同じトピックを再生成し続けています

最後の90日間のバックフィルを試みています。2000件中約500件は正常にバックフィルされましたが、ジョブが実行されるたびに(5分ごと)同じトピックが処理され続けるため、進行が停滞しています。理由が全くわかりません。トピックにはすでに有効な要約があり、過去12日間で新しい投稿はありません。AI監査ログテーブルには、各リクエストが成功したと表示されています。Sidekiqの状態はOKです。/logsに該当する情報はありません。デバッグ方法を教えてください。

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

すべての生のレスポンスペイロードは有効に見えます。それぞれが予想通りわずかに異なります。例を以下に示します(コンテンツテキストのほとんどは編集済みです)。


{
  "id": "msg_016C2dHZik2Miwe16pRHFe9z",
  "type": "message",
  "role": "assistant",
  "model": "claude-3-5-sonnet-20241022",
  "content": [
    {
      "type": "text",
      "text": "Franklin Lexington Private Markets Fund (FLEX) は、新しいプライベートエクイティセカンダリーファンドです... [編集済み]"
    }
  ],
  "stop_reason": "end_turn",
  "stop_sequence": null,
  "usage": {
    "input_tokens": 13848,
    "cache_creation_input_tokens": 0,
    "cache_read_input_tokens": 0,
    "output_tokens": 416
  }
}

これが手がかりなのか分かりませんが、103という数字は、103番目の投稿までしか要約されていないと考えており、投稿が108件あるため、新しい要約が必要だということでしょうか?

SQLヘルパーによって生成されたクエリ:

-- [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
    -- 単語数閾値
    t.word_count >= :min_word_count
    -- 年齢制限
    AND t.updated_at > CURRENT_TIMESTAMP - (:max_age_days || ' DAYS')::INTERVAL
    -- 要約が存在しないか、または要約を更新する必要がある
    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

このトピックには5件の非表示または削除された投稿があります。108-103=5です。非表示および削除された投稿を正しく処理していない可能性はありますか?はい、108が最も高い投稿ですが、103しか渡されないため、常に5件の新しい投稿を要約する必要があると認識し続けています。

@Falco @sam

「いいね!」 1

要約が再生成され続ける別のトピックがあります。そのトピックには非表示または削除された投稿はありませんが、ピン留めされているため、「このトピックはグローバルにピン留めされました…」という投稿が作成されます。したがって、投稿の最大数は 8 ですが、最後の投稿は実際には渡されないのでしょうか?

ええ、@Roman さん、あなたは何か掴んでいると思います。

best_replies には、トピックの最後の公開投稿が含まれるとは限りません。best_replies を選択する場合でも、最後の投稿を無条件に追加する必要があります。

「いいね!」 1

ご確認ありがとうございます。影響を明確にするために申し上げますと、同じ要約を繰り返し生成することによる非効率性だけではありません。バックフィルが完全に停止します。たとえば、バックフィルが1時間あたり24トピックに設定されているとします。5分ごとに2つのトピックを試します。最終的に、両方のトピックで問題が発生します(トピックが削除されたり、トピックがピン留めされたりするなど)。そして、5分ごとに同じ2つのトピックを再試行し続けます。他のトピックは一切試行されません。

「いいね!」 2

.where("NOT deleted") も必要ですか? hidden と deleted の違いがわかりませんが、問題のトピックには hidden と deleted の両方があります。

マークさん、

現在調査中で、何が起こっているのか解明しようとしています。@sam が指摘したように、best_replies に最後の投稿が含まれていないと、ジョブが停止する可能性があります。その修正をもうすぐ完了し、クエリにバグがあった場合にジョブを no-op にしてエラーをログに記録するためのフェイルセーフを導入する予定です。これは理想的ではありませんし、起こるべきではありませんが、同じ要約を何度も再生成するよりはましです。

一方で、共有していただいた「Franklin Lexington…」の例を見ていますが、これは別の問題だと疑っています。なぜなら:

  1. すでに要約(149)が存在します。
  2. UPPER(ais.content_range) < t.highest_post_number + 1FALSE になるはずです。UPPERhighest_post_number + 1 と等しい 109 を返すはずです。

そのジョブがそのせいで停止するには、content_range 区間の終わりがもっと低くなければなりません。要約が古いかどうかを判断する際に、非表示または削除された投稿は気にしません。要約を避けることだけが目的です。
ai_summary_gists_enabled は有効になっていますか?もしそうであれば、そのトピックについて、type が 0 の要約と type が 1 の要約の 2 つがあることを確認していただけますか?また、共有していただいた ai_api_audit_logs クエリで、feature_name 列の値は何ですか?

見つかったことは随時報告します。

ご確認いただきありがとうございます。修正の準備ができましたら、エラーログを提供させていただきます。

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

有効にする方法がわからないため、有効になっていないと思います。

“summarize”

これにより、キューのブロックが解除され、この種の問題に対するジョブの耐性が向上します。

サイトを更新した後、状況がどうなったか教えていただけますか?

「いいね!」 3

要約が既に存在していたトピックの要約を再生成しなくなりました。これは良いことです。

しかし、新しい投稿があっても多くのトピックが要約されていません。原因は以下の通りです。

そのため、バックフィルは完了したと考えていますが、新しい投稿があっても、偶然90日以上前に作成されたという理由だけで、最新のトピックの約75%に要約がありません。これは意図したものではないはずです。変更するか、理由を説明してください。

ai リポジトリをフォークして created_atupdated_at に変更し、作業を進めることができました。期待通り 400 件以上のトピックをすべて要約することに成功したことをご報告いたします。最初のバックフィルパスで失敗したものもありましたが、それはおそらくその分のクォータを超えていたためだと思われますが、2 回目のパスで正常に要約されました。

特に、Franklin Lexington のトピックに要約が追加されました。

繰り返しになりますが、created_at の問題により、バックフィルはまだ他の人にはうまく機能しないでしょう。

「いいね!」 1

ええ、同意します。updated_atまたはlast_posted_atを調べる必要があります。これは少し穏健な方法です。

結局のところ、バックフィリングを行う場合は、コンテンツの変更に基づいて行うべきです。

「いいね!」 2

差分が編集によるものであれば、編集時に再生成することに賛成します。各トピックの最初の投稿にはウィキがあり、メンバーが要約に影響を与える可能性のある重要な情報をウィキ編集しています。

しかし、そうしない場合は、私のフォークを実行し続けることができます。

申し訳ありません、ご無沙汰しております。近いうちにこの件に取り組む時間を確保するようにいたします。

「いいね!」 1

今朝、これがマージされました。

バックフィルジョブは、created_at の代わりに last_posted_at を使用するようになりました。また、要約が古いかどうかを判断するロジックを変更し、要約よりも新しい last_revised_at を持つ投稿があるかどうかを確認することで、編集を考慮するようにしました。

「いいね!」 4

このトピックは3日後に自動的に閉じられました。返信はもう許可されていません。