传媒资讯分类总出错?7年测试工程师揭秘智能算法提效真相
|
凌晨三点二十,机房空调嗡嗡声突然低了半拍——不是停了,是压缩机喘不上气那种哑掉。我伸手摸了摸冷凝水管道外壁,烫得缩手。值班室泡面桶堆在桌角,汤汁结了层薄膜,上面浮着两粒没化开的葱花。监控屏右下角贴了块黄胶布,盖住去年十二月就裂了的屏线接口,一抖就闪雪花。 我原以为是模型服务崩了。查日志、看指标、连容器终端,都正常。连着看了三遍 inference 的 input pipeline,token 匹配规则全对,label map 也没热更错位。可一到分类,传媒类资讯硬往“本地民生”里塞,昨天那条《央视报道长三角影视基地升级》被标成“社区养老政策解读”,客服凌晨两点打来电话说:“用户投诉第十七次了,说我们把新闻当八卦推。” 可问题出在哪儿?模型训练用的标注集没问题,上线前 AB 测试也跑完三轮。我把 label 分布拉出来比——测试环境和线上环境,传媒类样本占比差0.7%,但错误率差六倍。这个数字我敢拍桌子:就是0.7%。不是四舍五入,是直接拿生产数据跑的,精确到小数点后三位。但为什么?我到现在也没想明白。 十一点半接到预警,我切进主库慢查列表,前十条全是分类结果回写 SQL。再翻 binlog,发现 last_update_time 在凌晨零点二十三分集体停滞了四十一秒。不是锁表,是事务卡在一条 update… case when 上——case 里嵌了个 subquery,查的是用户历史点击标签权重缓存。缓存服务?那个用 Go 写的轻量版,连监控埋点都没加全。我翻代码时发现,它默认超时是15秒,但 DNS 解析策略配了 round-robin,其中一台 DNS 服务器上周就宕了,没告警。所以每三次请求,就有一次夯住十五秒,然后整个事务排队雪崩。 老板在运维大群里发了个问号。张工蹲在隔壁柜子底下接网线,手里还捏着半截没剥皮的跳线,抬头说:“是不是模型调参时候动了阈值?”我说不是。他“哦”了一声,继续蹲着,螺丝刀戳进配线架缝隙里,“咔哒”一声,整排端口闪绿灯。窗外开始下雨,不是淅沥,是砸在机房玻璃顶上那种闷响,像有人往上倒豆子。 我其实去年搬家时也遇到过类似的事。纸箱里塞满旧硬盘,搬家师傅问:“这盒标‘2018测试备份’的能扔不?”我说不能,结果拆箱那天发现标签贴反了——里面全是2019年春节前压测的 mock 数据,压根不是备份。那天我就想,所谓“备份”,不过是某个人某一刻的判断。就像这次,没人觉得 DNS 里一个失效节点值得建个专项治理。谁想到它会卡在分类链路第三环? 分类错的不是模型。是模型前面那一长串人写的 if-else、配置文件、curl 调用、重试逻辑、超时兜底。有次上线前,小李写了段预热脚本,让模型提前加载 embedding,但漏了清缓存,结果老 embedding 跟新模型混训——不是 bug,是设计如此。他还笑着说了句:“反正线上也分不清哪个是热的。”我们当时都笑。现在想想,笑得有点早。 最荒诞的是错误本身。它不是全错,也不是随机错。你拿《人民日报》头版文章喂进去,分类稳定在“时政要闻”;可只要带个“影视”“综艺”“流量”字眼,哪怕上下文是严肃政策分析,也会滑向“娱乐八卦”。这不是语义理解崩了,是某种隐式偏好被放大的副作用——像高压锅泄压阀锈住了,压力只往一个缝里喷。而那个缝,是我们半年前为了提效加的二级标签过滤器,用 Redis 做热词命中,热词库里“综艺”下面挂着三百一十七个变体,其中二十八个是运营同学手动加的,包括“综Yi”“综姨”“ZongYi”,还有一个是拼音首字母“ZY”,结果跟“战略协议”撞了。 我昨天下午三点四十分重启了那个 Go 缓存服务。不是 systemctl restart,是先 kill -9,等三秒,删掉 /tmp/cache.pid,再 cd 到部署目录,敲 go run main.go —config /etc/cache.yaml —log-level warn,看着日志刷出 “server started on :8081” 才松气。全程四分十六秒。可重启之后,分类错误没降——因为上游早把脏数据灌进消息队列了。消息没丢,只是晚到了四十二分钟。而那四十二分钟里,运营后台弹窗提示“分类服务降级中”,他们点了“忽略并继续推送”。没人告诉他们,“降级”其实是把模型切回了一年前的老版本,老版本里,“媒体融合”和“融媒体中心”压根是两个 label。 王姐抱着保温杯路过,说她孩子今早发烧三十九度二,老师打电话让她去学校接人,她刚在群里@了交接同事,话没发完就看见我切进了数据库慢查页。“哎哟,又来了?”她叹口气,保温杯盖子没拧紧,茶水晃出来一点,在她手背上洇开一小片深色。“你们搞算法的,怎么跟我们当年调天线似的——越想对准,越偏得厉害。” 优胜劣汰是真的。不是模型之间淘汰,是问题之间互相吃掉。DNS 故障吃掉超时控制,超时控制吃掉事务并发,事务排队吃掉实时性要求,实时性崩了又逼运营加人工审核……一层吃一层,最后咬到自己手指头。今天上午十点,我在 kibana 里筛 error 级别日志,发现分类模块有三万七千条 WARN:“fallback to default label: ‘Other’”。可它从来就没设过 default label。这是代码里一行被注释掉的 // label = “Other”,两年前写的,没删干净。
文章配图,仅供参考 明天先把告警阈值调了。不调模型准确率,调缓存服务响应时间的 P99。加个告警:连续三次超时 >8 秒就喊人。别的,等雨停再说。 (编辑:站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |




