最後の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 ですが、最後の投稿は実際には渡されないのでしょうか?
sam
(Sam Saffron)
2025 年 1 月 14 日午後 11:42
5
ええ、@Roman さん、あなたは何か掴んでいると思います。
best_replies には、トピックの最後の公開投稿が含まれるとは限りません。best_replies を選択する場合でも、最後の投稿を無条件に追加する必要があります。
「いいね!」 1
ご確認ありがとうございます。影響を明確にするために申し上げますと、同じ要約を繰り返し生成することによる非効率性だけではありません。バックフィルが完全に停止します。たとえば、バックフィルが1時間あたり24トピックに設定されているとします。5分ごとに2つのトピックを試します。最終的に、両方のトピックで問題が発生します(トピックが削除されたり、トピックがピン留めされたりするなど)。そして、5分ごとに同じ2つのトピックを再試行し続けます。他のトピックは一切試行されません。
「いいね!」 2
Sam Saffron:
.where("NOT hidden")
.where("NOT deleted") も必要ですか? hidden と deleted の違いがわかりませんが、問題のトピックには hidden と deleted の両方があります。
Roman
(Roman Rizzi)
2025 年 1 月 15 日午後 3:30
9
マークさん、
現在調査中で、何が起こっているのか解明しようとしています。@sam が指摘したように、best_replies に最後の投稿が含まれていないと、ジョブが停止する可能性があります。その修正をもうすぐ完了し、クエリにバグがあった場合にジョブを no-op にしてエラーをログに記録するためのフェイルセーフを導入する予定です。これは理想的ではありませんし、起こるべきではありませんが、同じ要約を何度も再生成するよりはましです。
一方で、共有していただいた「Franklin Lexington…」の例を見ていますが、これは別の問題だと疑っています。なぜなら:
すでに要約(149)が存在します。
UPPER(ais.content_range) < t.highest_post_number + 1 は FALSE になるはずです。UPPER は highest_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
有効にする方法がわからないため、有効になっていないと思います。
Roman Rizzi:
feature_name 列の値は何ですか?
“summarize”
Roman
(Roman Rizzi)
2025 年 1 月 16 日午後 3:46
11
これにより、キューのブロックが解除され、この種の問題に対するジョブの耐性が向上します。
main ← summary_backfill_resilience
opened 07:55PM - 15 Jan 25 UTC
To quickly select backfill candidates without comparing SHAs, we compare the las… t summarized post to the topic's highest_post_number. However, hiding or deleting a post and adding a small action will update this column, causing the job to stall and re-generate the same summary repeatedly until someone posts a regular reply. On top of this, this is not always true for topics with `best_replies`, as this last reply isn't necessarily included.
Since this is not evident at first glance and each summarization strategy picks its targets differently, I'm opting to simplify the backfill logic and how we track potential candidates.
The first step is dropping `content_range`, which serves no purpose and it's there because summary caching was supposed to work differently at the beginning. So instead, I'm replacing it with a column called `highest_target_number`, which tracks `highest_post_number` for topics and could track other things like channel's `message_count` in the future.
Now that we have this column when selecting every potential backfill candidate, we'll check if the summary is truly outdated by comparing the SHAs, and if it's not, we just update the column and move on
サイトを更新した後、状況がどうなったか教えていただけますか?
「いいね!」 3
要約が既に存在していたトピックの要約を再生成しなくなりました。これは良いことです。
しかし、新しい投稿があっても多くのトピックが要約されていません。原因は以下の通りです。
Found the problem. It’s comparing ai summary backfill topic max age days to topic.created_at, not updated_at. I think this should be changed to updated_at- I have many very active topics created two years ago which still get new posts every week, but if I use a max age of 90 days or even a year, those topics will not get summarized.
Please consider changing this.
.where("topics.created_at > current_timestamp - INTERVAL '#{max_age_days.to_i} DAY'")
そのため、バックフィルは完了したと考えていますが、新しい投稿があっても、偶然90日以上前に作成されたという理由だけで 、最新のトピックの約75%に要約がありません。これは意図したものではないはずです。変更するか、理由を説明してください。
ai リポジトリをフォークして created_at を updated_at に変更し、作業を進めることができました。期待通り 400 件以上のトピックをすべて要約することに成功したことをご報告いたします。最初のバックフィルパスで失敗したものもありましたが、それはおそらくその分のクォータを超えていたためだと思われますが、2 回目のパスで正常に要約されました。
特に、Franklin Lexington のトピックに要約が追加されました。
繰り返しになりますが、created_at の問題により、バックフィルはまだ他の人にはうまく機能しないでしょう。
「いいね!」 1
sam
(Sam Saffron)
2025 年 1 月 20 日午前 4:30
15
ええ、同意します。updated_atまたはlast_posted_atを調べる必要があります。これは少し穏健な方法です。
結局のところ、バックフィリングを行う場合は、コンテンツの変更に基づいて行うべきです。
「いいね!」 2
差分が編集によるものであれば、編集時に再生成することに賛成します。各トピックの最初の投稿にはウィキがあり、メンバーが要約に影響を与える可能性のある重要な情報をウィキ編集しています。
しかし、そうしない場合は、私のフォークを実行し続けることができます。
Roman
(Roman Rizzi)
2025 年 1 月 22 日午後 6:05
17
申し訳ありません、ご無沙汰しております。近いうちにこの件に取り組む時間を確保するようにいたします。
「いいね!」 1
Roman
(Roman Rizzi)
2025 年 2 月 4 日午後 2:51
18
今朝、これがマージされました。
main ← summarization_outdated_logic
opened 08:20PM - 03 Feb 25 UTC
Before this change, a summary was only outdated when new content appeared, for t… opics with "best replies", when the query returned different results. The intent behind this change is to detect when a summary is outdated as a result of an edit.
Additionally, we are changing the backfill candidates query to compare "ai_summary_backfill_topic_max_age_days" against "last_posted_at" instead of "created_at", to catch long-lived, active topics. This was discussed here: https://meta.discourse.org/t/ai-summarization-backfill-is-stuck-keeps-regenerating-the-same-topic/347088/14?u=roman_rizzi
バックフィルジョブは、created_at の代わりに last_posted_at を使用するようになりました。また、要約が古いかどうかを判断するロジックを変更し、要約よりも新しい last_revised_at を持つ投稿があるかどうかを確認することで、編集を考慮するようにしました。
「いいね!」 4
Falco
(Falco)
クローズされました:
2025 年 2 月 8 日午前 11:00
19
このトピックは3日後に自動的に閉じられました。返信はもう許可されていません。