Soba

准确度测试 · 2026 年 10 月

我们在 400 张餐食照片上测试了 Soba 的碳水估算

照片来自两个公开研究数据集,其中每餐的碳水均经过称重或记录。下文列出测试结果、测试方法,以及 Soba 估算出错的餐食。

68.5%的餐食仅凭一张照片,碳水估算与实际值相差不超过 10 克

+4个百分点:提示按研究记录准确写出食物名称后,相差不超过 10 克的餐食比例提高的幅度

5.2 克仅凭一张照片时的误差中位数

共 400 张照片,每张分别在有提示和无提示时各识别一次。提示列出主要食物,不含用量,例如“steak; cauliflower; chicken”。没有识别失败的情况。每张照片的识别时间中位数为 3.1 秒。

测试结果

本节的数字是 Soba 仅凭照片给出的首次估算,此时还没有人修改重量或添加提示。49% 的估算与实际碳水相差不超过 5 克。相差不超过 10 克的比例,其 95% 置信区间为 64.0% 至 72.9%。

小份和中份餐食的估算最接近实际值。碳水低于 15 克的餐食中,89% 的估算相差不超过 10 克。

大份餐食通常被低估。在 42 份碳水达到 60 克或以上的餐食中,有 38 份的估算偏低。估算值的中位数为实际值的 64%。主要原因是份量重量:在这 38 份餐食中,有 30 份 Soba 估算的食物重量比实际轻至少 15%,而每 100 克的碳水估算通常接近实际值。

使用 Soba 时需要注意什么

在应用中可以补充的信息

以上结果仅基于一张照片。在应用中,你可以用几个字描述这餐饭;在配备深度摄像头的 iPhone 上,Soba 还会测量到食物的距离。我们分别加入这两项,重复了测试。

与实际碳水相差不超过 10 克的餐食比例

全部 400 张照片

仅照片68.5%
照片和提示72.8%

带深度数据的 200 张食堂照片

仅照片77.5%
照片和深度82.0%
照片、深度和提示78.5%

文字提示

“甜茶”或“荞麦”这样的几个字,可以补充照片中看不出的信息。测试中,400 张照片都加上了提示,提示中写有数据集记录里主要食物的名称,不含用量,例如“Coffee, brewed; Coffee creamer, liquid, fat free”。相差不超过 10 克的比例从 68.5% 提高到 72.8%(提升幅度的 95% 区间:0.7 至 7.9 个百分点),误差中位数从 5.2 克降至 4.5 克。

照片可以有多种理解时,提示的作用最大。没有提示时,Soba 把那杯加了奶精的咖啡当成了焦糖酱,估算碳水为 162 克。有提示时,估算为 5.5 克,饮食记录中为 2.7 克。在 SNAPMe 中由参与者自己拍摄的餐食照片上,相差不超过 10 克的比例从 59.5% 提高到 67.5%。在食物清晰可见的食堂照片上,这一比例几乎没有变化:从 77.5% 到 78.0%。

提示写出了食物名称,但 Soba 仍根据照片判断用量。有提示时,42 份大份餐食中有 37 份被低估;没有提示时为 38 份。测试用的提示完全照搬数据集记录。大部分提升来自第一组 200 份餐食,为 8.0 个百分点;第二组仅为 0.5 个百分点。你自己输入的提示,带来的提升可能更小。

深度摄像头测得的距离

在配备 LiDAR 扫描仪或两颗及以上后置摄像头的 iPhone 上用 Soba 的相机拍照时,Soba 会测量到食物的距离,并告诉模型画面宽度是多少厘米。Nutrition5k 的每张照片都附有深度摄像头记录,因此我们加入这项测量,重复测试了其中的 200 份餐食。相差不超过 10 克的比例从 77.5% 提高到 82.0%(提升幅度的 95% 区间:1.0 至 8.3 个百分点),误差中位数从 3.9 克降至 3.1 克。大份餐食仍被低估,13 份中有 12 份。这些照片都是从固定高度垂直俯拍的。倾斜拍摄的照片我们还没有测试。

同时使用深度测量和提示时,结果为 78.5%。在这些食堂照片上,提示能补充的信息很少。与仅用深度相比,差值的 95% 区间为 −8.8 至 +1.5 个百分点,包含零。

你的修改

如果你知道份量的重量,请输入,所有数值都会重新计算。在本次测试中,份量重量是大误差的主要原因。

Soba 会在每项估算旁显示重量范围。在 200 份已称重的 Nutrition5k 餐盘中,有 97 份的实际重量落在这个范围内,约占一半。这个范围表示模型预计重量所在的区间。最可靠的方法是用厨房秤称一下。

按餐食大小分组的结果

实际碳水餐食数相差不超过 10 克相差不超过 20 克误差中位数
低于 15 克16788.6%98.8%2.0 克
15 至 30 克9469.1%88.3%6.2 克
30 至 60 克9754.6%84.5%8.4 克
60 克或以上4219.0%38.1%25.4 克

总体结果取决于这一构成:测试餐食中有 42% 的碳水低于 15 克。如果你平时吃的份量更大,典型误差也会更大。

这些分组按实际碳水划分,而识别时应用并不知道实际碳水。如果按 Soba 自己的估算分组,有 84 份餐食的估算达到 40 克或以上,其中 55 份相差超过 10 克:32 份偏高,23 份偏低。因此,当估算达到 40 克时,应用会建议你称一下主要的含碳水食物。

400 份餐食的散点图:横轴为实际碳水,纵轴为 Soba 的估算值。在约 50 克以内,大多数点位于 ±10 克的带内。超过 60 克后,大多数点位于带的下方。
测试中的每一份餐食。阴影带内的点相差不超过 10 克。虚线下方的点为低估。有一杯饮料(加奶精的咖啡被识别为焦糖酱)估算为 162 克,画在图的上边缘。

测试中的四份餐食

两份估算接近,两份出错。Soba 给出的食物名称和重量取自它的回答。

餐盘中有两段玉米棒、白米饭、花椰菜和一个苹果。
实际 49.7 克 · Soba 49.7 克玉米、米饭、花椰菜和一个苹果。Soba 估算苹果为 130 克(实际 117 克),玉米为 60 克(实际 74 克)。两项重量误差相互抵消。
白色餐盘中的烤土豆配藜麦和蔬菜。
实际 46.0 克 · Soba 40.8 克烤土豆配藜麦。Soba 把藜麦认成了蒸粗麦粉(couscous)。两者碳水含量相近,所以总量仍然接近。
白色餐盘中的一片芝士披萨和一块巧克力饼干。
实际 33.3 克 · Soba 46.6 克一片披萨和一块饼干。Soba 把两者都估算得比实际更重:披萨 85 克(实际 47 克),饼干 35 克(实际 27 克)。
白色餐盘中的四块披萨,配有菠萝、鸡肉丁和樱桃番茄。
实际 85.1 克 · Soba 59.8 克鸡肉菠萝番茄披萨。披萨重 233 克,Soba 估算为 180 克。在 23 个超过 30 克的误差中,有 16 个出现在碳水达到 60 克或以上的餐食中。

照片:Nutrition5k 数据集,Google Research,CC BY 4.0。已为本页调整尺寸。

两个数据集,两类照片

数据集,各 200 份餐食相差不超过 10 克误差中位数平均误差
Nutrition5k77.5%3.9 克6.8 克
SNAPMe59.5%6.8 克12.2 克

Nutrition5k 的餐盘来自 Google 的食堂。每种食材都经过称重,每张照片都由固定相机垂直俯拍。拍摄条件很规整,Soba 在这组照片上的结果最好。

SNAPMe 是美国农业部和加州大学戴维斯分校的一项研究。美国的 95 名参与者在用餐前拍下自己的餐食,并用膳食评估工具 ASA24 记录饮食。这些照片与人们用 Soba 拍的照片相似。参考值来自参与者的饮食记录,这些记录本身也有误差。两个数据集之间的差距,一部分来自照片,一部分来自参考值。

与已发表研究的比较

Rodríguez-Jiménez 等人(Nutrients, 2025)仅用照片在 74 份 SNAPMe 餐食上测试了 ChatGPT-5。他们报告的碳水平均绝对误差为 12.99 克,中位数为 8.75 克。

仅照片餐食数平均误差误差中位数
ChatGPT-5(已发表)7412.99 克8.75 克
Soba20012.2 克6.8 克

该研究的作者选取餐食的方式不同,并手动修正了部分参考值,因此这两行只能粗略比较。两者的误差水平相近。在同一研究中,补充一句关于餐食中脂肪、糖和肉类的简短说明后,平均误差降至 11.29 克。在 Soba 中,写出食物名称的提示使 200 份 SNAPMe 餐食的平均误差从 12.2 克降至 10.2 克。

Soba 使用哪个模型

我们用 Soba 的指令,在第一组 200 份餐食上测试了八个模型。

模型相差不超过 10 克时间中位数
Google Gemini 3.7 Flash73.0%3.7 秒
Google Gemini 3.8 Flash71.5%4.8 秒
Google Gemini 3.5 Flash-Lite69.0%2.1 秒
Google Gemini 3.6 Flash67.5%3.3 秒
OpenAI GPT-6 Luna65.0%6.9 秒
OpenAI GPT-6 Luna Pro63.0%11.7 秒
OpenAI GPT-6.1 Sol58.0%13.1 秒
Anthropic Claude Sonnet 5.553.0%6.0 秒

每个模型通过 OpenRouter 运行一次,使用 Soba 在 2026 年 10 月之前的请求设置。通过 OpenRouter 选择的服务商,Claude Sonnet 5.5 在 200 张照片中有 41 张返回了空的食物项。在其余照片上,它的结果为 66.7%。GPT-6.1 Sol 平均高估碳水 10 克。

Gemini 3.7 Flash 在这 200 份餐食上排名第一。在八个模型的一次比较中胜出,往往会让模型看起来比实际更好,所以我们在第二组 200 份餐食上又做了检验。在第二组中,它与 Gemini 3.6 Flash 的结果相同,都是 70.5%,但价格更高。Soba 继续使用 Gemini 3.6 Flash。

我们还尝试给 Gemini 3.6 Flash 更多推理时间。在 400 份餐食上,相差不超过 10 克的比例提高了 4.1 个百分点,而相差不超过 5 克的比例和超过 30 克的误差数量保持不变。每次识别的时间增加一倍,从 3.5 秒增加到 6.6 秒。我们保留了速度更快的设置。

完整比较,包含 95% 区间、每餐数据和可重新计算每张表的脚本:用餐食照片比较 8 个 AI 模型(英文)。

测试方法

选取餐食

初始样本包括 Nutrition5k 官方俯拍照片测试集中的 505 份餐盘,以及 SNAPMe 中 1,457 张餐前拍摄的照片。在此之前,我们剔除了 22 条记录:数值无效的餐盘和餐食,以及无法与唯一一条饮食记录对应的 SNAPMe 照片。

脚本使用固定的随机种子,从每个数据集中各选取 100 份餐食:在碳水范围的每个四分位区间中各选 25 份。同一个十分钟内拍摄的食堂餐盘往往看起来相似,所以脚本限制了从同一个十分钟时段中选取的餐盘数量。随后,脚本用同样的方法选出第二组 200 份餐食,与第一组没有重复的照片或餐食。

两组餐食

我们只在第一组 200 份餐食上分析误差,并尝试修改 Soba 的指令。第二组 200 份用来检验结果是否成立。上文 Gemini 3.7 Flash 的结果就是这样发现的。

运行 Soba

每张照片都经过应用所用的同一套服务器代码:相同的指令、模型和设置。照片的长边缩小到 1,024 像素,与应用发送前的处理相同。主测试中没有文字提示、没有深度摄像头数据,事后也没有修改。带提示或深度数据的测试使用同一套代码,只改变这一项输入。应用语言设为俄语。

误差的计算

Soba 分别给出净碳水(不含膳食纤维)和膳食纤维。数据集给出的是总碳水,所以我们把 Soba 的净碳水加膳食纤维与总碳水进行比较。主要指标是差值不超过 10 克的餐食比例。识别失败会计为未达标,本次测试中没有出现。95% 区间来自 10,000 次重抽样的自助法(bootstrap),同一名 SNAPMe 参与者的餐食,或同一个十分钟食堂时段的餐食,在重抽样时放在一起。

本次测试的局限

Soba 不属于医疗器械。它给出的数值均为估算。请对照餐盘中的食物和食品标签核对,并遵循你的糖尿病管理方案。

测试后的改动

数据与参考资料

每餐结果(CSV,400 行,英文):数据集 ID、参考碳水、Soba 仅凭照片的估算、提示文字,以及有提示和有深度数据时的估算。该文件遵循 SNAPMe 的许可协议 CC BY-SA 4.0。