載入中

在建構 RAG 管線時,您會很快發現僅靠語意搜尋並不總能返回最佳結果。有時您需要精確的關鍵字匹配,而這正是語意搜尋可能會遺漏的。解決方案是使用一種稱為 BM25 的技術,將語意搜尋與詞彙搜尋結合起來。

僅使用語意搜尋的問題

假設您正在文件中搜尋一個特定的事件 ID,例如「INC-2023-Q4-011」。雖然這個確切的詞彙在相關章節中多次出現,但語意搜尋可能會返回看似語意相似但實際上不包含您所需特定資訊的不相關章節。

這是因為語意搜尋專注於意義而非精確的文字匹配。當您需要精確的關鍵字匹配時,就需要一種不同的方法。

混合搜尋策略

解決方案是並行執行語意搜尋和詞彙搜尋,然後合併結果。這樣可以兼得兩者的優點:

  • 語意搜尋 - 使用嵌入向量找出概念上相關的內容
  • 詞彙搜尋 - 使用傳統文字搜尋找出精確的關鍵字匹配
  • 合併結果 - 結合兩種方法以獲得更好的整體相關性

BM25 的運作方式

BM25(Best Match 25)是 RAG 管線中一種流行的詞彙搜尋演算法。以下是它處理搜尋查詢的方式:

該演算法遵循以下關鍵步驟:

  1. 將查詢分詞 - 將使用者的問題拆分為個別詞彙
  2. 計算詞頻 - 查看每個詞彙在所有文件中出現的頻率
  3. 依稀有度加權詞彙 - 使用頻率較低的詞彙會獲得較高的重要性分數
  4. 為文件評分 - 找出包含較多高權重詞彙實例的文字區塊

關鍵的洞察是,像「INC-2023-Q4-011」這樣的稀有詞彙對搜尋相關性的重要性,遠高於像「a」或「the」這樣的常見詞彙。

以下是設定 BM25 搜尋系統的方法:

python
# 建立 BM25 儲存庫
store = BM25Index()

# 將文件新增至儲存庫
for chunk in chunks:
    store.add_document({"content": chunk})

# 搜尋儲存庫
results = store.search("What happened with INC-2023-Q4-011?", 3)

BM25 的實作維持了與您的向量儲存庫相似的 API,具有 add_document() 和 search() 方法。這種一致性使得同時使用這兩個系統變得容易。

更好的搜尋結果

當您透過 BM25 執行同一個在僅使用語意搜尋時失敗的查詢時,您會獲得更好的結果。該演算法正確地優先排序包含確切事件 ID 的章節,將它們排在可能語意相關但不包含您所尋找特定詞彙的章節之前。

現在搜尋結果能正確呈現實際討論該事件的軟體工程章節和網路安全章節,而不是返回像財務分析這樣不相關的內容。

後續步驟

現在您已經讓語意搜尋和詞彙搜尋系統獨立運作,下一步是合併它們的結果。這種混合方法將為您帶來嵌入向量的語意理解,結合關鍵字匹配的精確性,為您的 RAG 管線創造更穩健的搜尋體驗。