ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

LLM如何落地零售货架审计?人机协作的实践与踩坑

LLM如何落地零售货架审计?人机协作的实践与踩坑

1. 先搞清楚一件事:货架审计到底在审什么

很多零售项目的需求方对"货架审计"四个字的理解其实完全不一样。有人以为货架审计就是拿手机拍张照,数一下货架上有没有东西;真正在一线管过门店的人会告诉你,远没这么简单。货架审计至少包含三个层级:SKU级的排面识别——这个位置到底摆的是哪个商品;缺货状态判断——这个空格是暂时卖完了、根本没上架、还是本来就该空着;以及陈列合规性——摆放位置和数量是否符合品牌方花钱买下的陈列规则。三个层级出错的代价完全不同。

排面识别错了,最轻的后果是系统里多一条无效记录,全量扫完之后也没人去看。缺货判断错了,问题就麻烦了:系统报了一个缺货,店长跑过去一看,货其实在仓库还没补,补货员白跑一趟还算是小事;系统漏掉了真缺货,那就是实打实的销售损失——尤其碳酸饮料、牛奶这类销量波动大的品类,缺货一小时和缺货一天,差距是数量级的。陈列合规错了,受影响的是品牌方的排面权益,这在零售里是一笔很大的隐性收入,很多促销合同都签死了"必须摆满两排面""必须放在黄金视线层"之类的条款,违规是要被扣费的。

我们在接到项目需求后做的第一件事,不是选模型,而是拉着门店运营、采购和品牌方三方坐下来,把"审计"这个词逐条翻译成可量化的检查项。这个步骤容易被技术团队跳过,但跳过的后果就是后期模型做完了,业务方却说不清楚它有没有做对。

1.1 缺货损失之外,还有三本账

很多行业报告都会提一个数据:快消品缺货率一般在4%到8%之间,缺货带来的销售损失能占到个位数百分比。但门店层面的真实压力是三本账,这三本账在报告里通常看不到,却是老板真正关心的东西。

第一本是补货效率账。如果补货员每天要凭空判断哪些位置缺货,他就得在货架之间反复来回走。我们跟踪过某社区超市的一个区域,人工巡检一个区域平均要15到20分钟,一天巡三次,光是走路的时间就占掉一个小时。如果能把巡检范围缩小到"只去疑似缺货的位置",这个时间可以压缩到原来的三分之一。可别小看这个数字,门店人力成本基本都花在这种重复走路上。

第二本是陈列合规账。品牌商和零售商签的陈列合同规则非常细,比如某款口香糖必须在收银台前三层、某饮料必须保证垂直陈列两个排面。人工检查的时候,很难做到每个SKU逐个核验,所以大多数门店的合规检查是抽查,而且往往只看头部品牌。LLM要是能把每个排面完整过一遍,相当于把抽查变成普查——这个能力过去只有大牌区域经理巡店的时候才能勉强做到。

第三本是库存数据可信度账。门店的库存系统跟实际库存经常对不上,差异源头往往就是货架状态没及时更新。缺货位置补了货,系统没有回写,库存就会虚高;反过来商品已经清完下架,系统还挂着库存,也会虚低。货架审计的副产品就是修正这些差异,让补货预测和订货计算更稳。这第三本账最容易被技术团队忽略,但实际价值往往比前两本还高,因为整个供应链计划都建立在库存数据可信这个前提上。

三本账串起来,货架审计在决策者眼里就不是一个"门店内部事务",而是直接影响周转率和毛利的事。这也是为什么"用AI看货架"是一个值得认真投入的商业问题,而不只是拿来发论文的技术Demo。

1.2 人工巡检为什么是一个值得被替代的活

人工巡检的问题不在"人懒",而在"人做不到稳定"。一个店的SKU动辄上千,每个SKU要看位置、看数量、看价签、看生产日期,纯靠眼睛扫一遍,前十分钟还能保持专注,到了后半程就开始走神,这是生理规律,不是培训能解决的。我们曾经把同一个人对同一排面的两次巡检结果做对比,间隔只有半小时,漏看率都能差出好几个百分点。

缺货这种状态本身也是时间敏感的:晚发现一小时,可能就少卖好几件商品。人工巡检做不到实时,一般门店一天最多巡两三次,很多缺货要等到下一次巡检才能发现。如果再叠加人员流动,问题就更大了——老员工一走,巡检标准也跟着走,新员工对陈列规则不熟,经常会看着满满当当的货架就当没事,实际却存在大量错排。

这些恰恰是技术最擅长补的:一致的标准、高频的扫描、自动留痕的记录、跨排面的比对。所以从业务逻辑上讲,货架审计被AI改造的条件早就成熟了。之前的瓶颈不在业务需求,而在底层模型对复杂货架场景的识别能力,以及识别结果之后"该做什么"的判断。这两件事,前者靠视觉模型,后者正好是LLM的主场——这也是我们真正想验证的问题:LLM到底能不能把这两件事顺畅地接起来。

2. LLM想端到端搞定货架审计,得先过感知这一关

我们团队对这个问题的探索,是在一次原型验证里扎扎实实踩过坑之后才走上正轨的。最早的思路很直接:把货架照片整张丢给多模态大模型,让它直接输出"这排有没有缺货"。试了一个月,效果远没有想象中好。

原因是货架照片的信息密度太高了。一排货架上有几十个商品,包装颜色相近、瓶型相似,模型很容易把某款红色包装饮料和另一款深色酱料搞混;再加上价签、促销立牌、照明反光、顾客的手臂等大量干扰,多模态模型在同一张图上做密集目标识别,准确率会明显下降。这不是模型能力差,而是任务形态不合适——货架审计本质上是一个"密集检测+结构化推理"的组合问题,不应该让单一模型一口吞下。

2.1 感知层的现实:视觉模型管看见,LLM管看懂

我们最终的方案是拆分:先用一个专门训练的目标检测模型,把货架图里的每个排面、每个SKU候选框找出来;再用OCR把价签文字读出来。这一步输出的是"货架上有什么、在哪个位置"的中间结果。然后把这些结构化的中间结果以文字形式喂给LLM,让它基于这份清单做判断。换句话说,LLM看到的不是一个像素网格,而是一份类似这样的清单:

排面号: A-03-2 层号: 3 位置: 左起第4个 商品编码: SKU-78012 识别名称: 某品牌柠檬味碳酸饮料 库存量: 3 价签OCR: 某品牌柠檬味碳酸饮料 500ml 售价5.5元 货道编号: STA-03 货道库存: 0

这个拆分有两个好处。第一,目标检测模型可以在我们自己的标注数据上微调,把漏检率压到很低;第二,LLM拿到的是干净的、结构化的输入,它的任务是组合判断——比如"A缺货但旁边B正常,且A货道库存也为0,说明是真实售罄"或者"A缺货但是促销立牌在,说明可能正在做堆头调整"。这种逻辑判断,目标检测模型做不了,但让LLM读结构化清单做推理,是它最舒服的姿势。

经验之谈:不要指望用一个模型做完所有事。单模型方案在货架这种高密度场景里,既不会省钱也不会省事,调试周期会成倍拉长。拆分后,每一层的问题都变得容易定位和替换。

感知层还有一个容易忽略的点:摄像头选型。我们一开始想直接复用门店现有的监控摄像头,理由很充分——省钱、不用新装设备。但实际去门店看了一圈就放弃了:监控摄像头的安装角度、分辨率、帧率都是按安防场景设计的,不是按货架拍摄设计的。货架顶层和底层之间的视角差异很大,监控很难同时拍清整个排面,而且帧率是摄像头的,不是我们可以远程控制的。后来改成人工用手机按固定路线拍摄,反而稳定得多。这个结论有点反直觉:在货架审计场景,移动端随手拍加固定拍摄规范,比安装固定摄像头的方案更靠谱,也更便宜,还更容易在不同门店复制。

2.2 推理层的挑战:什么叫"缺货",得先定义清楚

就算感知层拿到了完美的结构化清单,LLM要做的事也远不止"数量是否为0"。

门店里一种常见情况是:某个SKU在排面上数量为2,但这2件商品其实是从隔壁排面被顾客拿过来随手放下的。只按数量判断,系统会认为"正常";按SKU归属判断,它属于"错排"。LLM需要结合上下文——相邻排面的商品是否一致、货道编号与商品名的匹配关系、该位置的历史犯错概率——才能给出正确的结论。这种跨排面的逻辑,人工一眼能看出来,模型要靠推理才能做对。

还有一种更微妙的情况,我们内部管它叫"幽灵缺货":排面上看着是空的,但这不代表卖完了。可能是商品在仓库有货、还没来得及上架,也可能是因为促销规则调整,这个位置本来就被留空。如果系统没有活动日历信息,LLM很容易把所有空格一律报成缺货,造成很高的误报率,补货员跑两趟空路之后就不会再信任系统。

所以我们在方案里把"缺货"判定拆成了好几层推理:先看这个空格是否在尾货清仓区;再看该SKU在系统里是否处于活动期禁上架状态;然后看同一系列商品是否已经补过一轮货;最后才结合货道库存判断应该是"补货延迟"还是"真实断货"。LLM读结构化清单和状态数据之后,输出的不是一个简单的"缺货/正常"标签,而是一个带原因的判断。这个带原因的输出是整个项目信任度提升的关键——人工核验的时候,看到"判定缺货:货道编号5在系统内库存为0,距上次补货超过6小时,且同排面左右商品均为正常状态",就愿意相信系统;如果只有一串红字判断,没有任何解释,店长很容易产生抵触。

2.3 幻觉与数值敏感性:LLM做审计的第二个坑

结构化输出能解决"不可用"的问题,但解决不了"幻觉"的问题。LLM在生成JSON的时候,可能会编造一个清单里并不存在的SKU编号,也可能把数量从3写成5。纯文本场景里这算不上大事,但在审计场景里,任何一个幻觉出来的记录都会进入下游系统,轻则污染统计,重则误导补货决策。

我们针对这个问题做了三件事。第一,提示词里明确规定"只能使用输入清单中出现过的商品编码,不得自行创建或改写"。第二,在代码层做了一道强校验:LLM返回的JSON里,所有sku_id必须能在当次输入清单中匹配到,匹配不到的直接整条丢弃并标记为"识别失败"。第三,把温度参数调低,虽然生成结果会变得保守一些,但可预测性明显提升。

说实话,这三件事里最起作用的是那道硬校验。LLM的推理能力再强,在数值上仍然不是一个可靠的"计数器"。让LLM做逻辑判断,让规则代码做数据校验,两者各管一摊,这是我们在试点中反复验证后最稳的组合方式。

3. 我们在某社区超市跑了一次八周试点

理论拆解得差不多了,真正能说明问题的还是落地实验。我们联系到某社区超市,规模不大不小,SKU数大概两千出头,选了饮料区和零食区作为试点范围,合计约四百个排面,每周采集两次数据,总共跑了八周。

先说清楚:这次试点并不是把全部判断都交给LLM做一个黑箱。我们搭了一条流水线:目标检测模型负责出框,OCR负责读价签,LLM负责汇总推理,最后人工抽检复核。LLM不是决策的全部,而是决策链路里最核心的一段。这个定位从一开始就要跟门店讲明白——AI是辅助工具,不是无人系统。

3.1 数据采集方案:一部手机加一份拍摄规范

拍摄这一步看起来最没有技术含量,实际上是决定整个项目成败的一环。我们一开始让大家随手拍,结果照片角度、距离、曝光差异巨大,目标检测模型的漏检率从5%直接跳到20%以上。后来我们定了一份拍摄规范,核心就三条:手机站在货架正前方,镜头与目标层平行,距离控制在1.5米左右;每层排面单独拍一张,不要试图用一张照片拍完整个货架;拍摄时间固定在早间开门后和晚间补货前。

为什么强调镜头与货架层平行?因为俯拍或者仰拍会让商品标签发生透视变形,OCR识别率会明显下降。平拍的时候,把每层排面的上下边缘都留一点余量,既能保证对齐全层商品,又不至于把地面和天花板拍进去太多。

拍完之后,数据先经过目标检测模型做初筛,把明显的"空排面"和"正常排面"直接分流,只有存在争议的排面才带着结构化信息进入LLM。这样做的原因是控制成本:如果每个排面都交给LLM处理,API调用量会很大;只让LLM处理争议样本,平均每次巡检需要LLM参与的图不到总量的三分之一。成本这关,要在这个环节就开始设计,而不是等账单出来了再想办法。

3.2 提示词与结构化输出的设计细节

LLM的输出格式是我们反复调过的重点。第一次测试,我们让模型自由描述货架状态,输出结果像一篇自然语言散文,准确率不低,但下游系统完全没法用。后来所有输出都限定为JSON结构,字段固定为:sku_id、位置编号、预测状态、置信度、原因说明、建议动作。原因说明用简短文本,建议动作只能在"补货、调整陈列、待观察、无需动作"四个值里选一个。字段固定之后,人工复核和后续的系统对接都顺了很多。

提示词里有一句话我们反复验证过,值得单独分享:明确告诉模型"宁可标注不确定,也不要硬猜"。"不确定"状态会进入人工复核队列,而"硬猜"的错误会直接污染系统状态。这个让模型"有认怂权限"的设计,直接降低了误报率,也避免了AI系统在门店里被快速弃用的悲剧。

另一个发现是关于上下文窗口的用法。一开始,我们试图把历史巡检记录全部塞进去,想着让模型更了解这个货架的"脾气"。结果输出反而飘了,模型可能因为历史数据里的某个异常事件,对正常排面产生过度反应。后来改成只传最近一次巡检的状态加上当天的库存系统数据,效果稳定很多。"上下文不是越多越好"这条经验,我们在很多场景里反复验证过,LLM对上下文里诱因性信息的处理,目前远没有想象中聪明。

3.3 踩坑记录:促销立牌、货架遮挡与光线反光

八周试点攒了一堆具象的坑,每一个都能单独写一篇踩坑复盘。这里说三个最典型的。

促销立牌是最普遍的干扰源。饮料区经常挂着大面积的活动立牌,直接挡在商品前面。目标检测模型还算争气,框能出来,但OCR会把促销立牌上的大号文字当成价签,导致LLM拿到一份"SKU名称为'买一送一'"的奇怪清单,推理自然就乱了。我们的解法是加一道过滤规则:OCR出来的文本先跟库存系统的SKU名称做模糊匹配,匹配不上且文本长度又明显不符合SKU命名规则的,直接标记为促销物料,不参与后续推理。这一步加上之后,因为"幻觉SKU"导致的错误直接清掉了大半。

货架遮挡出现在垂直方向。下层货架如果放着高一点的箱子,上层货架的底部光线会被挡住,形成一条阴影带。商品明明没有缺,但目标检测模型容易把阴影带误判成空排面。我们试过用图像增强算法提亮阴影,效果一般,后来发现最省事的办法是控制拍摄时间,在门店已经开灯、又没有顾客进出干扰的早间时段采集,阴影问题基本消失。

光线反光则主要发生在小包装零食的铝箔包装上。金属反光会让目标检测模型把同一个商品框出两个不完整的框,数量统计直接翻倍。这个问题在后处理里加了去重逻辑解决:两个框的重叠面积超过50%且SKU相同,合并为一个。这些都是感知层的琐事,但实际项目里,这类琐事占掉了我们大约一半的开发时间。这也就是为什么"LLM审计货架"这件事,不能在提示词层面单点发力——真正的工程复杂度都在数据管道和容错设计上。

3.4 冷启动的另一个问题:没有历史数据怎么校验

还有一个经常被忽略的问题:一个门店之前从没有做过AI巡检,凭什么让店里的人相信AI的输出是对的?

我们的办法是搞了"对照周":前两周不启用AI巡检,人工按老办法巡检并记录结果,同时AI方案在后台静默跑,两边结果只做对比、不对外发布。对比之后发现,AI在"排面数量"这类硬指标上已经接近人工;在"缺货原因判断"这类软指标上还存在分歧,但有意思的是,分歧大多来自人工之间本身就不一致——两个人对同一个排面的判断也有差别。这算意外的收获:AI不只是替代人工,还成了统一标准的参考坐标系。有了这两周的对照,正式启用时店长对输出结果的接受度明显高了,因为大家已经看到AI跟老师傅的判断基本在一个水平线上。

4. 实测结果与三个"意料之外"的数据

八周试点结束之后,我们整理了一份内部评测报告。这里可以把主要结果放出来,但先提醒一句:所有数字都来自这一个样本门店,不代表行业普遍水平,仅作方案对比参考。

4.1 评测口径:准确率不是唯一指标

我们一共统计了三个指标:排面识别准确率、缺货召回率、缺货精确率。排面识别准确率衡量"模型说的位置和商品是否真的对得上";缺货召回率衡量"真实缺货里有多少被系统找出来";缺货精确率衡量"系统报出的缺货里有多少是真的缺货"。后两个指标之间的平衡,对落地体验影响最大。召回率太低,漏报缺货;精确率太低,天天虚报缺货,补货员跑麻木了,整个系统就会被弃用。

在这个口径下,排面识别准确率大约96%,比预想的好;缺货召回率大约87%;缺货精确率大约82%。人工复核一批误报样本后发现,精确率上不去的主要原因是定义分歧——有些排面货架看起来确实是空的,但门店觉得"反正补货员马上就到"就不算缺货。这种业务定义上的问题,单纯靠改模型解决不了,需要系统设计时留出人工复核入口,把争议样本交给店长用业务逻辑裁决。

4.2 各品类SKU的表现差异

不同商品在LLM审计里的表现差异非常大,这一点经常被技术团队忽略。试点里,饮料类表现最好,因为瓶型标准、标签材质稳定、视觉特征明显;零食类表现中等,问题集中在多语言包装、小尺寸标签;表现最差的是散装称重区,因为同一个SKU可能被分装成完全不同的包装形态,目标检测和OCR都容易翻车。

另一个反直觉的发现是:SKU数量多的排面反而好判断,因为模型能从多个同类商品中互相验证"这是一个正常排面";反而是单个SKU独享一整个排面的时候,只要有一件商品放歪了或者被顾客碰倒,模型就倾向于判成异常。这个观察告诉我们,审计系统要针对不同类型货架设计不同的阈值和容忍度,一刀切的标准是走不远的。

4.3 与人工巡检的横向对比

成本对比让我印象很深。按这家超市原来的习惯,饮料和零食两个区域每天巡检三次,每个区域一次人工巡检平均耗时18分钟,折算下来每天约1.8小时人力。AI方案每天早间和晚间各采集一轮,每轮从拍照到生成报告大概20分钟,人工只负责拍摄和最后抽检,识别与推理全由流水线完成。按门店总面积放大到全店约5000个排面估算,AI方案的人工时间大约是传统方式的五分之一。

需要说明的是,AI方案省的是"重复巡检"的时间,而不是"区域决策"的时间——缺货发现后的补货决策、陈列调整、供应商沟通,依然需要人来执行。这个边界必须在项目立项阶段就跟业务方讲清楚,否则上线之后的预期一定会错位:业务方以为AI能解决所有问题,结果发现还要保留人工环节,心理落差会很大。

4.4 翻车样本画像:四类典型错误

评测报告里最有价值的部分是错误样本归类。我们把所有误判样本拉出来,一帧一帧看,最终归成了四类。

第一类是"促销干扰",典型场景就是大号促销立牌遮住了商品主体,OCR读到的全是活动文案。第二类是"白牌商品"——超市自有品牌或新上架的无品牌包装,在训练数据里几乎没有类似形态,检测模型很容易把它框成"未知对象",LLM拿着这个"未知"也没辙。第三类是"高相似包装",两款不同品牌的商品,主色调、瓶型几乎一样,只靠包装角落的小字区分,检测模型给出的置信度普遍偏低。第四类是"时空混淆",同一排面两次拍摄时间相隔较大,中间发生过补货,AI在对比时把状态差异误判成异常。

每一类对应不同的解法:促销干扰靠过滤规则;白牌商品靠冷启动标注;高相似包装靠追加训练样本;时空混淆靠缩短采集间隔并引入补货日志。这个分类方法后来成了我们内部复盘的标准模板——以后再遇到新误报,先归类,再定方案,而不是头痛医头。

5. 结论:现在到底能不能用

回到标题的问题:Can LLMs audit a supermarket shelf yet?

我们八周试点的结论是:离全自动审计还有距离,但已经在"人机协作审计"的实用范围内了。LLM真正解决的,不是"看"的问题,而是"把看的结果变成业务判断"的问题。如果你的目标是建立一套高可信度的感知层,用LLM自动生成带原因的缺货清单和陈列问题清单,那现在完全够用;如果你的目标是完全去掉人工抽检,让机器全包,恐怕还要等视觉模型在复杂货架场景里的鲁棒性再上一个台阶,同时也需要门店业务流程本身更标准化。

5.1 现在就能落地的三个场景

第一个是高频缺货监测。饮料、牛奶、纸巾这类销量波动大且陈列规律的商品,LLM加检测模型的组合已经能做到每天两次的自动对比,及时捕捉缺货状态。第二个是陈列合规普查。品牌方和零售商签了陈列合同,但没有足够人力逐店核验,用LLM把排面照片批量比对陈列规则,可以在不增加门店工作量的前提下完成合规审计,相当于把抽查升级成普查。第三个是供应链数据修正。货架状态跟库存系统经常对不上,用巡检结果反向回写系统补货逻辑,能让补货预测和订货建议都更稳。

这三个场景有一个共同点:都允许"人工复核"存在。争议样本进人工队列,而不是直接进系统自动执行,这是目前最稳妥的落地边界。

5.2 如果要复刻这套方案,我建议的最小配置

硬件方面,一部拍照清晰的中端手机加一个固定拍摄支架就够,不用采购专业采集设备;如果门店数量多,给店员配一个带固定高度的拍摄夹子能显著提升照片一致性。软件层面,目标检测模型用开源模型在自有数据上做微调,OCR用成熟的文本识别方案,LLM接主流大模型的API。所有中间数据落在门店本地,只把结构化结果传到云端。

有几个配置建议我觉得值得写下来:

  • 拍摄规范必须写成SOP,并且每季度复核一次,防止门店操作变形
  • 所有LLM输出必须结构化,输出格式在代码层做强校验,不允许自由文本进入系统
  • 系统保留最近三次巡检结果用于上下文参照,但不要无限堆积历史
  • 评审初期就接受"不确定"作为合法输出,并预留人工复核通道

团队配置上,一个算法工程师加一个熟悉门店业务的产品经理就能跑起来。关键是产品经理能不能把店长的口头经验翻译成规则——这个能力决定了系统的最终上限。

5.3 给需求方的预期管理清单

跟业务方沟通的时候,我建议把下面几条作为默认预期,而不是让人家自己猜:

  • AI每天能稳定巡检,但判断结果仍然需要门店侧确认关键动作
  • 缺货召回率可以做到85%以上,但做不到100%,极端情况比如货架被推车整个挡住,任何视觉方案都会漏
  • 系统部署前期需要一到两周的"对照期",用于建立信任和校准阈值
  • 切换到AI巡检之后,人的工作会从"走现场"变成"看报告+处理争议",这对店长的能力要求反而提高了

预期管理做得好,项目推进就顺;做不好,模型再准也会被业务的失望情绪淹没。这一点我认为比技术参数更重要。

5.4 接下来半年值得盯的方向

一个是视觉语言模型本身的进步。如果多模态模型的密集识别能力继续提升,几年后真有可能把"看见"和"看懂"收敛到一个模型里,审计链路会大大简化。另一个是货架动态数据的建模,比如促销临时变化、堆头、试吃台这类非结构化状态,未来会有更细的状态模型来处理,而不会像现在这样被我们简单过滤掉。第三个是多门店聚合学习,在保护各门店数据隐私的前提下,把不同门店的货架特征做联合建模,让新门店冷启动不再需要对照周。

我的建议是:不要等"完美模型",先把手头的巡检流水线跑起来。数据会不断积累,模型会不断迭代,但业务闭环一旦转起来,后面的优化才有真实有效的抓手。这次试点给我最大的体会是,零售场景里的技术突破很少是单一模型的功劳,更多是感知、推理、流程和人的信任机制一起转动的结果。LLM目前的定位,更像是给这套机制补齐了"判断和组织语言"的那一环——这一环补上之后,货架审计这个存在了不知道多少年的老问题,确实到了一个可以正式动手改的阶段。

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进