使用句子轉換模型構建播放清單生成器

TL;DR

Hugging Face 詳細說明了如何建構一個使用 Sentence Transformers 於歌曲歌詞嵌入上執行語意搜尋的播放清單生成器,並以多步驟 Gradio 應用程式包裝。此專案展示了預訓練嵌入模型如何在不需自行訓練模型的情況下,將使用者文字提示與相關歌曲內容匹配。

使用 Sentence Transformers 進行語意搜尋

播放清單生成器的核心功能在於產生句子嵌入以實現語意搜尋。系統不是匹配關鍵字,而是找出與使用者提示意義相近的歌曲。

模型選擇與實作

本專案選用了 sentence-transformers/msmarco-MiniLM-L-6-v3 模型。此模型屬於 MS MARCO 系列,該系列以 Bing 搜尋查詢為訓練資料,在多種領域上皆表現良好。

以詩節切分處理長文本

由於嵌入模型有最大輸入序列長度限制(本例為 512 個 word piece),整首歌曲往往超過模型容量而被截斷。為了解決此問題,會將歌詞切分成較小的片段——具體而言是詩節——並分別對每個詩節進行嵌入。此做法確保搜尋更精確,且模型能處理完整的歌曲內容。

產生與儲存嵌入

嵌入是透過 Sentence Transformers 模型的 .encode() 方法產生的。在此實作中,產生的嵌入會以 pickle 檔案形式儲存,並上傳至 Hugging Face Hub 作為資料集供大家存取。

執行搜尋

為了找出相關歌曲,系統使用 util.semantic_search 將使用者提示的嵌入與預先產生的詩節嵌入語料庫進行比對。為確保返回足夠數量的不同歌曲,top_k 參數設為 20,通常在去除同一歌曲的重複詩節後,至少會得到 9 首獨立歌曲。

使用 Gradio 建構多步驟介面

此應用程式利用 Gradio Blocks API 建立非線性、多步驟的使用者體驗,讓前一步的輸出作為下一步的輸入。

應用流程

  1. 輸入:使用者在 gr.TextArea 中輸入文字提示,或選取範例。
  2. 觸發gr.Button 觸發 generate_playlist 函式。
  3. 處理:函式編碼提示並對詩節嵌入執行語意搜尋。
  4. 輸出:結果透過 gr.Radio 元件返回,並使用 .update() 方法動態更新,以顯示辨識出的歌曲名稱。
  5. 檢視:使用者可從 radio 選項中選取歌曲,查看其完整歌詞。

資料整合

應用程式在啟動時使用 hf_hub_download 從 Hugging Face 資料集直接載入必要的資料——包括詩節嵌入、歌曲映射與歌詞。

未來增強與資源

專案作者指出了幾個可擴充工具功能的潛在方向:

  • Spotify 整合:自動產生播放清單,並嵌入播放器以即時收聽。
  • 視覺回饋:使用 HighlightedText Gradio 元件顯示觸發語意匹配的具體詩節。
  • 嵌入可視化:建立嵌入空間的視覺化圖形,以更好理解歌曲之間的關係。

Sources