스팸: 최근 게시글을 AI로 사후 검토한 후 스팸으로 표시된 항목 삭제

,

스팸 게시물이 시간당 약 30개씩 유입되는 사이트를 도와준 적이 있습니다. AI 스팸 기능을 활성화했지만, 기존에 쌓여 있던 게시물 문제는 해결되지 않았습니다. 저는 다음과 같이 처리했습니다. 이 방법이 여러분에게도 도움이 될 수 있습니다. 다만, 이 방법은 여러분의 사이트에서 테스트된 것이 아니므로, 아래 조치 중 어떤 것을 수행하든 백업을 반드시 만들고, 이 글이 사이트를 무너뜨리려 하는 AI가 작성한 것처럼 보이지 않도록 주의해야 합니다.

이 글은 Rails가 무엇이고 어떻게 실행하는지 아는 것을 전제로 합니다. 그렇지 않다면 이 작업을 수행하지 않는 것이 좋습니다.

먼저, 여러분이 치명적인 실수를 저지를 동안 사람들이 무언가를 생성하지 못하도록 사이트를 Discourse의 읽기 전용 모드(Read Only Modes)로 설정해야 합니다. 그런 다음 백업을 만들어야 합니다. 이렇게 하면 읽기 전용 모드를 해제하기 전까지는 안전하게 백업으로 복귀할 수 있습니다.

최근 게시물 가져오기

공격은 하루가 조금 지난 시점에 시작되었으므로, 저는 이틀 전부터 데이터를 조회했습니다. 더 명확하게 표현하고 싶다면 36.hours.ago와 같은 문법을 사용할 수도 있습니다. 더 똑똑했다면 PM(개인 메시지) 내 게시물을 건너뛰는 로직을 추가했을 수도 있지만, 저는 그 부분은 신경 쓰지 않기로 했습니다.

posts = Post.where("created_at >= ?", 2.days.ago)
          .where(deleted_at: nil)
          .where("user_id > ?", 1)

해당 게시물에 대해 SpamScanner 호출

일부 게시물이 실패한 정확한 이유는 정확히 알 수 없지만, 몇 개의 "oops"가 출력된다고 해서 걱정할 일은 아닙니다.

posts.each do |post|
  begin
    puts  "https://talk.commonmark.org/p/#{post.id}"
    DiscourseAi::AiModeration::SpamScanner.perform_scan(post)
  rescue
    puts "oops";
  end;
  sleep 0.2;
end

이제 검토가 필요한 게시물 가져오기

이 코드는 방금 검토 대상(reviewable)으로 표시된(대략적으로 위 동작에 의해) 검토 가능한 게시물을 가져옵니다. 우리는 이 위험한 모험의 일부가 아닌 다른 게시물들에 대해 이를 무분별하게 적용하고 싶지 않습니다.

reviewables = Reviewable.where(status: "pending")
  .where(potential_spam: true)
  .where("created_at >= ?", 1.hour.ago)
  .where("updated_at >= ?", 1.hour.ago)

AI를 맹목적으로 신뢰하기

물론 숨겨진 주제들을 주의 깊게 살펴봤고, 모두 정말로 스팸처럼 보였기 때문에 그냥 실행해 보겠습니다. 제목은 농담입니다.정말 AI를 맹목적으로 신뢰하는 건 아니죠?!?!?

이 코드는 게시물을 삭제하고 사용자를 삭제 및 차단합니다. 정말로, 정말로 위험한 작업입니다.


reviewables.each do |reviewable|
  begin
    puts "deleting https://talk.commonmark.org/t/#{reviewable.topic_id}"
    if reviewable.topic.nil?
      puts "already gone"
      next
    end
    reviewable.perform(user, :delete_user_block)
  rescue
    puts "oops"
  end
end

8개의 좋아요