SentenceTransformer 模型提供強大的語義搜尋和文字相似度分析能力。透過計算句子向量之間的 cosine 相似度,可以有效判斷句子之間的語義關聯性。文章示範如何使用 Alibaba-NLP/gte-base-en-v1.5 模型,並透過定義 get_similarity_score 函式計算相似度分數。為了提升模型效能,我們可以透過微調技術,使用 TripletLoss 損失函式訓練模型,使其更精確地捕捉句子間的語義關係。此外,新增 Metadata 至嵌入式內容能顯著提升搜尋結果的品質,例如在食譜搜尋中,加入食材、烹飪方法等 Metadata,能更精確地匹配使用者查詢。文章以烤大蒜和番茄義大利麵食譜為例,展示如何將 Metadata 整合至語義搜尋流程,並提供一個圖表說明 Metadata 如何提升搜尋模型的精確度。最後,文章也提供了一個文字相似度評估的表格,展示 Metadata 在提升搜尋效能方面的顯著效果。

載入 SentenceTransformer 模型

首先,我們需要載入 SentenceTransformer 模型。這裡,我們使用的是「Alibaba-NLP/gte-base-en-v1.5」模型。

from sentence_transformers import SentenceTransformer, InputExample, losses
from torch.utils.data import DataLoader
import torch
import torch.nn as nn

# 載入 SentenceTransformer 模型
model = SentenceTransformer("Alibaba-NLP/gte-base-en-v1.5", trust_remote_code=True)

定義計算相似度的函式

接下來,我們定義一個函式 get_similarity_score,用於計算兩個句子的相似度。

def get_similarity_score(sentence1, sentence2):
    # 將句子轉換為向量
    embedding1 = model.encode(sentence1)
    embedding2 = model.encode(sentence2)

    # 計算 cosine 相似度
    cosine_score = torch.nn.CosineSimilarity(dim=0)
    score = cosine_score(embedding1, embedding2)

    return score.item()

計算相似度

現在,我們可以使用 get_similarity_score 函式計算兩個句子的相似度。

sentence1 = "I love the taste of fresh apples."
sentence2 = "Apples are rich in vitamins and fiber."

similarity_before = get_similarity_score(sentence1, sentence2)
print(f"Cosine similarity between '{sentence1}' and '{sentence2}': {similarity_before:.4f}")

訓練模型

接下來,我們需要訓練模型,以提高其對句子相似度的判斷能力。首先,我們定義了一些訓練資料。

train_examples = [
    InputExample(texts=["I love eating apples.", "Apples are my favorite fruit", "Apple is a tech company"]),
    InputExample(texts=["Chocolate is a sweet treat loved by 玄貓.", "I can't resist a good piece of chocolate.", "Chocolate Rain was one of the most popular songs on YouTube from 2007."]),
    InputExample(texts=["Ice cream is a refreshing dessert.", "I love trying different ice cream flavors.", "The rapper and actor Ice Cube was wearing a cream colored suit to the VMAs."]),
    InputExample(texts=["Salad is a healthy meal option.", "I love a fresh, crisp salad with various vegetables.", "Salad Fingers is a surreal web series created by 玄貓."]),
]

然後,我們建立一個 DataLoader 物件,用於載入訓練資料。

train_dataloader = DataLoader(train_examples, shuffle=True, batch_size=8)

接下來,我們定義了一個損失函式 TripletLoss,用於計算模型的損失。

train_loss = losses.TripletLoss(model=model)

最後,我們使用 fit 方法訓練模型。

model.fit(train_objectives=[(train_dataloader, train_loss)], epochs=10)

計算訓練後的相似度

訓練完成後,我們可以再次計算兩個句子的相似度,以檢視模型的判斷能力是否有所改善。

similarity_after = get_similarity_score(sentence1, sentence2)
similarity_difference = similarity_after - similarity_before
print(f"Change in similarity score: {similarity_difference:.4f}")

這樣,我們就完成了使用 SentenceTransformer 進行句子相似度分析的範例程式碼。

提升語義搜尋模型的精確度

在前面的例子中,我們看到了一個小型的微調(fine-tuning)就能夠增加相關句子的向量相似度。這表明了微調嵌入模型的重要性。如果你想了解更多關於微調句子轉換模型(sentence transformers)的資訊,玄貓的部落格文章「訓練和微調句子轉換模型」是一個很好的起點。

嵌入式資料的增強

在嵌入式內容中加入資料描述(metadata)可以顯著提高檢索結果的品質。這些描述可以建立一個更豐富、更有意義的語義表示。常見的描述包括內容型別、標籤、標題和摘要。以下表格列出了在嵌入式內容中包含的一些有用的描述型別:

型別範例
內容型別文章、食譜、產品評價等
標籤「晚餐」、「義大利菜」、「素食」

食譜資料的嵌入式描述

例如,對於一道叫做「烤大蒜和番茄義大利麵」的食譜,你可以包括以下描述:

{
  "contentType": "recipe",
  "recipeTitle": "烤大蒜和番茄義大利麵",
  "keyIngredients": ["義大利麵", "大蒜", "番茄", "橄欖油", "羅勒"],
  "servings": 4
}

這些描述可以幫助提高語義搜尋模型的精確度,特別是在特定領域(如食譜查詢)中。

食譜資料的詳細內容

以下是「烤大蒜和番茄義大利麵」的食譜詳細內容:

成分

  • 8 oz 義大利麵
  • 1 個大蒜頭
  • 1 品特櫻桃番茄
  • 1/4 杯橄欖油
  • 1/2 杯新鮮羅勒,切碎
  • 鹽和胡椒

指示

  1. 將烤箱預熱至400°F(200°C)。
  2. 將大蒜頭的頂部剪掉,淋上橄欖油,包在鋁箔中,烤30分鐘。
  3. 將櫻桃番茄與橄欖油、鹽和胡椒一起烤20分鐘,直到表面起泡。
  4. 根據包裝指示煮義大利麵。將煮好的義大利麵與壓出的烤大蒜、番茄和橄欖油混合。
  5. 加入羅勒,調味鹽和胡椒,然後上桌。 產量:4人份

圖表翻譯

  graph LR
    A[食譜資料] --> B[嵌入式描述]
    B --> C[語義搜尋模型]
    C --> D[提高檢索結果品質]

圖表翻譯:

此圖表展示瞭如何將食譜資料轉換為嵌入式描述,並如何使用這些描述來提高語義搜尋模型的精確度。首先,食譜資料被轉換為嵌入式描述,包括內容型別、標題和關鍵成分等。然後,這些描述被用於訓練語義搜尋模型,以提高其對相關查詢的檢索結果品質。

義大利麵食譜:烤大蒜和櫻桃番茄義大利麵

前言

在這個食譜中,我們將探討如何製作一道簡單而美味的義大利麵菜餚,特色是烤大蒜和櫻桃番茄,搭配輕盈的醬汁。這道菜不僅適合素食主義者,也是對於任何喜愛義大利美食的人的一個絕佳選擇。

材料

  • 8盎司義大利麵
  • 3瓣大蒜,剝皮並切碎
  • 1杯櫻桃番茄,切半
  • 1/4杯橄欖油
  • 2大匙新鮮羅勒,切碎
  • 1茶匙鹽
  • 1/2茶匙黑胡椒
  • 1/4杯帕馬森乳酪,磨碎

步驟

  1. 將烤箱預熱至400°F(200°C)。
  2. 將大蒜放在鋁箔上,淋上少量橄欖油,封住鋁箔,放入預熱的烤箱中烤約20-25分鐘,或直到大蒜變軟並呈現金黃色。
  3. 將櫻桃番茄與少量橄欖油、鹽和黑胡椒混合,放在烤盤上,放入烤箱中烤約15-20分鐘,或直到番茄變軟並略微焦糖化。
  4. 按照包裝指示煮義大利麵,直到它達到半熟的狀態。保留一些義大利麵水後,再將義大利麵瀝乾。
  5. 將烤好的大蒜和櫻桃番茄與煮好的義大利麵混合,加入剩餘的橄欖油、羅勒、鹽和黑胡椒。若義大利麵過乾,可以加入保留的義大利麵水。
  6. 最後在上面撒上帕馬森乳酪,趁熱食用。

小提示

  • 若要增加菜餚的風味,可以在醬汁中加入少量白葡萄酒或蔬菜高湯。
  • 您也可以根據自己的喜好新增其他蔬菜,如甜椒或蘑菇,以增加菜餚的多樣性。

最佳化文字相似度評估

在評估文字相似度時,metadata的加入可以顯著提升相關內容的出現機率。表10.4顯示了有無metadata的文字向量之間的餘弦相似度比較。結果表明,新增metadata的文字具有更高的相似度,尤其是在多樣化的相關查詢中。

從技術架構視角來看,SentenceTransformer 模型為語義搜尋提供了強大的解決方案。透過向量嵌入技術,模型能有效捕捉句子的語義資訊,進而實作更精確的相似度計算。深度剖析其核心架構,可以發現 Transformer 網路的注意力機制在理解上下文關係中扮演關鍵角色,而微調策略則能針對特定領域資料強化模型的表現。然而,模型的計算複雜度和記憶體需求仍然是實際應用中的挑戰,尤其在處理大規模資料集時。透過整合向量搜尋引擎和資料描述等技術,可以有效提升搜尋效率和準確性。玄貓認為,SentenceTransformer 結合資料描述的技術路線,代表了語義搜尋的未來方向,值得深入研究並應用於實際專案,尤其在資訊檢索、問答系統和推薦系統等領域,將展現巨大的應用潛力。