全部產品
Search
文件中心

ApsaraDB for Redis:TairVector混合檢索實踐

更新時間:Jun 08, 2024

本文介紹基於Tair向量檢索(Vector)實現條件過濾、向量檢索、全文檢索索引融合的混合檢索方案。

背景資訊

大語言模型(Large Language Model, LLM)的發展使得文本、圖片、音視頻等非結構化資料都可以通過向量來表示其語義資訊,基於向量的KNN檢索在語義搜尋、商品推薦、智能問答等領域有非常大的潛力。當前大多數產品通常僅支援經典的條件過濾、全文索引、向量檢索這三類檢索方案的一種或者兩種組合,這三種檢索方案的優缺點非常明顯:

  • 條件過濾:基於多種布爾條件組合過濾,對資料集和使用方式有嚴格的約束,限制了使用者使用情境。

  • 全文檢索索引:針對使用者通用查詢Query,通過分詞並計算文檔相關度,返回相關性最高的結果清單。一般限於文本類欄位的查詢,且難以處理使用者輸入錯誤等文法問題。

  • 向量檢索:首先進行語義編碼,通過計算向量之間相關度,返回相關性最高的結果清單。可以處理文檔、圖片、音視頻等各類非結構化資料,極大拓展了應用情境,不過也存在高度依賴LLM的效果、對私域資料處理不準確等問題。

基於Tair向量檢索可以在資料不出庫情況下實現條件過濾、全文檢索索引、向量檢索三類檢索方案的任意組合。您僅需通過一條查詢語句即可實現三路結果召回,例如通過待檢索的圖片、文本、音視頻等檔案進行向量檢索召回、通過輸入的文本進行全文檢索索引召回、通過布林運算式進行條件過濾召回等,Tair向量檢索還會對三路召回結果進行權重排序,返回最終的候選列表。

通過多路召回,可以避免因僅使用一種檢索方案而受到單檢索方案的能力限制,通過多種資料資源提高檢索命中率。同時也支援針對特定的請求,通過hybrid_ratio參數調整不同檢索方式的權重,更多資訊請參見Vector

方案概述

本樣本將使用fashion-product-images-small開來源資料集示範不同檢索方案的效果。

說明

請自覺遵守開來源資料集的相關協議及法律法規等。

資料說明

該資料集包含4.4萬條商品資料,資料格式如下:

id (int64)

gender (string)

masterCategory (string)

subCategory (string)

articleType (string)

baseColour (string)

season (string)

year (float64)

usage (string)

productDisplayName (string)

image (dict)

15,970

"Men"

"Apparel"

"Topwear"

"Shirts"

"Navy Blue"

"Fall"

2,011

"Casual"

"Turtle Check Men Navy Blue Shirt"

{ "bytes": [ 255, 216, 255, ... ], "path": null }

39,386

"Men"

"Apparel"

"Bottomwear"

"Jeans"

"Blue"

"Summer"

2,012

"Casual"

"Peter England Men Party Blue Jeans"

{ "bytes": [ 255, 216, 255, ...], "path": null }

59,263

"Women"

"Accessories"

"Watches"

"Watches"

"Silver"

"Winter"

2,016

"Casual"

"Titan Women Silver Watch"

{ "bytes": [ 255, 216, 255, ...], "path": null }

資料轉換方案

Tair向量檢索是簡單直觀的Tair向量索引Key-Key-(Key-Value)儲存結構,首先需要建立一個向量索引(例如hybrid_index用於儲存所有商品資料。再對上述表資料結構進行轉換,按照欄位可以分為四類:

  • id:作為Tair向量檢索中的主鍵,可通過該欄位可以實現點查操作(只掃描少量資料的查詢操作)。

  • image:通過LLM編碼後作為Tair向量檢索的向量資訊,通過該向量資訊可以實現向量檢索。

  • productDisplayName:該欄位為image的描述資訊,可作為Tair向量檢索中的Text文本資訊。通過該欄位可以實現全文檢索索引。

  • 其他列:作為Tair向量檢索的最子級索引值對,沒有限制數量。通過該索引值對可以實現傳統的屬性過濾檢索。

Tair向量檢索儲存的資料結構樣本如下:1.jpg

整體流程與範例程式碼

本樣本的整體流程為:

  1. 載入資料集。

  2. Tair環境準備。

  3. 匯入資料集至Tair。

  4. 以不同檢索方案進行查詢。

詳情請參見Hybrid search代碼工程

重要

該代碼檔案為.ipynb檔案,使用前需提前執行pip install jupyter命令,安裝相關依賴。

查詢展示

以下代碼僅展示以不同的檢索方案進行查詢與對應效果。以查詢Green Kidswear為例,通過調整hybrid_ratio參數(hybrid_ratio參數為向量檢索的權重,全文檢索索引的權重為1-hybrid_ratio),分別測試下面四種情境:

  • 純向量檢索:將hybrid_ratio參數設定為0.9999,查詢樣本如下。

    topk = 20
    text = "Green Kidswear"
    vector = model.encode([text])[0]
    filter_str = None
    kwargs = {"TEXT" : text, "hybrid_ratio" : 0.9999}
    result = client.tvs_knnsearch(index_name, topk, vector, False, filter_str, **kwargs)
    top_img = [images[id_pos[int(item[0])]] for item in result]
    display_result(top_img)

    執行結果:

    image.png

  • 純全文檢索索引:將hybrid_ratio參數設定為0.0001,查詢樣本如下。

    topk = 20
    text = ""Green Kidswear"
    vector = model.encode([text])[0]
    filter_str = None
    kwargs = {"TEXT" : text, "hybrid_ratio" : 0.0001}
    result = client.tvs_knnsearch(index_name, topk, vector, False, filter_str, **kwargs)
    top_img = [images[id_pos[int(item[0])]] for item in result]
    display_result(top_img)

    執行結果:image.png

  • 向量、全文混合檢索:將hybrid_ratio參數設定為0.5,查詢樣本如下。

    topk = 20
    text = ""Green Kidswear"
    vector = model.encode([text])[0]
    filter_str = None
    kwargs = {"TEXT" : text, "hybrid_ratio" : 0.5}
    result = client.tvs_knnsearch(index_name, topk, vector, False, filter_str, **kwargs)
    top_img = [images[id_pos[int(item[0])]] for item in result]
    display_result(top_img)

    執行結果:

    image.png

  • 向量、全文、條件過濾混合檢索:將hybrid_ratio參數設定為0.5,同時添加subCategory == "Topwear"的條件陳述式,查詢樣本如下。

    topk = 20
    text = "Green Kidswear"
    vector = model.encode([text])[0]
    filter_str = "subCategory == \"Topwear\""
    kwargs = {"TEXT" : text, "hybrid_ratio" : 0.5}
    result = client.tvs_knnsearch(index_name, topk, vector, False, filter_str, **kwargs)
    print(result)
    top_img = [images[id_pos[int(item[0])]] for item in result]
    display_result(top_img)

    執行結果:

    image.png

總結

  • 直觀上看,無論是向量檢索還是全文檢索索引,整體都比較符合查詢需求。在排名最高的候選集中,全文檢索索引體驗要略微好於向量檢索。

  • 在混合檢索中,若某一個目標存在於兩個召回結果中,則其最終排名會更加靠前。

  • 通過調整hybrid_ratio參數,可以動態對向量檢索和全文檢索索引各自召回的結果進行Rerank(重排),以得到更精準的結果。

  • 可以通過條件過濾的方式進一步過濾掉特定的候選集,提高檢索命中率。