本文介紹基於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向量檢索儲存的資料結構樣本如下:
整體流程與範例程式碼
本樣本的整體流程為:
載入資料集。
Tair環境準備。
匯入資料集至Tair。
以不同檢索方案進行查詢。
詳情請參見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)
執行結果:
純全文檢索索引:將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)
執行結果:
向量、全文混合檢索:將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)
執行結果:
向量、全文、條件過濾混合檢索:將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)
執行結果:
總結
直觀上看,無論是向量檢索還是全文檢索索引,整體都比較符合查詢需求。在排名最高的候選集中,全文檢索索引體驗要略微好於向量檢索。
在混合檢索中,若某一個目標存在於兩個召回結果中,則其最終排名會更加靠前。
通過調整hybrid_ratio參數,可以動態對向量檢索和全文檢索索引各自召回的結果進行Rerank(重排),以得到更精準的結果。
可以通過條件過濾的方式進一步過濾掉特定的候選集,提高檢索命中率。