你有沒有試過,明明公司內部文件就放在共用雲端,搜尋「報價單」卻什麼都找不到,只因為檔名寫的是「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 字;第三,如果領域術語很特殊,可以考慮用少量問答對做微調,或改用更大的嵌入模型。