设计一个内容审核系统

本文系统设计一个覆盖文本/图片/视频的内容审核系统:多模态审核流水线(文本敏感词/图片/视频帧级审核)、AI 模型 + 规则引擎的分级审核、人审兜底与工单流转、审核状态机、异步队列削峰、误杀与漏杀权衡、举报反馈闭环,并给出架构图、数据表、流水线伪代码与量级估算。

内容审核是任何 UGC 平台的「合规生命线」:用户每发一条文本、一张图片、一段视频,平台都要在「不放过违规内容(不漏杀)」与「不错伤正常内容(不误杀)」之间取得平衡,同时满足实时性与人工兜底的成本约束。本文按照系统设计面试的标准答题结构,设计一个覆盖文本、图片、视频多模态的内容审核系统。

一句话:内容审核是「机器打底 + 人审兜底 + 状态机流转」的流水线——AI 模型负责召回可疑内容,人工负责对可疑内容做最终裁决,一切以审核状态机为准。

一、需求澄清与量级估算

1.1 需求澄清

面试官给出题目「设计一个内容审核系统」后,先通过提问明确边界:

  • 内容形态:文本(评论/帖子/私信)、图片、视频(含音频)是否都要支持?
  • 违规类型:涉政、色情、暴恐、广告引流、谩骂人身攻击、未成年人相关,覆盖哪些?
  • 审核模式:先发后审(异步)、先审后发(同步)、抽审,各自在哪些场景用?
  • 人工兜底:机器拿不准的内容是否进人审队列?人审如何工单化?
  • 反馈闭环:用户举报、误伤申诉如何回流到模型与规则?
  • 合规要求:审核记录留存、审计追溯、不同国家地区差异化策略?

明确假设(面向面试的合理假设):

需求项假设
内容形态文本、图片、视频三类,音频暂不做帧级
违规类型涉政、色情、暴恐、广告、谩骂五大类
审核模式文本先发后审;图片视频先审后发(违规风险高)
人审机器置信度不足的内容进入人审队列
反馈举报 + 申诉闭环,周级回流优化模型
合规全量审核记录留痕,支持审计回溯

1.2 量级估算

指标估算值推导
日新增内容文本 5 亿条 / 图片 1 亿张 / 视频 2000 万段UGC 平台假设
审核峰值~15 万条/秒晚高峰发帖洪峰
视频平均时长30 秒帧级审核需抽帧
需要人审比例5~10%机器置信度不足的部分
人审时效分钟级先审后发场景需可接受延迟
审核记录数十亿/日每次审核一条记录

一句话:5 亿文本/日 + 15 万条每秒峰值,决定了机器审核必须全异步流水线化;视频帧级审核是计算量最大的环节,必须抽帧而非逐帧全审。

二、高层架构设计

  ┌──────────────────────────────┐   ┌──────────────────────────┐
  │ 内容生产方(App/Web/小程序)   │   │ 人工审核员(审核平台)     │
  │ 发文本/图片/视频 → 进入审核    │   │ 工单队列 → 裁决 → 回流    │
  └──────────────┬───────────────┘   └──────────┬───────────────┘
                 │ 内容提交(写后审/审后发)       │
  ┌──────────────▼──────────────────────────────▼──────────────┐
  │                    审核接入层(网关)                          │
  │        鉴权/限流/幂等(同一内容不重复入审)                       │
  └──────────────┬──────────────────────────────▲──────────────┘
                 │ 入审                     裁决结果 │ 回流
  ┌──────────────▼──────────────────────────────┴──────────────┐
  │                    审核流水线(异步队列驱动)                     │
  │  ┌────────────┐  ┌────────────┐  ┌────────────┐  ┌────────┐ │
  │  │ 文本审核    │  │ 图片审核    │  │ 视频审核    │  │ 聚合    │ │
  │  │ 敏感词/模型 │  │ OCR/图像模型│  │ 抽帧+图像+  │  │ 裁决    │ │
  │  │ 语义/变体   │  │ NSFW/违禁  │  │ 音频转文字   │  │ 服务    │ │
  │  └────────────┘  └────────────┘  └────────────┘  └────────┘ │
  │       规则引擎(命中即定级)    AI 模型(置信度+可解释标签)      │
  └──────────────┬──────────────────────────────▲──────────────┘
                 │ 判定结果(通过/拦截/待人工)     │ 人审裁决
  ┌──────────────▼──────────────────────────────┴──────────────┐
  │                     审核状态机 + 落库                         │
  │       审核记录(审计) / 内容状态(待审/通过/拦截/待裁决)         │
  └──────────────────────────┬───────────────────────────────────┘
                             │ 触达:通知作者、下架/屏蔽内容

整体拆为五个模块:

  1. 接入层:内容提交入口,幂等去重,避免同一内容重复审核。
  2. 审核流水线:文本/图片/视频三条并行的异步审核通道,规则引擎 + AI 模型分级。
  3. 聚合裁决:多维度(文本 + 图片 + 音频)审核结果聚合,产出最终判定。
  4. 状态机与落库:内容审核状态流转,审核记录审计留痕。
  5. 人审平台:工单队列、裁决操作、规则与模型的回流闭环。

2.1 为什么用异步流水线

内容审核天然适合异步:机器模型耗时几十到几百毫秒,视频帧级更久,且需要批处理吞吐。异步化带来三个好处:

① 削峰:晚高峰 15 万条/秒 → MQ 缓冲 → 消费端按通道并行处理
② 分级:先审后发的内容可以等;先发后审的内容流水线追上
③ 可扩展:不同形态(文本/图片/视频)独立扩缩容

一句话:审核是「必做但可排队」的工作,异步流水线让海量内容像工厂流水线一样流过,机器模型按通道分工、人审处理尾部疑难件。

三、核心组件设计

3.1 审核状态机

内容是审核的核心实体,状态机是所有审核动作的骨架:

                          ┌──────────┐
                    ┌────→│  待审核   │────┐
                    │     └──────────┘    │ 提交
                    │                     ▼
              ┌──────────┐          ┌──────────┐
              │ 审核失败  │          │  审核中   │
              │ (重试/死信)│          └────┬─────┘
              └──────────┘               │ 判定
                 ▲                        ▼
                 │               ┌───────────────┐
                 └────失败重试────│ 通过/拦截/待人工 │
                                └──┬────┬────┬──┘
                    通过            │    │    │ 待人工
                    ▼              ▼    ▼    ▼
              ┌──────────┐   ┌──────────┐   ┌────────────┐
              │  已通过   │   │  已拦截   │   │  待人工裁决  │
              └──────────┘   └──────────┘   └─────┬──────┘
                                                  │ 人审
                                                  ▼
                                         ┌───────────────┐
                                         │ 人工通过/拦截/  │
                                         │ 申诉重审(回流)  │
                                         └───────────────┘
CREATE TABLE content_review (
  content_id     BIGINT PRIMARY KEY,
  content_type   TINYINT,        -- 1文本 2图片 3视频
  status         TINYINT,        -- 0待审核 1审核中 2通过 3拦截 4待人工 5申诉中
  machine_labels JSON,           -- 机器判定的违规标签与置信度
  human_verdict  JSON,           -- 人审裁决
  review_stage   INT,            -- 流水线阶段(用于断点续审)
  submit_time    DATETIME,
  finish_time    DATETIME
);

3.2 文本审核流水线

文本审核是「规则打底 + 模型分级」的典型场景:

① 前置清洗:分词、繁简转换、去除特殊字符(抗变体绕过)
② 敏感词命中:敏感词库(精确 + 变体词库,如字符拆解/谐音)
   命中高危词 → 直接拦截;命中中危 → 待模型复核
③ 语义模型:深度学习模型(文本分类/语义相似)给出违规概率与标签
   置信度 > 阈值 → 拦截;< 低阈值 → 通过;中间 → 待人工
④ 变体对抗:新变体绕过(如拼音、缩写)→ 规则库周级更新 + 反馈回流
;; 伪代码:文本分级判定
(defn moderate-text [text]
  (let [hits   (match-sensitive-words text)       ; 规则命中
        result (if (any-high-risk? hits)
                 :block
                 (let [{:keys [prob label]} (semantic-model text)]
                   (cond (>= prob 0.95) :block
                         (<= prob 0.05) :pass
                         :else          :human)))]
    (emit-review result {:machine_labels (conj hits label)})))

要点:文本审核的核心是「分级」而非「一刀切」——规则负责快而准的高危命中,模型负责广覆盖的语义识别,置信度区间交给人工,三方配合控制误杀与漏杀。

3.3 图片与视频审核

图片审核比文本多 OCR 与图像模型两条线;视频审核是计算量最大的,必须抽帧:

图片流水线:
  ① 图像模型:NSFW 检测、违禁物识别、文字水印检测
  ② OCR:提取图中文字 → 交给文本审核(涉政/广告等文字违规)
  ③ 图像指纹:与违规图片库比对(hash 相似度),命中即拦截

视频流水线(抽帧 + 多模态):
  ① 关键帧抽取:按场景切分抽帧(每 2~5 秒一帧,含首帧)
  ② 抽帧图片审核:每帧走图片流水线,单帧命中高危即整段拦截
  ③ 音频转写:转文字 → 文本审核(涉政言论等)
  ④ 聚合:帧级结果取「最高违规级别」作为整段判定

要点:视频不逐帧全审而是「抽帧 + 首帧必审 + 音频转写」三维覆盖,兼顾成本与召回;帧级命中即整段拦截,避免违规片段漏出。

3.4 聚合裁决与异步队列

一条内容可能同时有文本、图片、音频多个维度(如一条带图和标题的动态)。聚合裁决服务把各通道结果合并:

;; 伪代码:多通道聚合裁决
(defn aggregate [results]
  (let [worst  (max-by :severity results)         ; 取最严重判定
        needs-human? (some #{:human} (map :verdict results))]
    (cond needs-human?   (send-to-human worst)     ; 任一待人工 → 整体待人工
          (= :block (:verdict worst)) :block
          :else :pass)))

;; 队列设计:按形态分 topic,消费端按通道并行
;;   topic: review-text / review-image / review-video
;;   每条内容一个 message,聚合服务按 content_id 做窗口合并

幂等与去重:同一 content_id 重复提交(重试/并发)不能产生两次审核记录,用 Redis SETNX + 内容指纹双重幂等。

3.5 人审平台与工单流转

人审是机器置信度不足内容的兜底,也是整个系统准确性的最后防线:

工单生成:机器判定 :human 的内容 → 按风险等级/通道分类进入人审队列
工单流转:待审 → 分配审核员 → 裁决(通过/拦截/转申诉)→ 状态机更新
绩效与质量:人审抽样复核(上级抽检),评估审核员一致性
回流闭环:人审裁决 → 回流训练集 → 周级重训模型 + 更新规则库

四、深入权衡

4.1 误杀 vs 漏杀

偏向结果代价
偏保守(宁杀错)漏杀低、误杀高误伤正常用户、投诉申诉多、创作者流失
偏激进(宁放过)误杀低、漏杀高违规内容漏网、合规风险、监管处罚

权衡结论:用分级策略平衡——高危类型(涉政/色情/暴恐)宁杀错,用高灵敏度;低危类型(广告/谩骂)保体验,走模型 + 人审。误杀的内容通过申诉回流恢复,漏杀的内容通过举报 + 巡检补齐。

4.2 同步审核 vs 异步审核

场景模式原因
评论/弹幕先发后审(异步)体验优先,违规评论事后下架
图片/视频发布先审后发(同步)风险高,需上线前拦截
直播/实时实时抽审无法全审,靠抽帧 + 违规处罚

结论:不同内容形态对「审核时机」要求不同,模式选择本质是体验成本 vs 合规风险的权衡,而不是统一异步或同步。

4.3 规则引擎 vs AI 模型的协同

机制优势短板
规则引擎精确、可解释、即时生效对抗变体跟不上、维护成本高
AI 模型泛化、抗变体、覆盖广有误判、不可完全解释、需数据训练

结论:两者是打底与升级的关系——规则负责可解释的硬边界(合规红线必须可追溯),模型负责柔性的语义扩展,规则命中优先、模型补充召回、人审裁决尾部。

五、总结

内容审核系统的本质是一条多模态异步流水线 + 状态机 + 人审兜底的治理体系。文本走「规则打底 + 语义模型分级」,图片走「图像模型 + OCR + 指纹比对」,视频走「抽帧 + 音频转写 + 整段聚合」,所有维度在聚合裁决服务里合成最终判定;判定通过状态机流转落库留痕,可审计可回溯。工程上,用异步队列削峰、按形态独立扩缩容、分级策略平衡误杀漏杀、人审工单兜底 + 申诉反馈回流,共同保证「高危不放过、正常不误伤、一切可追溯」。这是合规压力下 UGC 平台不得不做、但可以做得优雅的系统。

继续阅读

探索更多技术文章

浏览归档,发现更多关于系统设计、工具链和工程实践的内容。

全部文章 返回首页

「design」更多文章

  1. 设计一个弹幕系统
  2. 设计一个权限系统(RBAC + ABAC)
  3. 设计一个分布式任务调度系统