一個模仿 PTT 八卦版 (Gossiping) 風格的聊天機器人,同時支援 Telegram 和 LINE。不提供幫助,只提供毒舌。
本 Bot 透過 RAG (Retrieval-Augmented Generation) 技術,將真實的 PTT 精華片段注入 LLM Prompt,使其能夠精準捕捉 PTT 鄉民的語氣、用詞與靈魂。
| 元件 | 技術 |
|---|---|
| LLM | gpt-5-mini(OpenAI 相容 API) |
| 向量資料庫 | ChromaDB |
| 嵌入模型 | sentence-transformers/all-MiniLM-L6-v2 |
| Telegram 框架 | python-telegram-bot(非同步) |
| LINE 框架 | line-bot-sdk v3 + Flask webhook |
| 排程 | APScheduler(每日倒數、每週爬蟲) |
步驟 A:觸發判定
Bot 不會對每條訊息回應,模擬真實鄉民的「隨緣」特性:
Telegram
@bot直接提及 → 100% 回應- 包含問句關鍵字(為什麼、怎麼、推薦、有沒有、股票、感情⋯⋯等 30+ 詞)→ 30% 機率回應
- 其他訊息 → 10% 機率隨機發作
LINE
- 私訊(1:1)→ 100% 回應
- 群組內
@bot直接提及 → 100% 回應 - 群組內含關鍵字 → 30% 機率回應
- 群組其他訊息 → 10% 機率隨機發作
步驟 B:語料檢索 (RAG)
- 用戶輸入轉為向量,在 ChromaDB(約 8.8 萬條 PTT 語料)中語義搜索最相關的 6 條,再隨機抽取 3 條注入 Prompt,確保相關性的同時增加回應多樣性。
步驟 C:毒舌生成
- 從 15 個 few-shot 示範中每次隨機抽取 5 個 + RAG 語料注入 Prompt,避免回應模式固化。
- System prompt 以創意角色扮演框架設定 PTT 鄉民人設:極短、犀利、充滿台灣網路黑話。
- 輸出經後處理,移除 PTT 標記符號,只取第一行;若 LLM 觸發安全過濾,自動替換為人設台詞。
- LINE:回應時自動引用(quote reply)觸發的那則訊息,群組中一眼看出 bot 在回哪句話。
- 多輪對話:每個群組/私訊維護最近 5 輪對話記憶,bot 能接話茬。
步驟 D:自動排程
- 每日 09:00:推播畢業倒數天數 + 當日 PTT 熱門時事(快取至
data/news_cache.json,供當日嘴砲使用) - 每週日 03:00:自動爬取最新 PTT 八卦板文章並重建 ChromaDB 索引,語料持續更新
Sassy-PTT-Bot/
├── telegram_bot/
│ └── bot.py # 機器人主程式
├── indexer.py # 將 PTT 語料建立 ChromaDB 索引
├── data/
│ └── news_cache.json # 每日新聞快取(自動產生)
├── PTT-Crawler-master/
│ ├── Crawler.py # PTT 爬蟲
│ └── chroma_db/ # 向量資料庫(不含於 repo)
├── requirements.txt
└── bot.log # 滾動日誌(5MB × 7 份)
本專案的向量資料庫(chroma_db/)和原始語料(7.4GB)均不包含於 repo,需自行建立。
使用 PTT-Crawler-master/ 內的爬蟲抓取文章,輸出為 JSON 格式。
每個 JSON 檔的結構應為:
[
{
"Content": "文章內文",
"Responses": [
{ "Content": "推文內容" }
]
}
]將所有 JSON 檔放入:
PTT-Crawler-master/data_Gossiping_2025/
source venv/bin/activate
python indexer.py執行完成後會在 PTT-Crawler-master/chroma_db/ 建立向量資料庫。
預設最多索引 100,000 筆語料(可在 indexer.py 的 MAX_DOCUMENTS 調整)。
語料越多、涵蓋話題越廣,RAG 檢索效果越好。建議至少準備 5 萬筆以上的推文。 啟動後每週日 03:00 會自動增量爬取並重建索引。
- Python 3.11+
python -m venv venv
source venv/bin/activate
pip install -r requirements.txt在專案根目錄建立 .env:
# Telegram(必填)
TELEGRAM_TOKEN=your_telegram_bot_token
# LLM API(必填)
CGU_LLM_API_KEY=your_api_key
# LINE(選填,不填則只啟動 Telegram)
LINE_CHANNEL_SECRET=your_line_channel_secret
LINE_CHANNEL_ACCESS_TOKEN=your_line_channel_access_token
LINE_WEBHOOK_PORT=5000
# 畢業倒數(選填)
GRADUATION_DATE=2027-05-22
GRADUATION_GROUP_ID=your_line_group_idLINE Bot 需要公開的 HTTPS 端點才能接收 webhook。本機開發可用 ngrok:
ngrok http 5000將 ngrok 產生的 URL +
/line/callback填入 LINE Developers Console 的 Webhook URL。
source venv/bin/activate
python telegram_bot/bot.py啟動成功會看到:
Telegram 機器人已啟動 (gpt-5-mini 模式)。
LINE webhook server 啟動於 port 5000 # 若有設定 LINE 環境變數
日誌寫入 bot.log(RotatingFileHandler,5MB × 7 份,重啟不清除)。