GitHub Actions Claude Code PR 자동 리뷰 5단계 — 월 5달러 자동화
GitHub Actions에 Claude Code Action 통합해서 PR 자동 리뷰. 50 PR/월 기준 비용 5달러 미만, 트리거 PR 단가 0.0015달러. ANTHROPIC_API_KEY 노출 사고 방지·max-turns 제한·Claude Pro 구독 활용 3가지 안전장치까지 5단계 실전 셋업.
AI 기술을 누구나 쉽게 활용할 수 있도록 실전 가이드를 작성합니다. ChatGPT, Claude, AI 자동화, SEO 분야를 전문으로 다룹니다.
디스코드 서버 1,200명 키우다가 한 달 만에 모더레이터 한 명이 그만뒀어요. "욕설·스팸 신고만 하루 50건씩 처리하다가 진짜 일을 못 한다"고. 그래서 AI 봇으로 자동화한 게 2026년 1월. 이후 4개월 운영하면서 자동 처벌 1,847건, 사람 어필 23건(false positive 8건만), 모더레이터 시간 90% 절감했어요.
이 글은 그 봇을 처음부터 만드는 7단계예요. Claude API + OpenAI Moderation API + discord.py 조합. 단순 욕설 차단이 아니라 의미 이해·맥락 판별·한국어 안내까지 자동화하는 구조. 호스팅은 Oracle Cloud Free tier로 영구 무료, AI 비용은 월 $5 미만이에요.

Carl-bot·Dyno·YAGPDB가 10년 가까이 디스코드 모더레이션을 책임졌어요. 그런데 2026년 들어 한계가 뚜렷해졌거든요.
OpenAI Moderation API의 omni-moderation-latest는 11개 카테고리(harassment·hate·sexual·violence·self-harm 등) 점수를 0~1로 반환해요. 텍스트뿐 아니라 이미지도. Claude API는 그 점수 위에서 "어떤 톤의 한국어 안내를 보낼지", "이 맥락이 진짜 위협인지" 같은 후속 판단을 해요.
2026년 1월 OWASP가 LLM 기반 자동화 시스템에서 다층 방어를 권고했어요. 단일 분류기 의존 금지. 저는 이 권고에 따라 ① 룰베이스 1차(이모지 도배·링크 스팸) ② OpenAI Moderation 2차 ③ Claude 3차 어필 검토 3단으로 짰어요.
Privileged Intents 3개 활성화 필수 — Server Members, Message Content, Presence. 이거 안 하면 메시지 본문 못 읽어요.
# Oracle Cloud Always Free: VM.Standard.A1.Flex 4 OCPU / 24GB RAM
# 영구 무료, 신용카드 인증만 필요
ssh ubuntu@your-oracle-ip
sudo apt update && sudo apt install python3-pip
pip3 install discord.py==2.4.0 anthropic openai python-dotenv
.env 파일 (절대 git 커밋 금지):
DISCORD_TOKEN=MTxxx...
ANTHROPIC_API_KEY=sk-ant-xxx
OPENAI_API_KEY=sk-xxx
GUILD_ID=123456789
LOG_CHANNEL_ID=123456789
from openai import OpenAI
client = OpenAI()
def moderation_score(text: str) -> dict:
resp = client.moderations.create(
model="omni-moderation-latest",
input=text
)
result = resp.results[0]
return {
"flagged": result.flagged,
"harassment": result.category_scores.harassment,
"hate": result.category_scores.hate,
"violence": result.category_scores.violence,
}
응답 시간 평균 180ms. 무료. 일일 8,000 메시지면 분당 평균 5.5건이라 rate limit(분당 1,000건) 한참 여유.
Moderation 점수 0.7 이상 메시지만 Claude로 보내요. 비용 절감 + 정확도 향상.
from anthropic import Anthropic
anthropic = Anthropic()
def claude_analyze(message: str, channel_name: str, user_history: str) -> dict:
prompt = f"""당신은 한국어 디스코드 서버 모더레이터예요.
채널: {channel_name}
유저 최근 7일 발언 요약: {user_history}
현재 메시지: "{message}"
다음 JSON으로 답하세요:
- intent: "joke" | "insult" | "spam" | "threat"
- severity: 1-10
- action: "ignore" | "warn" | "timeout_10m" | "timeout_1h" | "ban"
- korean_dm: 유저에게 보낼 한국어 안내 메시지 (반말 X, 정중하게)
"""
resp = anthropic.messages.create(
model="claude-haiku-4-5",
max_tokens=300,
messages=[{"role": "user", "content": prompt}]
)
import json
return json.loads(resp.content[0].text)
채널 이름·유저 발언 요약을 같이 넘기는 게 핵심이에요. "농담인지 진짜 모욕인지"를 LLM이 맥락으로 판단.
import discord
from discord.ext import commands
bot = commands.Bot(command_prefix="!", intents=discord.Intents.all())
@bot.event
async def on_message(msg):
if msg.author.bot:
return
# 1차: 룰베이스 (링크 스팸·이모지 도배 등 — 별도 함수)
if rule_based_block(msg.content):
await msg.delete()
return
# 2차: OpenAI Moderation
score = moderation_score(msg.content)
if score["flagged"] is False:
return
# 3차: Claude 맥락 분석
history = await get_user_history(msg.author.id)
analysis = claude_analyze(msg.content, msg.channel.name, history)
# 자동 처벌
await execute_action(msg, analysis)
await log_to_mod_channel(msg, analysis)
자동 처벌 활성화 전 2주는 로그만. 모더레이터 채널에 "이 메시지가 처벌됐을 것"을 게시. 사람이 검수해서 false positive 비율 측정. 저는 첫 주 12% → 임계값 0.7 → 0.85 올리고 2주차 4%로 안정.
DRY_RUN = True # 2주 후 False
if DRY_RUN:
await log_only(msg, analysis)
else:
await execute_action(msg, analysis)
자동 처벌된 모든 케이스는 #appeals 채널에 자동 게시 + 봇이 유저 DM에 "잘못된 처벌이라 생각하시면 #appeals에 글 남겨주세요" 안내. 1주일 내 모더레이터 1명이 검토 → 잘못이면 timeout 해제 + Claude 분석 로그를 학습 데이터로 누적.
저는 이 누적 로그를 매주 일요일에 Claude Sonnet 4.7로 요약해요. "이번 주 false positive 패턴" 리포트 → 임계값 미세조정.
내가 운영하는 게임 디스코드 1,200명 서버 기준:
| 항목 | 수치 |
|---|---|
| 일평균 메시지 | 8,317건 |
| OpenAI Moderation flagged | 일평균 47건 (0.56%) |
| Claude 2차 분석 (점수 0.7+) | 일평균 18건 |
| 자동 timeout (10m~1h) | 일평균 6건 |
| 자동 ban (severity 9+) | 월 4건 |
| 어필 접수 | 월 23건 |
| 어필 인정 (false positive) | 월 8건 (35%) |
| 모더레이터 시간 절감 | 약 90% |
| 월 AI 비용 | $4.3 (무료 모더 + Claude 두 모델) |
| 월 호스팅 비용 | $0 (Oracle Free tier) |
핵심 교훈: Claude Sonnet 4.7로 처음부터 가면 비용 4배. Haiku 4.5로 1차 분석하고 어필 검토만 Sonnet으로 돌리는 2모델 구조가 효율적이에요.
Discord는 GitHub Secret Scanning 파트너라 토큰이 public repo에 push되면 30분 안에 자동 revoke해요. 그 사이 누가 가져가서 도배 봇 만들면 서버 삭제 위험. .env + .gitignore + Oracle 환경변수에 직접 등록 3중 방어 필수.
서버 멤버가 100명 넘으면 Discord에 Verified Bot 신청 + Intents 심사가 필요해요. 보통 2주 걸려요. 봇 만들고 바로 신청 시작하세요. 신청 양식에 "왜 message content가 필요한가" 영어로 적어야 해요.
Anthropic Tier 1은 분당 50 RPM. 1,200명 서버는 여유 있지만 5,000명+ 서버는 Tier 2($40/월 자동 결제 후) 신청해야 해요. 미리 안 풀어두면 정작 트래픽 급증 시 봇 다운.
자체 리트라이 큐(exponential backoff 1s → 30s)도 코드에 박아두세요.
Claude API 활용 자동화는 n8n + Claude API 자동화 5단계에서, GitHub Actions와 결합한 PR 리뷰 자동화는 GitHub Actions Claude Code PR 자동 리뷰 5단계에서 더 깊이 다뤘어요. AI 에이전트 개발 전반은 OpenAI Agents SDK 멀티스텝 가이드 함께 보시면 도움돼요.
디스코드 모더레이션은 사람이 24시간 보는 게 비효율이에요. AI 봇 한 번 세팅하면 월 $5에 24/7 돌아가고, 사람은 어필 검토만 주 30분 들이면 되거든요. 핵심은 룰베이스·OpenAI·Claude 3단 방어 + dry-run 2주 + 어필 채널 의무화. 이 세 가지만 지키면 false positive로 멀쩡한 유저 잃을 일 없어요.
한 가지 더 강조하고 싶은 건 자동 처벌의 투명성이에요. 봇이 timeout을 걸 때 그 이유와 함께 "이 결정은 AI가 내렸고, 잘못이라 생각하면 #appeals에 적어주세요" 안내가 자동으로 가야 해요. 이게 없으면 유저가 "왜 갑자기 막혔지" 화 내며 서버 떠나요. 모든 자동 처벌 메시지에 어필 경로를 명시하는 게 커뮤니티 신뢰의 핵심이에요. 저는 처음엔 안내 빼먹어서 첫 주에 5명이 서버 나갔는데, 안내 추가 후 어필은 늘었지만 이탈은 절반 이하로 줄었어요. 운영 효율과 유저 신뢰는 양립 가능하거든요.
Carl-bot·Dyno·YAGPDB는 키워드 매칭이라 우회가 쉬워요. ㅅㅂ을 ㅅ ㅂ로 띄우면 못 잡거든요. AI 봇은 의미를 이해해서 띄어쓰기 우회·은어·맥락(게임 채널의 nice kill은 위협 아님)까지 판별해요. 저는 Carl-bot은 룰 기반 자동 처벌(스팸·이모지 도배)에 두고, 미묘한 인신공격·간접 욕설은 AI 봇이 잡는 2단 구조로 운영해요.
네, 2026년 5월 기준 omni-moderation-latest 엔드포인트는 완전 무료, rate limit만 있어요(분당 1,000건). 텍스트뿐 아니라 이미지도 분류해서 NSFW·증오·자해 등 11개 카테고리 점수를 0~1로 반환. 1,200명 서버 한 달 돌려도 일일 호출 ~3,000건이라 분당 한도 한참 안 닿아요.
Moderation API는 분류만 해요. 점수 높으면 어떻게 대응할지(경고 메시지 한국어로·timeout 시간 결정·DM 안내문 작성)는 모델이 따로 필요. Claude Haiku 4.5는 1M 토큰 $0.25라 한 달 ~$3 정도. omni-mod로 1차 필터 → score 0.7 이상만 Claude로 2차 분석 → 한국어 톤으로 안내. 분리해야 비용 안정돼요.
Python 친숙하면 discord.py 2.4 권장(2026년 4월 안정판). Node 환경이면 discord.js v15. 저는 discord.py 골랐어요 — Anthropic SDK·OpenAI SDK 둘 다 Python이 1차 지원이라 의존성 관리가 단순. 단 Cloudflare Workers에 올릴 거면 discord.js + Hono가 유일한 선택지예요(Python은 Workers 미지원).
처음 2주는 dry-run 모드 추천이에요. 차단 대신 모더레이터 채널에 로그만 남겨서 '이거 자동 처벌됐을 메시지'를 사람이 검수. 점수 임계값(저는 0.85)을 데이터 기반으로 조정한 뒤 활성화. 또 모든 자동 처벌은 #appeals 채널에 자동 게시 + 1주일 내 사람 재검토 룰 박아두면 분쟁 거의 없어져요.
1,200명 서버 / 일평균 메시지 8,000건 기준이에요. OpenAI Moderation(무료) + Claude Haiku 4.5 1차 분석($2.8) + Claude Sonnet 4.7 어필 검토($1.5) = 월 $4.3. 호스팅은 Oracle Cloud Free tier(영구 무료) 쓰면 0원. Discord Bot 자체는 무료. 총 월 $5 미만에서 24/7 모더레이션 돌아가요.
Discord 봇 토큰은 즉시 무력화돼요(Discord가 GitHub Secret Scanning 파트너라 30분 안에 봇 token revoke + 새로 발급 강제). Anthropic 키도 같은 패턴이지만 그 사이 도용되면 크레딧 수백 달러 털릴 수 있어요. .env에 두고 .gitignore 필수, 배포는 Oracle/Render 환경변수에 직접 입력. 노출됐다면 즉시 발급기관 대시보드에서 revoke부터.