close

未命名-1.png

最近 AI 圈的重磅消息:DeepSeek R1 突襲登場,在某種程度上重新定義了 AI 的遊戲規則,打破了西方國家對 AI 科技的壟斷。同時,DeepSeek 也開源了其語言大模型,讓本地部署 LLM(大語言模型)的話題再次熱門了起來。其實,本地部署語言模型服務本來是一項非常繁瑣的事,但隨著 Ollama 在 2023 年 7 月的問世,如今這一切變得超級簡單了。最近我在嘗試 Telegram 機器人服務時,突然靈光一閃,若能將機器人與本地語言模型結合起來,那不就變成了自製 AI 聊天機器人嗎?沒想到實作起來也非常簡單,因此寫這篇文章來簡單記錄,希望也能讓對此感興趣的人少走一些彎路。

本文主要分成三個部分:Ollama 本地部署 LLM 大語言模型服務、申請 Telegram 機器人、撰寫 Python 代碼整合兩者。整個操作流程不含下載時間,10 分鐘內就能全部搞定。我個人以三號機實測(Intel i7-10700K, RTX 3060 12GB),Ollama 在 Windows 平台的表現最好,masOS 平台不論是黑蘋果或是 Apple M2,Ollama 都無法使用 GPU 加速,運行速度差很多。本文以 Windows 為例。

一、Ollama 本地部署大型語言模型服務

Ollama 是開源的大語言部署套件,支援 Windows / macOS / Linux 跨平台,安裝簡單、容易使用。

1.1 下載並安裝 Ollama:可根據自己的作業系統選擇下載安裝檔。安裝也很簡單,執行安裝檔之後,一直下一步就行了。

最後安裝完成之後,開啟命令提示視窗(終端機),執行 ollama ,如果看到以下的指令說明畫面,就表示 ollama 安裝完成了。

螢幕擷取畫面 2025-02-13 235012.png

1.2 選擇大語言模型

Ollama 支援的 LLM 大語言模型很多,點擊官網左上角的 Models 可用關鍵字查詢支援的模型。在此我選擇 llama3.2 的 3b 模型(30 億參數)作為示範,搜尋 llama3.2 之後,點擊進入模型頁面之後,下拉項目選擇 3b,右邊會出現運行指令。

【碼農】自建低成本 AI 聊天機器人

開啟命令提示視窗(終端機),將指令貼到視窗內執行。由於本地端還沒有模型檔,所以會先下載。下載完成之後才會開始運行。最後如果出現 >>> 提示符號,表示本地部署模型服務的工作完成了,可以在提示符號內,輸入任意內容提問。

附帶一提,ollama run <模型名稱> 指令可以加入 --verbose 顯示運作細節。

螢幕擷取畫面 2025-02-13 234149.png

通常來說,tokens/s > 10 速度才算順暢,如果速度很快,可嘗試安裝參數更大的語言模型,效果會更好。反之則要挑選更少參數規模的模型。

有關 ollama 的其他補充(本文中不一定用得到):

(1) 安裝大語言模型的友善界面

在命令提示(終端機)中與語言模型交談總是覺得有點不方便,所以在安裝完 ollama 之後,可以安裝 AnythingLLM 或其他套件來使用 Ollama 的本地端大語言模型服務。這裡介紹 Chrome 的延伸套件 Page Assist - A Web UI for Local AI Models,安裝與設置方式相當簡單。

點擊 Page Assist 的商店頁面右上角「加入 Chrome」即可進行安裝。安裝完之後先別急著使用,還需要做一點設置。首先開啟終端機,輸入 ollama pull nomic-embed-text 安裝文本嵌入模型,接著回到 Chrome 開啟 Page Assist 擴充功能,點擊頁面右上方的齒輪進行設置,General Settings (一般設置)可設置界面語言,RAG 設置的文本嵌入模型選擇 nomic-embed-text:latest,按下保存按鈕即可。

【碼農】自建低成本 AI 聊天機器人

回到聊天視窗,看到 ollama 運行中的綠燈圖示,上方下拉選擇本地端語言模型,就可以開始進行對話了。

【碼農】自建低成本 AI 聊天機器人

(2) ollama 的其他常用參數:

  • pull:下載大語言模型。EX: ollama pull llama3.2:3b
  • rm:刪除本地的模型檔案。EX: ollama rm llama3.2:3b
  • list: 列出本地可用的模型檔案。EX: ollama list

(3) 將本地端的模型檔案移到其他目錄

ollama 下載管理的本地端語言模型檔案,都會放在 <使用者帳戶>/.ollama 目錄下。如果硬碟空間不夠時,可以考慮移動到別的硬碟空間上,並使用 mklink /D (Windows 系統)或 ln -s (macOS / Linux 系統)指令建立虛擬目錄連結。要注意的是,Windows 版 mklink /D 必須在系統管理者權限中操作,以及兩個指令的 <建立虛擬目錄連結> <實體目錄> 順序剛好相反。

mklink /D <建立虛擬目錄連結> <實體目錄>

ln -s <實體目錄> <建立虛擬目錄連結>

二、申請 Telegram 機器人服務

這部分如果有不懂的,直接問 ChatGPT 就行了。以 iOS 為例,操作方式如下:

(1) App Store 下載 Telegram App

(2) 執行 Telegram App 並登入。如果沒有 Telegram 帳號的話,可直接透過 App 申請註冊一個,註冊帳號細節就不展開了。

(3) 搜尋 BotFather 機器人,並開始與之對話:輸入 /newbot 之後,根據對話提示為機器人取名和 username,建立機器人服務。

最後會得到一串 Token 代碼。這個代碼可視為機器人的分身,記下 Token 代碼,後續寫程式操作機器人時會用得到。

【碼農】自建低成本 AI 聊天機器人

做到這裡,申請 Telegram 機器人的工作就完成了,很簡單。

三、撰寫 Python 代碼,串接 Telegram 機器人與本地端大語言模型

這個部分如果有不懂的,也是問 ChatGPT 就行了。

3.1 安裝 Python :這裡直接使用 Python 官網安裝就行了。之前寫過幾次,這裡不再展開說明。

3.2 ollama 的 python 代碼

先安裝 ollama 的 python 套件

pip install ollama

python 代碼範例如下:

import ollama

# 發送問題給 Ollama
response = ollama.chat(model="llama3.2:3b", messages=[
    {"role": "system", "content": "你是我的助手,請幫助我回答問題。用繁體中文。"},
    {"role": "user", "content": "告訴我今天的天氣如何?"}
]).model_dump()

# 顯示回應文本
print("Ollama 回應: ", response['message']['content'])

 

3.3 Telegram 機器人的 python 代碼:

先安裝 Telegram 機器人的 python 套件

pip install python-telegram-bot --upgrade

python 代碼範例如下:

from telegram import Update
from telegram.ext import Application, CommandHandler, MessageHandler, filters, CallbackContext

TOKEN = "你的Bot Token"

async def start(update: Update, context: CallbackContext):
    await update.message.reply_text("你好!我是你的 Telegram Bot 🤖,請輸入指令!")

async def echo(update: Update, context: CallbackContext):
    await update.message.reply_text(f"你說:{update.message.text}")

def main():
    app = Application.builder().token(TOKEN).build()

    app.add_handler(CommandHandler("start", start))
    app.add_handler(MessageHandler(filters.TEXT & ~filters.COMMAND, echo))

    print("Bot 正在運行...")
    app.run_polling()

if __name__ == "__main__":
    main()

程式碼中的「你的Bot Tokan」,記得用先前取得的機器人 Token 替換掉。

3.4 整合兩者的 python 代碼如下:

from telegram import Update
from telegram.ext import Application, CommandHandler, MessageHandler, filters, CallbackContext
import ollama

TOKEN = "你的Bot Token"

async def start(update: Update, context: CallbackContext):
    await update.message.reply_text("你好!我是你的 Telegram Bot 🤖,請輸入指令!")

async def echo(update: Update, context: CallbackContext):
    # 發送問題給 Ollama
    response = ollama.chat(model="llama3.2:3b", messages=[
        {"role": "system", "content": "你是我的助手,請幫助我回答問題。用繁體中文。"},
        {"role": "user", "content": f"{update.message.text}"}
    ]).model_dump()
    await update.message.reply_text(response['message']['content'])

def main():
    app = Application.builder().token(TOKEN).build()

    app.add_handler(CommandHandler("start", start))
    app.add_handler(MessageHandler(filters.TEXT & ~filters.COMMAND, echo))

    print("Bot 正在運行...")
    app.run_polling()

if __name__ == "__main__":
    main()

執行上述的 python 程式後,回到 iOS 的 Telegram,搜尋自己建立的機器人名稱,找到之後點擊 start 開始對話看效果。

【碼農】自建低成本 AI 聊天機器人

要說明的是,上述程式碼不支援上下文參照。支援上下文的關鍵是維持對話歷程,可以繼續問 ChatGPT 要怎麼寫,這裡就不展示了。

多聊幾次可以發現,ollama3.2:3b 對中文的理解與反應不太好。可以試著改用最夯的 DeepSeek-R1,對中文的反應較佳。以我的三號機為例,Intel i7-10700K + RTX 3060 12GB 對 DeepSeek R1 開源模型可以跑到 14b ,模型大小為 9GB 未超過 VRAM 12GB,速度約 30 tokens/s。再上去就是 32b,模型大小約 20 GB,超過 VRAM 12GB 已經不能用 GPU 加速了,跑起來速度跟口吃一樣,一秒約一到兩個字。

後記

選擇 Telegram 的原因很簡單:申請和使用機器人完全免費且容易,而其他平台(比如 Line)查詢後發現,要麼需要付費,要麼只有非常有限的免費額度。將本地端語言模型搭在 Telegram 上的最大優點是,手機無論在哪裡都能使用,只要本地大語言模型的設備能連接網路並進入 Telegram,就不需要額外配置主機或處理端口映射等技術問題,非常方便。

另外,由於硬體 VRAM 的限制,一般人很難使用更大參數的模型。即便像 RTX 5090 這樣的顯卡擁有 32GB 的 VRAM,仍然無法支撐更大的模型運行,而小參數語言模型在理解問題的能力確實有限,問題長度長一點就容易抓不到重點,因此適合用於科研領域的提問。老實說,目前在本地端搭建語言模型的實用性還不高,這個「自建 AI 聊天機器人」更多的是一種零成本的娛樂和學習途徑。我查了一下,本地端語言模型在文章翻譯方面表現相當不錯,進階應用是使用 AnythingLLM 結合本地文件知識庫,透過語言模型來進行簡單的歸納與整理。不過,知識庫的建置過程恐怕會更加繁瑣和耗時。若要推薦適合本地部署的語言模型,我個人傾向推薦 phi4:14b 更甚於 llama 與 deepseek-r1,這款模型由微軟於 2024 年底發布,官方表示其 14b 版本的表現不遜色於 70b 等級。我個人覺得的確是優於 deepseek-r1:14b,而且與 phi:14b 交談的感覺更接近 ChatGPT,在 RTX3060 12GB 也能順跑。

無論如何,能夠在本地端搭建 AI 語言服務,還是非常令人高興的事。這不僅代表著 AI 正在快速走入並改變人類的生活習慣,也讓人對未來充滿期待。期待不久的將來,我們能以低成本在本地端搭建像 ChatGPT 這樣的大語言模型服務,人人都能成為 ChatGPT 大師。

arrow
arrow
    創作者介紹
    創作者 benjenq 的頭像
    benjenq

    -Ben's PHOTO-

    benjenq 發表在 痞客邦 留言(0) 人氣()