一张图片胜过千言万语!我的旅程:借助ChatGPT和谷歌的Gemini视觉模型打造一款一键计算卡路里的应用。
2022年11月,ChatGPT的推出永远改变了世界。作为一个从近二十年前攻读硕士学位时(论文专注于机器学习与推荐系统)就开始探索数据与人工智能细微之处的人来说,这一推出让虚幻的人工智能世界变得更加真实可感。起初对我来说,这只是一些有趣的事情和游戏——孩子们的睡前故事、语言学习、假期行程安排、绘画书的生成等等。但是,缺失的拼图是如何利用人工智能的力量来简化我日常生活中的任务。
在过去的一年左右时间里,我涉猎了各种模型 - Open AI、Llama、Palm、Claude、Mistral - 他们参与了大型语言模型(LLM)的战争。由于我在数据战略和架构领域的日常工作,我对这些LLM文本模型如何被利用来简化和自动化业务流程有了很好的理解。但是,再次提问,我如何利用这些超智能的大脑来简化我的日常生活呢?
快进到2023年12月,谷歌推出了带有多模特性的“双子座(Gemini)”模型,并伴随着一段病毒视频(点击这里查看),被极客们立即称为被篡改/编辑过。对我来说,这给了我对人工智能普适性(AGI,Artificial General Intelligence)的一瞥--火花已经点燃!一旦“双子座”API开放,我立即开始在Vertex AI(谷歌云平台-GCP)上尝试不同的图像和视频。
问题声明
当人工智能世界在变化,过去一年中我的生活重点也发生了变化,我正在寻找方法来更加健康。去年秋天,我接受了间歇性禁食(IF)或时间限制饮食——这是昼夜节律生活方式的一个重要支柱: 我的终极长期健康目标(点击此处获取更多信息/背景)。那时候,卡路里计算的噩梦开始了!称量食物,分解成分,手动输入所有这些数据到一个应用程序中是辛苦而单调的。而且,你如何为印度咖喱或类似海鲜杂烩这样的美食做到这一点呢?——肯定有更好的办法:如果一个人只需拍照食物,应用程序就可以处理卡路里估算,以及宏量和微量营养素计算,确定每日间歇性禁食进餐时段等等,只需一次点击。
一项小型市场调查发现很少有应用与此问题有一定的相关性。它们不仅缺乏一键式卡路里和宏量计算,而且也缺乏自动确定第一餐、最后一餐以及所有如此重要的饮食窗口的IF功能,这对我来说是非常关键的需求。决心破解这个难题,我决定开始一项使解决方案不仅功能齐全,而且与我的生活方式无缝衔接的任务。
开始使用
挑战是巨大的 - 不仅我需要在停了15年之后重新捡起我的编码技能(我最后一次编码是在读硕士期间和在SAP实验室工作期间),而且我还想通过在Google Cloud平台上实现原型Web应用程序来拓展我关于GCP知识的边界,以便我可以与分布在世界各地的家人和朋友分享它。
进入PyCharm——一款流行的集成开发环境(IDE)用来编码,通过YouTube上的几个小时Python速成课程,还有这个展示的明星:ChatGPT和Gemini。它们成为了我值得信赖的编码伴侣(是Gen AI最有前途的应用之一),在每个转折和困难时刻都给予我帮助。经过几个彻夜未眠,原型迅速开始成型,每一行代码都证明了人类直觉和人工智能之间的协同努力。是的,我在这个过程中遇到了困难、卡住和阻塞——但是——凭借多年培养的良好问题解决技能和数字同伴的指导,我克服了障碍或找到了奇思妙想的解决办法,继续前进。
技术栈
体系结构和数据流
数据流程
- 用户通过计算机或移动设备上的浏览器访问网页应用程序。
- 在运行在GCP Cloud Run上的网络应用中,提供给用户通过摄像头拍摄照片或上传之前拍摄的照片的选项。还有一个第三个选项,可以手动输入食物描述。
- 图像已验证,并附加了相应的提示。使用这个有效负载,作为云函数运行的LLM封装被引入。
- 云功能执行几项验证操作,并调用Vertex AI Gemini Vision模型来分析图像,并估计图像中捕捉到的食物项目中的热量、宏量和维生素等。模型的默认响应为英语,如果用户配置文件中设置了其他语言的翻译,例如法语(作为骄傲的加拿大人)、印地语(为了我的父母)和罗马尼亚语(为了家人,不能出错!),则会额外调用Vertex AI的Gemini Text模型进行翻译。
- 一旦模型提供了响应,关键的数据点会被提取并插入后端的BigQuery(BQ)表中。数据模型相当简单,包括一个称为“宏”的事务表,以粒度级别存储数据,一个用于用户管理的主数据用户表以及几个用于分析的聚合视图。在数据保存在BQ中后,来自Gemini的响应会在应用程序上展示给用户。
- 用户仪表盘是在Looker工作室中构建的。请参考下方的仪表盘截图和详细信息。
- 代码被容器化,并通过从我在本地笔记本电脑上运行的Pycharm到Docker和Cloud Build部署到Cloud Run。随着应用程序在过去的一个月中不断发展演进,我周期性地部署了多个应用程序的修订版本。
应用程序的屏幕截图
对于原型,目前还没有单独的用户身份验证设置(正在进行中)。用户(在下面遮蔽)通过BQ用户表在后台手动管理。一旦应用程序开始运行,用户有三个选项:
- 点击一张食物的图片
- 上传了之前点击过的图片
- 无图像 - 手动输入描述
一旦图片上传完毕,用户点击“计算卡路里”。
以下是从Gemini模型收到的响应示例。首先是一个简短的描述,然后是总热量、宏量、微量和维生素的分类显示。正如上面的数据流程所描述的那样,模型响应的关键数据点被自动提取并插入后端BQ表中,从而实现了关键的一键需求。
根据用户偏好,如果翻译设置为特定语言,则在英文文本之后也会显示该语言的文本。例如下面的例子,对于魁北克非正式的国家美食 - 加拿大薯条奶酪烤肉青酱干酪沙拉,描述和宏观英文文字是: La poutine..en Français SVP!
正(Positive)/负(Negative) 测试及模型幻觉
即使在开始编码之前,我都直接在GCP上对Gemini Vision模型进行了各种食物图像的准确性测试,包括对食物项目和卡路里、宏量、微量营养成分的识别。虽然它的识别能力相当准确,大约90%左右,卡路里、宏量、微量营养成分的估计却取决于各种因素,包括食物放置在盘子上的方式、照片的方向、距离、角度等。在各种尝试中,我估计平均约为70-80%。我毫不怀疑,随着这些模型变得更加复杂和先进,我们迈向AGI的过程中,它们将变得非常准确。
模型表现不佳的测试用例,准确度不到50%,是指没有任何食物的图片,也就是所谓的负面测试。即使进行了大量的模型参数调整(如温度、顶部-p、顶部-k)和提示工程(少数拍摄),结果往往是偶如命中。就像下面的例子中一样。
在左边:使用一本阿特拉斯书的照片进行测试,该模型正确地回复为 - 请提供一张包含食物项目的图片,以便我提供估计。
在右侧:使用一张螺丝刀的照片进行测试,显然该模型产生了幻觉,并且完全忽略了照片的内容。
仪表板
希望仪表盘非常直观易读。它显示卡路里消耗量、宏级与微级营养的平均分配比例(我的目标是40:40:20的平衡比例),以及过去一周(7天滚动)的趋势。根据最初确定的关键间断性断食(IF)要求,它自动计算每日进食时间窗口和每日进食次数,具体取决于用户每天拍摄的照片的时间和数量。最后,在摘要和食物选择总结(左下方),再次使用Gemini文本模型提供洞见和建议。显然,周末我健康作息出现问题!
结论
在这段探索和学习的短暂旅程中,我以超快的速度解决了一个真正的问题,揭示了人工智能的神奇潜力:仅用3-4周的时间(晚上和周末)就构建了整个应用。它完美吗?远非如此。它100%准确吗?还没有,但它非常实用,能够帮助我保持对健康目标的动力和责任。人工智能的卓越与数字魔法的融合产生了一个项目,不仅满足了个人需求,还为未来在迷人的人工智能领域进行探索奠定了基础。希望这篇博文成为一个蓝图,激励他人通过利用人工智能的力量将他们的创意付诸实践!