淺談有贊搜尋QP架構設計

語言: CN / TW / HK

一、有贊搜尋平臺整體設計

在介紹QP前先簡單介紹一下搜尋平臺的整體結構,方便大家快速瞭解QP在搜尋平臺中的作用。下圖簡單展示了一個搜尋請求開始到結束的全部流程。業務通過簡潔的api接入los,管理員在搜尋平臺新建配置並下發,完成整個搜尋接入,並通過abtest驗證QP帶來的優化效果。

二、QP的作用

在NLP中,QP被稱作Query理解(QueryParser),簡單來說就是從詞法、句法、語義三個層面對query進行結構化解析。這裡query從廣義上來說涉及的任務比較多,最常見的就是搜尋系統中輸入的查詢詞,也可以是FAQ問答或閱讀理解中的問句,又或者可以是人機對話中使用者的聊天輸入。

在有贊,QP系統專注對查詢內容進行結構化解析,整合了有贊NLP能力,提供統一對外介面,與業務邏輯解耦。通過配置化快速滿足業務接入需求,同時將演算法能力外掛化,並支援人工干預外掛執行結果。

以精選搜尋為例,當用戶輸入衣服時使用者往往想要搜的是衣服類商品,而不是衣服架,衣服配飾等衣服周邊用品。通過將衣服類目進行加權,將衣服類的商品排在靠前的位置,優化使用者搜尋體驗。

QP目前應用在新零售,微商城、精選、愛逛買手店、分銷市場、幫助中心知識庫、官網搜尋等場景,通過類目加權,產品詞識別,搜尋詞糾錯,同近義詞召回提升使用者搜尋效果。

三、QP應用整體設計

上圖完整描述了QP請求流程和配置流程的執行情況。當搜尋請求到達QP時,根據請求體中的場景標記獲取QP配置。QP配置中包含搜尋詞位置標記,外掛列表,dsl改寫指令碼等內容。

QP根據配置,按序執行相應外掛。外掛在執行後,可通過干預配置以及超引數對結果進行人工干預。

QP在獲取到演算法外掛執行結果後,根據改寫配置,對搜尋dsl進行改寫。如將糾錯詞放置在搜尋詞同一層級,將dsl改寫成fuction score結構進行類目加權。

四、QP應用分層設計

上圖按照請求流程從上到下展示了QP的分層設計,接下來將簡單描述各層作用:

controller層:查詢改寫服務入口,對請求做預處理。

service層:根據場景獲取QP改寫配置,獲取dsl裡的搜尋詞,呼叫相應的外掛返回qp結果。

plugin層:負責演算法外掛執行,呼叫外掛對應的演算法實現handler,對演算法結果做干預並針對呼叫成功或者失敗做處理。

handler層:演算法具體實現放置在該層,該層會依賴各種演算法服務(如小盒子,Milvus等)。

Intervener層:負責對handler結果做人工干預。

processor層:根據QP改寫配置,呼叫改寫外掛,完成dsl的改寫。

五、QP演算法外掛設計

5.1 預處理Preprocess外掛

按照配置規則對搜尋詞進行預處理,預處理方式如下:

* 刪除特殊符號 " “ \ 等;

* 大寫轉小寫,全形轉半形;

* 連續英文聯合切分,連續數字聯合切分,其餘單獨切分;

* 預設擷取list前50個字/詞;

* 將list拼接成一個字串。

樣例

輸入:"史蒂夫新款\時尚套裝夏修身圓領百搭鉤花DWF鏤空雪紡兩件套套裙;"
輸出:"史蒂夫新款時尚套裝夏修身圓領百搭鉤花dwf鏤空雪紡兩件套套裙"

5.2 糾錯Correction外掛

糾錯外掛的作用是對搜尋詞中錯誤內容進行識別,返回正確內容。

樣例

輸入:[上海牛黃皁]
輸出:[上海硫磺皁]
當用戶輸入“上海牛黃皁”時,通過糾錯外掛能正確輸出“上海硫磺皁”,其技術架構如下圖所示。

1、糾錯模型在bert基礎上採用知識蒸餾,提升模型精度降低模型時延。

2、根據同音字召回候選集,使用tri-gram語言模型對候選集排序。

5.3 細粒度分詞Tokenizer外掛(基礎分詞)

樣例

輸入:[雪地靴女2020年新款皮毛一體冬季加絨加厚防滑東北厚底保暖棉鞋子]
輸出:[雪地 靴 女 2020 年 新款 皮毛 一體 冬季 加絨 加厚 防滑 東北 厚底 保暖 棉 鞋子]

該分詞外掛由Java版結巴 jieba-analysis 修改而來,修改內容如下:

* 從全網商品標題資料,有贊行業資料,開源資料中統計出詞頻,作為基礎分詞詞典;

* 解決詞典中由英文單詞導致英文字串被分開的問題;

* 限制DAG的長度,即匹配詞的長度,以此控制分詞粒度,目前預設是2,分出來的詞除英文和數字外,長度不會超過2。

5.4 語義分詞sementicSegment外掛

樣例

輸入:[雪地 靴 女 2020 年 新款 皮毛 一體 冬季 加絨 加厚 防滑 東北 厚底 保暖 棉 鞋子]
輸出:[雪地靴 女 2020年 新款 皮毛一體 冬季 加絨加厚 防滑 東北 厚底 保暖 棉鞋子]

該外掛在細粒度分詞的基礎上,通過模型生成語義樹將關聯度大的詞列表進行合併,輸出語義分詞結果。在樣例中,雪地與靴關聯度更大,所以在語義分詞中將雪地與靴合併輸出。

5.5 實體識別Tagging外掛

樣例

輸入:["汽車","腳墊","刷子"]
輸出:[{"word":"汽車","tag":"產品修飾詞"},{"word":"腳墊","tag":"產品修飾詞"},{"word":"刷子","tag":"產品詞"}]

實體識別外掛主要用於識別出搜尋內容中的產品詞。比如使用者在輸入“汽車腳墊刷子”時,如果沒有做產品詞識別,“腳墊”相關的商品會因為商品分高而排在“刷子”商品前面,影響使用者搜尋體驗。

反之,經過命名實體識別,對“刷子”做產品詞提權,刷子類商品就可以排在腳墊類商品前面,優化搜尋體驗。

目前有贊規劃的實體類別列表如下所示:

產品詞 eg:“修身連衣裙”中的“連衣裙”
產品修飾詞 eg:“汽車腳墊”中的“汽車”
普通詞
新詞
修飾
品牌
機構實體
地點地域
材質
人名
功能功效
專有名詞
影視名稱
型號
文娛書文曲
系列
遊戲名稱
款式元素
顏色
場景
風格
營銷服務
人群
時間季節
性別
類目
母嬰
規格
新品
字首
字尾
數字
符號

實體識別方法

基於正則可以識別數字、符號、規格、時間季節。

// 數字
private numWordRegex = "[0-9]+";  
// 符號
private String symbolWordRegex = "[\\[\\]\\{\\}【】「」\\\\\\|、|‘'\"“”’;:;:>.。》/?\\?<《,,~`·!\\!@#\\$¥%\\^…&\\*(\\(\\))\\-_—=\\+\\s]+";  
// 規格
private String unitRegex = "(?:\\d+|\\d+\\.\\d+|[一二三四五六七八九十百千萬]+)\\s*(?:m|米|cm|釐米|ml|毫升|l|升|度|平米|件|塊|元|片|張|本|條|瓶|部|輛|個|桶|包|盒|g|克|kg|千克|噸|寸|斤)";  
// 時間季節
private String seasonRegex = "[春夏秋冬]+[季天]?";  
private String yearRegex = "(?:18|19|20)\\d{2}";

基於詞庫可以識別產品詞、品牌、產品修飾詞。

品牌:query->二級類目->品牌,條件:在當前類目品牌詞庫裡且模型預測不是“產品詞”,此時打“品牌”實體標。    
產品詞:在產品詞庫且模型預測是普通詞。   
產品修飾詞:多個詞出現時,除最後一個,其餘打“產品修飾詞”實體標。

基於模型可以識別剩餘23類實體,類別如下所示:

產品詞
普通詞
新詞
修飾
品牌
機構實體
地點地域
材質
人名
功能功效
專有名詞
影視名稱
型號
文娛書文曲
系列
遊戲名稱
款式元素
顏色
場景
風格
營銷服務
人群
時間季節

模型結構:

5.6 類目預測categoryPredict外掛

樣例

輸入:牛奶絨
輸出: {
        "categoryId": "101000010001",
        "categoryName": "被套",
        "categoryChainList": [
            "家居建材",
            "床上用品",
            "被套"
        ],
        "parentCategoryId": "10100001",
        "level": 3,
        "hasChildren": true,
        "percent": 0.9010684490203857
    }

該外掛會根據使用者的搜尋內容輸出類目結果,主要應用在類目加權上。

例如當用戶在有贊精選上輸入牛奶絨,期望返回牛奶絨床單。

未使用類目加權,返回的商品大多為牛奶相關產品,不符合使用者的搜尋期望。

使用類目加權後,將床上用品類產品提權,返回的商品牛奶絨床單,符合使用者期望。

類目預測模型是在對比學習基礎上實現,具體內容可看對比學習在有讚的應用

5.7 同近義詞外掛

樣例

輸入:[襯衣]
輸出:[襯衫]

同近義詞外掛目前非常實現輕量,通過離線同義詞表,搜尋內容中的產品詞作為輸入,輸出同義詞。

六、總結與展望

本文從QP整體設計,分層設計,外掛設計較為完整的介紹了QP的架構設計。目前經過一年多的迭代,QP已經實現業務場景小時級接入,優化了零售,微商城,精選,愛逛,分銷等場景搜尋效果。後續將會繼續豐富演算法外掛能力同時完成QP視覺化配置能力方便業務自主接入。

本文由吳鑫強,任豔萍負責收集整理。

歡迎關注我們的公眾號