跳至主要內容

用Claude Code做一個AI飲食營養分析Bot:從拍照辨識到條碼查詢的實作筆記

沒想到在十多年後,因為想做飲食營養控管,所以自己利用 AI 開始做一個簡單的食品營養分析工具,能分析我每餐的飲食是否充足或過量,並提供有依據的飲食建議。

最初的雛形是基於以往曾參與「Food Open Data」倡議的經驗,我希望用最簡單的方式,拍照-->AI辨識與分析-->提供建議,然後統計一段期間的營養攝取狀況。

最初的想法

當我把我的雛形想法告訴 AI 後,Claude Code 很快的就幫我設計好雛形、教我如何申請Telegram Bot,這些步驟都寫得很清楚,整個雛形做好不用半天,我還愣住了,怎麼可能這麼簡單?難怪那些應用程式公司只把飲食營養分析當作一個「附加功能」,主要目的是蒐集其他的生理監測資料,但這些公司蒐集資料的用途,我自己在處理過美國資料經紀公司所販售的資料隱私資訊後,這是值得關心的議題,但不在此篇文章裡討論。

不過,我只專注在飲食分析項目,我覺得這個功能如果可以做好,再想想其他的。最初的想法很宏大,因為家人與自己患有慢性疾病,所以特別針對某些族群設計,但事實上,如果沒有實際的使用情境,可能也無法做出符合需求的產品。

於是我把這個Bot的使用者只鎖定在我自己的飲食分析上,那就簡單多了。

工具與環境限制

我在今年已經改用 Claude Cowork 與 Claude Code 協作,雖然 Claude Code 有一般介面版,但我大多數時間都開著終端機視窗使用 Claude Code,這樣比較能專心工作。

基於使用工具的習慣,我使用 Claude Code 開始建置,當時的模型雖然已經有Opus 4.8,但Sonnet 4.6已綽綽有餘,而後來出現的Fable 5 則用在其他專案裡。

因為只做給自己用,所以選擇最簡單的 Chatbot 形式;也因為我希望可以自由的使用而不是提供過多的個人資料給其他平台,選用 Telegram Bot,而不是台灣人常用的 LINE Bot ,而且 LINE上太多廣告,根本不想開它。

在衡量經濟現實及自我管理資料的想法後,目前這個 Bot 與資料庫只放在我的電腦裡,沒有上雲端,當電腦休眠、網路斷線時,Bot就會停止工作。

雖然只是給我自己使用,但我還是要求資料庫是加密儲存的,匯出資料時也必須加密。

台灣的飲食文化很多元

我不是開發者、也不是營養師,我自己也沒使用過其他的應用程式,所以無從理解在開發飲食營養分析應用程式的工程師們,除使用AI來分析外,有沒有實際去參考飲食營養資料?或是確認 AI 辨識出的東西是否正確?我自己就曾遇過 AI 把粽子辨識成滷雞腿、把茶葉蛋辨識成小饅頭的狀況,而錯誤的辨識結果也會影響到營養分析的結果。那使用者有沒有辦法修正辨識錯誤的結果?我把修改的功能寫進去,可修改食物名稱、份量、熱量,在昨天,我要求它能記住我每次修改後的資訊,做一次改版。

一般使用者無從得知 AI 辨識的依據是什麼,根據哪個飲食指南?資料庫?參考資料與分析出的結果可信度是多少?由於台灣有豐富多元的飲食文化,AI 能否辨識出不同國家料理的營養成份?

在 Claude 的協助下,這些問題都處理好了,我連輸入「Khichari」(印度阿育吠陀小豆粥),這個Bot 都能分析出來。

ai-diet-bot-telegram-screenshot

現在的進度

在我使用 Chatbot 的過程裡,也發現自己食用不少包裝食品,而這些食品通常都會有條碼,於那個在腦袋裡塵封十多年前的專案,又回到眼前--我能否靠掃描條碼就能取得每一份的營養成份資訊?又或是我拍下包裝上的營養成份表,我就可以直接讓 AI 取得資訊?

我把想法告訴Claude,它就開始幫我串接、寫程式、驗證,完成後再讓我實際去掃描一次條碼,並提醒我較知名的品牌比較可能有機會取得資料,但小眾的品牌就不會有。我分別測試義美與元本山的包裝食品,我有取得義美包裝食品的營養成份資訊,元本山則是無法經由條碼取得資訊,改由辨識拍攝的營養成份表取得。

食藥署的開放政府資料

由於 Claude 提醒我,台灣的包裝食品資料並不完整,尤其缺乏本地較小的廠牌的包裝食品資料。於是我想起了以前的食品安全溯源系統,但大概是更換執行團隊或什麼原因,原本的食品安全溯源網站已經不存在了,而食藥署提供「非登不可」與「非追不可」兩個平台,但都不是一般民眾會使用的介面,當我進一步再查找有無開放的API可以介接或是開放政府資料可以下載時,我在政府開放資料平台上找到「食品藥物開放資料平臺 OpenData API」網址,頁面列出的大概都是網站公告的資訊、丟在社群媒體上的懶人包,最後終於找到「食品追溯追蹤系統消費者查詢資料集」,但不是可以介接的 API,我讓Claude幫我寫入更新排程裡。

當我第一眼看到食藥署開放的 API 頁面時,我只能回應「不予置評」,當初行政院的「食品雲」理想,不知道是否在2024年後就沒再延續下去?最近的食安問題,「非登不可」與「非追不可」兩個平台能提供人民什麼協助?

在我寫這篇文章的同時,Claude正在幫我整合資料(使用額度快到期的Fable 5),同時也把 7 天更新一次的頻率寫進去,也因為台灣多元的飲食文化、食品名稱,Claude 也幫我整合同義詞表等這些細微的工作項目。

目的:了解自己的飲食習慣-鈉超標

從原本只想用AI辨識分析自己的飲食資料,到後來我發現AI辨識所依據資料的來源、可信度,都在一個黑盒子裡,基於工作習慣,我需要分析結果有憑有據,為此繞了很大一圈,但這麼大一圈、介接許多資料後,還是有很多地方需要調整,例如只能約略估算食物的份量,但資料庫可能是以 100 g 為單位;便當盒裡雜亂無章擺放的菜與飯,AI也無法正確辨識份量;台灣有很多美味的小吃是不在資料庫裡,只能讓AI去估算。不過我只是給自己使用,我可以再想辦法調整。

在我實際使用幾個星期後,我看著Bot自動產出的報表,雖然有測試資料,但我會記得刪除,保留下來的資料都顯示出我攝取的鈉超標了,而經營養師檢核,都認為我的飲食已偏清淡,但還是有鈉攝取過量的問題。

結尾

昨天晚上我完成掃條碼及辨識成份資料表的功能時,我其實百感交集。當初的 FOOD OpenData,因為各種原因,似乎成為一句口號,我在當時有與其他業者聊過,想過多種應用情境,但都沒有看到產品,我不喜歡安裝無法信任的程式,也不喜歡把自己的生理資料存在一般公司的電腦裡(美其名是存在雲端)。

我一直都在鼓勵許多使用者,把你需要的東西、想要解答的問題丟進AI,它會帶著你逐步從評估、製作雛形到完成、改版……。不再受限於需要花時間等待工程師幫你做雛形,而是直接生成可以用的雛形,再依照使用情境去修改,所有的天馬行空被實現的可能機會增加了,我覺得這才是AI時代的意義。


Image by Bernadette Wurzinger from Pixabay

留言

此網誌的熱門文章

台灣女性在 ICT 相關產業的情況(更新至 2018 的資料)

Image by StockSnap from Pixabay 去年五月時寫了一篇「 願天下的女性都能享受自己選擇的人生 」,事隔一年,主計總處、內政部的詳細報表資料已經找不到了,只找到粗略的分級,所以今年也不打算更新太多項目,只大概更新一下資料。關於資料這件事,如果政府繼續排斥將這些資料完整的公開,我覺得整個開放資料或政府公開資訊都只是做做樣子,有交差就算了。 在我開始更新資料前,先讓大家看一下這是讓我今年在主計總處統計專區裡所下載回來的資料,表頭是「臺灣地區15至64歲已婚女性曾因結婚、生育而變更職務之情形」,但只有依學歷來區分,無法看到以年齡來分組的統計資料,但這份資料的主題不就是以年齡來分組嗎? 臺灣地區15至64歲已婚女性曾因結婚、生育而變更職務之情形 後來我找到 2016年的「 婦女婚育與就業調查報告 」,其實就是去年使用的資料,所以只好再去找尋其他的資料。

為什麼我支持《數位中介服務法》草案

在經歷許多次反抗台灣政府所立的網路相關法案後,我其實沒想過除了《數位通傳法》草案外,我還會再支持另一部法律草案,雖然 《數位通傳法》草案還壓在某處,但如果有人讀過《數位通傳法》的草案,再讀這部《數位中介服務法》草案,就會知道這部草案的重要性,而且也可以顯示台灣網路使用者的成熟度,更重要的,這是我第一次看到引入國際網路治理多方利害關係人機制的法律草案,而且是用在正確的地方。 有興趣想知道我在讀法條時的筆記和當下的感想,可以看我這則  Tweet 。這篇不使用逐條讀法條的方式來寫,因為那會讓人昏昏欲睡,我也不去比對歐盟《數位服務法》,因為我在讀《數位服務法》草案時,該草案特別強調是加強歐盟 E-Commerce Directive  ,而不是取代它,而且更多著重在預防盜版、仿冒,保護消費者的法案。所以當有輿論提到參考自《數位服務法》的《數位中介服務法》草案限縮言論自由時,我其實是一頭問號的,但一直到今天我才有時間讀《數位中介服務法》草案,這篇文章出自於我的個人經驗和閱讀法案的心得,與擔任的職務無關。 如果最近注意一下網路的資訊,有幾件事該注意一下: 有許多人在社群平台,如Facebook或是其他網路看到一些廣告,而這些廣告可能是要你支持台灣農產品、台灣製的產品,結果你收到時,上面還寫著簡體字,通常這是所謂的一頁式廣告詐騙,而行政院的消費者保護會在 2019 年時就有新聞稿在警告「 一頁式廣告詐騙多 小心查證保障多 」,之後像公視或是其他單位都有相關的活動在提醒大家小心這類廣告。但目前這些廣告其實多數不易處理,因為不容易取證、保留證據,等到追查到時已經找不到對方了。 有不少親密照片與影片在情侶分手後,被報復性的上傳到情色網站或透過即時通訊傳到親友的帳號裡,或是被洩露個資,遭到公開的霸凌。 之前有一個專題:「 青春煉獄:網路獵騙性私密影像事件簿 」,光是讀完這個專題報導我就覺得受傷。 有人使用 Deep Fake 把台灣名人的臉部照片合成至色情影片再上傳至色情影片平台,今年 7 月才被判刑。 還有許多創作者藉由網路分享作品時,被人盜用,甚至有國外的使用者修改台灣人的作品去參與比賽還獲獎。 有一次打電話問某個部會,如果消費者在國外電子商務平台買東西,但資料被外洩怎麼辦?雖然政府願意協助,但衡量至國外打官司的時間和成本,就會讓人卻步。 有些行為在現實世界裡有法...

停不下來的更新

一直更新Blog的版型,我必須承認是一件很無聊的事,不過這次除了版型的更動外,連分類和文章內文也做了變動。 先說分類吧!在Blogger叫做Label,不過,Blogger在分類上有一些bugs,只能使用英文,以前這裡的分類大多都是中文分類,結果在link上就是一堆亂七八糟的亂碼,所以我把它改成英文,同時細分一些項目,把出版的文章和一些教學的文章分開來,雖然已經很久沒寫新的,不過既然放上來就做個分類。然而就在新舊label移轉之後,發現中文的label還會存在,而且還會出現莫名奇妙的幽靈數字,Blogger知道這是個bug,不過似乎一直沒有修復的跡象。所以在分類上就出現了如右圖一般的情況,在英文標籤裡會有文章,但是在中文標籤裡是沒有文章出現的,但奇怪的是,有些中文標籤已經不見了,然而在Beauty-Beta這個部落格裡,我也做了分類上的變動,由於以前用英文開頭的Label,所以在label的變動上倒是不用擔心會有這樣的情況。 再來是文章的內容,把以前的文章重新分類,標題前面的一些全形符號或是分類刪掉,除了一些比較特殊的,我會留著,例如壹陸壹,因為在label裡為了統一,我留著原本的E61,但人家的店名是壹陸壹,所以留下文章標題前面的中文分類,另外像是Entertainment項目裡,可能有音樂,可能有電影,就會在前面留下中文分類。 前簡單的CSS和HTML改成現在的XML,這無疑是讓我們再多學些東西,能有時間鑽研當然是好事,可是轉換後,我一直沒有時間去改,當然多半也是因為懶,到現在也是拿別人做好的版型去改配色而已,所以像裡面的設定、安裝的widget和analytics的javascript都要一個一個重新裝,上個星期幾乎每天都弄到天亮才睡,只為了整理這個blog。也因為之前在blog裡放了technorati的分類,所以還要修改以前的文章,把它們加入technorati,還有裡面的語法要更改,所以這個星期甚至下個星期都會一直收到這裡的更新訊息,對於不斷收到訊息干擾的朋友們,在這裡說聲抱歉。 在版面上因為blogger系統在feed接受上的更新,所以還有四個東西沒加進去,分別是最近的文章(Recent Post)、Comments(目前是用別人寫的widget)還有GVO的feed訂閱顯示、Beauty-Beta的訂閱顯示也都還沒放上去。 在Feed訂閱上,以前bl...