留言区里的暗语变体:内容风控先收窄结构,再上模型
在出行、本地生活、二手交易这类业务里,除了主流程字段,总会留几处自由文本位:订单留言、补充说明、备注、追评。它们的初衷是服务正常业务——写清货物尺寸、上车点在哪、需要搬几楼。真正的麻烦在于,这类位置同时具备两个特征:产品给的自由度最高,审核给的优先级最低。灰色产业挑口子的时候,挑的正是这个组合,而不是去碰起点终点、金额、账号昵称这些早就被盯死的主字段。
这类事件在公开报道里隔段时间就会出现一次,讨论通常停在”平台审核有漏洞”。工程上的问题要更具体一些:漏洞不是某条规则没写,而是通道本身的存在形态。本篇只讲平台侧怎么发现、怎么把通道收窄、怎么治理与接申诉。

一、先承认一件事:字面匹配一定会失配
任何基于词表的规则,面对的都是”文本长什么样”;而违规内容的判定要素是”这段话想达成什么”。这两者之间隔着一层,变体利用的就是这层缝隙。机制层面的来源大致是这几类,这里只描述类别,不给任何可照做的样例串。
| 变体类别 | 机制层面发生了什么 | 平台侧的归一化方向 |
|---|---|---|
| 音近、形近替换 | 字面串改变,语义不变,词表失配 | 不靠扩词表穷举,转向语义与上下文判定 |
| 拆字与字符插入 | 词的连续性被打断,匹配窗口失效 | 先去分隔再比较,规则层取消”必须连续”假设 |
| 全半角与不可见字符 | 字节不同而视觉相同,同一段文本有多个形态 | 宽度统一、剥离控制与零宽字符后再进入判定 |
| 联系方式改写成需重组的表达 | 目的从”直接可拨”变成”人看一眼能懂” | 不识别具体值,只打”疑似外呼或可添加形态”标签并送审 |
| 文本挪进图片 | 文字脱离文本管道,进入图像 | 图像内文本同样进归一化管道,与文本共用判定层 |
写到这里必须明确一条纪律:具体样例串不能出现在任何文档、培训材料或对外内容里。样例串公开一次,词表与规则就当场作废一轮,而且它会长期在各处复制流传。内部样本库要做访问控制,与文档系统隔离;对外只讲类别与机制,讲清楚”为什么这类形态会被拦”,不讲”怎么让它不被拦”。
二、性价比最高的一步是收窄结构,不是加规则
自由文本位之所以成了通道,根因是它自由。把”一段随便写”改成”几个受约束字段”,能直接消掉大部分需求,而且成本远低于持续堆模型。
- 用预置选项承担主要意图。把留言拆成可枚举的意图标签加一个短文本框,正常业务需求绝大部分能被选项覆盖,剩下的才允许写。
- 设长度与行数上限。真实业务说明通常很短,需要传递引流信息的表达往往冗余;长度本身就是一条有效特征,而且是零成本的。
- 收敛字符集。允许常用汉字、数字和少量标点;外链形态、连续数字串、控制字符与不可见字符在进入判定前先做处理或拒绝。
- 把联系需求收进自家通道。如果业务上确实需要双方通话,正确做法是平台内中转,而不是让用户在文本位互相传递号码——需求是真实的,堵而不疏只会把文本挤向更隐晦的形态。
- 图片位单独治理。默认不允许带图;允许带图的场景走图像文本识别与视觉模型,与文本走同一套判定与留痕。
- 发布前拦截加二次确认。首次命中先给提示并延迟生效,把新账号的第一次尝试当作观察期,比事后全量回查便宜得多。
- 做一次输入位盘点。把系统里所有可写入自由文本的点位列成一张表,含昵称、备注、商品说明、评价追评、工单标题,逐点标注长度、审核策略与生效时机。这张表就是风控的地图,绝大多数疏漏都是”某个点位从来没进过表”。
# 字段级约束示意,字段名按自己系统调整 |
三、检测层怎么搭:四层管道,各吃什么、漏什么
| 层 | 做什么 | 能吃掉什么 | 会漏什么 | 常见错误 |
|---|---|---|---|---|
| 归一化 | 统一宽度、剥离不可见字符、把可疑形态打标签 | 只改了外观的重复模板 | 真正换语义表达的 | 把这层当判定层,只在此处做匹配 |
| 规则与词表 | 已知高危形态的快速命中 | 成熟稳定的类别 | 任何新形态 | 用词表覆盖率考核风控水平 |
| 分类模型 | 结合上下文与意图判定,输出置信度 | 语义未变而字面变化的、短文本歧义的边界样本 | 全新类别(没有正样本) | 拿单条文本孤立打分,不看账号历史 |
| 关系与聚集 | 同一模板在多账号复用,设备、网络、收款与联系通道的聚集 | 团伙化发布:单条看似正常,聚集即异常 | 单账号低频行为 | 只按内容处置,不看关系面 |
四层里最被低估的是第四层。判断一条文本是否属于批量引流,”这条说了什么”往往不如”这段话在多少个账号里出现过、这些账号还共享了什么”来得可靠。文本模板复用次数、账号注册批次、发布时间的聚集度,这些是结构化指标,不依赖语言理解,误杀面也小得多。
短文本还有一个绕不开的问题:同一句短语在正常业务里也可能出现。所以这一层不适合做终态判定,适合做召回,命中之后按置信度分流到延迟生效或人工复核,把最终定性留给能看到完整上下文的复核环节。
四、样本治理与处置分级
模型的上限在标注口径上。口径文档至少要写清三件判定要素:这段话的意图是否超出业务说明、是否存在把联系引到平台外的通道、是否有模板复用迹象。同一句话两个人标的结果不同,模型学到的就是噪声,标注一致性要定期抽检,而不是只在培训时说一次。
其余几条同样决定成败:
- 时效性。类别会从一个输入位迁移到另一个,样本要带采集时间窗,训练时按窗口滚动,不能只靠历史积累。
- 误杀回流。申诉成功的样本必须回到困难负样本池,这是降低误杀最直接的一条通路;不回流就会反复误杀同一类正常表达。
- 类别不平衡。高危内容在真实流量里稀少,阈值要按召回优先设置,再用人工复核兜住精确率,不能反过来。
- 处置分级。拦截、延迟生效观察、限流、降权、人工复核、账号阶梯处置(警告、限权、封禁)是不同强度的手段,选择依据是危害可逆性与判定置信度,而不是内容类型的名词。已经发布的违规内容要连带检查同一账号在其他点位的遗留。
- 申诉链路。一次申诉必须由不同于原处置的复核路径处理,结果要能回滚、要留痕、要能追溯到用了哪条规则或哪个模型版本。申诉量与申诉成功率是核心健康指标:申诉多说明规则解释不清或误杀多,申诉成功率高说明阈值过紧。这两条不达标时,优先怀疑处置强度,而不是怀疑用户。
五、上线前后看什么:只给指标定义
具体数字要看各家业务基数,这里不编造任何比例,只把指标口径定清楚,能算出来才有得谈。
| 指标 | 定义 | 用来判断什么 |
|---|---|---|
| 命中构成 | 各层命中量在总命中中的占比,按层拆分 | 规则层占比过高说明模型没吃到东西 |
| 抽检精确率 | 固定抽样方式下人工复核确认的正确判定比 | 阈值是否过紧,复核负担会落在哪 |
| 申诉率与申诉成功率 | 申诉量除以处置量;申诉后撤销的占申诉量 | 误杀水平与规则可解释性 |
| 漏检发现来源 | 举报、主动复核、外部反馈各占比 | 主动能力还是被动接招 |
| 举报处理时长 | 从举报到处置完成的时间,取分位 | 响应能力,不看均值 |
| 模板复用度 | 同一文本模板在其他输入位的出现次数变化 | 通道是否被堵住还是只是迁移 |
| 复核队列老化 | 队列中最早未处理样本的等待时长 | 有没有积压到”永远不看” |
最后一项尤其重要:处置自动化程度越高,复核队列越容易变成没人看的暗角,而漏检恰恰从那里长出来。
六、中小平台的务实顺序与洹拓视角
预算和人力有限时,顺序应该是:第一步做输入位盘点与字段约束,把长度、字符集、外链与账号形态串管起来,这一步几乎全是产品设计工作;第二步把人工复核与申诉流程跑通,先有一份可执行的口径文档;第三步才是训练模型,而且模型上线时它的角色是召回器,不是判官。跳过前两步直接买模型,是这类项目最常见的失败方式——模型在一个自由文本位上永远追不上文本的变形速度,而一个几十字符的字段上限就能挡掉大量冗余表达。
洹拓科技在工业质检与文本审核这两类工程上反复用到同一条经验:先约束输入的结构,再优化识别的精度。风控不是内容识别这一个算法问题,而是字段规格、数据通路、处置强度、申诉留痕加在一起的系统问题。把留言区当成”一段没人管的长文本”,它就一定会变成通道;把它当成一个有 schema 的接口,绝大多数变形需求在写进来之前就已经不存在了。