里程碑
讓只會單向推播的股票機器人學會「回答」:n8n × AI Agent × Gemini 打造可追問的 LINE 投資小精靈
sh @sh233發布於
一、背景與動機
我平常有在寫一個台股量化小程式 quant-bot(使用Python),每天收盤後會自動跑兩種規則,再用 LINE 官方帳號「書浩專屬投資機器人」推播結果給我(見圖 2):
- 突破策略:收盤價創近 20 日新高就「進場」,跌破近 10 日最低就「出場」,中間叫「續抱」。
- 低價潛力股評分:位階低、外資買超、站上 20 日均線,三項各 2 分,滿分 6 分。
用了幾個月,我發現這個機器人「只會通知,不可追問」。訊息寫「[6分] 3035 智原 位階35%」,可是我常常想不起來 6 分是怎麼加出來的,也不知道「續抱」離出場還有多遠。想追問,只能回電腦重跑程式。
所以這次任務,我想做的是「原本的推播保留」,在旁邊多加一層 AI 小精靈:看到推播有疑問,直接在 LINE 問它「為什麼」。
二、觀察到的問題
- 有結論,沒原因:推播只有結果,沒有判斷依據。
- 想追問需要自己翻程式:例如「2401 現在位階多少」「這週訊號有什麼變化」。
- 算完就不見:程式算出來的中間數字(20 日高點、外資買超張數)都沒有存下來,事後想查也查不到。
在整理資料的過程中,抓到自己程式的兩個 bug:
- 「位階 35%」其實是 34.85% 四捨五入,所以才拿到「低於 35%」的 2 分,只看訊息會以為規則寫錯。
- 訊息寫「一年區間」,程式實際卻用了從 2024 年到現在,兩年多的區間。
這點醒了我:AI 要能「解釋」,資料本身要先講得清楚。
三、系統架構與做法
- 整體架構(見圖 1)
- 既有部分(不動):GitHub Actions 每天收盤後算訊號 → LINE 推播給我。
- 新增一:算完順便把結果存成 JSON,上傳到 Cloudflare R2。
- 新增二:我在 LINE 傳問題 → n8n 收到 → AI Agent 自行去讀 JSON、查即時股價 → 用白話回覆到 LINE。
- 第一步:讓資料「落地」
我寫了一支 export_signals.py,每天輸出兩種 JSON:
summary.json:今天的總覽,包含哪些續抱、哪些出場、潛力股排名、最近 10 天的進出場紀錄。- 個股明細(例如 2330.json):20 日高點、10 日低點、外資買賣超,以及每一項評分的原始數字。
關鍵設計是「數字一律保留原始值」(位階存 0.3485 不是 35%),另外再放一個給人看的欄位。這樣 AI 解釋時不會被四捨五入影響到。
- 第二步:n8n 流程拆解
n8n 可以想成「用積木拼流程的工具」:每個方塊(節點)做一件事,用線連起來,資料就從左流到右。
我的流程大致分成四段:
- 收信與驗證:Webhook 是 n8n 的收件信箱,LINE 收到訊息就寄過來。接著用 Crypto 節點,拿只有我和 LINE 知道的 Channel secret 算出一組「指紋」,和 LINE 附上的
x-line-signature比對,不一致就直接拒收,避免有人假冒 LINE 來亂打、浪費 AI 額度。
- 整理問題:拆開訊息、只留文字,記下是誰問的、今天問了第幾題(每人每天上限 30 題),並讓聊天室先顯示「輸入中…」動畫。
- AI 大腦(見圖 3):AI Agent 掛著 Gemini 2.5 Flash、對話記憶(記住最近 10 輪,所以可以追問「那它呢?」),以及三個工具:讀今日總覽、讀個股明細、查證交所即時股價。AI 「自己判斷」要查哪個工具、查哪一檔。
- 回覆:把 AI 的回答去掉 LINE 不支援的格式符號、限制長度、由程式固定附上免責聲明,再加上 4 顆快速按鈕(今日訊號/這週變化/潛力股/規則說明),用 LINE Reply API 回覆(見圖 4)。AI 出錯時改回一句「請稍後再試」,另一條流程會自動推播錯誤通知給我(見圖 5)。
- 給 AI 的工作守則
- 每一題都要先用工具查資料,數字只能來自查到的資料,禁止憑記憶或猜。
- 回答要附上資料日期。
- 不給任何買賣建議或目標價,也不用「安全」「值得關注」這類帶評價的字眼。
- 免責聲明由程式在最後固定附上,確保每一則都有。
四、目前成果
現在可以直接在 LINE 這樣問(括號是資料日期):
- 問「為什麼續抱 2379?」(10/15)→ 10/14 進場,當天收盤 778;目前 764、報酬 -1.8%;出場線 741,距離 3.1%。(見圖 4)
- 問「智原為什麼 6 分?」(10/13)→ 會先指出它現在不是 6 分:位階 56.4% 已超過 50% 門檻,外資得 2 分、止跌 0 分。(見圖 6)
- 接著問「那它的外資呢?」→ 小精靈記得在講智原,回答近 20 日外資買超 13,373 張。(見圖 7)
- 問「這週訊號有什麼變化?」→ 10/06 世芯進場,10/07 瑞昱、聯發科出場。
- 問「2379 要不要買?」→ 婉拒給買賣建議,只說明目前的訊號狀態與依據。(見圖 8)
幾項測試數據:
- 一題從送出到收到回答,約 10 秒內。
- 每一則回答的數字,都拿 JSON 原始資料逐一對過。
- 開發到完成的所有測試加起來,Gemini 實際帳單只有新台幣 1.17 元。
五、開發過程中的卡點與除錯
- LINE 會重複回覆
遇到的問題:小精靈回答的同時,LINE 官方帳號的自動回覆也跟著回。
解決方式:到 LINE 官方帳號後台關掉「自動回應訊息」、開啟 Webhook。
- 簽章驗證要對「原始內容」計算
遇到的問題:n8n 的 Code 節點不允許使用 crypto 模組,沒辦法自己算 HMAC。
解決方式:Webhook 打開 Raw Body 保留原始內容,改用 n8n 內建的 Crypto 節點計算,secret 也存在 n8n 的憑證裡,不寫在流程中。
- AI 幻覺
遇到的問題:問「這週有什麼變化」時,AI 一度沒查資料就說「聯發科 10/13 出場」,實際是 10/07。
解決方式:在 summary.json 直接提供「近 10 日進出場事件清單」,並在守則規定每題都要先查工具。
- 欄位名稱太像,AI 會拿錯
遇到的問題:手機實測時,小精靈說台積電「進場價 2585 元」,其實那是「近 20 日最高收盤」(再進場門檻),真正的進場收盤是 2480。
解決方式:在守則和工具說明裡把每個欄位的意思寫清楚,並明講「這個欄位不是進場價」。
我學到:AI 回答得流暢,不代表數字是對的,需要人工拿原始資料逐一核對。
- 免費額度比想像中小
遇到的問題:Gemini 2.5 Flash 免費版每天只有 20 次請求,一題約用 2 次,測試沒多久就用完;預覽版模型在尖峰時段還會出錯。
解決方式:改用正式版模型,開啟付費並設定預算上限,實際花費非常低。
- 免費 Tunnel 的網址會變
遇到的問題:n8n 跑在我自己的 Mac 上,用 Cloudflare 的免費 quick tunnel 對外,每次重開機網址都會變,閒置太久還會被回收,LINE 就找不到小精靈了。
解決方式:目前是換網址後到 LINE Developers 更新 Webhook。
六、技術總結與心得
最大的收穫:理解 AI 小精靈的品質取決於「資料」和「守則」。n8n 讓我很快把 Webhook、AI Agent、HTTP Request 串起來,但真正花時間的是:
- 把資料整理成 AI 讀得懂、不會被誤解的樣子。
- 用簽章驗證、每日上限、錯誤通知,讓它可以安心交給別人用。
- 拿已知答案一題一題驗證,改善 AI 幻覺的問題。
原本的推播系統不動,在旁邊多加一層,讓一個「只會推播」的機器人變成「可以追問」的小幫手。
七、下一步
- 把 n8n 搬到雲端平台,讓小精靈 24 小時在線。
- 用 Flex Message 卡片呈現訊號,讓畫面更好讀。
- 讓小精靈也能回答回測績效相關的問題。
原始碼:github.com/sh940203/quant-bot(在新分頁開啟)
※ 本文與小精靈內容僅為規則型程式的解釋與學習紀錄,不構成任何投資建議。
0 個愛心0 則留言
登入並驗證手機後就能留言。登入