大模型赋能智能垃圾分类:从视觉语言模型到提示词工程的完整实践
做垃圾分类识别两年多我最大的感慨是分类问题从来不是“训练一个模型”那么简单。最近我们刚完成一个小区智能垃圾箱的改造项目业主投放时经常把干净纸箱扔进厨余桶、把没喝完的奶茶杯丢进可回收传统识别设备只能按预设类目硬着头皮判效果一言难尽。后来我们把方案整体切到“大模型赋能智能垃圾分类”这条技术路线上——用视觉语言模型替代固定分类器误判率下降了一多半。这篇文章把整个项目从选型、架构到部署的完整思路、踩过的坑、可复用的提示词模板都整理出来供正在做类似项目的朋友参考。1. 几轮对比下来传统CV方案到底差在哪1.1 固定类目识别器的两大硬伤传统方案大多走“目标检测图像分类”路线先训练一个分类器把垃圾分成可回收、厨余、有害、其他四大类运气好一点的能细分到几十个子类。听起来没问题实际一上线就露馅。第一个硬伤是类目写死。模型训练时定了几十个标签线下运营同学后天突然要加一类“泡沫箱”就得重新采集数据、训练、发版。社区垃圾类型跟着季节和周边业态跑夏天珍珠奶茶杯多、春节烟花爆竹残留多、装修季瓷砖胶桶多固定分类器根本没有能力响应这种变化每个月都在为“加一个类目”加班。第二个硬伤是表面特征和语义特征打架。同样一个白色塑料杯空杯子是可回收里面还有珍珠残渣按很多小区的投放规则应该直接进厨余。传统分类器看到的特征完全一样它不知道这个杯子“脏没脏”。垃圾分类判断依赖的是“物品当前状态投放规则”的语义组合而不是单纯的视觉外观。长尾垃圾问题更无解。一个普通小区投放口内出现的真实垃圾种类少说几百种固定分类器只覆盖几十个类剩下的全落到“其他”用户投什么都是其他垃圾闸机永远照开识别模块形同虚设。1.2 大模型的切入点把分类问题改成问答问题换到大模型方案之后最核心的变化是问题定义变了原来做的是“图像属于哪一类”现在做的是“根据这套投放规则图像里的物品应该进哪个桶”。这个转变看着不起眼实际影响巨大。视觉语言模型接受自然语言指令不需要为每个新类目重新训练。改规则就是改提示词里的一句话模型马上就能按照新规则执行。我们实测过提示词里加一条“带液体和食物残留的一次性杯子按厨余垃圾处理”同一张奶茶杯图片输出从“可回收”立刻切到“厨余”整个验证在三分钟内完成。这相当于把知识从“训练时的固定标签”搬到了“推理时的提示词”里。对垃圾分类这种规则频繁变化、又依赖常识推理的场景这恰恰是最大优势。1.3 方案边界不是所有场景都适合上大模型也不是说大模型方案就万能。实时性要求极高的产线分拣、算力受限的简易手持终端、完全断网的野外场景硬上大模型体验会很差。我们项目最终采用“边缘小模型粗筛云端大模型精判”的混合策略后面第2章会详细说分工逻辑。2. 整套系统的架构设计从摄像头到云端的分工逻辑2.1 整体数据流系统整体是一条很直接的单向链路投放口摄像头采集图像本地节点做预处理和运动检测检测到投放动作后立即抓帧图像先送本地小模型置信度足够就直接出结果低于阈值再上传云端大模型精判最终结果写给业务系统由业务系统控制闸机开合和语音播报投放引导。这样设计的原因是成本和延迟都要兼顾。做一个智能垃圾箱用户投放时的等待体验非常敏感全走云端往返2秒以上门口排队的人能急出火气全部走本地常见垃圾识别率又不够。所以本地当“第一道把关人”云端当“疑难杂症专家”各管一段最稳妥。2.2 硬件配套摄像头和边缘节点的选型逻辑摄像头使用普通星光级网络摄像头就够了分辨率为1080P不需要上4K。视觉语言模型的输入分辨率基本都有上限而且高分辨率会显著拖慢推理速度1080P画面压缩到模型要求的尺寸后细节信息完全够用。镜头安装角度要朝斜下方45度左右正对投放口挡板内侧尽量减少桶口反光直射镜头的情况。边缘节点我们选的是带集成显卡的低功耗迷你主机。朋友可能会问为什么不用树莓派之类更便宜的板子——本地要跑量化后的视觉语言模型性能和内存带宽都得够用否则量化模型推理慢得像PPT反而拖累整体体验。算力卡在“能流畅跑量化模型”这个最低线上不要盲目省钱。2.3 本地与云端的分工对比维度本地量化小模型云端大模型API单次延迟200~500ms1~2秒常见垃圾识别率约85%约96%单次调用成本几乎为0按次计费网络依赖完全离线可用必须联网适用场景桶内常见垃圾、高频投放模糊图像、长尾垃圾、争议类目实际运行中大约75%的投放请求在本地直接判完只有25%的疑难样本会走到云端这是成本最可控的组合。3. 提示词工程垃圾类目真正的难点在“知识设计”3.1 一份可以直接改的提示词模板大模型方案里提示词就是业务规则本身。我们目前的提示词模板结构固定为四部分角色定位、类目定义、投放规则、兜底要求。下面给一份简化版你是一位垃圾分类督导员请根据投放规则判断图片中的物品属于哪个垃圾类别。 类目定义 1. 可回收物纸张、硬纸板、塑料瓶、易拉罐、玻璃瓶、金属制品、干净织物。 2. 厨余垃圾剩饭剩菜、果皮、蛋壳、茶叶渣、食物残渣、带残留物的餐盒。 3. 有害垃圾充电电池、过期药品、油漆桶、温度计、杀虫剂瓶。 4. 其他垃圾受污染的纸张、用过的一次性餐具、卫生用品、碎陶瓷、烟头。 投放规则 - 纸箱即使压扁或有一点潮湿仍按可回收物投放。 - 一次性塑料杯如果还有液体或食物残留按厨余垃圾投放空杯按可回收物投放。 - 玻璃碎片和碎陶瓷不得投入可回收桶按其他垃圾投放。 输出要求 只输出类别名称不要解释。如果图片模糊或无法判断只输出“不确定”。注意几个细节类目描述不要写口号式定义要写成“什么物品在什么状态下归哪类”的条件式描述投放规则必须覆盖现场最高频的争议点输出要求要限制格式方便代码解析。3.2 Few-shot示例和边界表达提示词里加上少量正反例能显著提升识别准确率。我们在实际模板中加入过这样的描述“陶瓷碗碎片不是可回收物属于其他垃圾完整可用的陶瓷碗属于可回收物。”有了这种对比模型对“破损后应该怎么分类”的理解会更精准而不是机械地一看是碗就回可回收。另外一定要在提示词里授权模型说“不确定”。很多工程师怕模型答不出拼命把内容往模板里塞。实际上垃圾分类场景最怕的不是“不确定”而是“自信地答错”。“不确定”出现时系统可以走人工审核或让用户自行选择至少不会开错闸机。3.3 规则动态下发一套系统适配多种场景不同投放点的规则差异很大景区以饮料瓶和食品包装为主商场以纸袋、快递盒和一次性餐具为主医院周边以药品包装和口罩手套为主。我们做了一个规则配置后台运营同学可以直接编辑类目描述和投放规则发布后边缘节点定时拉取下次推理自动生效。整个配置链路不需要开发介入、不需要模型重训这是传统方案完全做不到的灵活性。4. 核心实现从图像到投放建议的完整链路与参数调优4.1 代码级实现思路核心逻辑不复杂本质就是一个带降级策略的串行调用。用伪代码表示大致是这样:def run_garbage_recognition(camera_frame, config): # 1. 图像预处理去噪、压缩到模型输入尺寸 processed preprocess(camera_frame, config.input_size) # 2. 本地量化模型先跑一轮 local_result local_vlm_infer(processed, build_prompt(config)) if local_result.confidence config.confident_threshold: return format_result(local_result, sourcelocal) # 3. 低置信度样本上传云端精判 cloud_result cloud_vlm_infer(processed, build_prompt(config)) return format_result(cloud_result, sourcecloud)实际工程里还需要把结果连同抓拍图一起写入日志用于后续抽检和误判分析。我们为每一张图片保存了投放时间、置信度、来源、最终类别后续复盘事故时可以直接翻出原始画面效率高很多。4.2 关键参数与调节逻辑参数设置值调节说明输入分辨率448×448分辨率太低丢失细节太高拖慢延迟448是速度和精度的折中温度0.1垃圾分类必须稳定输出温度必须压到很低防止发散最大输出长度20 tokens只需要输出类别名或“不确定”长度限制能有效防止输出废话本地置信度阈值0.75低于该值就上云调高会更多请求云端成本上升清晰度评分阈值0.5连拍多帧选清晰度最高的一帧再送模型过滤运动模糊温度这个参数容易被忽略。朋友如果直接用默认值模型可能偶尔给出“可能是可回收物”这种带歧义的保守回答。我们把温度压到0.1之后输出稳定成短类别词工程解析不再需要维护一堆同义词表。4.3 边界案例验证上线前我们专门做了几个典型边界测试压扁的矿泉水瓶、纸质餐盒、药品铝箔、玻璃碎片。压扁的矿泉水瓶按投放规则仍属可回收但传统模型训练数据里大多是“完整瓶子”图片很难泛化到“严重变形”这个状态。VLM在提示词里明确写了“结构变形不影响材质属性”后能稳定判断为可回收。玻璃碎片是最容易翻车的项。很多人下意识觉得“玻璃”应该可回收实际投放规则里碎玻璃属于其他垃圾因为可能会划伤搬运人员回收价值也极低。提示词中专门加了一句“玻璃碎片和碎陶瓷禁止投入可回收桶”配合示例之后识别准确率从六成直接拉到九成以上。5. 试点实测数据与背后三类典型识别事故5.1 小批量测试指标我们在试点点位采集了640张真实投放抓拍图做验证覆盖早中晚不同光照条件结果如下类目样本量准确率主要误判类型可回收物21093.8%潮湿纸箱被误判为厨余厨余垃圾18092.2%带包装外卖盒被误判为可回收有害垃圾11096.4%药品铝箔与易拉罐混淆其他垃圾14088.6%干净陶瓷被误判为可回收总体64092.7%模糊样本2.1%这个结果比原先固定分类器的76%提升非常明显。不过真实环境比测试集更刁钻紧接着就暴露了三个典型事故。5.2 事故案例一反光材质干扰现场第一周集中出现“金属罐被误判成塑料瓶”的现象。排查后定位为投放口内顶灯光源在罐体弧面产生高光反射模型将高光区域误识别为塑料标签纹理。解决办法有两步物理上给摄像头加装遮光罩避免直射反光软件上对图像做高光抑制处理把反光过曝的区域还原后再送模型。加上之后金属罐的误判率明显下降。5.3 事故案例二潮湿纸箱与厨余视觉混淆潮湿的瓦楞纸箱颜色发暗、质地松软视觉上和厨余垃圾中的软性物质高度相似连续几天都被判成厨余。我们最初尝试增加数据增强样本没有明显效果最终是在提示词投放规则里加了一句“纸箱即使潮湿、颜色深浅变化只要可以压扁折叠仍按可回收物投放”。文本规则一改这个问题就消失了不需要动模型。通过这个案例我想强调一点大模型方案里最先该检查的永远是提示词而不是重新训练或调参。很多问题本质上是“知识没有表达进去”。5.4 事故案例三桶盖遮挡与运动模糊投放动作快的时候抓拍经常拍到运动模糊或桶盖遮挡的废帧模型输出“不确定”的比例一度达到8%。后来在抓帧环节做了连续多帧采集先做清晰度评分选得分最高的帧再送模型同时增加投放口挡板与镜头位置的物理间距减少遮挡概率。“不确定”比例降回2%以内。6. 成本控制与部署优化把单次识别成本压下去6.1 单次识别成本拆解借用试点一个月的数据按日投放量3000次估算成本结构项目计算方式月成本估算本地推理75%请求边缘端完成0元/次约0元云端AI调用25%请求约750次/日按次计费约几百元网络与存储图片日志上传对象存储小几十元运维人力偶发规则调整、远程排查摊薄后很低关键是把本地识别率从60%提到75%云端调用量就减少四成比反复去和服务商谈单价有效得多。想尽办法提高本地小模型的兜底能力是成本控制的核心。6.2 量化、缓存与并发优化本地小模型我们做了两轮优化先切成INT8量化推理延迟从800ms降到300ms再对高频出现的重复物品做特征缓存同一个用户连续投放两个相同包装的饮料瓶第二次直接命中缓存延迟降到50ms以内。并发方面一个边缘节点会服务两个投放口所以模型推理服务设计成异步队列。高峰期多路请求同时到达时云端的连接池也做了限制避免瞬时并发打爆接口。实测峰值20路并发时云端平均等待时间仍然可控。6.3 降级策略宁可不确定不要乱开闸云端服务偶发不可用是现实问题。我们设计了降级开关云端调用失败时如果本地置信度高于0.85直接采纳本地结果否则返回“不确定”投放口语音提示用户手动选择垃圾类别并放行。这条策略保证了极端情况下现场不会堵塞又不会因为AI瞎猜而把有害垃圾放进可回收桶。7. 后续可扩展方向与我的实践体会7.1 下一步可以做的事这套系统目前还能在几个方向上延展语音交互可以接上大模型的自然语言理解用户问“电池丢哪”时直接语音引导积分运营可以把识别结果和用户账号打通正确投放自动累计积分问题投放追踪可以把“桶盖开启但未投放”这类逃逸行为也纳入分析形成完整证据链减少劝说的沟通成本。7.2 我的实践体会最后分享一点感受垃圾分类识别这件事卡点从来不在模型而在对物理场景的理解。模型换得再快也不能取代你对投递口、光照角度、桶盖遮挡、残留物状态的把控。如果准备做类似项目建议动手前先花一周蹲在投放点拍真实投递视频把高频争议物和奇葩投放行为全部列出来再回头设计提示词和降级策略你会省下大量返工时间。大模型给了我们一个以前没有的灵活性——规则可以让运营同学随时改模型不用天天重新训练。但真正跑赢项目的还是对现场的观察够不够细。