内容审核是任何 UGC 平台的「合规生命线」:用户每发一条文本、一张图片、一段视频,平台都要在「不放过违规内容(不漏杀)」与「不错伤正常内容(不误杀)」之间取得平衡,同时满足实时性与人工兜底的成本约束。本文按照系统设计面试的标准答题结构,设计一个覆盖文本、图片、视频多模态的内容审核系统。
一句话:内容审核是「机器打底 + 人审兜底 + 状态机流转」的流水线——AI 模型负责召回可疑内容,人工负责对可疑内容做最终裁决,一切以审核状态机为准。
一、需求澄清与量级估算
1.1 需求澄清
面试官给出题目「设计一个内容审核系统」后,先通过提问明确边界:
- 内容形态:文本(评论/帖子/私信)、图片、视频(含音频)是否都要支持?
- 违规类型:涉政、色情、暴恐、广告引流、谩骂人身攻击、未成年人相关,覆盖哪些?
- 审核模式:先发后审(异步)、先审后发(同步)、抽审,各自在哪些场景用?
- 人工兜底:机器拿不准的内容是否进人审队列?人审如何工单化?
- 反馈闭环:用户举报、误伤申诉如何回流到模型与规则?
- 合规要求:审核记录留存、审计追溯、不同国家地区差异化策略?
明确假设(面向面试的合理假设):
| 需求项 | 假设 |
|---|---|
| 内容形态 | 文本、图片、视频三类,音频暂不做帧级 |
| 违规类型 | 涉政、色情、暴恐、广告、谩骂五大类 |
| 审核模式 | 文本先发后审;图片视频先审后发(违规风险高) |
| 人审 | 机器置信度不足的内容进入人审队列 |
| 反馈 | 举报 + 申诉闭环,周级回流优化模型 |
| 合规 | 全量审核记录留痕,支持审计回溯 |
1.2 量级估算
| 指标 | 估算值 | 推导 |
|---|---|---|
| 日新增内容 | 文本 5 亿条 / 图片 1 亿张 / 视频 2000 万段 | UGC 平台假设 |
| 审核峰值 | ~15 万条/秒 | 晚高峰发帖洪峰 |
| 视频平均时长 | 30 秒 | 帧级审核需抽帧 |
| 需要人审比例 | 5~10% | 机器置信度不足的部分 |
| 人审时效 | 分钟级 | 先审后发场景需可接受延迟 |
| 审核记录 | 数十亿/日 | 每次审核一条记录 |
一句话:5 亿文本/日 + 15 万条每秒峰值,决定了机器审核必须全异步流水线化;视频帧级审核是计算量最大的环节,必须抽帧而非逐帧全审。
二、高层架构设计
┌──────────────────────────────┐ ┌──────────────────────────┐
│ 内容生产方(App/Web/小程序) │ │ 人工审核员(审核平台) │
│ 发文本/图片/视频 → 进入审核 │ │ 工单队列 → 裁决 → 回流 │
└──────────────┬───────────────┘ └──────────┬───────────────┘
│ 内容提交(写后审/审后发) │
┌──────────────▼──────────────────────────────▼──────────────┐
│ 审核接入层(网关) │
│ 鉴权/限流/幂等(同一内容不重复入审) │
└──────────────┬──────────────────────────────▲──────────────┘
│ 入审 裁决结果 │ 回流
┌──────────────▼──────────────────────────────┴──────────────┐
│ 审核流水线(异步队列驱动) │
│ ┌────────────┐ ┌────────────┐ ┌────────────┐ ┌────────┐ │
│ │ 文本审核 │ │ 图片审核 │ │ 视频审核 │ │ 聚合 │ │
│ │ 敏感词/模型 │ │ OCR/图像模型│ │ 抽帧+图像+ │ │ 裁决 │ │
│ │ 语义/变体 │ │ NSFW/违禁 │ │ 音频转文字 │ │ 服务 │ │
│ └────────────┘ └────────────┘ └────────────┘ └────────┘ │
│ 规则引擎(命中即定级) AI 模型(置信度+可解释标签) │
└──────────────┬──────────────────────────────▲──────────────┘
│ 判定结果(通过/拦截/待人工) │ 人审裁决
┌──────────────▼──────────────────────────────┴──────────────┐
│ 审核状态机 + 落库 │
│ 审核记录(审计) / 内容状态(待审/通过/拦截/待裁决) │
└──────────────────────────┬───────────────────────────────────┘
│ 触达:通知作者、下架/屏蔽内容
整体拆为五个模块:
- 接入层:内容提交入口,幂等去重,避免同一内容重复审核。
- 审核流水线:文本/图片/视频三条并行的异步审核通道,规则引擎 + AI 模型分级。
- 聚合裁决:多维度(文本 + 图片 + 音频)审核结果聚合,产出最终判定。
- 状态机与落库:内容审核状态流转,审核记录审计留痕。
- 人审平台:工单队列、裁决操作、规则与模型的回流闭环。
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 平台不得不做、但可以做得优雅的系统。
继续阅读
探索更多技术文章
浏览归档,发现更多关于系统设计、工具链和工程实践的内容。