“車貨匹配”平臺(tái)-搜索排序系統(tǒng)的工程設(shè)計(jì)與思考(1)

前言

有句話說(shuō)的好:“如果能把問(wèn)題寫清楚,那么問(wèn)題就解決了一半”。這里先對(duì)車貨匹配業(yè)務(wù)的系統(tǒng)工程與架構(gòu)中的問(wèn)題做一些小結(jié),之后再寫一些技術(shù)實(shí)現(xiàn)上的內(nèi)容。

有關(guān)業(yè)務(wù)模式的‘小白型’介紹,在這兩篇文章《車貨匹配業(yè)務(wù)模式》里 :)

背景

工程架構(gòu)的設(shè)計(jì)還是需要圍繞業(yè)務(wù)需求及目標(biāo)來(lái)建設(shè),并隨著業(yè)務(wù)發(fā)展不斷演進(jìn)。

產(chǎn)品角度,車貨匹配從產(chǎn)品形態(tài)上大體上有三類(但本質(zhì)上,最重要的那幾步 - 查詢分析、召回與排序):

? ? ?-? 貨源列表主動(dòng)搜索 - 司機(jī)主動(dòng)通過(guò)選擇出發(fā)地、到達(dá)地、車長(zhǎng)、車型、運(yùn)輸距離等條件進(jìn)行匹配篩選、服務(wù)端返回貨源列表。而列表也會(huì)根據(jù)搜索的條件類別與返回的貨源結(jié)果集大小(比如,不滿足一頁(yè)大小時(shí),補(bǔ)充其他類別的貨源)合并其他列表,如’周邊’貨源(比如,出發(fā)地條件選擇的如果是’區(qū)’,而’區(qū)’出發(fā)的貨源列表大小不足一頁(yè)時(shí),則選擇同城其他區(qū)的貨源),’相似’貨源等等

? ? - 司機(jī)被動(dòng)觸發(fā)系統(tǒng)搜索匹配推送 - 司機(jī)可以選擇自己經(jīng)常跑的幾個(gè)路線作為’訂閱路線’(一般是城市間)。添加’訂閱’后,如果在訂閱的路線上,有新發(fā)布的貨源消息,系統(tǒng)匹配司機(jī)的訂閱路線進(jìn)行推送。除此之外,系統(tǒng)會(huì)根據(jù)司機(jī)的歷史行為進(jìn)行’偏好’計(jì)算作為匹配條件并推送貨源

? ? - 詳情推薦 - 司機(jī)點(diǎn)擊某一個(gè)貨源進(jìn)入詳情時(shí),系統(tǒng)根據(jù)當(dāng)前點(diǎn)擊貨源的出發(fā)地、到達(dá)地等條件進(jìn)行與當(dāng)前貨源相似的貨源進(jìn)行匹配推薦

而從運(yùn)營(yíng)角度,對(duì)于車貨匹配來(lái)說(shuō),更多的是需要提供搜索結(jié)果集上的運(yùn)營(yíng)配置能力。 比如,針對(duì)某類貨主發(fā)布的貨源(或特定類別貨源),需要做特定司機(jī)流量的’傾斜’(在司機(jī)搜索和推送的結(jié)果上,進(jìn)行優(yōu)先展示或推送)。那么就需要針對(duì)這些情況,在車貨匹配運(yùn)營(yíng)后臺(tái)設(shè)計(jì)上,進(jìn)行’接口’預(yù)留,即可以提供規(guī)則,讓運(yùn)營(yíng)(或產(chǎn)品)人員對(duì)搜索排序結(jié)果集進(jìn)行干預(yù)配置(當(dāng)然也是在滿足司機(jī)搜索條件的前提下);還有就是需要根據(jù)車貨匹配運(yùn)力供需系統(tǒng)實(shí)時(shí)計(jì)算出的各個(gè)地理區(qū)域內(nèi)的貨源與運(yùn)力供需情況,基于預(yù)定義的規(guī)則或’供需調(diào)度’提權(quán)模型,來(lái)動(dòng)態(tài)調(diào)整貨源的召回權(quán)重,以達(dá)到供需調(diào)節(jié)的目的。

從用戶角度,在App上一個(gè)司機(jī)進(jìn)行貨源列表搜索時(shí),往往滿足其搜索條件的貨源會(huì)很多,一般幾千條,甚至上萬(wàn)條。那么,就需要對(duì)這些貨源進(jìn)行排序,并將最有可能匹配司機(jī)真實(shí)需求(偏好)且最有可能成交的貨源排在前面;而對(duì)貨主而言,他期望的是在貨源發(fā)布后,平臺(tái)能夠幫助在最短時(shí)間內(nèi)幫助他調(diào)到最’靠譜’的司機(jī)來(lái)承運(yùn),那么司機(jī)那么多,該給誰(shuí)派單與推送。 上述召回與排序的過(guò)程,都需要算法模型或者機(jī)器學(xué)習(xí)模型的能力(搜索排序中,更多是排序?qū)W習(xí)模型,基于多維特征來(lái)計(jì)算相關(guān)度),即在工程實(shí)現(xiàn)上,需要將算法模型嵌入進(jìn)去,并提供灰度與實(shí)驗(yàn)分組能力,以實(shí)現(xiàn)不同模型算法的迭代與驗(yàn)證。同時(shí),不同的搜索排序算法在線上運(yùn)行需要有穩(wěn)定性保障,即最終都要有降級(jí)兜底方案。

問(wèn)題分析

架構(gòu)決策?一、 需要對(duì)’問(wèn)題域’(領(lǐng)域模型)進(jìn)行統(tǒng)一,統(tǒng)一一套搜索與排序平臺(tái)

存在不同的產(chǎn)品形態(tài),其道理是顯而易見(jiàn)的,即抓住’機(jī)會(huì)’使得未被成交/未被反饋的貨源能夠盡快且更多的匹配到?jīng)]有找到貨的司機(jī)。就如同上面背景中所述,貨源的主動(dòng)搜索,本身存在著多種不同的形態(tài),也意味著搜索的邏輯有很多是不同的,條件模式不一、召回過(guò)濾條件不一、排序函數(shù)不一、結(jié)果集返回大小不一,還有推送與推薦等不同的形式。且功能的上線都不是一個(gè)節(jié)點(diǎn),加上時(shí)間緊,那么結(jié)果往往就是不同的邏輯全部混在一起,沒(méi)有區(qū)分沒(méi)有隔離。即使有了隔離(也有可能是由不同的開(kāi)發(fā)同學(xué)實(shí)現(xiàn)的功能,由于代碼不熟或不影響已有服務(wù)邏輯及穩(wěn)定性,索性新起一個(gè)服務(wù)來(lái)實(shí)現(xiàn):)),如果不考慮整體框架的擴(kuò)展以及可維護(hù)性,依然會(huì)使得邏輯越來(lái)越復(fù)雜,甚至功能復(fù)用困難。 因此,需要將搜索排序等邏輯進(jìn)行領(lǐng)域劃分,各個(gè)’算子’(一段功能內(nèi)聚的,只對(duì)應(yīng)一個(gè)輸入數(shù)據(jù)結(jié)構(gòu)和輸出結(jié)構(gòu))的實(shí)現(xiàn)遵循統(tǒng)一接口,可以被框架在一個(gè)搜索、排序請(qǐng)求(抽象成一個(gè)’查詢計(jì)劃’)中分階段進(jìn)行統(tǒng)一調(diào)用。

架構(gòu)決策 二、運(yùn)營(yíng)規(guī)則不斷變化,那么需要的是一個(gè)統(tǒng)一的規(guī)范來(lái)描述和定義,并且可以’關(guān)聯(lián)’到‘查詢計(jì)劃’以及包含的’算子’

運(yùn)營(yíng)規(guī)則通常影響著召回與排序。如召回(包含’粗排’的子過(guò)程)時(shí),針對(duì)某類貨源的強(qiáng)制曝光或者對(duì)貨源(虛假、廣告貨源)的降權(quán),規(guī)則可以直接發(fā)揮作用,即決定‘查詢分析’過(guò)程的查詢條件組成;如排序(包含’精排’的子過(guò)程)時(shí),對(duì)’分組’了的貨源(經(jīng)過(guò)粗排后,貨源被打上’標(biāo)簽’,分成不同的組),根據(jù)排序規(guī)則的優(yōu)先級(jí),進(jìn)行重排序 (舉例來(lái)說(shuō),對(duì)于列表中的第1 ~ 3位置,如果召回的’分組’中,有A類貨源且貨源列表Size大于等于3,則優(yōu)先取A類貨源其次取B類貨源,如果取B類貨源時(shí),按50%概率來(lái)?。瑳Q定’列表的最終組成’;而一個(gè)規(guī)則的組成除了上述兩個(gè)部分,還與應(yīng)用場(chǎng)景、某類用戶、某條路線相關(guān),即不同的場(chǎng)景、用戶、路線可以決定不同的規(guī)則配置。那么,這種情況下如何保障規(guī)則的可配置性、動(dòng)態(tài)性(實(shí)時(shí)生效)這對(duì)于工程架構(gòu)提出了比較大的挑戰(zhàn)。因此,一個(gè)比較可行的辦法,就是將’規(guī)則’模型與’查詢計(jì)劃’模型進(jìn)行’關(guān)聯(lián)’。

架構(gòu)決策 三、搜索排序平臺(tái)中的’算子’在功能實(shí)現(xiàn)時(shí)需要考慮通用性,同時(shí)平臺(tái)框架也需要支持按具體場(chǎng)景進(jìn)行特定化編程實(shí)現(xiàn)的能力 - 即可以寫’Glue codes’將通用算子和特定算子連接起來(lái)

為了能’更好’的對(duì)結(jié)果集list 進(jìn)行排序,引入’Learning To Rank’ 模型(即,對(duì)召回結(jié)果集Item list與Query Features進(jìn)行相關(guān)度打分)并構(gòu)建特征庫(kù)(UserModel等)是一個(gè)比較重要的途徑(這一般發(fā)生在當(dāng)用戶的Query 條件比較模糊 - 如到達(dá)地為一個(gè)’省’,或者’車長(zhǎng)’、’車型’為不限的情況下,召回結(jié)果集結(jié)合更多的Feature來(lái)計(jì)算相關(guān)度得分。題外話:Feature的選擇對(duì)于LTR是一個(gè)比較重要的步驟)。而這個(gè)模型需要在貨源列表搜索和詳情推薦等不同的場(chǎng)景下用到。不同的場(chǎng)景下,搜索策略卻又不同、Query條件類別不同、運(yùn)營(yíng)規(guī)則也不同,因此平臺(tái)需要提供框架將特定實(shí)現(xiàn)的’算子’和通用’算子’整合,即’查詢計(jì)劃’(SearchPlan)?!樵冇?jì)劃’的作用更像一個(gè)’算子’執(zhí)行預(yù)編排好的’指令',不同的’查詢計(jì)劃’可以按用戶、查詢條件、場(chǎng)景來(lái)細(xì)分。

架構(gòu)決策 四、搜索排序平臺(tái)不能成為一個(gè)單體應(yīng)用,不同場(chǎng)景下雖然需要遵循統(tǒng)一框架,但物理部署與邏輯上需要考慮熔斷、降級(jí)兜底等穩(wěn)定性保障相關(guān)策略

不同的產(chǎn)品形態(tài)決定了不同的流量特征與并發(fā)量。無(wú)論是’貨源列表主動(dòng)搜索’還是’司機(jī)被動(dòng)觸發(fā)系統(tǒng)搜索匹配推送’,本質(zhì)上雖然都是這一個(gè)’查詢分析->召回(含粗排)->打分精排 ->合并與重排序 ->截?cái)?->緩存’的過(guò)程,但執(zhí)行的過(guò)程還是需要考慮穩(wěn)定性影響。一個(gè)新的策略或算法上線,是一個(gè)不斷調(diào)整參數(shù)與實(shí)驗(yàn)灰度的過(guò)程。因此,對(duì)平臺(tái)的需求是可以將核心框架剝離并獨(dú)立部署到其他服務(wù),同時(shí)平臺(tái)在上層接口調(diào)用處基于超時(shí)時(shí)間設(shè)置、錯(cuò)誤率等做’查詢計(jì)劃’的降級(jí)、兜底(一般是替換另外一個(gè)’查詢計(jì)劃’,或者’查詢計(jì)劃’內(nèi)部做容錯(cuò)處理)。再說(shuō)說(shuō)影響平臺(tái)性能的幾個(gè)重要因素(暫不說(shuō)由于代碼質(zhì)量引起的問(wèn)題 ??)。正如上面提到的搜索與排序過(guò)程,需要對(duì)大量Item 進(jìn)行相關(guān)度計(jì)算,距離計(jì)算,偏好度計(jì)算。因此,這里有幾個(gè)原則:

? ? ? - 盡量通過(guò)條件過(guò)濾,縮小待召回候選集(并利用到搜索引擎的緩存)

? ? ? - 將一部分相關(guān)度(基于少量關(guān)鍵特征)打分過(guò)程,盡量放在召回粗排階段

? ? ? - 如有需要距離計(jì)算并過(guò)濾的場(chǎng)景,盡量先計(jì)算出地理索引值,然后寫入搜索引擎。搜索時(shí),可以根據(jù)地理索引值,快速計(jì)算出周邊的索引,然后按Term過(guò)濾

后記

最近看的了另外一個(gè)文章,覺(jué)得不錯(cuò)也分享在這兒 -?教你用認(rèn)知和人性來(lái)做最棒的程序員

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容