AI Summarization Backfill 卡住了,持续生成相同的话题

我正在尝试回填过去 90 天的数据。它成功回填了大约 2000 个主题中的 500 个,但现在进度停滞了,因为它在每次作业运行时(每 5 分钟)都会处理同一个主题。不知道为什么——该主题已经有一个有效的摘要,并且在过去 12 天内没有新帖子。AI Audit Logs 表显示每次请求都成功。Sidekiq 状态正常。/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) 是一个新的私募二级基金…… [REDACTED]"
    }
  ],
  "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 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
    -- 字数阈值
    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 个赞

感谢您的关注。为了弄清其影响,这不仅仅是反复重新生成相同摘要的低效率问题——它会完全阻止回填。假设您设置了每小时回填 24 个主题。每 5 分钟,它会尝试处理 2 个主题。最终,这两个主题都会出现问题——被删除的主题或置顶的主题或其他问题——它会每 5 分钟不断重试相同的 2 个主题。它甚至不会尝试处理任何其他主题。

2 个赞

还需要 .where("NOT deleted") 吗?我不明白 hidden 和 deleted 之间的区别,但我的问题主题中既有 hidden 也有 deleted。

嘿 Mark,

我目前正在调查此事,并试图弄清楚发生了什么。@sam 指出的情况属实——best_replies 未包含最后一篇帖子可能会导致作业停滞。我即将完成对此的修复,并引入一个故障保护机制,以便在查询中出现错误时,将作业变成一个空操作并记录错误。这并非理想情况,也不应该发生,但总比一遍又一遍地重新生成相同的摘要要好。

另一方面,我正在查看你分享的 Franklin Lexington... 示例,我怀疑这是另一个问题,因为:

  1. 它已经有一个摘要(149)。
  2. UPPER(ais.content_range) < t.highest_post_number + 1 应该是 FALSEUPPER 应该返回 109,这等于 highest_post_number + 1

content_range 区间的结束值需要更低,作业才会因此停滞。在决定摘要是否过时时,我们并不真正关心隐藏或删除的帖子;我们只想避免对这些帖子进行摘要。
你是否启用了 ai_summary_gists_enabled?如果是,你能确认该主题有两个摘要吗,一个类型为 0,一个类型为 1?另外,在你分享的 ai_api_audit_logs 查询中,feature_name 列的值是什么?

我会及时向你汇报我的发现。

感谢您对此事的关注。当您的修复程序准备就绪时,我很乐意提供错误日志。

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

我不知道如何启用它,所以我不认为它已启用。

“summarize”

这将解除队列阻塞,并使作业更能抵抗此类问题:

更新您的站点后,能否告知我情况如何?

3 个赞

它不再为已有摘要的主题重新生成摘要,这很好。

但是,由于以下原因,它没有总结许多主题,即使有新帖子:

因此,回填认为它已完成,但也许 75% 的最新主题没有摘要,即使它们有新帖子,仅仅因为它们是 90 天前创建的。我相信这不是预期。请更改它或帮助我理解原因。

我分叉了 ai 存储库,以便我可以将 created_at 更改为 updated_at 并继续进行。我很高兴地报告,它成功地总结了我期望它总结的所有 400 多个主题。一些在第一次回填时失败了,可能是因为我们当分钟的配额超了,但它在第二次回填时成功地总结了它们。

特别是,Franklin Lexington 主题现在有了摘要。

同样,由于 created_at 问题,回填目前对其他人来说效果不佳。

1 个赞

是的,我同意,我们需要查看 updated_at 或 last_posted_at,这稍微不那么激进。

归根结底,如果我们进行回填,应该基于内容的更改。

2 个赞

如果差异是编辑,我建议在编辑时重新生成。每个主题的第一个帖子都有一个维基,成员们会对其进行维基编辑,其中包含可能影响摘要的关键信息。

但如果你不这样做,我可以继续运行我的分支。

抱歉这么久没联系。我会尽快找时间来处理这件事。

1 个赞

今天早上合并了此内容:

回填作业现在使用 last_posted_at 而不是 created_at。我还更改了逻辑,通过检查任何帖子的 last_revised_at 是否比摘要新来确定摘要是否已过时,以考虑编辑。

4 个赞

此主题已在 3 天后自动关闭。不再允许回复。