Thanks to visit codestin.com
Credit goes to github.com

Skip to content

won-seoop/content-safety-ops-api

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 

History

6 Commits
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

content-safety-ops-api

μ‚¬μš©μžκ°€ μž‘μ„±ν•œ κ²Œμ‹œκΈ€μ„ μš΄μ˜μ •μ±… λ£° 기반으둜 μžλ™ κ²€μˆ˜ν•˜κ³ , 슀팸/사기/μ–΄λ·°μ§• μœ„ν—˜λ„λ₯Ό 계산해 ALLOW, REVIEW, BLOCK 쀑 ν•˜λ‚˜λ‘œ νŒμ •ν•©λ‹ˆλ‹€.

ALLOW BLOCK REVIEW
image image image

1. 문제 상황

μš΄μ˜νŒ€μ€ 맀일 λ§Žμ€ κ²Œμ‹œκΈ€μ„ κ²€μˆ˜ν•΄μ•Ό ν•˜κ³ , 반볡적인 μ •μ±… μœ„λ°˜ ν‚€μ›Œλ“œ 탐지와 μœ„ν—˜λ„ νŒλ‹¨μ€ μˆ˜μž‘μ—…μœΌλ‘œ μ²˜λ¦¬ν•˜λ©΄ 속도와 일관성이 λ–¨μ–΄μ§‘λ‹ˆλ‹€.

특히 λ‹€μŒκ³Ό 같은 νŒ¨ν„΄μ€ λΉ λ₯΄κ²Œ 감지해 μš΄μ˜μžκ°€ μš°μ„ μˆœμœ„λ₯Ό μž‘μ„ 수 μžˆμ–΄μ•Ό ν•©λ‹ˆλ‹€.

  • μ„ μž…κΈˆ μš”κ΅¬
  • μ™ΈλΆ€ 연락 μœ λ„
  • κ³„μ’Œ/μ†‘κΈˆ μœ λ„
  • λΆˆλ²• 거래 ν‚€μ›Œλ“œ
  • μŠ€νŒΈμ„± ν‘œν˜„

μˆ˜μž‘μ—… κ²€μˆ˜λ§ŒμœΌλ‘œ μ²˜λ¦¬ν•  경우 λ‹€μŒ λ¬Έμ œκ°€ λ°œμƒν•  수 μžˆμŠ΅λ‹ˆλ‹€.

문제 μ„€λͺ…
처리 μ§€μ—° κ²Œμ‹œκΈ€μ΄ λ§Žμ•„μ§ˆμˆ˜λ‘ κ²€μˆ˜ λŒ€κΈ° μ‹œκ°„μ΄ 증가
νŒλ‹¨ 일관성 λΆ€μ‘± μš΄μ˜μžλ§ˆλ‹€ μ •μ±… μœ„λ°˜ νŒλ‹¨ 기쀀이 λ‹¬λΌμ§ˆ 수 있음
반볡 업무 증가 λ‹¨μˆœ ν‚€μ›Œλ“œ κ²€μˆ˜μ—λ„ 운영 λ¦¬μ†ŒμŠ€κ°€ μ†Œλͺ¨λ¨
사후 λŒ€μ‘ κ°€λŠ₯μ„± μœ„ν—˜ μ½˜ν…μΈ κ°€ μ‚¬μš©μžμ—κ²Œ λ…ΈμΆœλœ λ’€ 처리될 수 있음

문제 상황 캑처

μœ„ν—˜ ν‚€μ›Œλ“œκ°€ ν¬ν•¨λœ ν…ŒμŠ€νŠΈ κ²Œμ‹œκΈ€ μ˜ˆμ‹œ 캑처λ₯Ό λ„£λŠ” μ˜μ—­μž…λ‹ˆλ‹€.

문제 상황 μ˜ˆμ‹œ


2. μ„ νƒν•œ ν•΄κ²° 방법

λ³Έ ν”„λ‘œμ νŠΈμ—μ„œλŠ” μš΄μ˜μ •μ±… 룰을 μ½”λ“œμ— ν•˜λ“œμ½”λ”©ν•˜μ§€ μ•Šκ³  DB에 μ €μž₯ν•œ λ’€, ν™œμ„±ν™”λœ 룰만 κ²€μˆ˜μ— μ‚¬μš©ν•˜λ„λ‘ μ„€κ³„ν–ˆμŠ΅λ‹ˆλ‹€.

  • μš΄μ˜μ •μ±… 룰을 PostgreSQL에 μ €μž₯
  • 제λͺ©κ³Ό λ³Έλ¬Έμ—μ„œ ν‚€μ›Œλ“œ λ§€μΉ­
  • 맀칭된 룰의 점수λ₯Ό ν•©μ‚°ν•΄ μœ„ν—˜λ„ 계산
  • 점수 기쀀에 따라 ALLOW, REVIEW, BLOCK νŒμ •
  • κ²€μˆ˜ 결과와 맀칭된 룰을 PostgreSQL에 둜그둜 μ €μž₯
  • 동일 μ½˜ν…μΈ  μž¬κ²€μˆ˜λŠ” Redis μΊμ‹œλ‘œ 응닡

νŒμ • 기쀀은 λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

점수 λ²”μœ„ νŒμ • 의미
0 ~ 39 ALLOW 정상 κ²Œμ‹œκΈ€
40 ~ 79 REVIEW 운영자 κ²€ν†  ν•„μš”
80 이상 BLOCK 차단 λŒ€μƒ

3. 기술 μŠ€νƒ

ꡬ뢄 기술
Language Python 3.11+
Framework FastAPI
Database PostgreSQL
ORM SQLAlchemy
Migration Alembic
Validation Pydantic
Cache Redis
Infra Docker Compose
Test pytest
API Docs FastAPI Swagger UI

4. μ•„ν‚€ν…μ²˜ λ‹€μ΄μ–΄κ·Έλž¨

flowchart LR
    Client[Client / 운영자] --> API[FastAPI Server]

    API --> Redis[(Redis)]
    API --> DB[(PostgreSQL)]

    DB --> Rules[moderation_rules]
    DB --> Logs[moderation_logs]

    API --> Hash[Content Hash 생성]
    Hash --> Redis

    API --> RuleEngine[Rule Engine]
    RuleEngine --> Decision[ALLOW / REVIEW / BLOCK]
    Decision --> Logs
Loading

μ•„ν‚€ν…μ²˜ 캑처

GitHub README의 Mermaid λ Œλ”λ§ ν™”λ©΄ λ˜λŠ” mermaid.liveμ—μ„œ PNG둜 뽑은 이미지λ₯Ό λ„£λŠ” μ˜μ—­μž…λ‹ˆλ‹€.

μ•„ν‚€ν…μ²˜ λ‹€μ΄μ–΄κ·Έλž¨


5. μ‹œμŠ€ν…œ 흐름

  1. ν΄λΌμ΄μ–ΈνŠΈκ°€ POST /api/moderations/check둜 μ½˜ν…μΈ λ₯Ό μ „μ†‘ν•©λ‹ˆλ‹€.
  2. μ„œλ²„κ°€ title + content + price + category둜 contentHashλ₯Ό μƒμ„±ν•©λ‹ˆλ‹€.
  3. Redisμ—μ„œ moderation:content:{contentHash} keyλ₯Ό μ‘°νšŒν•©λ‹ˆλ‹€.
  4. cache hit이면 λ£° 계산과 DB 쑰회 없이 μ¦‰μ‹œ μ‘λ‹΅ν•©λ‹ˆλ‹€.
  5. cache miss이면 ν™œμ„±ν™”λœ 룰을 DBμ—μ„œ μ‘°νšŒν•©λ‹ˆλ‹€.
  6. 제λͺ©κ³Ό λ³Έλ¬Έμ—μ„œ ν‚€μ›Œλ“œλ₯Ό λ§€μΉ­ν•©λ‹ˆλ‹€.
  7. 맀칭된 룰의 점수λ₯Ό ν•©μ‚°ν•΄ μœ„ν—˜ 점수λ₯Ό κ³„μ‚°ν•©λ‹ˆλ‹€.
  8. μœ„ν—˜ 점수 κΈ°μ€€μœΌλ‘œ ALLOW, REVIEW, BLOCK을 νŒμ •ν•©λ‹ˆλ‹€.
  9. κ²€μˆ˜ 둜그λ₯Ό PostgreSQL에 μ €μž₯ν•©λ‹ˆλ‹€.
  10. κ²€μˆ˜ κ²°κ³Όλ₯Ό Redis에 5λΆ„ TTL둜 μ €μž₯ν•©λ‹ˆλ‹€.
  11. ν΄λΌμ΄μ–ΈνŠΈμ—κ²Œ νŒμ • κ²°κ³Όλ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€.

6. κ²Œμ‹œκΈ€ κ²€μˆ˜ μ‹œν€€μŠ€

sequenceDiagram
    participant Client as Client
    participant API as FastAPI Server
    participant Redis as Redis
    participant DB as PostgreSQL

    Client->>API: POST /api/moderations/check
    API->>API: title + content + price + category둜 contentHash 생성
    API->>Redis: moderation:content:{contentHash} 쑰회

    alt Cache Hit
        Redis-->>API: μΊμ‹œλœ κ²€μˆ˜ κ²°κ³Ό λ°˜ν™˜
        API-->>Client: decision, riskScore, matchedRules λ°˜ν™˜
    else Cache Miss
        API->>DB: enabled=true μš΄μ˜μ •μ±… λ£° 쑰회
        DB-->>API: ν™œμ„±ν™”λœ rules λ°˜ν™˜
        API->>API: ν‚€μ›Œλ“œ λ§€μΉ­
        API->>API: riskScore 계산
        API->>API: ALLOW / REVIEW / BLOCK νŒμ •
        API->>DB: moderation_logs μ €μž₯
        API->>Redis: κ²€μˆ˜ κ²°κ³Ό 캐싱, TTL 5λΆ„
        API-->>Client: decision, riskScore, matchedRules λ°˜ν™˜
    end
Loading

μ‹œν€€μŠ€ λ‹€μ΄μ–΄κ·Έλž¨ 캑처

포트폴리였 λ¬Έμ„œμ— λ„£κΈ° 쒋은 핡심 μΊ‘μ²˜μž…λ‹ˆλ‹€.

κ²Œμ‹œκΈ€ κ²€μˆ˜ μ‹œν€€μŠ€


7. ERD λ‹€μ΄μ–΄κ·Έλž¨

erDiagram
    MODERATION_RULES {
        int id PK
        string ruleName
        string keyword
        int score
        string action
        string category
        boolean enabled
        datetime createdAt
        datetime updatedAt
    }

    MODERATION_LOGS {
        int id PK
        int userId
        string title
        string contentHash
        int riskScore
        string decision
        string matchedRules
        string reason
        datetime createdAt
    }
Loading

ERD 캑처

ERD λ‹€μ΄μ–΄κ·Έλž¨


8. ERD μ„€λͺ…

moderation_rules

μš΄μ˜μ •μ±… 룰을 μ €μž₯ν•©λ‹ˆλ‹€.

ν•„λ“œ μ„€λͺ…
id λ£° ID
ruleName λ£° 이름
keyword 감지 ν‚€μ›Œλ“œ
score μœ„ν—˜ 점수
action κΈ°λ³Έ μ•‘μ…˜ 힌트
category μ •μ±… μΉ΄ν…Œκ³ λ¦¬
enabled λ£° ν™œμ„±ν™” μ—¬λΆ€
createdAt 생성 μ‹œκ°
updatedAt μˆ˜μ • μ‹œκ°

moderation_logs

κ²€μˆ˜ μš”μ²­μ˜ νŒμ • κ²°κ³Όλ₯Ό μ €μž₯ν•©λ‹ˆλ‹€.

ν•„λ“œ μ„€λͺ…
id 둜그 ID
userId μž‘μ„±μž ID
title κ²Œμ‹œκΈ€ 제λͺ©
contentHash μ½˜ν…μΈ  ν•΄μ‹œ
riskScore μœ„ν—˜ 점수
decision μ΅œμ’… νŒμ •
matchedRules 맀칭된 λ£° 이름 λͺ©λ‘
reason νŒμ • μ‚¬μœ 
createdAt 생성 μ‹œκ°

9. API λͺ…μ„Έ

FastAPI μžλ™ λ¬Έμ„œλŠ” μ‹€ν–‰ ν›„ μ•„λž˜ μ£Όμ†Œμ—μ„œ 확인할 수 μžˆμŠ΅λ‹ˆλ‹€.

κ°„λ‹¨ν•œ 운영 확인 UIλŠ” μ‹€ν–‰ ν›„ http://localhost:8000/μ—μ„œ μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

UI의 λΆ€ν•˜ν…ŒμŠ€νŠΈ / κ΄€μΈ‘ μ˜μ—­μ—μ„œ μš”μ²­ 수, λ™μ‹œμ„±, cached/unique λͺ¨λ“œλ₯Ό 선택해 λΆ€ν•˜ν…ŒμŠ€νŠΈλ₯Ό μ‹€ν–‰ν•  수 μžˆμŠ΅λ‹ˆλ‹€. μ‹€ν–‰ 결과둜 RPS, 평균 μ§€μ—°, p95 μ§€μ—°, μ—λŸ¬ 수, RSS λ©”λͺ¨λ¦¬, DB 컀λ„₯μ…˜ν’€ checked-out/overflow, Redis ping, 병λͺ© 힌트λ₯Ό 확인할 수 μžˆμŠ΅λ‹ˆλ‹€.

http://localhost:8000/docs

Swagger 캑처

Swagger API λ¬Έμ„œ


9-1. μ½˜ν…μΈ  κ²€μˆ˜ API

POST /api/moderations/check

Request

{
  "userId": 1,
  "title": "아이폰 μ‹Έκ²Œ νŒλ‹ˆλ‹€",
  "content": "μ„ μž…κΈˆν•˜λ©΄ 택배 λ³΄λ‚΄λ“œλ €μš”. 카톑 μ£Όμ„Έμš”.",
  "price": 100000,
  "category": "DIGITAL"
}

Response

{
  "decision": "REVIEW",
  "riskScore": 70,
  "matchedRules": [
    "PREPAYMENT_KEYWORD",
    "EXTERNAL_CONTACT_KAKAO"
  ],
  "reason": "μš΄μ˜μ •μ±…μƒ κ²€ν† κ°€ ν•„μš”ν•œ ν‚€μ›Œλ“œκ°€ κ°μ§€λ˜μ—ˆμŠ΅λ‹ˆλ‹€."
}

κ²€μˆ˜ API 응닡 캑처

κ²€μˆ˜ API 응닡


9-2. μš΄μ˜μ •μ±… λ£° 관리 API

Method Endpoint μ„€λͺ…
POST /api/ops/rules μš΄μ˜μ •μ±… λ£° 등둝
GET /api/ops/rules μš΄μ˜μ •μ±… λ£° λͺ©λ‘ 쑰회
PATCH /api/ops/rules/{id}/status μš΄μ˜μ •μ±… λ£° ν™œμ„±ν™”/λΉ„ν™œμ„±ν™”

μš΄μ˜μ •μ±… λ£° 쑰회 캑처

μš΄μ˜μ •μ±… λ£° 쑰회


9-3. κ²€μˆ˜ 둜그 쑰회 API

GET /api/ops/moderation-logs?limit=50&offset=0

κ²€μˆ˜ 둜그 쑰회 캑처

κ²€μˆ˜ 둜그 쑰회


10. Redis 캐싱 μ „λž΅

동일 μ½˜ν…μΈ μ— λŒ€ν•œ 반볡 κ²€μˆ˜ μš”μ²­μ€ Redis μΊμ‹œλ₯Ό 톡해 DB λ£° μ‘°νšŒμ™€ μœ„ν—˜ 점수 계산을 μƒλž΅ν•©λ‹ˆλ‹€.

ν•­λͺ© λ‚΄μš©
Hash Source title + content + price + category
Hash Algorithm SHA-256
Redis Key moderation:content:{contentHash}
TTL 5λΆ„
Cache Hit λ£° 계산과 DB 쑰회 μƒλž΅
Cache Miss DB λ£° 기반 κ²€μˆ˜ ν›„ Redis μ €μž₯

Redis μΊμ‹œ Key μ˜ˆμ‹œ

moderation:content:3f1e9b3f2a2c9a...

Redis μΊμ‹œ 캑처

Redis CLI λ˜λŠ” RedisInsightμ—μ„œ keyκ°€ μ €μž₯된 화면을 μΊ‘μ²˜ν•©λ‹ˆλ‹€.

Redis μΊμ‹œ ν‚€


11. μ‹€ν–‰ 방법

docker compose up --build

μ•± μ»¨ν…Œμ΄λ„ˆ μ‹œμž‘ μ‹œ Alembic migration을 μ μš©ν•˜κ³  초기 seed rule을 μ €μž₯ν•©λ‹ˆλ‹€.

Docker μ‹€ν–‰ 캑처

Docker Compose μ‹€ν–‰


12. ν…ŒμŠ€νŠΈ 방법

python -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt
pytest

ν…ŒμŠ€νŠΈλŠ” SQLite와 fake Redisλ₯Ό μ‚¬μš©ν•΄ μ™ΈλΆ€ μ„œλΉ„μŠ€ 없이 μ‹€ν–‰λ©λ‹ˆλ‹€.

ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€

ν…ŒμŠ€νŠΈ κΈ°λŒ€ κ²°κ³Ό
정상 κ²Œμ‹œκΈ€ ALLOW
μ„ μž…κΈˆ 포함 κ²Œμ‹œκΈ€ REVIEW
μ„ μž…κΈˆ + 카톑 + κ³„μ’Œ 포함 κ²Œμ‹œκΈ€ BLOCK λ˜λŠ” 기쀀에 λ§žλŠ” κ³ μœ„ν—˜ νŒμ •
λΆˆλ²• ν‚€μ›Œλ“œ 포함 κ²Œμ‹œκΈ€ BLOCK
동일 μ½˜ν…μΈ  μž¬μš”μ²­ Redis μΊμ‹œ μ‚¬μš©

pytest 결과 캑처

pytest κ²°κ³Ό


13. DB μ €μž₯ κ²°κ³Ό

κ²€μˆ˜ κ²°κ³ΌλŠ” moderation_logs ν…Œμ΄λΈ”μ— μ €μž₯λ©λ‹ˆλ‹€.
이λ₯Ό 톡해 μš΄μ˜μžλŠ” μ–΄λ–€ κ²Œμ‹œκΈ€μ΄ μ–΄λ–€ 룰에 μ˜ν•΄ κ²€μˆ˜λ˜μ—ˆλŠ”μ§€ 확인할 수 μžˆμŠ΅λ‹ˆλ‹€.

moderation_logs 캑처

moderation_logs ν…Œμ΄λΈ”

moderation_rules 캑처

moderation_rules ν…Œμ΄λΈ”


14. 검증 κ²°κ³Ό

μ•„λž˜ μˆ˜μΉ˜λŠ” μ‹€μ œ μ‹€ν–‰ κ²°κ³Όλ₯Ό λ„£λŠ” μ˜μ—­μž…λ‹ˆλ‹€.
μ‹€μ œ μΈ‘μ • μ „μ—λŠ” μž„μ˜ 수치λ₯Ό λ„£μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

검증 ν•­λͺ© κ²°κ³Ό
Docker Compose μ‹€ν–‰ 성곡
Swagger μ ‘κ·Ό 성곡
μ½˜ν…μΈ  κ²€μˆ˜ API 성곡
μš΄μ˜μ •μ±… λ£° 등둝/쑰회/μˆ˜μ • 성곡
κ²€μˆ˜ 둜그 μ €μž₯ 성곡
Redis μΊμ‹œ μ €μž₯ 성곡
pytest 톡과 성곡

검증 캑처 λͺ¨μŒ

캑처 파일 경둜
Swagger λ¬Έμ„œ docs/images/swagger-docs.png
κ²€μˆ˜ API 응닡 docs/images/moderation-check-response.png
μš΄μ˜μ •μ±… λ£° 쑰회 docs/images/rules-list-response.png
κ²€μˆ˜ 둜그 API docs/images/moderation-logs-response.png
PostgreSQL 둜그 ν…Œμ΄λΈ” docs/images/moderation-logs-db.png
Redis μΊμ‹œ ν‚€ docs/images/redis-cache-key.png
pytest κ²°κ³Ό docs/images/pytest-result.png
Docker μ‹€ν–‰ docs/images/docker-compose-up.png

15. λ‹Ήκ·Ό μš΄μ˜κ°œλ°œνŒ€ JDμ™€μ˜ 연결점

λ‹Ήκ·Ό μš΄μ˜κ°œλ°œνŒ€ μš”κ΅¬ ν”„λ‘œμ νŠΈ μ—°κ²°
운영 μžλ™ν™” μš΄μ˜μ •μ±… λ£° 기반 μžλ™ κ²€μˆ˜ API
슀팸/사기/μ–΄λ·°μ§• 탐지 μœ„ν—˜ ν‚€μ›Œλ“œ 기반 점수 계산
κ±΄κ°•ν•œ μ½˜ν…μΈ  도달 ALLOW, REVIEW, BLOCK νŒμ •
λŒ€μš©λŸ‰ νŠΈλž˜ν”½ κ³ λ € Redis μΊμ‹±μœΌλ‘œ 동일 μ½˜ν…μΈ  μž¬κ²€μˆ˜ λΉ„μš© κ°μ†Œ
DB/μΊμ‹œ 이해 PostgreSQL, Redis ν™œμš©
AI 관심 및 ν™•μž₯μ„± pgvector, AI 보쑰 νŒλ‹¨ ν™•μž₯ ꡬ쑰 μ œμ‹œ
운영 νŒλ‹¨ κ·Όκ±° matchedRules, reason, moderation_logs μ €μž₯

16. ν™•μž₯ λ°©ν–₯

16-1. pgvector 기반 μœ μ‚¬ μœ„ν—˜ 문ꡬ 탐지

ν˜„μž¬λŠ” ν‚€μ›Œλ“œ 기반 κ²€μˆ˜ λ°©μ‹μž…λ‹ˆλ‹€.
μΆ”ν›„μ—λŠ” pgvectorλ₯Ό ν™œμš©ν•΄ κΈ°μ‘΄ μœ„ν—˜ 문ꡬ와 μœ μ‚¬ν•œ ν‘œν˜„λ„ 탐지할 수 μžˆμŠ΅λ‹ˆλ‹€.

μ˜ˆμ‹œ:

κΈ°μ‘΄ μœ„ν—˜ 문ꡬ 우회 ν‘œν˜„
μ„ μž…κΈˆν•˜λ©΄ λ³΄λ‚΄λ“œλ¦΄κ²Œμš” λ¨Όμ € λ³΄λ‚΄μ£Όμ‹œλ©΄ 택배 μ ‘μˆ˜ν• κ²Œμš”
카톑 μ£Όμ„Έμš” γ…‹γ…Œ μ£Όμ„Έμš”
κ³„μ’Œλ‘œ λ³΄λ‚΄μ£Όμ„Έμš” γ„±γ…ˆλ‘œ λ³΄λ‚΄μ£Όμ„Έμš”

16-2. AI 보쑰 νŒλ‹¨

λͺ¨λ“  κ²Œμ‹œκΈ€μ„ AI둜 νŒλ‹¨ν•˜λ©΄ λΉ„μš©κ³Ό 응닡 μ‹œκ°„μ΄ 증가할 수 μžˆμŠ΅λ‹ˆλ‹€.
λ”°λΌμ„œ REVIEW νŒμ • κ²Œμ‹œκΈ€λ§Œ AI 보쑰 νŒλ‹¨ λŒ€μƒμœΌλ‘œ λ„˜κΈ°λŠ” λ°©μ‹μœΌλ‘œ ν™•μž₯ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

ALLOW β†’ μ¦‰μ‹œ 톡과
REVIEW β†’ AI 보쑰 νŒλ‹¨ λ˜λŠ” 운영자 κ²€μˆ˜
BLOCK β†’ 차단 λ˜λŠ” κ°•ν•œ κ²€μˆ˜ 큐 등둝

16-3. μ‹ κ³  μ‹œμŠ€ν…œ 연동

μ‚¬μš©μž μ‹ κ³ κ°€ λ“€μ–΄μ˜€λ©΄ κΈ°μ‘΄ κ²€μˆ˜ λ‘œκ·Έμ™€ μ—°κ²°ν•΄ 운영자 κ²€μˆ˜ μš°μ„ μˆœμœ„λ₯Ό 높일 수 μžˆμŠ΅λ‹ˆλ‹€.

μ‚¬μš©μž μ‹ κ³ 
β†’ κΈ°μ‘΄ moderation_log 쑰회
β†’ μœ„ν—˜ 점수 μž¬κ³„μ‚°
β†’ 운영자 κ²€μˆ˜ 큐 등둝

16-4. Slack/Discord μž₯μ•  μ•Œλ¦Ό

κ²€μˆ˜ API μž₯μ• λ‚˜ 비정상적인 BLOCK 급증 상황을 운영 μ±„λ„λ‘œ μ•Œλ¦΄ 수 μžˆμŠ΅λ‹ˆλ‹€.

쑰건 μ•Œλ¦Ό
API μ‹€νŒ¨μœ¨ 증가 μž₯μ•  μ•Œλ¦Ό
p95 응닡 μ‹œκ°„ 증가 μ„±λŠ₯ μ €ν•˜ μ•Œλ¦Ό
BLOCK νŒμ • 급증 이상 νŒ¨ν„΄ μ•Œλ¦Ό

16-5. 운영자 κ΄€λ¦¬μž ν™”λ©΄

μš΄μ˜μžκ°€ 직접 룰을 등둝/μˆ˜μ •/λΉ„ν™œμ„±ν™”ν•  수 μžˆλŠ” κ΄€λ¦¬μž ν™”λ©΄μœΌλ‘œ ν™•μž₯ν•  수 μžˆμŠ΅λ‹ˆλ‹€.


17. μ£Όμš” curl μ˜ˆμ‹œ

μ½˜ν…μΈ  κ²€μˆ˜

curl -X POST http://localhost:8000/api/moderations/check \
  -H "Content-Type: application/json" \
  -d '{
    "userId": 1,
    "title": "아이폰 μ‹Έκ²Œ νŒλ‹ˆλ‹€",
    "content": "μ„ μž…κΈˆν•˜λ©΄ 택배 λ³΄λ‚΄λ“œλ €μš”. 카톑 μ£Όμ„Έμš”.",
    "price": 100000,
    "category": "DIGITAL"
  }'

μš΄μ˜μ •μ±… λ£° 쑰회

curl http://localhost:8000/api/ops/rules

μš΄μ˜μ •μ±… λ£° 등둝

curl -X POST http://localhost:8000/api/ops/rules \
  -H "Content-Type: application/json" \
  -d '{
    "ruleName": "WIRE_TRANSFER_KEYWORD",
    "keyword": "μ†‘κΈˆ",
    "score": 30,
    "action": "REVIEW",
    "category": "FRAUD",
    "enabled": true
  }'

μš΄μ˜μ •μ±… λ£° λΉ„ν™œμ„±ν™”

curl -X PATCH http://localhost:8000/api/ops/rules/1/status \
  -H "Content-Type: application/json" \
  -d '{"enabled": false}'

κ²€μˆ˜ 둜그 쑰회

curl "http://localhost:8000/api/ops/moderation-logs?limit=20&offset=0"

18. ν”„λ‘œμ νŠΈ 의의

이 ν”„λ‘œμ νŠΈλŠ” λ‹¨μˆœν•œ ν‚€μ›Œλ“œ 필터링이 μ•„λ‹ˆλΌ, μš΄μ˜μ •μ±…μ„ λ°μ΄ν„°ν™”ν•˜κ³  μžλ™ν™”ν•˜λŠ” λ°±μ—”λ“œ ꡬ쑰λ₯Ό κ΅¬ν˜„ν•œ ν”„λ‘œμ νŠΈμž…λ‹ˆλ‹€.

μš΄μ˜μžλŠ” 룰을 직접 μΆ”κ°€ν•˜κ±°λ‚˜ λΉ„ν™œμ„±ν™”ν•  수 있고, κ²€μˆ˜ κ²°κ³ΌλŠ” 둜그둜 μ €μž₯λ˜μ–΄ 사후 뢄석이 κ°€λŠ₯ν•©λ‹ˆλ‹€. λ˜ν•œ Redis 캐싱을 톡해 반볡 μš”μ²­ λΉ„μš©μ„ μ€„μ˜€μœΌλ©°, μΆ”ν›„ pgvector 기반 μœ μ‚¬ 문ꡬ 탐지, AI 보쑰 νŒλ‹¨, μ‹ κ³  μ‹œμŠ€ν…œ, μž₯μ•  μ•Œλ¦ΌμœΌλ‘œ ν™•μž₯ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

About

πŸ₯• μ‚¬μš©μžκ°€ μž‘μ„±ν•œ κ²Œμ‹œκΈ€μ„ μš΄μ˜μ •μ±… λ£° 기반으둜 μžλ™ κ²€μˆ˜ν•˜κ³ , 슀팸/사기/μ–΄λ·°μ§• μœ„ν—˜λ„λ₯Ό 계산해 ALLOW, REVIEW, BLOCK 쀑 ν•˜λ‚˜λ‘œ νŒμ •ν•©λ‹ˆλ‹€.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors