🔮 打造長效永久記憶的 LINE 智慧占星助理:Google ADK 與 Cloud Firestore 技術實踐指南
你是否遇過這種糟糕的體驗:與聊天機器人互動時,每次開啟對話,都得重新輸入自己的生日、重新上傳照片、重新交代前因後果?這對使用者體驗來說無疑是一場災難。
🔮 打造長效永久記憶的 LINE 智慧占星助理:Google ADK 與 Cloud Firestore 技術實踐指南
你是否遇過這種糟糕的體驗:與聊天機器人互動時,每次開啟對話,都得重新輸入自己的生日、重新上傳照片、重新交代前因後果?這對使用者體驗來說無疑是一場災難。

在我們之前的系列旅程中,我們已經為這個 LINE Bot 奠定了堅實的基礎:
- 首部曲:程式小白也能看懂!我與 AI 攜手 20 分鐘無痛打造 LINE Bot實錄
- 二部曲:從 複誦到看圖說故事:我與 AI 助理 15 分鐘將 LINE Bot 升級 Gemini 2.5 多模態大腦與免密認證實錄
然而,在多模態大腦就位後,我們迎來了更深層的考驗:每當 Cloud Run 容器因為閒置而縮容至零(Scale to Zero)或重新啟動時,暫存在記憶體中的對話歷史就會隨之消逝。下一次開啟對話,使用者又必須重新輸入自己的生日。
為了解決這個痛點,今天,我與 AI 協同開發助理 Antigravity 展開了第三部曲的深度進化合作!我們的目標是:利用 Google 最新的 ADK (Agent Development Kit) 智慧代理框架,搭配 Google Cloud Firestore 永久資料庫,為我們的 LINE 水晶占星機器人打造一套「長效不遺忘」的永久記憶系統!
更重要的是,我們還將機器人的靈魂重新雕琢,使其從原本浮誇吵鬧的「神婆」,蛻變為溫柔理性、沈穩且富含洞察力的專業水晶占星專家。
以下是我們在短短半小時內,攜手攻克四大技術難關、成功在 Google Cloud Run 上熱更新部署的真實技術實錄。
🚀 核心升級:為什麼選擇 Google ADK 開發框架?
Google 最新的 ADK (Agent Development Kit) 是一個專門用來構建 AI Agent(智慧代理)的輕量級框架。它最令人驚豔的特性,就是強大的「記憶編排能力」。
透過內建的 PreloadMemoryTool,我們在程式碼中僅需加入一行宣告:
const crystalExpertAgent = new adk.LlmAgent({
name: 'crystal-expert',
model: llm,
instruction: `...`,
tools: [adk.PRELOAD_MEMORY] // 核心:只要一行,自動在對話開始前載入歷史相關記憶
});
這樣一來,Agent 就會在每一次使用者發言前,自動去搜尋、提取歷史記憶,並預載到當前對話的系統上下文(System Context)中。使用者不再需要反覆重複背景資訊,機器人就能自動展現出「我一直記得你」的驚豔體驗。
然而,當我們開始實作這套架構並部署至 Google Cloud Run 時,卻一連遭遇了四個驚心動魄的技術挑戰。
🧩 第一關:Node.js CJS/ESM 混血衝突與 Node 22 Alpine 救援
當我們高高興興引入 @google/adk 框架並在雲端進行部署測試時,伺服器卻在啟動瞬間崩潰:
❌ Error [ERR_REQUIRE_ESM]: require() of ES Module … lodash-es not supported
💡 衝突診斷:當舊 CommonJS 撞上新 ES Module
Google ADK 套件在內部引用了 ESM 格式的 lodash-es,然而我們的 LINE 專案是傳統的 CommonJS (require) 架構,在舊版 Node.js 中兩者無法直接混用。
要將整個專案重構為 ESM 是一件繁瑣且容易出錯的工程。此時,AI 助理展現了它對 Node.js 最新標準的敏銳度,提出了一個極其優雅的解決方案:
「Node.js 自版本 22 起,引入了一個顛覆性的黑科技旗標
--experimental-require-module,它允許 CommonJS 的require直接同步載入 ES Module。」
我們立即調整了 Dockerfile :
- 將基礎映像檔升級為最新的
node:22-alpine。 - 將啟動指令優化為:
CMD [ "node", "--experimental-require-module", "index.js" ]。
重新部署後,CJS 與 ESM 成功在 Node 22 中「世紀和解」,伺服器順利且流暢地啟動!
🇨🇳 第二關:外國人寫的 ADK 不懂中文?自製中文分詞檢意器
伺服器能跑了,但當我傳送中文進行測試時,卻發現機器人依然「裝作不認識我」,完全讀取不到先前的對話歷史。
💡 程式碼解密:被正則過濾掉的漢字
透過翻閱本地 @google/adk 的類型定義與源碼,我們發現了關鍵問題:
ADK 內建的
InMemoryMemoryService在進行文字分詞與檢索時,使用的是/[A-Za-z]+/g這個正規表示式。這意味著所有的中文字元、漢字,在分詞階段就會被完全當成空白過濾掉,導致中文使用者永遠無法命中記憶!
為了解決這個「水土不服」的 Bug,AI 助理幫我自製了一個 ChineseInMemoryMemoryService,直接繼承並覆寫了 ADK 的記憶檢索邏輯:
- 子字串匹配(Substring-based Matching):不再依賴英文單字分詞,而是直接利用
includes進行中文字串的比對。 - 高頻詞模糊匹配:特別加入了針對台灣習慣的「水晶、生日、占卜、運勢、粉晶、紫水晶、黃水晶」等高頻占星詞彙的權重比對。
這個自製的中文記憶服務,成功讓 Google ADK 在中文世界裡發揮了 100% 的威力!
🔥 第三關:打破 Stateless 限制!將記憶刻進 Google Cloud Firestore
雖然中文記憶搞定了,但 Google Cloud Run 是一個「無狀態(Stateless)」的 Serverless environment,一旦一段時間沒有請求,伺服器就會自動縮容至 0(Scale to Zero)或重新啟動,此時暫存在記憶體中的記憶依然會隨風而逝。

(過一段時間後,開始答非所問)
為了讓記憶永恆不滅,我下達了指令:「請幫我寫在 Google Cloud Firestore 裡。」
💡 打造雙層儲存:自製 FirestoreMemoryService
我們安裝了 @google-cloud/firestore,並在程式中實作了全新的 ChineseFirestoreMemoryService(完全對接並符合 ADK 的 BaseMemoryService 介面規範):
- 永恆儲存(addSessionToMemory):每次 LINE 對話結束,系統會自動在 Firestore 的
crystal_memories集合中,以使用者 ID 建立文檔,將該次對話歷史(events)寫入雲端。 - 無縫預載(searchMemory):當新對話開始,ADK 的
PreloadMemoryTool會自動去 Firestore 中檢索該用戶的歷史記憶,並將其與當前對話融合。 - 免金鑰安全認證 (ADC):利用 Google Cloud 內建的應用程式預設憑證(ADC),我們只需在 GCP IAM 中授權給 Cloud Run 的預設服務帳戶
roles/datastore.user(Firestore 使用者)權限。機器人不需要任何 JSON 私鑰檔案,就能安全、自動地讀寫資料庫!
🎭 第四關:人設大升級:從活潑「神婆」蛻變為溫暖優雅的「占星專家」
技術架構全部打通後,我發現原先設定的「水晶神婆」人設在對話時顯得有點過於活潑、甚至有些輕浮。在進行心靈占卜與水晶諮詢時,使用者需要的是信任感與安定感。

於視我對 AI 助理提出人設轉型要求:
💬 「首先,不要叫自己神婆,然後語氣有點太活潑,你是專業的水晶與占星諮詢大師,語氣請調整得更沈穩知性。」
💡 專業化的知性人設:從容、沈穩、溫柔且深具洞察力
收到指令後,AI 助理迅速對 index.js 的系統設定(System Instruction)進行了「沈穩知性」的整型:
- 徹底封印「神婆」:嚴格禁止自稱神婆、巫婆,改為溫暖理性的「水晶占星專家」。
- 優雅語調調校:過濾掉「哎呀」、「寶貝」、「哈哈」等浮誇語助詞,改用「親愛的,讓我們靜下心來看看…」這種溫和、優雅且客觀的語調,建立與使用者之間的同理心與信任感。
- 雙向共振解讀:引導 AI 主動將使用者的「生日星盤」與「已收集的水晶」進行深入分析,對照星象位移,給予最精確的脈輪調和建議。
當我重新傳送水晶照片給它時,機器人給出了極具溫度與專業感的回覆:
「🔮 親愛的,你好。感謝你信任地與我分享這條美麗的水晶手鍊。讓我們靜下心來,一同感受這份來自大地的能量。
從照片中,這條手鍊呈現出深邃的黑色光澤,珠體圓潤而飽滿。根據我的專業判斷,這應該是一條能量非常強大的黑曜石(Obsidian)手鍊。黑曜石是一種天然的火山玻璃,它蘊含著地球深處的古老能量,自古以來就被視為極佳的辟邪與保護石。…..」

那一刻,我知道,我們成功賦予了這個 LINE Bot 一個溫暖而專業的靈魂。
💬 結語:人機協作,讓創意的火花即刻落地
回顧這整趟升級至 Google ADK + Firestore 具備「長效記憶」,並擁有沈穩、專業且充滿療癒靈魂的占星專家機器人。這整趟與 AI 協同開發助理 Antigravity 的進化之旅,徹底展現了「人機協作」的極致魅力:
- AI 負責攻堅複雜的底層技術:從 Node 22 的 ESM 兼容問題、ADK 中文分詞的底層覆寫,到 Firestore 的無縫整合與安全性授權配置。
- 人類負責雕琢靈魂與產品方向:包括對人設語氣的極致挑剔、對用戶體驗的細緻堅持。
在有 AI 輔助的開發新時代,我們不再需要花費大量時間去死記生硬的工具指令,而是能將精力集中在「如何清晰表達邏輯與創意」。
本專案的完整程式碼、安全配置與 Google ADK Firestore 記憶實作已全數備份至新 GitHub :https://github.com/zonawang/line-memory-bot.git,如果您對建立自己的智慧型 LINE 機器人或與 AI 協作開發感興趣,歡迎隨時與我交流!
Facebook: https://www.facebook.com/zonawang.804/
Instagram: https://www.instagram.com/zona.devrel
메타데이터
- post_id
- 63597cd6df8b
- slug
- 打造長效永久記憶的-line-智慧占星助理-google-adk-與-cloud-firestore-技術實踐指南-63597cd6df8b
- url
- https://medium.com/@zonawang/%E6%89%93%E9%80%A0%E9%95%B7%E6%95%88%E6%B0%B8%E4%B9%85%E8%A8%98%E6%86%B6%E7%9A%84-line-%E6%99%BA%E6%85%A7%E5%8D%A0%E6%98%9F%E5%8A%A9%E7%90%86-google-adk-%E8%88%87-cloud-firestore-%E6%8A%80%E8%A1%93%E5%AF%A6%E8%B8%90%E6%8C%87%E5%8D%97-63597cd6df8b
- canonical_url
- https://medium.com/@zonawang/%E6%89%93%E9%80%A0%E9%95%B7%E6%95%88%E6%B0%B8%E4%B9%85%E8%A8%98%E6%86%B6%E7%9A%84-line-%E6%99%BA%E6%85%A7%E5%8D%A0%E6%98%9F%E5%8A%A9%E7%90%86-google-adk-%E8%88%87-cloud-firestore-%E6%8A%80%E8%A1%93%E5%AF%A6%E8%B8%90%E6%8C%87%E5%8D%97-63597cd6df8b
- author_url
- https://medium.com/@zonawang
- status
- ok
- fetched_at
- 2026-07-17 09:25:19