AI & ML Python Automation Side Project

用 Colab 免費弄一個自己的 AI 程式碼助手

用 Colab 免費弄一個自己的 AI 程式碼助手

想用 AI 寫程式,但 GPU 好貴、又怕商業公司偷看你公司的機密原始碼?來,這招免費的折衷方案學起來。


為什麼要大費周章自架語言模型?

現在寫程式沒用 AI 簡直像斷了一隻手。雖然 Claude、GPT-4 那些商業模型很強,但它們有一個共同的硬傷:你的程式碼通通得送去別人的伺服器,主控權都在大企業手上。

如果你在做公司的內部系統、處理含有敏感邏輯的專案,或者單純不想把心血送給大公司當訓練資料,自架開源模型就是唯一的出路。

自己架模型有三大爽點:

  • 隱私點滿:原始碼絕不離開你的掌控。
  • 錢包解脫:不用在那邊算這個月用了多少 Token、噴了多少美金。
  • 自由度高:以後想怎麼微調、魔改都隨你便。

現實很骨感:沒錢買 GPU 怎麼辦?

自架模型最大的障礙就是硬體
現在隨便一張 NVIDIA RTX 4090 都要五萬多台幣,而且如果你想跑個稍微聰明一點的模型,可能也只是剛好夠用而已。去租雲端 GPU?每個月帳單看下來也是會心痛。

如果只是偶爾寫寫個人專案、想測試一下,這筆錢真的砸不下去。


救星來了:Google Colab 免費的 T4 GPU

還好 Google 有開佛心車。Colab 的免費版有提供 T4 GPU(16GB 顯存),雖然閒置太久會把你踢掉,但對輕量使用者來說,已經足夠了。

我們先來看一張現實殘酷的對比表:

方案 費用 拿到的硬體 適合誰?
硬刷一張顯卡 5 萬+ 噴飛 RTX 4090 狂熱重度玩家
雲端課金租用 每月 ~$50 美金 A100 等級 企業 / 算力富豪
Google Colab 免費 $0 元免錢 T4 16GB 輕量 實驗性質
Colab Pro 訂閱 每月 ~$10.49 美金 A100 / High-RAM 嫌 DRAM 一直炸掉的人

當然,免費的代價就是:

  • 太久沒動它會自動斷線。
  • 每次重啟都要重新載入模型(除非你把模型掛載到 Google Drive 裡)。
  • 絕對不適合拿來當 24 小時不中斷的正式服務。

但如果只是「自己寫程式時偶爾開來用」,這還是很不錯。


來挑大腦:Google 的開源 Gemma 系列

Gemma 是 Google 釋出的開源模型,簡單來說就是 Gemini 的親弟弟。

它的版本長這樣:

模型名稱 參數量 實測硬體心得
gemma-2-2b-it 20 億 極度輕量,免費版 T4 可以閉著眼睛輕鬆跑。
gemma-2-9b-it 90 億 智商在線的黃金版本。但如果你用免費版 Colab,12GB DRAM 可能會炸掉,建議搭配 4-bit 量化。
gemma-2-27b-it 270 億 智商最高,但免費 T4 吃不下,必須升級 Pro 方案開 A100。

💡 冷知識:模型名稱後面帶有 -it 的,代表 Instruction-Tuned(指令微調版)。這才是已經調教好、聽得懂人話能跟你對話的版本。千萬別選到 base 版,那是只會玩純文字接龍的笨蛋。

今天這篇教學,我們先拿最輕量、最不會翻車的 gemma-2-2b-it 來當入門示範。


開工實作:在 Colab 架設你的專屬 API 伺服器

整個系統是這樣運作的:

你的本機 Windows (OpenCode)
        ↕ 透過 HTTPS 傳輸
    ngrok 幫你穿透內網的公開網址
        ↕
  Colab 幫你頂著的 FastAPI 伺服器
        ↕
   正在 T4 GPU 裡瘋狂運算的神經網路 (Gemma)

本機的寫程式助手(OpenCode)會透過 ngrok 給的臨時網址,連線到雲端的 Colab。Colab 上的 FastAPI 會當中間人,把任務丟給 Gemma 算完後再傳回來。

步驟一:把該裝的套件一腳踹進去

在 Colab 裡開一個新筆記本,複製這段程式碼並執行:

!pip install fastapi uvicorn pyngrok nest_asyncio transformers accelerate bitsandbytes

步驟二:把 Gemma 載入進來(記得開 4-bit 量化防炸)

這裡我們要設定 model_id = "google/gemma-2-2b-it"(注意二代沒有 7B,別打錯了)。
為了防止顯示記憶體(VRAM)和系統記憶體(DRAM)集體罷工,我們直接祭出 bitsandbytes4-bit 量化大法,把模型狠狠壓縮。

from transformers import AutoTokenizer, AutoModelForCausalLM, BitsAndBytesConfig
import torch

# 正確的二代小模型 ID
model_id = "google/gemma-2-2b-it"

# 4-bit 量化設定:不開這個硬體很容易炸掉
bnb_config = BitsAndBytesConfig(
    load_in_4bit=True,
    bnb_4bit_quant_type="nf4",
    bnb_4bit_compute_dtype=torch.float16,
)

# 記得先去 Hugging Face 勾選同意 Gemma 的使用條款,並把你的 HF_TOKEN 填進來
HF_TOKEN = "你的_HUGGING_FACE_TOKEN"

tokenizer = AutoTokenizer.from_pretrained(model_id, token=HF_TOKEN)
model = AutoModelForCausalLM.from_pretrained(
    model_id,
    device_map="auto",
    quantization_config=bnb_config,
    token=HF_TOKEN
)

步驟三:用 FastAPI 搓一個 OpenAI 規格的接口

為什麼要用 OpenAI 的格式?因為外面九成九的 AI 插件(像是 VS Code 插件、或我們今天要用的 OpenCode)都只認得 OpenAI 的 API 格式。我們在 Colab 裡偽裝一個,就能直接無縫串接。

from fastapi import FastAPI, Response
from pydantic import BaseModel
from typing import List, Optional, Any
import json, asyncio

app = FastAPI()

class Message(BaseModel):
    role: str
    content: Optional[str] = None

class CompletionRequest(BaseModel):
    model: str = "gemma-2-2b-it"
    messages: List[Message]
    stream: bool = False

def generate_response(messages: list) -> str:
    # 抓最後那條 user 說的話
    prompt = messages[-1]["content"]
    inputs = tokenizer(prompt, return_tensors="pt").to(model.device)
    with torch.no_grad():
        outputs = model.generate(**inputs, max_new_tokens=512)
    new_tokens = outputs[0][inputs.input_ids.shape[1]:]
    return tokenizer.decode(new_tokens, skip_special_tokens=True).strip()

@app.get("/v1/models")
def list_models():
    return {
        "object": "list",
        "data": [{"id": "gemma-2-2b-it", "object": "model", "owned_by": "google"}]
    }

@app.post("/v1/chat/completions")
async def chat_completions(request: CompletionRequest):
    messages = [m.dict(exclude_none=True) for m in request.messages]
    loop = asyncio.get_event_loop()
    reply = await loop.run_in_executor(None, generate_response, messages)

    message = {"role": "assistant", "content": reply}

    # 簡單模擬一下 Stream 串流輸出,騙過前端插件
    if request.stream:
        sse  = f"data: {json.dumps({'id':'chatcmpl-1','object':'chat.completion.chunk','model':request.model,'choices':[{'index':0,'delta':message,'finish_reason':None}]})}\n\n"
        sse += f"data: {json.dumps({'id':'chatcmpl-1','object':'chat.completion.chunk','model':request.model,'choices':[{'index':0,'delta':{},'finish_reason':'stop'}]})}\n\n"
        sse += "data: [DONE]\n\n"
        return Response(content=sse, media_type="text/event-stream")

    return {
        "id": "chatcmpl-1",
        "object": "chat.completion",
        "model": request.model,
        "choices": [{"index": 0, "message": message, "finish_reason": "stop"}]
    }

步驟四:用 ngrok 打通任督二脈,把網址打開

因為 Colab 躲在 Google 的內網裡,我們本機的電腦連不進去。這時候就要請出 ngrok 這個內網穿透神器,幫我們產出一個公開網址。

from pyngrok import ngrok
import uvicorn, threading, nest_asyncio

nest_asyncio.apply()

# 去 ngrok 官網註冊一個免費帳號就能拿到 Token
ngrok.set_auth_token("你的_NGROK_TOKEN")
public_url = ngrok.connect(8000)
print(f"🔗 你的專屬 API 網址:{public_url.public_url}")

def run_server():
    uvicorn.run(app, host="0.0.0.0", port=8000)

threading.Thread(target=run_server, daemon=True).start()

跑完之後,你會在畫面上看到一行超酷的網址:
🔗 你的專屬 API 網址:[https://xxxx-xxxx.ngrok-free.app](https://xxxx-xxxx.ngrok-free.app)
把它複製起來,等一下本機設定會用到。


本機串接:讓 OpenCode 與雲端大腦連線

OpenCode 是一個免費開源的終端機 AI 助手,你可以把它想像成不收錢的 Claude Code,而且可以讓你自由換腦。

1. 本機安裝 OpenCode

打開你電腦的終端機(CMD 或 Terminal),輸入指令:

npm install -g opencode-ai

2. 修改設定檔

找到你的設定檔 ~/.config/opencode/opencode.jsonc(Windows 在 C:\Users\你的使用者名稱\.config\opencode\opencode.jsonc),把內容改成下面這樣:

{
  "$schema": "https://opencode.ai/config.json",
  "provider": {
    "gemma": {
      "api": "openai",
      "options": {
        "baseURL": "https://你的ngrok網址/v1", // ⚠️ 後面一定要記得加 /v1,不然會迷路!
        "apiKey": "dummy" // 隨便亂填沒關係,因為我們沒設密碼
      },
      "models": {
        "gemma-2-2b-it": {
          "id": "gemma-2-2b-it",
          "limit": {
            "context": 8192,
            "output": 1024
          }
        }
      }
    }
  },
  "model": "gemma/gemma-2-2b-it"
}

驗收時間:啟動!

在本機終端機直接輸入:

opencode

這時候你就可以開始跟它對話了。輸入一個 what can you do?,如果看到終端機吐出 Gemma 的回應,恭喜你成功架好一個完全屬於你的私有 AI 助手了!


老實說:這個方案有哪些硬傷?

爽完之後還是要面對現實。目前這個「完全免費」的版本有幾個地方比較憋腳:

  1. 2B 模型智商有限Gemma 2-2b 雖然跑得快,但處理太複雜的扣(Code)或邏輯時,常常會開始胡言亂語。
  2. 沒有手腳(工具呼叫):它沒辦法直接去讀取或修改你電腦裡的檔案,只能在終端機裡用「講」的,你得自己複製貼上。
  3. 推理速度可能比較慢:免費的 T4 GPU 加上 4-bit 量化,速度大概比你付費開 OpenAI 慢了 3 到 5 倍。

💡 下一步該怎麼走?

如果你受夠了 2B 模型的金魚腦,想要換一個會自己去讀檔案、幫你改 Bug、智商高出好幾倍的真正助手,那可以嘗試把模型換成阿里開源的 Qwen2.5-Coder-7B-Instruct

不過,如果要換成 7B 甚至 9B 的模型,我們可能就要考慮去訂閱那個每個月 10.49 美金的 Colab Pro 方案,把「High-RAM」模式打開,不然你的 DRAM 絕對會天天炸給你看。

至於怎麼升級到 Qwen2.5-Coder、讓 AI 真正動手幫你改檔案?我們之後再來聊!

Comments

Loading comments…

Leave a Comment