跳至主要內容

里程碑

讓只會單向推播的股票機器人學會「回答」: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. 整體架構(見圖 1)
  • 既有部分(不動):GitHub Actions 每天收盤後算訊號 → LINE 推播給我。
  • 新增一:算完順便把結果存成 JSON,上傳到 Cloudflare R2。
  • 新增二:我在 LINE 傳問題 → n8n 收到 → AI Agent 自行去讀 JSON、查即時股價 → 用白話回覆到 LINE。
  1. 第一步:讓資料「落地」

我寫了一支 export_signals.py,每天輸出兩種 JSON:

  • summary.json:今天的總覽,包含哪些續抱、哪些出場、潛力股排名、最近 10 天的進出場紀錄。
  • 個股明細(例如 2330.json):20 日高點、10 日低點、外資買賣超,以及每一項評分的原始數字。

關鍵設計是「數字一律保留原始值」(位階存 0.3485 不是 35%),另外再放一個給人看的欄位。這樣 AI 解釋時不會被四捨五入影響到。

  1. 第二步: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)。
  1. 給 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 元。

五、開發過程中的卡點與除錯

  1. LINE 會重複回覆

遇到的問題:小精靈回答的同時,LINE 官方帳號的自動回覆也跟著回。
解決方式:到 LINE 官方帳號後台關掉「自動回應訊息」、開啟 Webhook。

  1. 簽章驗證要對「原始內容」計算

遇到的問題:n8n 的 Code 節點不允許使用 crypto 模組,沒辦法自己算 HMAC。
解決方式:Webhook 打開 Raw Body 保留原始內容,改用 n8n 內建的 Crypto 節點計算,secret 也存在 n8n 的憑證裡,不寫在流程中。

  1. AI 幻覺

遇到的問題:問「這週有什麼變化」時,AI 一度沒查資料就說「聯發科 10/13 出場」,實際是 10/07。
解決方式:在 summary.json 直接提供「近 10 日進出場事件清單」,並在守則規定每題都要先查工具。

  1. 欄位名稱太像,AI 會拿錯

遇到的問題:手機實測時,小精靈說台積電「進場價 2585 元」,其實那是「近 20 日最高收盤」(再進場門檻),真正的進場收盤是 2480。
解決方式:在守則和工具說明裡把每個欄位的意思寫清楚,並明講「這個欄位不是進場價」。

我學到:AI 回答得流暢,不代表數字是對的,需要人工拿原始資料逐一核對。

  1. 免費額度比想像中小

遇到的問題:Gemini 2.5 Flash 免費版每天只有 20 次請求,一題約用 2 次,測試沒多久就用完;預覽版模型在尖峰時段還會出錯。
解決方式:改用正式版模型,開啟付費並設定預算上限,實際花費非常低。

  1. 免費 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 則留言

登入並驗證手機後就能留言。登入