先恭喜自己連續30天寫作挑戰成功
第三十天,分享我這次用AI打造「每拍呷」LINE BOT的心路歷程
會想要做這個主題,是因為外食與超商食品成為日常,當我們拿起包裝,盯著密密麻麻的營養標示,應該常常一頭霧水,長輩族群也可能因為字太小而放棄查看。我希望透過一個簡單的 LINE BOT,讓營養標示不再是難以理解的天書,變成讓每個人都能輕鬆掌握的健康指南,這是我打造 「每拍呷-營養標示一拍就懂」 這個 AI Side Project 的初衷!
在構思這個專案時,我首先思考的是「使用者會在哪裡、如何使用它?」手機是我們最常接觸的裝置,而 LINE 在台灣幾乎是國民級的通訊軟體,而且是我身邊的家人、朋友都會優先使用的介面。
將服務建構在 LINE 上,使用者不需要額外下載 APP,只要加入好友就能立即使用,大大降低了使用門檻,將複雜的 AI 技術融入使用者最熟悉的介面。
我觀察到,大部分人看營養標示的場景都是在賣場或超商,這時一手拿著商品,另一手操作手機,如果操作流程太複雜,使用者很可能就放棄了。因此,我將核心功能設計得極為簡單:
這樣的流程設計,讓使用者可以在最短的時間內獲得最有價值的資訊,符合現代人追求效率的習慣。
整個技術架構核心基本上是圍繞著Google提供的服務:
LINE BOT 與後端串接:
我使用 Python 作為後端語言,並搭配 Flask 框架。LINE BOT 接收到使用者訊息(文字、圖片)後,會將其發送到我的後端伺服器。伺服器再根據訊息類型進行不同的處理。
AI 核心:Gemini API 辨識與分析
當使用者傳送營養標示圖片時,將圖片發送到 Gemini API。Gemini能夠直接辨識圖片中的文字,並理解其結構,(一開始有試過OCR辨識,雖然能辨識出文字,但是AI沒辦法理解結構,例如:可能抓到「蛋白質」、「每份」、「14公克」,卻沒辦法串起來。但是Gemini API就能理解結構,故選擇使用這項服務)
程式中需要給 Gemini 清晰的 Prompt:
「請你辨識這張圖片中的營養標示,並以 JSON 格式回傳以下資訊:每份、熱量、蛋白質、脂肪、碳水化合物、鈉、糖,以及其他重要營養素的數值。」
Gemini 會快速解析圖片,並回傳結構化的數據。接著,後端會將這些數據進行處理,並結合使用者的生理資訊(身高、體重、性別),計算出個人化的分析結果。
為了讓體驗更佳,我整合了Google的 TTS (Text-to-Speech) 服務。這項服務能將分析報告的文字轉換為音檔,並回傳給使用者。這對於視力不佳或不方便看手機的使用者來說,是一項非常有價值的輔助功能。想像一下,在賣場裡,你只需要戴上耳機,就能聽到營養標示的語音分析,這大大提升了使用的便利性。
此外,我用Firebase 的 Cloud Storage來儲存生成的音檔。當Gemini生成文字報告,後端會將其產生語音檔並上傳到 Cloud Storage,然後產生一個公共連結,再將此連結回傳給 LINE BOT,讓使用者能夠直接播放。
資料庫這段過程算是自行摸索的,一定還有可以做得更好的地方!
這個專案的開發過程並非一帆風順,我遇到了許多挑戰,而解決這些問題的過程,也讓我對專案有了更深的理解。
解決方案: 我在 Prompt 中增加了更多的上下文與容錯機制,例如:「如果無法辨識特定數值,請提示使用者文字輸入。」 下方圖文選單也可以按「文字輸入營養標示」,LINE BOT會逐項詢問。
單純的營養分析只是第一步,如何給出有價值的個人化建議才是關鍵。因此才會需要用戶輸入生理性別、身高、體重。
解決方案: 我在後端設計了更複雜的計算邏輯,這是程式碼佔最大比例的部份,像是我有參考了衛福部的DIRs建議攝取量標準、參考每個營養素提供的熱量與食物代換、參考了以時速4公里散步能消耗的熱量...等等。
未來,我還會考慮加入更多個人化標籤,例如「高血壓患者」、「糖尿病患者」、「素食者」等,讓建議更貼近使用者的真實需求!
「每拍呷-營養標示一拍就懂」這個專案,對我來說既是一個技術挑戰(畢竟才剛學程式語言兩、三個月),也是一次將所學應用於生活的實踐,AI可以跟我們的日常習慣結合,創造出更大的價值。
從最初的一個小想法,到現在擁有一個不完美但可行的技術架構,這段旅程充滿了學習與成長,也看到很多人做出厲害、有趣的專案!
雖然這樣講有點老套,但是這次的經驗真的是「學中做、做中學」,像是兩週前我還在驚訝別人怎麼把「部署」講得如此家常便飯(佩服),沒想到兩周後我也硬是逼自己把頭洗下去,然後依然覺得部署好難(誤)。
這個領域有趣的事情很多,當然還有太多、太多要學習的,希望自己能一直保持空杯心態、虛心學習,有機會繼續上來分享學習心得。