Skip to content

Repository files navigation

八卦分身 (Sassy PTT Bot)

一個模仿 PTT 八卦版 (Gossiping) 風格的聊天機器人,同時支援 TelegramLINE。不提供幫助,只提供毒舌。

核心理念

本 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,需自行建立。

步驟 1:爬取 PTT 八卦板文章

使用 PTT-Crawler-master/ 內的爬蟲抓取文章,輸出為 JSON 格式。 每個 JSON 檔的結構應為:

[
  {
    "Content": "文章內文",
    "Responses": [
      { "Content": "推文內容" }
    ]
  }
]

將所有 JSON 檔放入:

PTT-Crawler-master/data_Gossiping_2025/

步驟 2:建立向量索引

source venv/bin/activate
python indexer.py

執行完成後會在 PTT-Crawler-master/chroma_db/ 建立向量資料庫。 預設最多索引 100,000 筆語料(可在 indexer.pyMAX_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_id

LINE 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 份,重啟不清除)。

About

A sarcastic Telegram chatbot that mimics PTT Gossiping board culture. Powered by RAG (ChromaDB + sentence-transformers) and a CGU OpenAI-compatible LLM, it retrieves real PTT snippets and generates short, rude, on-brand replies — because nobody asked for your feelings.

Resources

Stars

Watchers

Forks

Releases

Packages

Contributors

Languages