3.4 内容审核:CI 安全扫描接入

场景:合规不是可选项

网盘一旦开放分享,用户传的内容就可能流向第三方,监管就把责任压到你头上。等到监管部门找上门,工作就难做了。我们的系统虽然只是团队内部用,但曾有外部协作者上传了一批来历不明的图片,吓得我们当周就上了审核,合规底线不能赌。

CI 的内容审核覆盖图片、视频、文本与文档,能识别违禁内容、敏感人物、广告二维码等。相比自建审核模型或人工抽审,它最大的优点是接进来就能用,且按调用计费,对小项目毫无门槛。

方案:审核时机与处置

审核可以在文件生命周期的两个点做,各有适用:

审核点 延迟 适用 我们采用
上传时同步审 增加数秒 强实时要求 少量走
上传后异步审 秒级异步 主流场景 主力

异步路线对用户无感,配合回调完成处置。审核结果的处置分档,别一刀切:

结果 处置
通过 正常放行
疑似 人工复核队列
违规 屏蔽并通知上传者

同步审看似美好,实际体验差且成本高。异步审多了个时差窗口,这期间文件已可被访问。我们对高风险类内容(如分享给外部的文件)前置强制审,必须审完才可分享,其余异步审,风险与体验两全。

配置:触发审核与处理回调

CI 的审核触发与图片处理一样可以走 URL 参数或任务接口。我们走的是 SCF 异步任务,上传完成后由事件触发:

// 由 SCF 函数调用 CI 审核接口
resp := ci.ImageAuditing(ctx, ci.AuditingJob{
    InputObject: key,
    DetectType:  "porn,ads,politics", // 按需勾选类型
})
// 结果写入元数据,违规时屏蔽下载与分享
if resp.Result == "Block" {
    meta.MarkBlocked(ctx, key)
}

审核结果的消费靠回调与状态查询双保险。审核通过走正常流程,疑似项进人工队列。这里多句嘴:审核结论如果是疑似,最好在前端打上待复核标签,而不是直接展示,让团队成员协助一起判断,人工复核的成本其实远低于误判造成的麻烦。

踩坑:审核的四个坑

第一个坑,误判率不低。设计稿里大面积肤色配色被误判是常见误会。我们的规则是疑似项一律人工确认,机器只做初筛,终审权留给人。误杀一张正常的图事小,把正常图全屏到列表上才叫事故。

第二个坑,审核是按调用收费的。上传量大时费用可观,不必对重复秒传的文件重复审,指纹级缓存审核结论,省下的钱够请团队喝奶茶。同时也避免对纯文本类低风险内容开全项检测,按文件类型勾选检测能力。

第三个坑,审核本身会失败。接口超时、配额耗尽、不支持的格式都会返回异常,必须有重试与兜底。审核失败的文件默认不可分享,等重试结论,宁可慢一步不可漏一个。

第四个坑,合规要求会变。某段时间新增了针对二维码的管控,存量文件要全部重审。我们的审核结论带版本号,规则升级时按版本号重跑,自动覆盖历史数据。上一个版本审核通过的旧文件不代表新规下通过,合规系统必须有重审能力。 再补几条运营层面的经验。审核结论的缓存做了指纹级,同内容不重复送审,直接复用结论,每月省下约三成的审核调用。同时注意缓存失效:CI 模型升级后历史结论应作废,我们带版本号标记结论,模型大改时整体重跑。

人工复核工具是自己花一天写的小网页:疑似文件列表、点击放大、一键通过或屏蔽、统计误判率。这个工具投资回报极高,它让团队任何人都能花五分钟参与复核,而不是依赖某个工程师的数据库操作。

环节 工具 效果
初筛 CI 自动 覆盖全部新文件
复核 自建工具 误判纠正率 12%
终审 管理员 每周看一次统计

误判率的数据值得贴出来让大家有预期:我们的疑似项里约 12% 最终被人工判为正常,大部分是设计稿的大色块或纹身类的敏感特征。没有人工兜底,这些文件会被静默屏蔽,用户发现时信任已经受损。机器审核的定位是过滤器不是法官。

合规清单也要随业务变化更新。接外部协作之后我们新增了二维码与文字敏感词检测,因为外部内容风险结构完全不同。每次出新的分享场景,先问一句审核覆盖了没有,再问功能行不行。把合规检查写进上线清单,而不是上线后想起来。

最后一段交底:内容审核这件事做到 80 分很容易(接 CI 即可),做到 90 分要靠运营(人工复核与误判治理),我们基本停在 85 分,剩下 15 分是律师也答不出的灰色地带。遇到拿不准的内容一律人工,宁可慢不可错,监管的罚单不是开玩笑的。 再补几条审核系统的边角设计。文本审核别忽略,网盘里传文本的场景不多,但分享备注、提取码提示这类用户输入都算内容。我们把这些零散文本都送审,逻辑共用一个网关,几十行代码就把最大的敞口堵住了。

告警联动值得做。审核发现违规时除了屏蔽文件,还给管理员发企业微信通知,附上文件链接与审核结论截图。半夜被叫醒是辛苦,但总比两周后看到监管函强。告警分级也要克制,全 Block 才打电话,疑似项只发群消息,否则天天喊狼来了没人看。

审核系统也要有降级。CI 审核接口偶尔抖动,超时直接降级为待审状态而非拒绝,文件先隔离起来等系统恢复。宁可让用户多等几小时,也不能把正常文件错误屏蔽。降级设计心里要有一杆秤:挂了的时候系统偏向安全还是偏向可用,没有标准答案,但必须有意选择。

合规方面还有一件事要交底。我们请法务出过一份用户协议,明确说明用户上传内容的责任归属与平台审核义务,并注明审核范围与时效。这份文件的成本不高,但在几次纠纷里是唯一的护身符。做内容平台,法务与代码同等重要,这一课希望大家永远用不上。

最后给一段心路总结。做审核之前我觉得这是政工功能,做之后才明白它是产品信用的地基。用户愿意把数据放在你的网盘里,前提是相信这里干净。这份信任每一分都来自这种看不见的功能,而不是 LOGO 多大、弹窗多炫。 审核与分享体系要联动。被屏蔽的文件不仅下载拦截,分享链接也要自动失效,不能出现文件被审掉了链接还在满天飞的情况。我们的做法是分享打开时实时查文件状态,多一次查询换确定性。性能靠短缓存兜住,状态频繁变动的场景缓存时间设十秒即可。

再讲讲审核结论可以被用户挑战这件事。用户对屏蔽结果不认同时可以发起一次人工复审。起初怕被刷量,后来发现复审请求极少,每个月个位数,全都是我们的误判。这说明两件事:CI 审核的基线是准的,我们的误判治理是有效的。给用户一个反馈出口,比静默驳回强。

对审核体系的终极建议是做年度健康检查。每年过一遍全年违规样例分布、误判率趋势、新模型能力,顺便看看规则的覆盖面有没有漏。合规体系像免疫系统,需要定期接种更新,否则新形态的内容总能找到空子。 审核的事最后一句嘱托:规则文档化。我们的审核规则、处置方式、误判治理都写在 wiki 上,新同事一周就能独立处理疑似件。没有文档的系统只能靠人肉传承,离职季就是故障季。 再分享一个真实数字。审核上线一年,累计送审约 300 万次,自动判定违规 0.3%,人工纠偏 0.04%,最终确认违规 0.26%。这个比例告诉我们绝大多数用户都是守规矩的,审核系统的真正价值是兜住那 0.26% 与让守规矩的人放心。

给小型团队的一句话建议:别被合规两个字吓住,CI 审核的接入门槛比想象中低太多。配上人工复审与规则文档,一个小团队也能有企业级的合规水位。难的不是技术,是开始做。 审核系统的灰度发布也要提一句。新规则上线先对小范围用户开放,观察误判率三天再全量。规则改动的影响面很大,贸然全量会误伤一批正常文件,用户的信任修不回来。灰度不是大项目的专利,小系统更该用,因为修复能力弱。 最后提醒一下审核接入的位置:放在 SCF 里而非后端接口里同步等待。同步等审核结果会让上传接口慢好几秒甚至超时,异步处理对用户最友好。后端只管把文件标记为待审,审核完由 SCF 回写状态,职责清晰不阻塞,这套时序在 5.1 有完整示例。

审核结论我们做了缓存,同一文件指纹命中缓存直接复用,审核调用量降了四成。缓存有效期设为七天,文件被修改则指纹变化自动重审。这个改动很小,但每个月账单上的数字肉眼可见地小了一圈。

误判处理流程我们跑顺了:用户申诉进工单,人工复核,确认误判则加白名单并回滚处理。整套流程平均两小时闭环,用户的信任感就这么一点点攒起来。

审核合规的一票否决权我们写进了系统设计:哪怕命中率再高、速度再快,审核不过的文件绝不许进入分享链路。这个原则执行得越严格,团队晚上睡得越踏实。

审核日志单独建库存档,每条结论带样本与判定依据。有次平台要求提供半年前某文件的处理证明,我们十分钟就调出了完整记录。合规的底气,是日志给的。

给内容运营的审核看板我们也建了。可处理队列、申诉列表、误判统计一目了然,运营同学不用再来找技术要数据。工具齐活了,协作才顺。

小结

审核是网盘的体检科:平时不显眼,出事就是大事。接入 CI 只需一两天,体系化运营(误判处理、结论缓存、重审机制)才是真正的功课。我们上线审核后,疑似违规量稳定下降,更重要的是团队对分享这件事有了底气。

延伸阅读