一句话总结
群聊审核不是"调用一个模型"这么简单--它是一个多层决策系统,需要平衡延迟, 准确率, 成本和用户体验.
本篇把前面所有知识点串成一个完整的生产级架构.
前置回顾
前两篇搞定了推理服务(第 16 篇)和 Go 集成(第 17 篇).
现在退后一步,看全局:一条群消息从进入到被放行或拦截,整条链路怎么设计?
系统全景
|
每一层都是过滤器. 越上层越快越便宜,越下层越准越贵. 设计目标:让 90% 的消息在前两层就完成判断.
Layer 1: 规则引擎
规则引擎是第一道防线,命中即决策,不走模型:
|
规则引擎的局限
规则引擎只能处理已知模式. 对于"这个群主真是个人才呢"(阴阳怪气), "来 W 我主页有好康的"(变体广告),规则无能为力. 这些需要模型理解语义.
Layer 2: 小模型快判
小模型(DistilBERT 级别)负责处理规则引擎漏过的消息. 目标: p99 延迟 < 30ms.
|
决策逻辑
|
多模型并发 = 体检的不同科室. 去医院体检不是一个医生看全科,而是内科, 外科, 眼科并行检查,最后汇总报告. 同理,情感, 意图, 毒性三个"科室"同时看一条消息,再由决策逻辑汇总判断.
Layer 3: LLM 深度判断
当小模型不确定时(置信度在灰色地带),调用 LLM 做更深入的语义分析:
|
LLM 调用的成本控制
LLM 调用成本比小模型高 100-1000 倍. 必须严格控制进入 Layer 3 的流量:
- 只有小模型不确定的消息才走 LLM(预计 < 5% 流量)
- 设置每分钟 LLM 调用量上限
- LLM 超时(>2s)直接走人工复审,不等待
Layer 4: 人工复审
所有层都无法确定的消息进入人工队列:
|
主调度器:串联四层
|
监控指标
核心指标
| 指标 | 含义 | 告警阈值 |
|---|---|---|
moderation_latency_p99 |
审核延迟 p99 | > 50ms(同步部分) |
moderation_accuracy |
模型准确率(通过人工标注验证) | < 95% |
false_positive_rate |
误封率(正常消息被拦截) | > 1% |
false_negative_rate |
漏放率(违规消息被放行) | > 5% |
model_qps |
推理服务 QPS | 接近容量上限 80% |
llm_escalation_rate |
进入 LLM 层的比例 | > 10% |
review_queue_depth |
人工复审队列深度 | > 1000 |
Prometheus 指标埋点
|
A/B 测试:模型版本对比
上线新模型时,不能直接全量替换. 用 A/B 测试验证效果:
|
A/B 测试观察周期内需要对比的指标:
|
优雅降级
当推理服务不可用时,系统不能完全停摆:
|
降级不能沉默
进入降级模式时必须触发告警. 否则模型服务挂了几个小时,违规消息一直在放行,没人知道.
降级告警 + 定时恢复探测,是生产必备.
生产注意事项
先放行后撤回的风险
LLM 异步审核意味着违规消息会短暂展示(200ms-2s). 对于极端违规内容(如暴力恐怖),这不可接受. 解决方案:对高风险关键词(哪怕模型不确定)先拦截再审核,宁可误伤不可漏放.
上下文窗口
单条消息看起来无害,结合上下文才能判断(如"+1"本身无害,但如果前一条是赌博广告,"+1"就是参与). LLM 层需要传入前后 N 条消息. 但上下文太长会增加延迟和成本,推荐 5-10 条.
快速回顾
- 四层架构: 规则(快) → 小模型(准) → LLM(深) → 人工(兜底), 逐层过滤
- 90% 在前两层解决: 规则引擎 + 小模型覆盖绝大多数场景
- 异步 LLM: 灰色消息先放行后撤回,平衡用户体验和审核准确度
- A/B 测试: 按群 hash 分流,同群同版本,观察指标对比后全量
- 优雅降级: 模型挂了不等于系统挂了,规则引擎兜底 + 告警
- 监控为王: 延迟, 准确率, 误封率, 漏放率, 队列深度,缺一不可
动手练习
- 实现主调度器: 完成
Moderator.CheckMessage的完整逻辑,包含四层调用 - 并发模型调用: 用
errgroup并发调用三个模型,测量相比串行调用的延迟提升 - 熔断器: 实现一个简单的熔断器,连续 5 次推理失败后进入降级模式,30 秒后自动恢复探测
- A/B 路由: 实现按 group_id hash 分流逻辑,验证分布均匀性
- 指标埋点: 接入 Prometheus,用 Grafana 展示审核延迟分布和各层决策比例
- 降级演练: 手动停止推理服务,验证系统自动切换到降级模式并触发告警