你有沒有試過,明明公司內部文件就放在共用雲端,搜尋「報價單」卻什麼都找不到,只因為檔名寫的是「Quotation_v3_final」?或者你的 AI 客服被客人問「點解收唔到貨」,卻因為知識庫裡寫的是「物流延誤處理流程」而完全答不上話?

這些問題的根源都一樣:傳統關鍵字搜尋只看字面,不懂意思。而解決方法,就是今天要教你的「嵌入模型」(Embedding Model)。

Google 剛發布的 EmbeddingGemma 2,是一個只有 3 億參數等級的開源多模態嵌入模型,可以在你的筆電上離線跑,還能同時處理文字和圖片。這篇文章會帶你從零開始,用大約 30 分鐘,建立一套屬於你自己的語義搜尋系統。不需要 GPU,不需要付 API 費用,MacBook Air 就做得到。

嵌入模型到底在做什麼?為什麼它比關鍵字搜尋強?

先講一個具體場景。假設你手上有 500 份香港中小企的採購文件,你想找出「所有關於付款期限的條款」。

用傳統搜尋,你得猜關鍵字:打「付款」可能漏掉寫「Payment」的、打「期限」可能漏掉寫「30 days net」的。你要試五六次,還是找不齊。

嵌入模型的做法完全不同。它把每一段文字轉換成一串數字(通常幾百到幾千個維度),這串數字叫做「向量」。語義相近的文字,向量距離就接近。所以「付款期限」和「Payment terms」的向量會靠得很近,即使它們一個中文字都沒有重疊。

這就是語義搜尋的核心。你不需要猜關鍵字,只要用自然語言描述你想找什麼,系統就會把最接近的內容排前面。

EmbeddingGemma 2 更進一步:它同時支援文字和圖片。意思是你可以用一句「紅色包裝的產品照」去搜尋一堆商品圖,或反過來用一張圖去搜尋相關文件。對做電商、做內容管理的香港台灣團隊來說,這個能力非常實用。

怎麼安裝?三步驟在本地跑起來

第一步,建立環境。打開終端機,執行:

pip install -U sentence-transformers pillow

第二步,載入模型。EmbeddingGemma 2 已經上架 Hugging Face,第一次執行會自動下載約 1.2GB 的權重檔:

from sentence_transformers import SentenceTransformer

model = SentenceTransformer("google/embeddinggemma-2")

第三步,測試一下。我們用三句中文,看看模型懂不懂語義:

texts = [
    "客戶投訴貨物延誤",
    "物流配送時間比預期長",
    "今天天氣很好"
]
emb = model.encode(texts, normalize_embeddings=True)

# 計算相似度
import numpy as np
sim = emb @ emb.T
print(sim[0][1])  # 應該接近 0.8 以上
print(sim[0][2])  # 應該明顯偏低

跑出來你會看到,第一句和第二句的相似度很高(因為語義接近),第三句則明顯偏低。這就是模型「懂意思」的證明。

小提醒:normalize_embeddings=True 這個參數很重要,它讓向量長度標準化,之後算相似度只要做內積就好,速度快很多。第一次跑會下載模型,香港的網路環境大概等 2 到 5 分鐘。

實戰:用 50 行程式碼做出你的語義搜尋引擎

現在來做真的。以下程式碼可以直接複製使用,我加了中文註解:

import numpy as np
from sentence_transformers import SentenceTransformer

model = SentenceTransformer("google/embeddinggemma-2")

# 1. 你的文件庫(實際使用時可從 CSV 或資料庫讀取)
docs = [
    "本公司報價單有效期為三十天,逾期需重新確認。",
    "付款條件為月結三十日,逾期將收取利息。",
    "退貨需於收貨後七日內提出,並保留原包裝。",
    "送貨範圍覆蓋香港島、九龍及新界,離島另議。",
    "保固期為一年,人為損壞不在保固範圍內。",
]

# 2. 先把所有文件轉成向量(只需做一次)
doc_vecs = model.encode(docs, normalize_embeddings=True)

def search(query, top_k=2):
    q_vec = model.encode([query], normalize_embeddings=True)[0]
    scores = doc_vecs @ q_vec          # 餘弦相似度
    idx = np.argsort(-scores)[:top_k]  # 由高到低排序
    return [(docs[i], float(scores[i])) for i in idx]

# 3. 試搜尋
for text, score in search("幾時要俾錢?"):
    print(f"{score:.3f}  {text}")

執行結果會是:

0.812  付款條件為月結三十日,逾期將收取利息。
0.556  本公司報價單有效期為三十天,逾期需重新確認。

注意看,你問的是廣東話口語「幾時要俾錢」,文件裡完全沒有這些字,但模型還是精準命中付款條款。這就是語義搜尋的威力。

如果你要處理上千份文件,只要把 doc_vecs 存成 .npy 檔,下次直接載入,不用重新編碼。5000 份文件在一般筆電上編碼大約 1 到 2 分鐘,之後每次搜尋都是毫秒級。

圖片也能搜?多模態嵌入的三個實用場景

EmbeddingGemma 2 的多模態能力,對香港台灣的團隊特別有用。以下三個場景你可以直接套用:

場景一:電商商品圖搜尋。 客人上傳一張「米白色針織外套」的照片,系統自動找出店內相似商品,不用客人自己想關鍵字。做法是把商品圖全部預先編碼成向量,收到查詢圖時算相似度即可。

場景二:設計素材管理。 設計師常說「我要上次那個藍綠色漸層的 banner」,用文字描述去搜圖庫,比翻資料夾快十倍。

場景三:文件截圖檢索。 很多合約、發票是掃描圖。你可以用文字查詢去搜尋這些圖片內容,等於幫舊文件做了 OCR 之外的語義索引。

程式碼上,圖片編碼只差一行:

from PIL import Image
img = Image.open("product.jpg")
img_vec = model.encode(img, normalize_embeddings=True)

之後把圖片向量和文字向量放在同一個空間比較,就能做到跨模態搜尋。這是 EmbeddingGemma 2 最被低估的功能。

接到 RAG 系統:讓你的 AI 客服不再胡說

如果你正在做 AI 客服或內部問答機器人,嵌入模型就是 RAG(檢索增強生成)的心臟。流程是這樣:使用者提問 → 用嵌入模型找出最相關的三五段文件 → 把這些段落塞進 LLM 的提示詞 → LLM 根據真實資料回答。

這樣做最大的好處是大幅降低幻覺。模型不再憑記憶亂答,而是根據你提供的文件回答,還能附上出處。

實作上,你可以把上面 search() 函式回傳的內容,組成提示詞:

context = "\n".join([d for d, _ in search(user_question, top_k=3)])
prompt = f"根據以下資料回答問題,若資料不足請說不知道。\n\n資料:\n{context}\n\n問題:{user_question}"

把 prompt 丟給任何 LLM,回答品質會比直接問高出一大截。對中小企業來說,這等於用零成本建立了一套私有知識庫問答系統,資料完全不出公司。

重點回顧:今天你學會了什麼

我們從「為什麼關鍵字搜尋不夠用」開始,一路做到了完整的語義搜尋引擎。你現在知道:嵌入模型把文字和圖片轉成向量,讓機器理解語義而非字面;EmbeddingGemma 2 只有 3 億參數等級,在筆電上就能跑,還支援多模態;用 sentence-transformers 三行就能載入模型,五十行就能做出搜尋系統;接上 LLM 就是一套私有 RAG 問答。

最實際的建議是:先從一個小場景開始。挑一個你每週都要花時間找資料的痛點,例如客戶合約、產品規格、內部 SOP,用今天教的程式碼跑一次。你會發現,原本要翻半小時的東西,現在三秒就找到。

香港和台灣的中小企業最缺的不是 AI 技術,而是把 AI 用在自己日常工作的具體方法。這套語義搜尋,就是最容易入門、回報最直接的一步。今天就試試看吧。

延伸閱讀

常見問題

Q: EmbeddingGemma 2 需要 GPU 才能跑嗎?

A: 不需要。 它是輕量級模型,在一般筆電的 CPU 上就能執行。以 M1 MacBook Air 為例,編碼 1000 段短文字大約 20 到 30 秒。只有在處理數十萬筆資料時,才會建議使用 GPU 加速。

Q: 我的文件是中文和英文混雜,這樣可以嗎?

A: 完全可以。 EmbeddingGemma 2 支援多語言,中英混雜的文件不需要事先翻譯或分類。實測下,中文查詢去搜尋英文文件、或英文查詢搜尋中文文件,都能正確命中語義相近的內容。

Q: 向量資料要存在哪裡?檔案會很大嗎?

A: 存成 .npy 檔即可。 每個向量約 768 維,以 float32 計算,1000 份文件大約 3MB,10000 份約 30MB,非常輕巧。若資料量超過十萬筆,再考慮導入 FAISS 或 Chroma 這類向量資料庫。

Q: 跟直接付費使用 OpenAI 的 embedding API 比,哪個好?

A: 看你的需求。 自架 EmbeddingGemma 2 的優勢是免費、離線、資料不外流,適合處理敏感的公司內部文件。付費 API 的優勢是免維護、無需下載模型。對香港台灣的中小企業來說,若涉及客戶資料或合約,本地執行通常是更安心的選擇。

Q: 搜尋結果不準怎麼辦?

A: 先檢查三件事。 第一,確認有加 normalize_embeddings=True;第二,文件切得太長會稀釋語義,建議每段控制在 200 到 500 字;第三,如果領域術語很特殊,可以考慮用少量問答對做微調,或改用更大的嵌入模型。