AI 요약 백필이 멈춰 있어 같은 주제만 계속 재생성됩니다

최근 90일치를 백필(backfill)하는 중입니다. 2000개 주제 중 약 500개는 성공적으로 백필되었지만, 지금은 작업이 매 5분마다 실행될 때마다 동일한 주제를 계속 처리하면서 진행이 멈춰 있습니다. 왜 그런지 전혀 모르겠어요 - 해당 주제에는 이미 유효한 요약이 있고, 지난 12일 동안 새로운 게시글도 없습니다. AI 감사 로그(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

모든 raw response payload가 유효해 보입니다. 예상대로 각 응답은 약간씩 다릅니다. 다음은 예시입니다(대부분의 콘텐츠 텍스트는 삭제했습니다):


{
  "id": "msg_016C2dHZik2Miwe16pRHFe9z",
  "type": "message",
  "role": "assistant",
  "model": "claude-3-5-sonnet-20241022",
  "content": [
    {
      "type": "text",
      "text": "The Franklin Lexington Private Markets Fund (FLEX) is a new private equity secondaries fund... [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이라는 숫자는 108개의 게시물 중 103번째 게시물까지 요약했다는 의미이며, 따라서 새로운 요약이 필요하다는 뜻일까요?

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개의 좋아요

이 주제에는 숨겨지거나 삭제된 게시물이 5개 있습니다. 108-103=5. 숨겨진 및 삭제된 게시물을 올바르게 처리하지 못하고 있는 것은 아닌가요? 네, 108이 가장 높은 게시물 번호이지만 실제로는 103개만 전달되므로, 시스템은 항상 5개의 새 게시물이 요약되어야 한다고 생각합니다.

@Falco @sam

1개의 좋아요

요약이 계속 재생성되는 또 다른 주제가 있습니다. 이 주제에는 숨겨지거나 삭제된 게시물이 없지만, 고정되어 있어서 "이 주제가 전역으로 고정되었습니다…"라는 게시물이 생성됩니다. 그래서 최대 게시물이 8개인데, 그 마지막 게시물이 실제로는 전달되지 않는 것 같습니다.

네, @Roman 님 말씀이 맞는 것 같습니다.

best_replies에는 토픽의 마지막 공개 게시물이 반드시 포함되지 않습니다. best_replies를 선택할 때에도 마지막 게시물은 무조건 추가해야 합니다.

1개의 좋아요

확인해 주셔서 감사합니다. 그리고 영향을 명확히 하기 위해 말씀드리면, 동일한 요약을 반복적으로 재생성하는 비효율성 문제만이 아닙니다. 백필(backfill)이 완전히 중단됩니다. 예를 들어 시간당 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가 활성화되어 있나요? 그렇다면 해당 주제에 타입이 0인 요약과 타입이 1인 요약이 각각 하나씩 존재하는지 확인해 주실 수 있나요? 또한, 공유해 주신 ai_api_audit_logs 쿼리에서 feature_name 열의 값은 무엇인가요?

조사 결과를 알게 되는 대로 업데이트해 드리겠습니다.

확인해 주셔서 감사합니다. 수정이 완료되면 오류 로그를 제공할 수 있습니다.

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

활성화하는 방법을 찾지 못해서, 활성화되어 있지 않은 것 같습니다.

“summarize”

이로써 큐가 해제되고 이러한 유형의 문제에 대한 작업의 내결함성이 향상됩니다:

사이트를 업데이트한 후 상황이 어떻게 보이는지 알려주실 수 있을까요?

3개의 좋아요

이미 요약이 있는 주제에 대해서는 더 이상 요약을 재생성하지 않으므로, 그 부분은 좋습니다.

하지만 새로운 게시글이 있는 주제 중 많은 수가 아래 이유로 요약되지 않고 있습니다:

즉, 백필(backfill)은 작업을 완료했다고 생각하지만, 최신(Latest) 주제 중 약 75%는 새로운 게시글이 있음에도 불구하고 단순히 90일 전에 생성되었기 때문에 요약이 없습니다. 이것이 의도된 동작이라고는 생각되지 않습니다. 수정해 주시거나, 왜 그런지 이해할 수 있도록 도와주세요.

저는 created_atupdated_at으로 변경하고 진행할 수 있도록 ai 저장소를 포크했습니다. 예상했던 400개 이상의 모든 주제를 성공적으로 요약했다는 소식을 기쁘게 전해 드립니다. 첫 번째 백필(backfill) 단계에서 일부가 실패했는데, 이는 해당 분당 할당량을 초과했기 때문일 수 있습니다. 하지만 두 번째 단계에서는 모두 성공적으로 요약되었습니다.

특히, Franklin Lexington 주제에는 이제 요약이 표시됩니다.

다시 한번 말씀드리지만, created_at 문제로 인해 다른 사용자들에게는 아직 백필링이 잘 작동하지 않을 것입니다.

1개의 좋아요

네, 동의합니다. 좀 더 덜 급진적인 방법인 updated_at 또는 last_posted_at를 살펴봐야 할 것 같습니다.

결국 백필링을 수행한다면 콘텐츠 변경을 기준으로 삼아야 합니다.

2개의 좋아요

차이가 편집이라면, 편집 시 재생성하는 쪽을 지지합니다. 각 토픽의 첫 번째 게시물로 위키를 운영하고 있으며, 회원들이 중요한 정보를 위키 방식으로 편집하고 있습니다. 이 정보는 요약에 영향을 줄 수 있습니다.

하지만 그렇게 하지 않기로 결정하신다면, 저는 제 포크를 계속 유지하겠습니다.

오랫동안 연락이 없었습니다. 곧 시간을 내서 이 작업을 진행해 보겠습니다.

1개의 좋아요

오늘 아침에 이 PR이 병합되었습니다:

백필(job) 작업이 이제 created_at 대신 last_posted_at을 사용합니다. 또한, 요약이 오래되었는지 판단하는 로직도 수정하여, 게시글 중 last_revised_at이 요약보다 새로운 것이 있는지 확인함으로써 편집 사항을 반영하도록 했습니다.

4개의 좋아요

이 주제는 3일 후 자동으로 닫혔습니다. 새로운 답글은 더 이상 허용되지 않습니다.