一个下午能跑通,几个月才敢上线

我们花几个月做了一个食物扫描工具:手机对准盘子,就能返回热量和宏量营养素。最粗糙的版本一个下午就搭出来了,但让它变得可信,花的时间长得多。原因不是识别不出食物,而是视觉模型有一个很具体的盲区,靠提示词怎么调都修不好。

打开网易新闻 查看精彩图片

下面是我们测到的数据、坏在哪一步,以及最后怎么重新搭的架构。

人们放弃记录饮食,不是没动力,是太麻烦

一天三次去数据库里搜“去皮烤鸡腿”,坚持两周就烦了。所以目标从来不是“识别图片里有什么食物”——这部分基本已经解决了。真正的目标是每餐只花几秒钟,从拍照到出结果,而且结果不能离谱。

流程很简单:拍照、识别菜品、估算份量、输出数字。问题就出在份量这一步。

同一个问题,藏着两个完全不同的估算

你问现在的多模态模型:盘子里是什么,有多少热量?它只给你一个数字,但这个数字悄悄把两种估算混在了一起:食物密度和食物重量。

我们拿称重过的参考餐分别测试这两项,差距非常明显。密度方面,模型表现很好。鸡胸肉给出的数值大约是每100克165千卡、31克蛋白质,跟美国农业部参考数据基本一致。花生的误差也只有几个百分点,对营养应用来说在噪声范围内。

重量方面,模型错得方向一致。我们称过162克的鸡肉,模型报回来大约180克。在我们测试的模型里,对同一张图片的高估幅度从大约10%到超过100%都有。每个模型都高估,没有一个低估。

这不是随机误差,是系统性偏差

这种一边倒的偏差很说明问题。它不是可以靠平均消除的随机误差,而是一种系统性偏向。想清楚这些模型到底学了什么,就不奇怪了:单张照片里没有深度信息,没有参照物,没有秤。模型看过几百万张带文字描述的食物图片,但描述里没有厨房秤称出来的克数。它只是在匹配“一盘鸡肉长这样”,而训练数据里一盘鸡肉通常就是180克左右。

靠提示词绕不过去。我们试过。让它“份量估保守一点”、给锚定示例、明确提到盘子直径——估算没有收敛,反而更飘。有一个提示词版本把一顿正常晚餐估成了680克。加指令等于给模型更多空间去错得更有创意。

把“照片里有多少热量”拆开,架构就清楚了

一旦不再把“这张照片有多少热量”当成一个问题,该怎么做就很明显:识别食物,查密度,单独处理重量,最后让用户确认或微调。

最后一步是很多团队会跳过的,因为感觉像承认失败。其实不是。用户就站在食物面前,他知道这份量不小。确认一下或者拨一下数字,一秒钟都不到,却能把一个系统性偏差的猜测变成用户真正相信的结果。这比原始准确率更重要,因为一个用户不信的数字,再准也没用。