從土法煉鋼到Telegram AI 機器人

第一階段:土法煉鋼(Custom Python Bot)

現階段的想法很簡單,最近龍蝦很夯,我也想自製一下。但初期,先讓自己可以透過其他方式與電腦溝通。因此我們(這邊用我們表示「我」和AI)在一開始嘗試用了最麻煩的方式:手寫 Python 腳本。

  • 作法:直接對接 LM Studio API,並透過 DuckDuckGo/Selenium 寫爬蟲去抓網頁。
  • 遇到的困難:
    1. IP 被鎖:爬蟲經常被 Google 擋下來。
    2. 模型限制:本機跑的小模型 (8B 參數) 有時候不夠聰明,會忘記呼叫搜尋工具。
    3. 維護困難:為了處理各種網頁格式,程式碼越寫越複雜。
# local_bot.py (已棄用)
async def handle_message(update, context):
# 1. 先問 AI 需不需要搜尋
messages = [{"role": "system", "content": "If you need data, start reply with 'SEARCH: <query>'"}]
reply = client.chat.completions.create(..., messages=messages)
# 2. 如果 AI 說要搜尋,我們就自己去爬蟲
if reply.startswith("SEARCH:"):
query = reply.replace("SEARCH:", "")
# 使用 DuckDuckGo 爬蟲
results = DDGS().text(query, backend="html")
# 3. 把爬到的資料塞回給 AI,再問一次
messages.append({"role": "user", "content": f"Search Results: {results}"})
final_reply = client.chat.completions.create(..., messages=messages)

這種寫法雖然可行,但非常脆弱,模型如果自主性高一點就會失敗,自動回覆他不清楚。

第二階段:導入 MCP 協定 (Native Search)

為了讓 LM Studio 能原生上網,我們試過 Model Context Protocol (MCP)。 當時的設定如下,這讓模型知道它有「搜尋」這個工具:

{
"mcpServers": {
"local-search": {
"command": "/opt/homebrew/bin/python3.12",
"args": ["/path/to/search_mcp.py"]
}
}
}

第三階段:大腦升級(Moving to AnythingLLM)

後來我們決定導入 AnythingLLM Desktop,這是一個決定性的轉捩點。

  • 為什麼選它?:它就像是給 AI 裝上了「外掛大腦」。它內建了 RAG (文件檢索) 和 Web Search Agent (搜尋代理),我們不需要再自己寫爬蟲了。然後最重要的是,他已經有網頁連接了,且我之前就有相關的實作了。
  • 現在的架構
    1. 使用者介面:Telegram Bot (負責接收訊息)。
    2. 核心大腦:AnythingLLM (負責判斷要不要上網查資料,或是讀 PDF)。
    3. 推理引擎:LM Studio (負責生成最後的文字)。

系統可以了,telegram也可以順利連接了,但是下一個問題是系統時間。

AnythingLLM 很強,但它是一個封閉系統,不知道「現在幾點」。 我們在 Telegram Bot 裡做了一個小巧思:在把訊息丟給 AI 之前,偷偷塞入系統時間與指令,並且命令他以中文回覆。

# anythingllm_bot.py 核心邏輯
async def handle_message(update: Update, context: ContextTypes.DEFAULT_TYPE):
user_text = update.message.text
# 🌟 關鍵:注入時間戳記與強制中文指令
current_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
augmented_text = f"[System Note: Current Time is {current_time}. Please ALWAYS reply in Traditional Chinese (繁體中文).] {user_text}"
# 呼叫 AnythingLLM API
response = requests.post(
f"{ANYTHINGLLM_URL}/workspace/{WORKSPACE_SLUG}/chat",
headers={
"Authorization": f"Bearer {API_KEY}",
"Content-Type": "application/json"
},
json={
"message": augmented_text, # 這裡傳送的是加工過的訊息
"mode": "chat"
}
)
# ... (回傳結果給使用者)

透過這段程式碼,我們實現了:

  1. 真實時間感知:AI 知道現在是 2026 年,不會胡亂回答。
  2. 繁體中文優化:強制 AI 使用繁體中文回答,避免它突然講英文。
  3. 全自動聯網搜尋:由 AnythingLLM 的 Agent 自動判斷是否上網。

第四階段:網路連線(SerpApi 的技術筆記)

在開發過程中,我們也評估了 SerpApi 這個強大的工具。如果你也想開發自己的 AI 應用,這裡有一些經驗分享:

SerpApi 是什麼?

它是 Google 搜尋的「付費快速通關」。如果你自己寫程式爬 Google,大概爬個幾次就會跳出驗證碼 (CAPTCHA) 把你擋住。SerpApi 就是幫你解決這些麻煩,給你乾淨的 JSON 資料。

什麼時候該用它?

  • 一般用途:不用買。像 AnythingLLM 這種工具通常有內建免費的爬蟲。
  • 專業用途:如果你需要爬取 Google Map 商家評論Google Shopping 商品價格、或是 Google Flights 機票資訊,這些複雜結構的資料普通的爬蟲抓不到,這時候 SerpApi 就是神器。

使用範例 (Python)

如果你想自己寫程式串接,代碼非常簡單:

from serpapi import GoogleSearch
params = {
"q": "台北 咖啡廳 推薦",
"location": "Taipei, Taiwan",
"hl": "zh-tw", # 設定繁體中文
"gl": "tw", # 設定地區
"api_key": "你的_API_KEY"
}
search = GoogleSearch(params)
results = search.get_dict()
# 輕鬆拿到乾淨的資料結果

所以現在系統就可以連接了。

如何與 Telegram 對接?

除了 AI 本體,大家最好奇的應該是:「要怎麼讓它變成一個 Telegram 機器人?

步驟一:跟 BotFather 申請帳號

  1. 打開 Telegram,搜尋 @BotFather
  2. 輸入 /newbot
  3. 幫機器人取個名字 (例如 MyAI_Bot)。
  4. 它會給你一串 Token (像這樣:123456:ABC-DEF...),這就是鑰匙。

步驟二:Python 程式碼實作

我們使用了 python-telegram-bot 這個套件,只要幾行程式碼就能串起來。

這是與 Telegram 溝通的程式碼:

from telegram import Update
from telegram.ext import ApplicationBuilder, MessageHandler, filters
# 設定您的 Token
TELEGRAM_TOKEN = "你的_BOT_TOKEN_在這裡"
async def handle_message(update: Update, context):
user_text = update.message.text
chat_id = update.effective_chat.id
# 這裡就是把 user_text 丟給 AnythingLLM 的地方 (參考下一段時間注入)
# ...
# 把 AI 的回應傳回給使用者
await context.bot.send_message(chat_id=chat_id, text=reply_text)
if __name__ == '__main__':
# 啟動機器人監聽
app = ApplicationBuilder().token(TELEGRAM_TOKEN).build()
app.add_handler(MessageHandler(filters.TEXT, handle_message))
app.run_polling()

這段程式碼就像是「郵差」,負責把 Telegram 的信 (訊息) 收下來,跑腿交給 AnythingLLM 處理,再把回信 (AI 回應) 送回給使用者。

發表留言