三天後,一個令人沮喪的消息傳來:南桃團隊的地方創生補助案申請失敗。李秘書拿著評審結果通知書,臉色凝重地走進會議室。
「很遺憾,」李秘書小心翼翼地說,「你們的補助案沒有通過審核。評審委員會認為申請案不夠完整。」
小潔接過通知書,看著上面的評語,心情瞬間跌落谷底:「『申請內容雖有創意,但技術規劃不夠詳實,缺乏完整的實施方案和風險評估』...這怎麼可能?我們準備得很充分啊!」
大財皺著眉頭:「讓我看看...這些評語感覺很奇怪,好像他們對我們的計畫有誤解。」
阿美失望地說:「我已經在社群媒體上預告好了,現在要怎麼跟大家說明?」
霈姊抱著小肉丸,看到團隊成員們的失望,心中也感到難過。小肉丸似乎感受到了氣氛的變化,安靜地依偎在媽媽懷中。
小肉丸輕聲問:「媽媽,大家怎麼看起來不開心?」
沉默了一會兒後,李秘書欲言又止地說:「其實...我打聽到一些消息。」
小潔立刻抬起頭:「什麼消息?」
李秘書降低了聲音:「評審委員會說,今年有另一個團隊提交了幾乎一模一樣的申請案,但是內容更加完整詳實。他們不只有技術規劃,還有完整的商業模式、風險評估、和長期營運計畫。」
大財震驚地站起來:「幾乎一模一樣?這怎麼可能?我們的企劃是原創的!」
小潔感到一陣寒意:「會不會是有人...偷取了我們的企劃內容?」
李秘書點點頭:「我也覺得很奇怪。那個團隊的負責人姓『林』,據說有很強的技術背景,而且申請案的格式和你們的非常相似,只是內容更加豐富。」
霈姊心中感到不安,這種巧合讓她想起了最近的一些異常情況。
阿美憤怒地說:「如果真的是抄襲我們的企劃,這太過分了!我們應該申訴!」
大財冷靜地分析:「但是要證明對方抄襲我們很困難,而且如果對方真的提供了更完整的內容,就算申訴成功,我們也不一定會獲得補助。」
面對這個打擊,團隊陷入了短暫的低潮。原本期待的300萬補助金泡湯,更糟糕的是,可能有人惡意競爭。
小潔苦笑著說:「我們辛苦了這麼久,結果被人搶先一步。」
霈姊看著沮喪的團隊成員,溫柔地說:「雖然失望,但我們不能放棄。這段時間我們學到了很多,也幫助了很多人,這些價值不會因為補助案失敗而消失。」
大財深深吸了一口氣:「霈姊說得對。而且這件事讓我更清楚了一點:我們不能只依賴政府補助,我們需要建立自己的服務體系。」
小肉丸看到大人們的情緒漸趨平靜,天真地說:「叔叔阿姨們,肉丸覺得你們還是很厲害!」
這句話讓大家都笑了起來,緊張的氣氛稍微緩解。
經過一番討論,團隊決定改變策略。
小潔率先提議:「既然傳統的補助申請行不通,我們為什麼不更全面地經營網路平台?直接為民眾提供服務,建立自己的收益模式。」
大財眼睛一亮:「對!我們可以建立一個更完整的數位服務平台。現在正是嘗試新技術的好時機!」
阿美也興奮起來:「我們可以製作更多元的內容,包括教學影片、線上課程、還有即時諮詢服務!」
霈姊思考了一下:「具體來說,我們要做什麼?」
大財說:「我想到一個很好的起點:LINE機器人!」
大財開始解釋他的想法:「LINE在台灣的普及率很高,如果我們建立一個AI服務機器人,可以24小時為民眾提供諮詢服務。這樣不只能擴大服務範圍,還能累積用戶數據,了解大家真正的需求。」
小潔立刻理解了這個想法的價值:「這個很棒!而且LINE機器人可以提供個人化服務,比傳統的客服更有效率。」
阿美也贊同:「對!而且我們可以把所有學會的AI技能都整合進去,讓機器人變成一個超強的助手!」
李秘書聽到這個討論,也很感興趣:「其實鄉公所也一直在想改善民眾服務的方法。如果你們的機器人真的做得好,我們也很願意合作推廣。」
霈姊看著團隊重新燃起的熱情,心中感到欣慰:「那我們就開始吧!把這次的挫折轉化為前進的動力!」
當天下午,團隊就在霈姊咖啡店開始了LINE機器人的開發工作。大財打開筆電,開始向大家説明LINE Bot的基本概念。
「LINE機器人其實就是一個自動回覆系統,」大財解釋,「但結合AI技術後,它可以理解使用者的問題,提供個人化的回答,甚至學習使用者的偏好。」
他在白板上畫出系統架構圖:
「我們的系統分成四個層次:
小潔仔細研究架構圖:「這個系統需要什麼技術基礎?」
大財開始列舉:「主要需要LINE Messaging API、自然語言處理技術、還有我們自己建立的知識庫。不過別擔心,我們可以用AI來協助開發。」
大財開啟Gemini,開始設計LINE機器人的功能架構:
大財的提示詞:
「請協助設計一個南桃鄉AI服務機器人,需要具備以下功能:
核心服務:
1. AI技能學習諮詢(基礎問題、工具推薦、學習路徑)
2. 永續環保指導(評估、建議、實踐方法)
3. 創業輔導諮詢(企劃書、資源媒合、政策資訊)
4. 在地資訊服務(活動通知、商家資訊、交通指引)
使用者類型:
- 一般民眾(基礎AI技能需求)
- 小型企業主(數位轉型需求)
- 學生和求職者(技能提升需求)
- 銀髮族(簡化操作需求)
請設計:
1. 對話流程和選單結構
2. 常見問題分類和標準回答
3. 個人化服務的實現方式
4. 人工客服轉接的觸發條件
5. 使用者滿意度追蹤機制
請確保介面友善且功能實用。」
AI很快提供了詳細的設計建議,包括完整的功能架構和對話流程。
霈姊看著這個設計,感到很驚喜:「這個機器人功能好完整!不只能回答問題,還能提供個人化服務。」
阿美補充說:「而且這樣我們就能追蹤哪些問題最常被問到,可以針對性地準備更多內容。」
接下來是最關鍵的步驟:建立機器人的知識庫。大財説明這是決定機器人回答品質的核心要素。
「我們需要把過去幾個月學會的所有技能和經驗,系統化地整理成機器人能理解的格式,」大財說。
小潔提議:「我們可以按照不同主題分類整理,每個人負責自己最擅長的領域。」
團隊開始分工:
他們開始用AI協助整理知識庫:
小潔的提示詞:
「請幫我整理企劃書撰寫的常見問題和標準答案:
常見問題類型:
1. 企劃書格式和結構問題
2. 預算編列和財務規劃
3. 市場分析和競爭研究
4. 風險評估和應對策略
5. 政府補助申請流程
請為每個類型提供:
- 3-5個具體的常見問題
- 簡潔明確的標準答案
- 進階諮詢的引導方式
- 相關資源的推薦連結
答案要適合在LINE訊息中傳送,每則不超過200字。」
大財開始設計機器人的對話流程,讓它能夠自然地與使用者互動。
「我們要讓機器人有個性,」大財說,「它應該有南桃鄉的在地特色,溫暖友善,就像我們團隊的風格一樣。」
他設計了機器人的基本人設:
機器人名稱:小桃助手
個性特質:
開場招呼:
「哈囉!我是小桃助手,南桃鄉的AI好夥伴!🍑✨
我可以幫你解決各種AI技能、環保生活、創業諮詢的問題呢!
請選擇你需要的服務,或直接告訴我你的問題吧!」
阿美看著這個設計,忍不住笑了:「小桃助手!這個名字好可愛,而且桃子符號也很有南桃鄉的特色。」
小肉丸在旁邊聽到,興奮地說:「小桃助手!像肉丸一樣可愛嗎?」
霈姊溫柔地回答:「對啊,小桃助手會幫助很多人,就像小肉丸總是給大家帶來快樂一樣。」
大財開始進行實際的技術開發工作。他先申請LINE Developer帳號,然後建立新的機器人應用。
「首先我們需要設定機器人的基本資訊,」大財邊操作邊説明,「包括名稱、頭像、歡迎訊息等等。」
他展示LINE開發者控制台的介面:
「看,這裡可以設定機器人的基本資料。我們把頭像設計成一個可愛的桃子圖案,配上南桃鄉的地標背景。」
接著他開始撰寫機器人的核心程式碼,並用AI協助開發:
大財的程式開發提示詞:
「請協助我撰寫LINE機器人的Python程式碼,需要具備以下功能:
技術架構:
- 使用LINE Messaging API
- 整合OpenAI GPT模型進行自然語言理解
- 連接自建知識庫數據庫
- 實現多輪對話管理
核心功能:
1. 接收使用者訊息並分類意圖
2. 根據意圖查詢知識庫或調用AI模型
3. 產生個人化回答
4. 記錄對話歷史和使用者偏好
5. 提供選單式快速服務
請提供:
- 完整的程式架構
- 關鍵功能的程式碼範例
- 錯誤處理和例外狀況處理
- 效能優化建議
程式碼要有詳細註解,方便團隊成員理解。」
經過幾個小時的開發,小桃助手的初版完成了!團隊成員都迫不及待地想要測試。
大財在群組中加入了小桃助手,大家開始試用:
小潔:「小桃助手,我想學習如何寫企劃書」
小桃助手:「太棒了!企劃書是很實用的技能呢!🍑
我可以根據你的需求提供不同層次的指導:
📝 基礎入門:企劃書格式和結構
💰 進階技巧:預算編列和財務規劃
🎯 專業應用:政府補助案撰寫
你想從哪個開始呢?」
阿美:「哇!回答得好專業!小桃助手,怎麼經營社群媒體?」
小桃助手:「社群經營是現代行銷的重點!讓我來幫你!📱✨
首先,你的目標群體是誰呢?
🎯 年輕族群 (18-30歲)
👨💼 商務人士 (30-50歲)
👴🏻 銀髮族 (50歲以上)
🏢 企業客戶
告訴我你的目標,我會提供客製化建議!」
霈姊也試著問問題:「小桃助手,咖啡店怎麼做環保?」
小桃助手:「咖啡店環保實踐是我們南桃鄉的特色!☕🌱
霈姊咖啡店就是最佳典範呢!我可以分享:
♻️ 咖啡渣循環利用
🌞 太陽能節能方案
🛍️ 永續供應鏈建立
📊 環保效益追蹤
你想了解哪個部分呢?」
經過一下午的測試,小桃助手的表現讓所有人都很滿意。機器人不僅能準確回答各種問題,還能根據使用者的需求提供個人化的建議。
「這個機器人比我想像中還要聰明!」小潔讚嘆道,「而且回答方式很親切,就像在跟朋友聊天一樣。」
大財檢查著後台數據:「使用者體驗很好,回應時間也很快。我們的知識庫建構得很完整。」
阿美已經開始想像推廣的可能性:「如果我們在社群媒體上分享這個機器人,一定會有很多人感興趣!」
霈姊抱著小肉丸,看著團隊成員們滿足的表情,心中充滿了成就感。從學習AI技能到現在能夠開發出實用的服務,他們真的成長了很多。
就在團隊專心測試新機器人功能時,鄉公所的李秘書又帶來了一個令人驚喜的消息。
「剛剛接到縣政府的電話,」她興奮地說,「他們對你們的LINE機器人很感興趣,希望能夠合作推廣到全縣的其他鄉鎮!」
小潔眼睛一亮:「真的嗎?這是很大的機會!」
李秘書繼續說:「對啊!而且他們願意提供額外的技術支援和推廣資源。下週會有一個正式的合作討論會議。」
大財雖然興奮,但還是保持謹慎:「這是很好的機會,但我們也要確保技術的安全性和獨立性。」
阿美則想到了推廣的可能性:「如果能推廣到全縣,我們的影響力會大幅提升!」
霈姊看著團隊的成功,心中感到無比驕傲:「從最初的學習AI技能,到現在能夠開發出幫助更多人的服務,我們真的走了很遠的路。」
小肉丸在旁邊聽到大人們開心的討論,也拍著小手說:「叔叔阿姨們好厲害!小桃助手會幫助很多人對不對?」
團隊成員們看著小肉丸天真的笑容,都感到一陣溫暖。這一路走來雖然有挫折,但正是這些真摯的支持和鼓勵,讓他們有動力繼續前進。
經過這次補助案的挫折,南桃團隊反而找到了更適合的發展方向。他們不再過度依賴外部資源,而是建立起自己獨特的服務模式。
小潔總結這段經歷:「雖然補助案失敗讓我們失望,但也讓我們學會了更重要的事情:真正的價值在於我們能為社區帶來什麼改變。」
大財點頭同意:「而且通過開發LINE機器人,我們不只學會了新技術,還建立了可持續的服務平台。」
阿美興奮地補充:「現在有政府的合作機會,我們可以把這個模式推廣到更多地方,幫助更多人學習AI技能!」
團隊決定把重心放在完善小桃助手的功能,並準備下週與縣政府的合作討論。他們相信,通過持續的努力和創新,一定能夠實現幫助更多人掌握AI技能的目標。
本章重點技能習得:
下一章預告:
縣政府合作會議即將展開,南桃團隊將面臨新的挑戰:如何將他們的AI服務模式標準化並推廣到全縣?同時,他們也將學習更進階的AI技術,為即將到來的南桃創意市集做準備...
若迫不及待想要知道之後的故事發展,可以到鏡文學,故事的部分,我已經都上傳到這裡,歡迎使用打賞功能等📚,是對筆者最實質的鼓勵🥰。ps:實做的部分還是會只放在鐵人賽喔
我是 Wolke。我是一名專業程式開發者,專長是開發 AI 和程式解決方案。
我投入了不少時間在專業發展上。我是多本書的作者,其中包括《LINE聊天機器人+AI+雲端+開源+程式:輕鬆入門到完整學習》和《ChatGPT來襲,未來人人都需具備的運算思維!應用詠唱工程來釋放程式生產力—程式學習/開發篇》。也有出版線上課程,我熱衷於分享我的經驗和技術,幫助其他開發者更好地利用 AI 工具。
也在許多知名大學、論壇、社團擔任講者,如果貴方有需要也歡迎與我聯繫。
2023年 講座 紀錄
最後這篇文章若有切合你的需求,敬請訂閱按讚分享
本系列相關內容已轉載及加強到筆者 2025 年 所出版之
若這篇文章對您有實質幫助🙏,還望購買書籍📚,是對筆者最實質的鼓勵🥰。
透過本指南,您將學會:
步驟說明:
重要設定項目:
必要設定項目:
Channel設定清單:
✅ Channel Secret(頻道密鑰)
✅ Channel Access Token(頻道存取權杖)
✅ Webhook URL(稍後設定)
✅ 自動回覆訊息(建議關閉)
✅ Greeting Message(歡迎訊息)
AI輔助設定提示詞:
請協助我設計LINE機器人的基本設定:
機器人用途:[您的機器人功能]
目標使用者:[主要使用族群]
服務範圍:[地區或領域]
請提供:
1. 機器人名稱建議(3-5個選項)
2. 歡迎訊息內容(溫暖友善風格)
3. 自我介紹文案(100字內)
4. 功能選單設計(Rich Menu結構)
5. 回覆訊息的語調風格設定
請確保內容親切易懂,符合台灣在地文化。
基本環境安裝:
# 建立虛擬環境
python -m venv linebot_env
source linebot_env/bin/activate # Linux/Mac
# linebot_env\Scripts\activate # Windows
# 安裝必要套件
pip install line-bot-sdk flask python-dotenv requests openai
專案結構建立:
linebot_project/
├── app.py # 主程式檔案
├── config.py # 設定檔
├── requirements.txt # 套件需求清單
├── .env # 環境變數檔案
├── templates/ # 範本檔案夾
├── static/ # 靜態檔案夾
└── modules/ # 功能模組
├── ai_handler.py # AI處理模組
├── knowledge_base.py # 知識庫模組
└── security.py # 安全防護模組
主程式範例(app.py):
from flask import Flask, request, abort
from linebot import LineBotApi, WebhookHandler
from linebot.exceptions import InvalidSignatureError
from linebot.models import MessageEvent, TextMessage, TextSendMessage
import os
from dotenv import load_dotenv
# 載入環境變數
load_dotenv()
app = Flask(__name__)
# LINE Bot設定
line_bot_api = LineBotApi(os.getenv('CHANNEL_ACCESS_TOKEN'))
handler = WebhookHandler(os.getenv('CHANNEL_SECRET'))
@app.route("/callback", methods=['POST'])
def callback():
# 驗證請求來源
signature = request.headers['X-Line-Signature']
body = request.get_data(as_text=True)
try:
handler.handle(body, signature)
except InvalidSignatureError:
abort(400)
return 'OK'
@handler.add(MessageEvent, message=TextMessage)
def handle_message(event):
# 基本回覆功能
reply_text = f"您說:{event.message.text}"
line_bot_api.reply_message(
event.reply_token,
TextSendMessage(text=reply_text)
)
if __name__ == "__main__":
app.run()
AI處理模組範例(modules/ai_handler.py):
import openai
import json
from typing import Dict, List
class AIHandler:
def __init__(self, api_key: str):
openai.api_key = api_key
self.conversation_history = {}
def classify_intent(self, message: str, user_id: str) -> Dict:
"""分析使用者意圖"""
prompt = f"""
請分析以下使用者訊息的意圖:
訊息:{message}
請回傳JSON格式:
{{
"intent": "意圖類別",
"confidence": 0.95,
"entities": ["相關關鍵字"],
"response_type": "回應類型"
}}
意圖類別包含:
- ai_learning: AI技能學習
- business_consulting: 創業諮詢
- environmental: 環保相關
- local_info: 在地資訊
- general: 一般閒聊
"""
response = openai.ChatCompletion.create(
model="gpt-3.5-turbo",
messages=[{"role": "user", "content": prompt}],
max_tokens=200
)
try:
result = json.loads(response.choices[0].message.content)
return result
except:
return {"intent": "general", "confidence": 0.5}
def generate_response(self, intent: Dict, message: str, user_id: str) -> str:
"""根據意圖產生回應"""
# 載入對話歷史
history = self.conversation_history.get(user_id, [])
# 建立對話上下文
context = f"""
你是南桃鄉的AI助手「小桃助手」,個性溫暖友善。
使用者意圖:{intent['intent']}
當前訊息:{message}
對話歷史:{history[-3:]} # 保留最近3次對話
請提供有用的回答,並保持親切的語調。
回答長度控制在150字內。
"""
response = openai.ChatCompletion.create(
model="gpt-3.5-turbo",
messages=[{"role": "system", "content": context}],
max_tokens=200
)
reply = response.choices[0].message.content
# 更新對話歷史
history.append({"user": message, "bot": reply})
self.conversation_history[user_id] = history[-5:] # 保留最近5次對話
return reply
知識庫模組範例(modules/knowledge_base.py):
import json
from typing import List, Dict
class KnowledgeBase:
def __init__(self):
self.knowledge = self.load_knowledge()
def load_knowledge(self) -> Dict:
"""載入知識庫"""
knowledge = {
"ai_learning": {
"basic": [
{
"question": "什麼是AI?",
"answer": "AI(人工智慧)是讓電腦模擬人類智慧的技術,包括學習、推理、感知等能力。",
"follow_up": ["想了解AI的應用領域嗎?", "需要AI學習資源推薦嗎?"]
}
],
"tools": [
{
"question": "推薦AI工具",
"answer": "推薦入門工具:ChatGPT(對話)、Gemini(搜尋)、Midjourney(圖像)",
"follow_up": ["想學習具體使用方法嗎?"]
}
]
},
"business": {
"planning": [
{
"question": "如何寫企劃書?",
"answer": "企劃書基本結構:目標→現況分析→解決方案→執行計畫→預算→效益評估",
"follow_up": ["需要企劃書範本嗎?", "想了解預算編列技巧嗎?"]
}
]
}
}
return knowledge
def search_knowledge(self, intent: str, keywords: List[str]) -> Dict:
"""搜尋知識庫"""
category = intent.split('_')[0] if '_' in intent else intent
if category in self.knowledge:
# 簡化版關鍵字匹配
for subcategory in self.knowledge[category]:
for item in self.knowledge[category][subcategory]:
for keyword in keywords:
if keyword.lower() in item['question'].lower():
return item
return None
def get_random_tip(self, category: str) -> str:
"""獲取隨機小貼士"""
tips = {
"ai": "💡 小貼士:使用AI時,清楚具體的問題會得到更好的答案!",
"business": "💡 小貼士:好的企劃案要有明確的目標和可測量的成果!",
"environmental": "💡 小貼士:小改變也能帶來大影響,從日常做起!"
}
return tips.get(category, "💡 小貼士:持續學習是成功的關鍵!")
AI輔助選單設計提示詞:
請設計LINE機器人的Rich Menu(豐富選單):
機器人功能:
1. AI技能學習諮詢
2. 創業和企劃指導
3. 環保生活建議
4. 在地資訊服務
5. 人工客服轉接
設計要求:
- 6個主要按鈕區域
- 色彩溫暖友善
- 圖示清楚易懂
- 符合台灣使用習慣
請提供:
1. 選單佈局建議(2x3或3x2)
2. 每個按鈕的標題和圖示建議
3. 按鈕顏色配置
4. 整體視覺風格描述
5. 無障礙設計考量
請以JSON格式提供選單配置。
對話流程架構:
class ConversationFlow:
def __init__(self):
self.flows = {
"ai_learning": {
"entry": "歡迎學習AI!你想了解什麼?",
"options": [
{"text": "🎯 基礎概念", "action": "show_ai_basics"},
{"text": "🛠️ 實用工具", "action": "show_ai_tools"},
{"text": "📚 學習資源", "action": "show_resources"}
]
},
"business_consulting": {
"entry": "創業諮詢服務!需要什麼協助?",
"options": [
{"text": "📝 企劃書撰寫", "action": "business_plan_help"},
{"text": "💰 資金規劃", "action": "financial_planning"},
{"text": "📊 市場分析", "action": "market_analysis"}
]
}
}
def get_flow_response(self, flow_type: str, step: str = "entry"):
"""獲取對話流程回應"""
if flow_type in self.flows:
flow = self.flows[flow_type]
if step == "entry":
return self.create_quick_reply(flow["entry"], flow["options"])
return None
def create_quick_reply(self, text: str, options: List[Dict]) -> Dict:
"""建立快速回覆選項"""
quick_reply_items = []
for option in options[:10]: # LINE限制最多10個選項
quick_reply_items.append({
"type": "action",
"action": {
"type": "message",
"label": option["text"],
"text": option["text"]
}
})
return {
"type": "text",
"text": text,
"quickReply": {
"items": quick_reply_items
}
}
安全模組範例(modules/security.py):
import time
from collections import defaultdict
from typing import Dict, Tuple
class SecurityManager:
def __init__(self):
self.user_requests = defaultdict(list)
self.blocked_users = set()
# 安全參數設定
self.max_requests_per_minute = 10
self.max_requests_per_hour = 100
self.block_duration = 300 # 5分鐘
def check_rate_limit(self, user_id: str) -> Tuple[bool, str]:
"""檢查使用者請求頻率"""
current_time = time.time()
# 檢查是否被封鎖
if user_id in self.blocked_users:
return False, "您的訪問被暫時限制,請稍後再試。"
# 清理過期記錄
self.cleanup_old_requests(user_id, current_time)
# 檢查每分鐘限制
minute_requests = [
req_time for req_time in self.user_requests[user_id]
if current_time - req_time < 60
]
if len(minute_requests) >= self.max_requests_per_minute:
self.block_user(user_id)
return False, "請求過於頻繁,請稍後再試。"
# 檢查每小時限制
hour_requests = [
req_time for req_time in self.user_requests[user_id]
if current_time - req_time < 3600
]
if len(hour_requests) >= self.max_requests_per_hour:
return False, "您今日的使用次數已達上限,請明日再試。"
# 記錄當前請求
self.user_requests[user_id].append(current_time)
return True, ""
def detect_suspicious_behavior(self, user_id: str, message: str) -> bool:
"""偵測可疑行為"""
suspicious_patterns = [
"system", "admin", "database", "api",
"password", "token", "secret", "key"
]
message_lower = message.lower()
for pattern in suspicious_patterns:
if pattern in message_lower:
self.log_suspicious_activity(user_id, message)
return True
return False
def log_suspicious_activity(self, user_id: str, message: str):
"""記錄可疑活動"""
timestamp = time.strftime("%Y-%m-%d %H:%M:%S")
log_entry = f"[{timestamp}] 可疑活動 - 使用者: {user_id}, 訊息: {message}"
# 寫入日誌檔案或數據庫
with open("security.log", "a", encoding="utf-8") as f:
f.write(log_entry + "\n")
def block_user(self, user_id: str):
"""封鎖使用者"""
self.blocked_users.add(user_id)
# 可以設定自動解封機制
# threading.Timer(self.block_duration, self.unblock_user, [user_id]).start()
資料保護實作:
import hashlib
import json
from cryptography.fernet import Fernet
class DataProtection:
def __init__(self, encryption_key: str = None):
if encryption_key:
self.cipher = Fernet(encryption_key.encode())
else:
self.cipher = Fernet(Fernet.generate_key())
def hash_user_id(self, user_id: str) -> str:
"""將使用者ID進行雜湊處理"""
return hashlib.sha256(user_id.encode()).hexdigest()[:16]
def encrypt_sensitive_data(self, data: Dict) -> str:
"""加密敏感資料"""
json_data = json.dumps(data, ensure_ascii=False)
encrypted_data = self.cipher.encrypt(json_data.encode())
return encrypted_data.decode()
def decrypt_sensitive_data(self, encrypted_data: str) -> Dict:
"""解密敏感資料"""
decrypted_data = self.cipher.decrypt(encrypted_data.encode())
return json.loads(decrypted_data.decode())
def sanitize_input(self, text: str) -> str:
"""清理使用者輸入"""
# 移除潛在危險字符
dangerous_chars = ['<', '>', '"', "'", '&', 'script', 'javascript']
cleaned_text = text
for char in dangerous_chars:
cleaned_text = cleaned_text.replace(char, '')
return cleaned_text.strip()
分析模組範例:
import sqlite3
from datetime import datetime
from typing import Dict, List
class AnalyticsManager:
def __init__(self, db_path: str = "analytics.db"):
self.db_path = db_path
self.init_database()
def init_database(self):
"""初始化數據庫"""
conn = sqlite3.connect(self.db_path)
cursor = conn.cursor()
cursor.execute('''
CREATE TABLE IF NOT EXISTS user_interactions (
id INTEGER PRIMARY KEY AUTOINCREMENT,
user_id_hash TEXT,
message_type TEXT,
intent TEXT,
timestamp DATETIME,
response_time REAL,
satisfaction_score INTEGER
)
''')
conn.commit()
conn.close()
def log_interaction(self, user_id_hash: str, message_type: str,
intent: str, response_time: float):
"""記錄使用者互動"""
conn = sqlite3.connect(self.db_path)
cursor = conn.cursor()
cursor.execute('''
INSERT INTO user_interactions
(user_id_hash, message_type, intent, timestamp, response_time)
VALUES (?, ?, ?, ?, ?)
''', (user_id_hash, message_type, intent, datetime.now(), response_time))
conn.commit()
conn.close()
def get_usage_statistics(self, days: int = 7) -> Dict:
"""獲取使用統計"""
conn = sqlite3.connect(self.db_path)
cursor = conn.cursor()
# 查詢最近N天的統計
cursor.execute('''
SELECT
COUNT(*) as total_interactions,
COUNT(DISTINCT user_id_hash) as unique_users,
AVG(response_time) as avg_response_time,
intent,
COUNT(*) as intent_count
FROM user_interactions
WHERE timestamp >= datetime('now', '-{} days')
GROUP BY intent
'''.format(days))
results = cursor.fetchall()
conn.close()
return {
"summary": {
"total_interactions": sum(row[0] for row in results),
"unique_users": len(set(row[1] for row in results)),
"avg_response_time": sum(row[2] for row in results) / len(results) if results else 0
},
"intent_distribution": [
{"intent": row[3], "count": row[4]}
for row in results
]
}
監控系統範例:
import psutil
import time
from typing import Dict
class PerformanceMonitor:
def __init__(self):
self.start_time = time.time()
self.request_count = 0
self.error_count = 0
def get_system_metrics(self) -> Dict:
"""獲取系統效能指標"""
return {
"cpu_usage": psutil.cpu_percent(),
"memory_usage": psutil.virtual_memory().percent,
"disk_usage": psutil.disk_usage('/').percent,
"uptime": time.time() - self.start_time,
"request_count": self.request_count,
"error_count": self.error_count,
"error_rate": self.error_count / max(self.request_count, 1)
}
def log_request(self):
"""記錄請求"""
self.request_count += 1
def log_error(self):
"""記錄錯誤"""
self.error_count += 1
def health_check(self) -> Dict:
"""健康檢查"""
metrics = self.get_system_metrics()
status = "healthy"
if metrics["cpu_usage"] > 80:
status = "warning"
if metrics["memory_usage"] > 90 or metrics["error_rate"] > 0.1:
status = "critical"
return {
"status": status,
"metrics": metrics,
"timestamp": datetime.now().isoformat()
}
Heroku部署配置:
requirements.txt:
Flask==2.3.3
line-bot-sdk==3.5.0
python-dotenv==1.0.0
requests==2.31.0
openai==0.28.1
psycopg2-binary==2.9.7
gunicorn==21.2.0
Procfile:
web: gunicorn app:app
runtime.txt:
python-3.11.5
.env範例:
CHANNEL_ACCESS_TOKEN=your_channel_access_token
CHANNEL_SECRET=your_channel_secret
OPENAI_API_KEY=your_openai_api_key
DATABASE_URL=your_database_url
ENCRYPTION_KEY=your_encryption_key
DEBUG=False
問題:Webhook連接失敗
解決方案:
問題:回應速度過慢
解決方案:
問題:遭受惡意攻擊
解決方案:
LINE機器人是現代數位服務的重要工具,結合AI技術後能夠提供更智慧、更個人化的使用者體驗。透過本指南的學習,您將能夠:
記住大財在故事中的理念:「AI是工具,但用心的設計才是創造價值的關鍵。」讓您的LINE機器人不只是技術展示,更要成為真正幫助使用者的好夥伴。
下一步行動:
選擇一個您關心的服務領域,運用本指南開始打造您的專屬LINE機器人。從簡單的問答開始,逐步加入AI智慧功能,創造真正有價值的數位服務!
若迫不及待想要知道之後的故事發展,可以到鏡文學,故事的部分,我已經都上傳到這裡,歡迎使用打賞功能等📚,是對筆者最實質的鼓勵🥰。ps:實做的部分還是會只放在鐵人賽喔
我是 Wolke。我是一名專業程式開發者,專長是開發 AI 和程式解決方案。
我投入了不少時間在專業發展上。我是多本書的作者,其中包括《LINE聊天機器人+AI+雲端+開源+程式:輕鬆入門到完整學習》和《ChatGPT來襲,未來人人都需具備的運算思維!應用詠唱工程來釋放程式生產力—程式學習/開發篇》。也有出版線上課程,我熱衷於分享我的經驗和技術,幫助其他開發者更好地利用 AI 工具。
也在許多知名大學、論壇、社團擔任講者,如果貴方有需要也歡迎與我聯繫。
2023年 講座 紀錄
最後這篇文章若有切合你的需求,敬請訂閱按讚分享
本系列相關內容已轉載及加強到筆者 2025 年 所出版之
若這篇文章對您有實質幫助🙏,還望購買書籍📚,是對筆者最實質的鼓勵🥰。
💥 計畫告急!補助案竟意外落選?
💪 危機秒變轉機,團隊火力全開!
🍑 開發超萌「小桃助手」LINE機器人!
🚀 竟獲政府青睞,迎來全新合作!
#南桃AI重生記 #地方創生 #危機就是轉機 #LINE機器人 #AI應用 #團隊力量 #永不放棄