🔗 文本相似度 (Text Similarity)

廁所 = 洗手間 · 80/20 Q&A 比對 · Siamese-BERT → BGE Embedding · ~45 天踩坑

作者TonTon Huang Ph.D.投入時間:2019/10/15–2019/11/30(~45 天)|更新:2026-07-28

文本相似度的核心問題是:「這兩句話是否表達同一個意思?」聽起來簡單,但中文博大精深,「廁所在哪裡」「洗手間在那」,字面上完全不同,語意上完全相同。傳統方法(TF-IDF、詞重疊)處理不了這種情況,這正是 BERT 類方法的突破口。

這個專案的應用場景是聊天機器人的「80/20 問題處理法」:80% 的用戶問題其實都是常見問題的變體,先用相似度比對快速匹配已有 Q&A 答案,剩下 20% 才進入關鍵字引擎或閱讀理解系統,大幅降低系統整體延遲與成本。

~45 天
研發投入
80%
問題可被快速比對解決
ALBERT
最終選用基底模型
BGE
2026 首選 Embedding

文本相似度的真正難題

傳統詞重疊方法(Jaccard / BM25)只看字詞是否相同,完全無法處理以下中文語意相似問題:

廁所在哪裡 vs 洗手間在那 語意相同 ✓ 詞重疊=0,BERT=高分
我不喜歡你 vs 你是個好人 語意相反 ✗ 詞重疊=低,需語意理解
台北 101 幾樓 vs 台北 101 有多少層 語意相同 ✓ 詞重疊=部分,BERT=高分
我要訂明天的票 vs 幫我退票 語意不同 ≠ 都是票務,但意圖相反

文本相似度:傳統 Embedding vs LLM

💡 核心論點:高頻語意檢索(Q&A 比對、知識庫搜尋)用 BERT-based Embedding 速度快、成本低;需要理解隱語、反諷、跨語言語意時,LLM 作為 reranker 是合理補充。
場景 Sentence-BERT / BGE LLM 語意比對
1 萬筆問題庫搜尋ANN 向量搜尋 <10ms每次都要 API 呼叫,不可行
字面不同語意相同BERT 向量相似度高,準確LLM 正確但費用高
反諷/隱喻向量相似度可能失準LLM 理解能力強
跨語言(中英混)需多語言模型(如 multilingual-e5)LLM 原生支援多語言
部署成本一次訓練,邊際成本極低每次都消耗 Token,隨量線性增長
✅ 2026 最佳實踐:Bi-encoder + Cross-encoder 兩階段
Stage 1:BGE / Sentence-BERT 快速召回 Top-K 候選(向量搜尋,<10ms)
Stage 2:Cross-encoder reranker(或 LLM)精排,提升最終排序準確度
→ 兼顧速度與精度,99% 的場景不需要把 LLM 用在 Stage 1。

TF-IDF → Word Vectors → BERT → BGE

TF-IDF / n-gram
詞頻統計
Word2Vec
詞向量相似度
ALBERT
輕量 BERT 微調
Siamese-BERT
孿生網路對比學習
BGE / E5
2026 SOTA
📊 TF-IDF + Cosine Similarity
最簡單的基線方法
把文本轉成詞頻向量,計算餘弦相似度。優點:不需要訓練,計算快;缺點:完全忽略語意,「廁所」和「洗手間」向量距離很遠,相似度為 0。適合作為基線對比,不適合直接用於生產。
🔤 Word Vectors(Word2Vec / FastText)
騰訊 ChineseEmbedding 16GB
把每個詞映射為 300 維向量,「廁所」和「洗手間」在向量空間中接近。但詞向量無法解決一詞多義(bank 是銀行還是河岸),且依賴 16GB 騰訊詞典,記憶體消耗極高。
⚡ ALBERT(2019,Google/CMU)
arXiv:1909.11942 | 原始專案選用
BERT 的輕量化版本,參數共享讓模型體積縮小 18 倍,但效果幾乎相當。當時選用 ALBERT 是因為記憶體和推論速度優勢。最終被知識蒸餾(Distillation)方法超越:把 BERT 蒸餾成小模型,速度更快、效果更好。
🧬 Siamese-BERT(孿生網路)
兩個共享權重的 BERT 分支分別編碼兩句話,用 Contrastive Loss 或 Cosine Similarity Loss 訓練。關鍵優勢:句向量可以離線預計算,推論時只需做向量相似度計算(<1ms),無需每次都跑完整 BERT。這讓大規模 Q&A 比對變為可行。
🏆 BGE / E5 / nomic-embed(2024–2026 SOTA)
BGE: BAAI/bge-large-zh-v1.5 | MTEB Chinese Leaderboard #1
北京智源研究院(BAAI)的 BGE(Beijing General Embedding)系列,在 MTEB 中文 Embedding 排行榜長期位居前列。支援繁體中文,1536 維高維 Embedding。搭配 FAISS 可在億級語料庫中做毫秒級向量搜尋。是 2026 年文本相似度的首選基礎模型。

聊天機器人的 80/20 問題處理法

這個 80/20 策略的核心洞見是:大多數問題都是常見問題的語意變體。只要能快速識別出這類問題,就可以直接返回預設答案,避免進入昂貴的 NLP pipeline。

🔄 問題處理 Pipeline:
用戶輸入 ASR / 文字輸入正規化
① 相似度比對 BGE Embedding + FAISS 向量搜尋 → 匹配 Q&A 庫 相似度 > 0.85 → 直接回答(~80%)
↓ 相似度 < 0.85
② 關鍵字/正規表達式 規則引擎處理常見意圖 覆蓋約 15%
↓ 未匹配
③ MRC / LLM 深度理解、開放域問答 剩餘約 5%(高成本)
✅ 關鍵收益:相似度比對的邊際成本幾乎為零(向量計算 <1ms),LLM 只處理最複雜的 5% 問題,整體 Token 費用降低 80–95%。

~45 天的收穫與教訓

那時剛好遇到 ALBERT 剛發布,以為輕量就是更好,做了大量 ALBERT 微調實驗。後來發現——

⚠️ ALBERT 被蒸餾打敗:把 BERT-base 用知識蒸餾(Knowledge Distillation)壓縮到相似大小後,速度比 ALBERT 更快,且因為蒸餾是在繁體中文語料上做的,領域適配更好。模型輕量化優先考慮蒸餾,而非直接選參數少的模型。
⚠️ 相似度閾值的魔法數字:「相似度 > X 才算匹配」的 X 值需要用驗證集仔細調整,不同資料集、不同問題類型,最佳閾值可能從 0.7 到 0.92 都有。設太高漏掉合理匹配,設太低帶入錯誤答案。
⚠️ 中文語意的特殊陷阱:「我不喜歡你」和「你是個好人」(就是委婉拒絕的意思),Siamese-BERT 會計算出中等相似度,但語意不同。語意相似度 ≠ 意圖相似度,下游需要額外的意圖識別層。
✅ 訓練數據策略:相似句對(Positive Pairs)可以用文本分類的標注數據生成——同類別的問題互相構成正樣本對,跨類別構成負樣本對。不需要額外從零標注,大幅降低數據成本。
🔗

探索更多 NLP 任務