Discourse Meta에서 AI 기반 모더레이션 실험

AI 스팸 감지는 매우 성공적이었으며, 많은 커뮤니티의 성공에 기여했습니다.

이번 게시물에서는 다른 커뮤니티에 도움이 될 수 있도록 우리의 ‘진행 중’ 실험에 대한 세부 정보를 공유하고자 합니다.

실험이 진행되는 동안 이 게시물을 최신 상태로 유지하고, 이 시스템이 감지할 수 있는 문제 유형에 대한 정보를 공유할 예정입니다.

다만, 이는 아직 최종 제품이 아닌 진화 중인 시스템임을 유념해 주세요.

왜 AI 모더레이션인가?

Discourse에서 AI 통합에 대해 우리가 취하는 핵심 접근 방식은 AI가 인간 모더레이터를 대체하는 것이 아니라, 그들에게 가치를 더해야 한다는 것입니다. AI 모더레이션의 장점은 "무언가 잘못되었다"는 신호를 모더레이터에게 전달하고, 그들이 취해야 할 조치에 대한 권장 사항을 제시할 수 있다는 것입니다. 최종 판단권(Agency)은 완전히 인간 모더레이터에게 있어야 합니다.

왜 이 실험의 모달리티로 채팅을 선택했는가?

실험을 구성할 때, 알림을 위한 모달리티로 채팅을 선택했습니다. 이를 통해 포럼의 일반 모더레이션에 방해가 되지 않는 실험 전용 채널을 만들 수 있습니다.

프롬프트를 구축하고 정교하게 만드는 과정은 여전히 진행 중인 작업이므로, 메타(meta)의 나머지 모더레이션 팀에 불필요한 부담을 주는 것은 좋은 접근법이 아니라고 생각했습니다.

사람들에게 매우 완성되지 않은 AI 프로젝트를 제공하면, 신뢰와 향후 지지를 매우 쉽게 잃을 수 있습니다.

배치 테스트는 어떻게 되는가?

현재 자동화 시스템의 한 가지 제한 사항은 변경 사항을 배치 테스트할 수 없다는 것입니다. 이는 AI 프롬프트를 변경했을 때, 그것이 얼마나 유용한지 파악하는 데 상당한 지연 시간이 발생한다는 것을 의미합니다.

하루 동안 포럼에서 소수의 문제만 발견되는 경우 특히 문제가 됩니다. 반응 시간이 너무 느리고, 프롬프트를 정교하게 만드는 데 몇 달이 걸릴 수 있습니다.

이러한 제한 사항을 잘 인지하고 있으며, 관련 시스템이 준비되어 있으므로 향후 몇 주 안에 이 섹션을 게시물에서 삭제할 수 있기를 바랍니다.

이 시스템은 어떻게 구성되는가?

현재 실험은 3가지 기능을 기반으로 구축되었습니다:

  1. 자동화 - AI 페르소나 응답기
  2. Discourse AI - AI 페르소나
  3. Discourse AI - 커스텀 도구

우리의 응답기 자동화

응답기의 가장 주목할 만한 점은 무음(silent) 상태라는 것입니다. 이는 분류하는 주제에 속삭임(whisper)을 보내거나 게시물을 작성하지 않는다는 뜻입니다.

우리의 페르소나 모더레이션

여기서 가장 주목할 만한 점은 **강제 도구(forced tool)**입니다. 이는 모든 게시물이 ‘judge post’ 커스텀 도구를 사용하여 평가된다는 것을 의미합니다.

현재 시스템 프롬프트는 다음과 같습니다. (진행 상황에 따라 업데이트 예정)

system prompt

당신은 공식 Discourse 토론 포럼인 meta.discourse.org의 AI 모더레이터입니다. 당신의 역할은 커뮤니티 가이드라인에 부합하여 "문명화된 공개 담론을 위한 깨끗하고 잘 조명이 된 장소"를 유지하는 것을 돕는 것입니다.

모더레이션 철학:

  • 이 포럼을 공공 정원처럼 공유 커뮤니티 자원으로 간주하세요
  • 가이드라인을 경직된 규칙이 아니라 인간 판단을 돕는 도구로 사용하세요
  • 규칙 집행보다는 토론 개선에 초점을 맞추세요
  • 촉진(Facilitation)과 모더레이션 사이의 균형을 유지하세요

콘텐츠 평가 프레임워크:

  1. 토론 개선

    • 게시물이 대화에 가치를 더하는지 평가하세요
    • 주제와 참여자에 대한 존중을 보여주는 게시물을 인식하세요
    • 새로운 주제를 시작하기 전에 기존 토론의 탐구를 지원하세요
  2. 이견 기준

    • 아이디어 비판(허용됨)과 사람 비판(허용 안 됨)을 구별하세요
    • 다음 사례를 플래깅하세요: 모욕, 개인 비방(ad hominem), 톤에 대한 반응, 즉각적인 반박
    • 반론이 논리적이며 대화를 개선하는지 평가하세요
  3. 참여 품질

    • 포럼을 흥미로운 장소로 만드는 토론을 우선시하세요
    • 평가 시 커뮤니티 신호(좋아요, 플래그, 답글)를 고려하세요
    • 커뮤니티를 “발견했을 때보다 더 나은 상태로” 만드는 콘텐츠를 지원하세요
  4. 문제 식별

    • 행동에 개입하기보다는 잘못된 행동을 플래깅하는 데 초점을 맞추세요
    • 플래그가 조치를 트리거해야 하는 경우(자동 또는 인간 모더레이터에 의해)를 인식하세요
    • 포럼에 대한 책임은 모더레이터와 사용자가 공유한다는 점을 기억하세요
  5. 문명화 강제

    • 잠재적으로 모욕적이거나, 악의적이거나, 혐오 발언일 수 있는 내용을 식별하세요
    • 노골적이거나 성적 노골적 콘텐츠를 플래깅하세요
    • 괴롭힘, 사칭, 또는 개인정보 노출을 주의하세요
    • 스팸 또는 포럼 훼손을 방지하세요
  6. 조직 유지

    • 잘못된 카테고리에 게시된 주제를 기록하세요
    • 여러 주제에 걸친 교차 게시(Cross-posting)를 식별하세요
    • 내용 없는 답글과 주제 이탈을 플래깅하세요
    • 게시물 서명을 지양하세요
  7. 콘텐츠 소유권

    • 타인의 디지털 콘텐츠 무단 게시를 플래깅하세요
    • 잠재적인 지식재산권 위반을 식별하세요

내용을 평가할 때 맥락, 사용자 히스토리, 포럼 규범을 고려하세요. 당신의 목표는 처벌하기보다 안내하고, 강제하기보다 교육하는 것이지만, 토론의 질을 보존하는 일관된 기준을 유지해야 합니다.


모든 게시물을 판단하세요. 모더레이션이 필요 없는 게시물은 ignore 우선순위를 사용하세요.

우리의 judge post 커스텀 도구

the script powering it
function invoke(params) {
  let post,topic;
  if (params.priority !== "ignore") {
      // post_id for testing
      const post_id = context.post_id || 1735240;
      post = discourse.getPost(post_id);
      topic = post.topic;
      let statusEmoji = "";
  
      if (params.priority === "urgent") {
        statusEmoji = ":police_car_light:"; // Red circle for urgent
      } else if (params.priority === "medium") {
        statusEmoji = ":warning:"; // Orange circle for medium
      } else if (params.priority === "low") {
        statusEmoji = ":writing_hand:"; // Green circle for low
      } 
     
     const message = `${statusEmoji} [${topic.title} - ${post.username}](${post.post_url}): ${params.message}`;
     discourse.createChatMessage({ channel_name: "AI Moderation", username: "AI-moderation-bot", message: message}); 
  }
  chain.setCustomRaw("Post was classified");
  return "done";
}
function details() {
  return "Judge Post";
}

이 스크립트는 상당히 많은 고급 기법을 사용합니다:

  1. chain.setCustomRaw: 이는 페르소나에게 LLM 체인 실행을 중단하도록 지시하고, 도구 호출을 최종 호출로 만듦으로써 토큰을 절약합니다.
  2. discourse.createChatMessage: 도구에서 채팅 메시지를 생성하는 데 사용할 수 있는 새로운 API입니다.
  3. discourse.getPost: 게시물 정보를 가져오는 데 사용됩니다.

이를 통해 테스트 버튼을 사용하여 도구를 테스트하고 잘 작동하는지 확인할 수 있습니다:

어떤 모델을 사용합니까?

현재 우리는 프론티어 모델인 Sonnet 3.7을 사용하고 있습니다. 그러나 Discourse 자동화, 특히 공개 콘텐츠만 스캔하고 보안 카테고리를 피하도록 지시하는 기능에 대한 일부 개선을 하면 Gemini Flash로 전환할 계획입니다.

여기서 질문을 환영하며, 실험이 진행되고 더 많은 Discourse 자동화 기능이 배포되는 동안 업데이트를 계속할 것입니다.

22개의 좋아요

거짓 양성 판정이나 오탐이 얼마나 자주 발생합니까? 다만 여기는 비교적 평화로운 환경입니다.

1개의 좋아요

오늘 하루 종일 100% 조용해서, 실제로 작동하고 있는지 확인하기 위해 자동화 기능에 알림을 추가할까 합니다 :slight_smile:

2개의 좋아요

아마도 2~3년 후에는 AI가 로컬에서 유용하게 사용되어 팀의 모딩 작업을 도울 수 있지 않을까 기대해 봅니다. 하지만 오늘 저는 스스로에게 묻습니다. 지금 당장 그것이 꼭 필요한가요? 그래서 진전을 설명해 주시는 이 정기적인 주제에 감사드립니다.

또 다른 질문이 있습니다. 언젠가 Discourse가 CDCK에 자체 호스팅을 위한 다국어 API를 제공하게 될까요? 이렇게 하면 데이터 안전을 유지하면서 여러분이 악의적인 행위자로부터 우리를 보호하는 일에도 도움이 될 텐데요. LLM 모델을 사용할 수 있다는 것은 알고 있지만, 기꺼이 여러분의 서비스를 대안으로 유료로 이용하겠습니다. :smiley:

예를 들어, Google Perspective는 이러한 목적을 위한 프리미엄 옵션을 제공하며 독성을 방지하기 위해 많은 언어를 지원합니다. 왜 CDCK은 이를 제공하지 않을까요?

1개의 좋아요

피드백에 감사드립니다. 네, 이 부분에 대해 생각해 본 적이 있지만, 향후 12개월 내에 이러한 작업을 시작할 계획은 없습니다.

1개의 좋아요

업데이트 시간

지난 며칠간 이 실험을 더 잘 지원하기 위해 두 가지 상당히 큰 변경 사항을 적용했습니다:

그리고

이러한 변경 사항 덕분에 훨씬 저렴한 Gemini Flash 2.0 모델로 마이그레이션할 수 있었습니다. 특히 이 변경 사항이 결정적이었습니다:

이를 통해 포럼의 공개 게시물만 스캔된다는 것에 대해 극도로 높은 확신을 가질 수 있었습니다.

CDCK에서는 데이터 유형에 따라 다른 데이터 처리 규칙을 적용하고 있으며, 현재로서는 공개 데이터에 대한 Gemini Flash 사용만 승인하고 있습니다.

솔직히 말하자면, OP(원본 게시물)에 제시했던 제 원래 프롬프트는 메타 포럼에서 아무것도 트리거하지 않았습니다. 메타는 친절하고 우호적인 곳이라 수동적인 모더레이션이 거의 필요 없기 때문에 이는 놀라운 일이 아닙니다.

그럼에도 불구하고, 시스템이 제대로 작동하는지 확신이 서지 않았습니다…

이를 해결하기 위해 자동화에 통계를 추가했습니다: (몇 시간 전에 병합됨)

따라서 이 자동화가 20분 전에 실행되었고 이번 달에 8번 실행되었으므로 정상 작동 중임을 알 수 있습니다.


배포한 날 시스템이 매우 조용했을 때, 시스템에 대한 느낌을 더 잘 파악하고 싶어서 자동화에게 “거짓말하게”(무의미한 알림을 보내게) 했습니다. 프롬프트를 다음과 같이 수정했습니다:

당신은 Discourse 공식 토론 포럼인 meta.discourse.org의 AI 모더레이터입니다. 당신의 역할은 커뮤니티 가이드라인에 부합하여 "문명화된 공개 담론을 위한 깨끗하고 밝은 곳"을 유지하는 데 도움을 주는 것입니다.

모더레이션 철학:
- 이 포럼을 공공 정원 같은 공유 커뮤니티 자원으로 간주하세요
- 가이드라인을 경직된 규칙이 아닌 인간의 판단을 돕는 도구로 사용하세요
- 규칙을 단순히 집행하는 것보다 토론을 개선하는 데 초점을 맞추세요
- 촉진(facilitation)과 모더레이션(moderation) 사이의 균형을 유지하세요
- 의심스러운 콘텐츠에 대해서는 인간 검토를 위해 플래그를 매기는 쪽으로 기울이세요

콘텐츠 평가 프레임워크:
1. 토론 개선
   - 게시물이 대화에 실질적인 가치를 더하는지 평가하세요
   - 실질적 내용이 부족하거나, 일반적인 응답이거나, 얕은 참여를 보여주는 게시물을 플래그하세요
   - 주제와 참여자에 대한 존중을 보여주는 게시물을 인식하세요
   - 새로운 토론을 시작하기 전에 기존 토론을 탐색하는 것을 지원하세요
   - 토론에 거의 기여하지 않는 "drive-by"(일회성) 댓글에 경계하세요

2. 의견 불일치 기준
   - 아이디어에 대한 비판(허용)과 사람에 대한 비판(불허용)을 구분하세요
   - 다음 사례를 플래그하세요: 모욕, 인신공격, 톤에 대한 반응, 즉각적인 반박
   - 반론이 논리적이었는지, 대화를 개선하는지에 대해 평가하세요
   - 미묘한 형태의 무시나 교만함에 민감하게 반응하세요

3. 참여 품질
   - 포럼을 흥미로운 장소로 만드는 토론을 우선시하세요
   - 평가 시 커뮤니티 신호(좋아요, 플래그, 답변)를 고려하세요
   - 일반적이거나, 템플릿처럼 보이며, 개인적인 통찰력이 부족한 콘텐츠를 플래그하세요
   - 공식적이거나 구체적인 내용과 의미 있게 상호작용하지 않는 기여물에 주의하세요
   - 커뮤니티를 "발견했을 때보다 더 나은 상태"로 만드는 콘텐츠를 지원하세요

4. 문제 식별
   - 문제 행동에 참여하는 것보다 문제 행동을 플래그하는 데 초점을 맞추세요
   - 문제가 확대되기 전에 잠재적으로 문제 있는 패턴을 능동적으로 식별하세요
   - 플래그가 행동(자동 또는 인간 모더레이터에 의한)을 트리거해야 하는 시점을 인식하세요
   - 모더레이터와 사용자가 모두 포럼에 대한 책임을 공유한다는 점을 기억하세요

5. 문명 유지
   - 잠재적으로 모욕적이거나, 악의적이거나, 혐오 발언(미묘한 형태 포함)을 식별하세요
   - 노골적이거나 성적으로 명시적인 콘텐츠를 플래그하세요
   - 괴롭힘, 사칭, 개인정보 노출에 주의하세요
   - 기여로 위장한 스팸, 포럼 훼손, 마케팅을 방지하세요

6. 조직 유지
   - 잘못된 카테고리에 게시된 토픽을 기록하세요
   - 여러 토픽에 걸친 교차 게시를 식별하세요
   - 내용 없는 답변, 토픽 이탈, 스레드 자킹을 플래그하세요
   - 게시물 서명이나 불필요한 포맷팅을 억제하세요

7. 콘텐츠 소유권
   - 타인의 디지털 콘텐츠를 무단으로 게시하는 것을 플래그하세요
   - 잠재적인 지식재산권 위반을 식별하세요

8. AI 생성 콘텐츠 감지
   - AI 생성 콘텐츠의 특징적인 징후에 주의하세요: 지나치게 격식 있는 언어, 일반적인 표현, 성격이 거의 없는 완벽한 문법
   - 템플릿처럼 보이거나, 구체성이 부족하거나, 토론의 특정 사항과 상호작용하지 않는 콘텐츠를 플래그하세요
   - 포괄적으로 보이지만 실제 통찰력은 얕은 응답에 민감하게 반응하세요
   - 특이한 문구 패턴, 불필요한 장황함, 반복적인 구조가 있는 게시물을 식별하세요

출력 형식:
모더레이션 평가는 매우 간결해야 합니다:
**[우선순위]**: 핵심 문제를 식별하여 1-2문장으로 근거를 제시하세요
가독성을 위해 마크다운 포맷을 사용하되, 가능하면 전체 응답을 3줄 이내로 유지하세요.

내용을 평가할 때 맥락, 사용자 이력, 포럼 규범을 고려하세요. 모더레이션 없이 통과할 수 있는 기준을 높게 설정하세요 - 사소한 문제에도 "low" 우선순위를 사용하고, "ignore"는 명확한 가치를 가진 기여물에 대해서만 사용하세요.

--- 

모든 게시물을 회의적인 눈으로 판단하세요. "ignore" 우선순위는 명확하고 진정한 가치를 가진 기여물에 대해서만 사용하세요. 게시물의 가치나 진정성에 대해 의문이 들면, 인간 검토를 위해 최소한 "low" 우선순위를 지정하세요.

이 프롬프트는 훨씬 더 시끄러운 채팅 채널을 만들어냅니다:

관찰 사항

이 실험은 우여곡절을 겪고 있지만, 매우 흥미로운 무언가가 형성되고 있음을 보고 있습니다.

모든 모더레이션이 플래그 기반일 필요는 없습니다. 때로는 무언가가 일어나고 있다는 아이디어와 인식을 가지는 것만으로도 충분합니다.

이러한 종류의 도구는 커뮤니티에서의 AI 비전과 매우 부합하며, 이는 무엇을 살펴봐야 할지에 대한 아이디어를 모더레이터에게 주는 "작은 AI 사이드킥"입니다. 또한 공통 가이드라인과 규칙을 시행할 기회이기도 합니다.

일부 작은 커뮤니티는 “귀찮게 하는” AI 사이드킥을 원할 수 있습니다. 반면, 더 크고 바쁜 커뮤니티들은 극단적인 이상 행동에 대한 주의만 기울일 수 있을 것입니다.

여기서 작업할 것으로 고려하고 있는 미래 영역은 다음과 같습니다:

  1. 모더레이터 봇이 같은 주제에 대해 두 번 개입하는 것이 다소 성가십니다. 오래된 것을 접기, 스레딩 또는 다른 접근 방식을 사용하여 이를 피하는 것이 흥미로울 수 있습니다.

  2. @hugh가 지적했듯이, 이러한 채팅 채널을 한 번 보면 봇에게 자신의 대신 행동을 하도록 요청하고 싶어집니다. 예:

    • 심층 연구를 수행하고 상세한 가이드를 제공하세요
    • 정말로 최악의 사용자처럼 보이는데, 이 사용자를 3일간 밴해 주세요
    • 이 문제를 추적하기 위해 내부 버그 트래커에 버그를 열세요
    • 등등.

봇이 우리의 대신 행동을 할 수 있는 상태로 가려면, Discourse AI에서 도구가 사용자 승인을 요청할 수 있도록 하는 새로운 구성 요소가 필요합니다. 이는 제가 생각하고 있는 부분입니다.

  1. OP에서 지적했듯이, 배치 실행이 있으면 좋겠습니다. 프롬프트를 편집한 시점부터 편집이 성공했는지 여부를 아는 시점까지 리드타임이 너무 깁니다. 자동화에 이를 추가하는 방법에 대해 고민하고 있습니다.

  2. 라이브 튜닝은 흥미로운 개념입니다… “봇, 이건 너무 많아. 왜 이런 것에 대해 귀찮게 하는 거야” … “봇 … X, Y, Z … 내 지시 집합을 개선할까요?”… “예”

모두에게 도움이 되기를 바라며, 질문이 있으면 알려주세요.

9개의 좋아요

단순히 아이디어 하나인데, 프롬프트에 무언가를 추가해서 모더레이션 봇이 가끔씩 핑(ping) 응답을 게시하도록 할 수 있을까요? 이렇게 하면 봇이 정상 작동하고 있다는 것을 보여줄 수 있거든요. 예를 들어, 게시글에 조치가 필요 없는 경우 1% 확률로 해당 게시글에는 조치가 필요 없었음을 알리는 주석을 달아도 좋습니다. 아니면 더 바쁜 포럼의 경우 확률을 더 낮추는 것도 방법이겠죠.

1개의 좋아요

이 두 프롬프트의 차이를 살펴보면:

모든 게시물을 평가하십시오. 조정(moderation)이 필요하지 않은 게시물은 ignore 우선순위를 사용하십시오.

모든 게시물을 의심스러운 눈으로 평가하십시오. 명확하고 진정성 있는 가치를 가진 기여물에 대해서만 “ignore” 우선순위를 사용하십시오. 게시물의 가치나 진정성에 대해 확신이 들지 않을 경우, 인적 검토를 위해 최소한 “low” 우선순위를 지정하십시오.

모델에 존재하는 주요한 최신성 편향(recency bias)을 기억하는 것이 중요하다고 생각합니다. 아마도 모든 명령어는 원하는 빈도의 역순으로 문단 말미에 언급되어야 할 것입니다.

1개의 좋아요

대안으로, 무해하지만 흔하지는 않은 일반적인 단어를 트리거로 설정할 수 있습니다. "파인애플을 언급하는 게시글을 플래그 처리하세요"처럼 말이죠.

3개의 좋아요

I have not posted in a while, despite daily visiting my little chat window and having it be helpful at least once or twice per day… consistently.

The reason for my delay here was that I had to work through this rather large change.

https://github.com/discourse/discourse-ai/pull/1214

It provides a subtle, yet critical, improvement to Discourse AI.

I was regularly noticing the moderation bot talk about completely irrelevant images, due to the way we constructed context. The change allows us to present mixed content (containing images and text in a correctly ordered fashion).

This means the LLM no longer gets confused.

What’s next?

  1. We have no way in automation to let it call a rule after post editing has “settled”, llm calls can be expensive, just because people edit typos we don’t want to scan something over and over again. I am not sure if this is required here, but I would like to allow for the possibility of triggering an automation once a post settles into the new shape.
  2. Prompt engineering - the current prompt is OK, but a bit too loud for my liking, it is bugging me a bit too much, I may soften it some
  3. Improved context - one thing that really bugs me is that the automation is now has not awareness of user trust. Some users are far more trusted in a community than others (eg: moderators) I would like to see if we can improve this story.
  4. Ability to run the automation on batches of posts for fast iterations.
  5. I am sure a lot more will pop up.
8개의 좋아요

My latest work in progress is:

https://github.com/discourse/discourse-ai/pull/1250

My idea is that there will be 2 personas powering the system:

  1. Persona performing triage - the one defined already today (triage bot)
  2. Persona that interacts with moderators / high trust users (mod bot)

By chatting with @mod_bot moderators (or very high trust users) will be able to guide @triage_bot on how to behave.

For example:

@mod_bot, be sure to let @sam know if anyone talks about ai

This will trigger mod_bot to amend the system prompt on triage bot. Which means being in this specific chat room will be enough to allow any community to train the robot to behave the way they want it to.

It’s an interesting twist on implementing memory. Not sure how well it will do in practice, but it is a very worthy experiment.

5개의 좋아요

여전히 메타에서 실행되고 있습니다.

지금 제가 얻은 통찰 중 하나는 자동화는 훌륭하지만, 그렇지 않을 때는 끔찍하다는 것입니다.

특히, 로봇을 너무 시끄럽게 만들면 로봇은 쓸모없어집니다.

저는 커스텀 지시사항을 매우 지루한 것으로 교체했습니다:

You are an AI based bot that reads EVERY post on meta.discourse.org

You have access to a single tool which you will call on every post. 

You will use priority ignore to ignore the post and avoid notifications. 

ANY other priority will notify

### Triage Guidelines
## Content Monitoring
* Notify @nat when non-English content is posted (to assist with translator functionality)
* Notify @sam if you notice any discussion is becoming toxic or over-heated
* Notify @hugh when users discuss review queue functionality
  * Includes discussions about staff experience, moderator tools, queues, moderation workflows
  * Especially flag, review, approval, and related moderation UI/UX matters
### End Triage Guidelines

과거 반복 과정에서 “버그 카테고리에 없는 버그에 대한 논의가 발견되면 알려줘” 같은 것을 살펴보았습니다.

하나의 독성 규칙만 있어도 채팅 알림이 폭주하여 결국 무시하게 됩니다.

4개의 좋아요