🔗 文本相似度 (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% 才進入關鍵字引擎或閱讀理解系統,大幅降低系統整體延遲與成本。
直觀理解
文本相似度的真正難題
傳統詞重疊方法(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)
BERT 的輕量化版本,參數共享讓模型體積縮小 18 倍,但效果幾乎相當。當時選用 ALBERT 是因為記憶體和推論速度優勢。最終被知識蒸餾(Distillation)方法超越:把 BERT 蒸餾成小模型,速度更快、效果更好。
🧬 Siamese-BERT(孿生網路)
兩個共享權重的 BERT 分支分別編碼兩句話,用 Contrastive Loss 或 Cosine Similarity Loss 訓練。關鍵優勢:句向量可以離線預計算,推論時只需做向量相似度計算(<1ms),無需每次都跑完整 BERT。這讓大規模 Q&A 比對變為可行。
🏆 BGE / E5 / nomic-embed(2024–2026 SOTA)
北京智源研究院(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)可以用文本分類的標注數據生成——同類別的問題互相構成正樣本對,跨類別構成負樣本對。不需要額外從零標注,大幅降低數據成本。