
搜索重排Re-ranking這幾年在搜索、推薦和廣告系統(tǒng)里是性價比極高但最容易被低估的一個環(huán)節(jié)。很多團隊把精力全押在召回和粗排上覺得重排無非是“再把順序調(diào)一調(diào)”但真正落地做過一輪就會發(fā)現(xiàn)一次合理的重排改造往往能帶來好幾個百分點的業(yè)務指標提升而且不需要重訓底層模型。我從傳統(tǒng)的LTRLearning to Rank學習排序講起一路聊到如今主流的深度交叉模型結(jié)合真實工程里的踩坑經(jīng)驗把重排這條鏈路從頭到尾拆開來講。不管你是在做搜索相關(guān)度優(yōu)化還是做推薦流體驗治理這篇文章都適合你既講清楚“為什么需要重排”也給出“到底怎么落地”的具體方案。1. 先看清重排在檢索鏈路里的位置1.1 從召回、粗排、精排到重排的漏斗搜索和推薦系統(tǒng)通常是一個多級漏斗。以搜索為例第一層是召回從幾千萬或上億的文檔集合里快速篩出幾百上千條候選第二層是粗排用輕量模型把候選剪枝到幾百條第三層是精排用復雜模型對每條候選做精細打分產(chǎn)出50到200條左右的結(jié)果最后一層才是重排。重排器的輸入是精排的輸出列表輸出是最終展示給用戶的順序。它和前幾層最大的區(qū)別在于召回、粗排、精排本質(zhì)上是“對單個Item打分”Pointwise思路而重排的核心訴求是“對整條列表做優(yōu)化”。舉個最直觀的例子精排模型認為某品牌A的10個商品相關(guān)度都極高各自分數(shù)也很高如果按精排分直接展示用戶看到的是清一色同一品牌不僅視覺疲勞還容易讓用戶覺得搜索結(jié)果被某個商家“包場”了。重排要解決的就是這類單點最優(yōu)不等于序列最優(yōu)的問題。我做過的模擬項目X里最初重排規(guī)則只有一條把運營配置的置頂內(nèi)容插到最前面其他按精排分輸出。后來加入多樣性打散和商業(yè)約束之后線上點擊率提升了5%左右但真正讓我意識到重排價值的是搜索無結(jié)果率下降了不少——這說明重排不是簡單“調(diào)順序”它直接影響用戶對搜索結(jié)果整體的滿意度。1.2 重排要同時扛起相關(guān)性、多樣性和業(yè)務目標如果你只把重排當成“精排分的微調(diào)”那你很快會在線上吃大虧。重排要承接的目標至少有三類而且它們之間經(jīng)?;ハ啻蚣?。第一類是相關(guān)性。重排不能把精排認為“毫不相關(guān)”的結(jié)果提到前面否則用戶點一下發(fā)現(xiàn)不對立馬流失。第二類是列表多樣性。無論是搜索、推薦還是廣告同質(zhì)化內(nèi)容都會讓用戶體驗快速下滑多樣性是為了保底體驗。第三類是業(yè)務目標。搜索里有商業(yè)流量占比要求推薦流里有完播率、停留時長、關(guān)注轉(zhuǎn)化等約束廣告系統(tǒng)里還有競價排名和預算分配邏輯。這三類目標的沖突點非常典型比如一個電商搜索品牌詞用戶意圖非常明確如果把不同品牌混進來“提升多樣性”相關(guān)度反而崩了反過來在泛詞搜索下如果一味追求相關(guān)度結(jié)果可能全是同一個店鋪的商品。重排模型或規(guī)則必須具備感知上下文的能力而不能只看單條Item的分數(shù)。這也是為什么重排從機器學習時代開始就和精排有非常不一樣的特征設計思維。1.3 重排和前級排序的本質(zhì)差異我給不少團隊做技術(shù)支持時經(jīng)常被問到精排模型已經(jīng)很復雜了Transformer、DeepFM都上了為什么還要單獨做重排答案在于“輸入輸出的口徑不同”。精排模型面對的是“Query-Item”二元組它看到的特征全部來自這條Item和查詢之間的關(guān)系以及這條Item自身的統(tǒng)計量。它看不到這條Item的“鄰居”是誰。哪怕你在精排模型里加入一些session維度的統(tǒng)計特征它依然只能從統(tǒng)計意義上間接感知上下文無法精確地對“A放第一、B放第二、C放第三”這樣的排列組合做整體評估。重排模型站在精排肩膀上輸入是已經(jīng)“精排過”的候選列表它的任務是做最終決策哪些Item該保留哪些Item該降權(quán)哪些Item該互換位置。說白了精排回答的是“這條結(jié)果值不值得展示”重排回答的是“這組結(jié)果以什么順序展示效果最好”。這兩個問題口徑完全不同所以不是同一個模型能一并解決的。在工程實現(xiàn)上重排最大的優(yōu)勢是數(shù)據(jù)量小、候選量少可以做更復雜的計算。精排在毫秒級要對幾百上千條Item打分重排只需要對50到200條候選進行排列優(yōu)化所以哪怕是深度交叉模型在重排階段也能扛得住性能壓力。這也是重排敢于上“交叉”架構(gòu)的底氣。2. 特征怎么喂重排模型和前級模型在原料上的分水嶺2.1 三類核心特征Query側(cè)、Item側(cè)、上下文側(cè)任何排序模型都離不開特征但重排的特征體系有自己的特點。我習慣把重排特征分成三組。第一組是Query側(cè)特征包括查詢詞本身的長度、類目、意圖類型、改寫結(jié)果、聯(lián)想詞等。它描述的是“用戶這次到底想找什么”。第二組是Item側(cè)特征包括精排模型輸出的相關(guān)性分數(shù)、點擊率預估值、歷史CTR/CVR、價格、時效性、品牌、店鋪等級、內(nèi)容類型等。這里最關(guān)鍵的是“精排分”因為重排是基于精排候選集做文章精排分相當于前級模型給每個Item的“簡歷”。第三組是上下文特征這是重排和精排最不一樣的地方。上下文特征包括當前Item在候選列表中的原始位置、當前Item和列表中其他Item的相似度、當前列表本身已經(jīng)展示過的類目分布、用戶在當前session里已經(jīng)點擊過哪些類型的內(nèi)容、用戶所處的頁面位置首屏/二屏等。上下文特征解決的核心問題是“位置偏差”和“列表內(nèi)互相影響”。我舉個例子你就懂了。同一件商品在搜索結(jié)果第3位和第30位被點擊的概率差異極大這不是商品本身質(zhì)量變了而是位置帶來的注意力偏差。如果重排模型不感知位置信息它學出來的分數(shù)會嚴重偏向那些“原本排在前面的Item”導致排序固化。你必須在特征里顯式告訴模型這個Item當前在第幾位。2.2 位置偏差要不要進特征這是個好問題關(guān)于位置特征業(yè)內(nèi)其實有兩種做法。第一種是直接把當前位置作為特征喂給模型讓模型自己去學位置影響但上線時要小心線上推理時刻的位置特征必須用當前候選的位置并且要配合訓練樣本的采樣或加權(quán)策略否則模型會把位置當成品類信號。第二種做法是用“無偏學習”的思路比如在訓練時對位置特征做隨機化處理或者使用Click模型消除偏差。我在實際項目里更推薦混合方案離線訓練時把位置特征保留但結(jié)合“Shuffle抽樣”讓模型不要過度依賴位置線上推斷時先按概率采樣一組候選順序再用模型打分迭代多次選最優(yōu)排列。這樣既保留了位置信息又沒有把位置當成絕對真理。這里有一個新手很容易踩的大坑特征穿越。訓練數(shù)據(jù)里如果用了“用戶點擊了該Item之后的行為特征”來預測這次點擊那離線指標會好看到爆表線上直接崩盤。重排特征設計時必須嚴格區(qū)分“決策前可得信息”和“決策后才發(fā)生的信息”凡是用到用戶當前行為序列特征的一定要問一句模型做排序決策時這個信息真的已經(jīng)存在了嗎2.3 特征歸一化與工程化重排模型的常用特征動輒幾十上百個歸一化和缺失值處理比精排更講究。原因在于重排要做的是“對比排序”模型感知的是特征之間的相對差異。比如價格這個特征有些類目均價幾十元有些類目幾千元如果你不做類目內(nèi)歸一化模型會被絕對數(shù)值帶偏。我常用的方案是對于連續(xù)特征先做分位歸一化或log變換再按類目做標準化對于類目特征做Target Encoding或Embedding對于精排分這類“模型輸出特征”不要直接裸用因為不同版本精排模型的分數(shù)分布可能變化很大最好對精排分做ranking歸一化比如在候選集內(nèi)轉(zhuǎn)為百分位。特征存儲上重排在工程上通常會有專門的“特征快照”——精排模型輸出的候選列表以及每個Item的分數(shù)一起傳給重排服務重排特征計算服務必須在毫秒級內(nèi)完成幾十個特征的拼接。這塊如果做得不好重排環(huán)節(jié)會成為整個鏈路的性能瓶頸。3. 模型能力演進從LTR到深度交叉模型的路線圖3.1 LTR的三大范式Pointwise、Pairwise、Listwise重排模型最早期的形態(tài)就是LTR。LTRLearning to Rank是一類“用機器學習方式學習排序”的方法統(tǒng)稱它有三個經(jīng)典范式。Pointwise把排序問題看成回歸或分類問題對每個Item單獨預測絕對分數(shù)比如“該Item是否會被點擊”。它簡單、訓練快但缺陷很明顯它不關(guān)心Item之間的相對順序訓練目標和排序評價指標NDCG、MRR不一致。Pairwise把問題轉(zhuǎn)化為“二元組誰更靠前”的分類問題。典型代表是RankNet和RankSVM。訓練時構(gòu)造左右配對樣本比如“用戶點擊過的Item應該排在未點擊的Item前面”。Pairwise比Pointwise更接近排序本身但它只關(guān)心二元組的相對順序不考慮列表整體位置的影響。Listwise直接對整條列表建模目標是讓模型輸出的排序和真實排序在列表級別盡量一致。ListMLE、SoftRank、LambdaRank都屬于這個方向。Listwise的訓練復雜度更高但評價口徑和線上排序最貼合因此在實際重排場景里用得最多。這里要特別提一下LambdaRank/LambdaMART。LambdaRank的思路非常巧妙它不直接定義一個可導的損失函數(shù)而是給每個樣本計算一個“Lambda梯度”這個梯度表示“如果把當前Item往前移動一位NDCG指標會提升多少”。梯度方向和大小直接對應排序指標的變化所以LambdaRank在優(yōu)化NDCG這類指標時效果遠超普通Pointwise回歸。LambdaMART則是把LambdaRank的梯度用于GBDT訓練用多棵樹的加法模型學出排序函數(shù)。在深度學習沒普及的年代LambdaMART幾乎是搜索排序的標配即便到今天它依然是業(yè)內(nèi)評價一個重排基線模型的強有力對照。3.2 深度模型如何逐步“交叉”起來LTR時代的特征交叉基本靠手工和樹模型自動分裂來隱式完成。GBDT能自動找特征之間的非線性關(guān)系但它無法主動做稠密的高階特征組合。深度學習來了之后重排模型的能力邊界被大幅推開。第一波深度排序模型是“雙塔結(jié)構(gòu)”代表作有DSSM和后續(xù)的各種雙塔變體。雙塔把Query和Item分別編碼成向量最后用內(nèi)積算相似度。雙塔對并行化友好、在線推理快但它本質(zhì)上還是Pointwise打分沒有做真正的列表級交叉。第二波是精排側(cè)先火起來的“特征交叉模型”比如DeepFM、DCN、xDeepFM等。這些模型把稀疏ID特征和連續(xù)特征統(tǒng)一做Embedding再通過FM層、Cross層和Deep層完成二階甚至高階特征交互。它們解決的是“單個Item維度上的特征交叉”依然不是列表內(nèi)的Item間交互。重排真正進入“交叉模型”時代是從把候選列表看作一個序列/集合開始的。早期有團隊用Bi-LSTM或Self-Attention對候選序列建模后來Transformer架構(gòu)全面接管。這類模型的基本思路是把精排TopN候選的每條Item特征序列作為輸入經(jīng)過多層Self-Attention讓Item之間互相“看到”對方的信息最后輸出每條Item的新分數(shù)或直接輸出排列順序。我把這條演進路線抽象一下從“逐點打分”到“兩兩比較”再到“整體序列建模”。每次躍遷都是在回答一個問題模型到底能看到多大的上下文窗口Pointwise只能看到Item自己Pairwise能看到一對ItemListwise能看到整條列表。深度學習交叉模型的價值就在于此——它讓Item之間的關(guān)系從“手工特征描述”變成“網(wǎng)絡自動交互”。3.3 重排模型的現(xiàn)實選型我知道看到這里很多人會問是不是一定要上Transformer重排才算合格答案取決于業(yè)務量級和算力。如果你的候選集在幾十條級別、線上耗時預算在20毫秒以內(nèi)那么一個LambdaMART模型加上簡單的MMR多樣性打散已經(jīng)能覆蓋大部分需求。它的優(yōu)點是訓練快、易解釋、穩(wěn)定非常適合中小團隊快速迭代。如果你的候選集在百條以上、流量規(guī)模又足夠支撐深度模型訓練和在線推理那么可以考慮“雙階段重排”第一階段用輕量級深度模型比如一個小型DNN對候選做粗篩把200條壓到50條第二階段用Transformer交叉模型對50條做最終排列。這種方案兼顧了效果和性能也是目前業(yè)內(nèi)主流做法。還有一個折中方案是“全局特征 Pointwise深度模型”。具體做法是不做真正的序列建模而是把整個候選列表的統(tǒng)計信息比如類目熵、價格方差、前N條的平均精排分、同品牌占比作為全局特征拼接到每條Item的特征向量里再用DNN打分。這個方案好處是工程簡單、推理快缺點是無法精確建模Item之間的兩兩關(guān)系。我自己的經(jīng)驗是如果從來沒做過重排先從這條路徑起步等團隊積累了數(shù)據(jù)管道和評估體系再逐步升級到真正意義上的交叉模型。4. 實操如何從零搭一套重排訓練與推理鏈路4.1 訓練數(shù)據(jù)怎么構(gòu)造日志、標簽和偏差處理重排模型的訓練數(shù)據(jù)可以復用搜索日志但構(gòu)造方式比精排更講究。精排訓練數(shù)據(jù)通常只需要Query, Item, Label三元組重排還需要“列表結(jié)構(gòu)”信息也就是一次搜索請求里哪些Item在同一屏展示過、順序是什么。我建議的訓練樣本格式是一個Session一個樣本同一個會話里曝光的所有Item按展示位置順序排列每條Item帶用戶行為標簽和特征向量。標簽不要只做“點擊/未點擊”二分類更好的做法是分級標簽未點擊、點擊、深度交互如停留時長超閾值、下單/加購/關(guān)注等不同級別對應不同權(quán)重的目標函數(shù)。這樣重排模型學出來的不只是“點擊率最大化”還能兼顧更下游的業(yè)務動作。樣本質(zhì)量上要特別小心三個坑。第一個坑是只拿“有曝光”的樣本訓練會引入選擇性偏差。精排覺得差的Item根本沒機會曝光重排模型也就永遠學不到“這類Item在重排階段輸?shù)袅恕薄=鉀Q辦法是做隨機化探索在線上保留一定比例流量讓重排在精排結(jié)果上做隨機擾動讓低分Item也有機會進入候選。第二個坑是位置偏差前面提過這里再說一次直接用曝光日志訓練會讓模型過度偏向位置靠前的Item應當用Shuffle日志展示前隨機調(diào)換順序或位置特征修正。第三個坑是時間穿越訓練數(shù)據(jù)的時間窗口和特征時間窗口必須嚴格對齊絕不能用“未來信息”預測當前行為。4.2 訓練流程和代碼骨架數(shù)據(jù)切分完成后訓練階段通常分四步特征工程、模型訓練、離線評估、模型導出。這里給一個用LambdaMART作為基線的偽代碼骨架實戰(zhàn)里很多人就是從這個起點起步的。import lightgbm as lgb # train_data: 每個session是一個groupfolds按時間切分 train_lgb lgb.Dataset( X_train, labely_train, groupgroup_train, # 同一個session的所有候選為同一組 feature_namefeature_names ) valid_lgb lgb.Dataset( X_valid, labely_valid, groupgroup_valid, referencetrain_lgb ) params { objective: lambdarank, metric: ndcg, ndcg_eval_at: [1, 5, 10], boosting_type: gbdt, learning_rate: 0.05, num_leaves: 127, min_data_in_leaf: 50, feature_fraction: 0.8, bagging_fraction: 0.8, bagging_freq: 1, verbose: -1 } model lgb.train( params, train_lgb, num_boost_round500, valid_sets[valid_lgb], callbacks[lgb.early_stopping(50), lgb.log_evaluation(10)] ) # 導出結(jié)構(gòu)線上用原生模型加載 model.save_model(rerank_lambdarank.txt)如果你直接拿這份代碼去跑大概率能出一個不錯的基線。但有兩個細節(jié)一定要調(diào)對第一group參數(shù)必須按Session切分否則LightGBM會認為所有樣本屬于同一個列表NCDG計算完全錯亂第二訓練集和驗證集要按時間順序切分不要隨機切分否則會出現(xiàn)驗證集里包含未來樣本離線指標虛高。這兩個問題我在不少新人代碼里都見過報錯不一定有但效果就是上不去。再往前一步如果你打算做深度交叉模型訓練框架推薦用TensorFlow或PyTorch自定義一個“列表級訓練循環(huán)”。數(shù)據(jù)輸入是(Batch, MaxSeqLen, FeatureDim)的矩陣BatchSize通常在32到64之間MaxSeqLen是候選數(shù)例如50或100Padding部分需要Mask掉。損失函數(shù)可以用ListMLE或Softmax交叉熵對模型輸出的每個位置logit計算候選列表的排列概率和真實序做交叉熵。4.3 評估指標不能只看點擊率重排模型評估是個系統(tǒng)工程單看CTR會把你帶偏。我的做法是分層級看。第一層是相關(guān)性指標NDCGK、MRR、RecallK。這些指標和精排共用用來確認重排沒有“破壞”基礎(chǔ)相關(guān)度。第二層是體驗類指標列表多樣性類目熵、品牌熵、內(nèi)容類型熵、同質(zhì)化比例比如前10條中同品牌占比、最大連續(xù)重復類目數(shù)。第三層是業(yè)務指標點擊率、轉(zhuǎn)化率、GMV、人均瀏覽深度、無結(jié)果率等。離線評估時能直接算的是前三類中的相關(guān)性指標和大部分多樣性指標業(yè)務指標只能通過模擬或小流量AB來驗證。我強烈建議任何重排模型上線前都先跑2到4周的“影子模式”就是讓重排模型并行打分但不真正影響線上展示把它的排序結(jié)果和線上真實排序結(jié)果存日志之后離線復盤看模型是不是真的做出了“更好的排列”。影子模式是幾乎所有重排項目都必須經(jīng)歷的環(huán)節(jié)。它不需要你改動線上鏈路風險極低卻能在AB之前暴露大量問題。4.4 在線推理鏈路怎么接重排模塊在在線推理時的上下游關(guān)系一般是上游精排模塊返回TopN候選和對應精排分重排服務拿到后先做特征拼接再調(diào)用模型打分最后經(jīng)后處理規(guī)則輸出最終列表。整個過程預算通常在10到30毫秒內(nèi)。由于候選列表長度有限在線推理不適合逐條請求正確做法是“批量打分”一個請求的所有候選組成一個Batch一次前向計算全部輸出。對LambdaMART來說單條打分本身很快對Transformer交叉模型來說一次性把50條候選編碼成一個序列做一次前向會比分別打分快一個數(shù)量級因為Item之間可以并行計算Attention。后處理規(guī)則是重排鏈路里不可省的一環(huán)。即使模型再強你仍然要保留運營硬規(guī)則置頂內(nèi)容、強插廣告位、品牌限流、類目最低占比、時間衰減加減權(quán)等。模型負責“軟性排序”規(guī)則負責“硬性約束”。在工程架構(gòu)上規(guī)則引擎要放在模型打分之后、結(jié)果輸出之前并且要支持運營實時調(diào)整不然一個活動改規(guī)則都要提工單等發(fā)版運營體驗會非常差。5. 常見問題與排查技巧實錄5.1 線上CTR漲了但GMV卻跌了這是重排項目里出現(xiàn)頻率最高的問題?,F(xiàn)象很典型AB實驗中點擊率提升業(yè)務收入反而下降。第一步排查點是“點擊質(zhì)量”。重排模型如果把更多的曝光給了低價、低毛利、促銷型商品用戶確實更容易點擊但成交金額被拉低了。第二步排查點是“相關(guān)性漂移”。有些模型為了提升多樣性會把高相關(guān)但同質(zhì)的結(jié)果壓下去換上來的是低相關(guān)但不同類型的結(jié)果。用戶點了更感興趣的內(nèi)容CTR漲但沒有產(chǎn)生購買或完播業(yè)務轉(zhuǎn)化降。解決思路是重新校準訓練目標。CTR這類“點擊意圖”要和“成交/完播意圖”分開建?;蚨嗄繕思訖?quán)不要把所有標簽揉成一個Label。在實際項目里我會把“下單”這類強業(yè)務行為的樣本權(quán)重提高到“點擊”樣本的3到5倍并直接以GMV或轉(zhuǎn)化率為業(yè)務護欄指標做上線評估。5.2 離線NDCG高線上表現(xiàn)平平離線評估結(jié)果和線上不一致是排序類模型最常見的老大難。這里頭最容易被忽略的因素是“位置偏差的離線估計偏差”。線上真實曝光位置由當前線上策略決定而離線評估用的是歷史日志的曝光位置兩者很可能不對齊。你用歷史日志評估一個“會改變展示順序”的新模型天然就存在分布偏移。還有一個元兇是“特征一致性斷裂”。離線訓練用的精排分來自某一版精排模型線上推理時精排模型已經(jīng)繼續(xù)迭代了兩邊的精排分口徑對不上。我的解決方案是在特征存儲里同時記錄“訓練時的模型版本”如果精排模型升級重排模型必須同步用新精排分重新生成訓練數(shù)據(jù)并重新訓練。5.3 模型輸出結(jié)果和規(guī)則打起來重排模型經(jīng)常和運營規(guī)則沖突。最常見的是運營要求某條內(nèi)容必須置頂?shù)P驼J為這條Item分數(shù)很低兩者拼接后出現(xiàn)“規(guī)則置頂了、模型特征里卻是低分”的矛盾進一步導致模型在后續(xù)會話里越來越不信置頂位。這類問題的本質(zhì)是規(guī)則和模型目標不一致。我的處理思路是運營硬規(guī)則盡量前置到“候選篩選”而不是全部堆到重排后處理。如果某條內(nèi)容必須置頂那它就不應該出現(xiàn)在重排模型的候選序列里被“打分”而是在重排輸出后強制插入。這樣模型打分和規(guī)則互不污染。5.4 多樣性參數(shù)怎么調(diào)如果你用的排序方案是“模型打分 多樣性后處理”典型是MMR或DPP那繞不開一個話題多樣性強度和相關(guān)性怎么權(quán)衡。MMR公式里的λ表示多樣性權(quán)重Score_final λ * Sim(Query, Item) - (1 - λ) * max(Item 與已選列表的相似度)λ越大越偏相關(guān)λ越小越偏多樣性。我的調(diào)參經(jīng)驗是先從λ0.7起步觀察前10條列表的類目熵和同質(zhì)比例如果類目熵低于預期每次調(diào)0.05往下走同時要按Query類型分組設置不同的λ比如品牌詞用高λ更偏相關(guān)泛詞用低λ更偏多樣性而不是全站一個值。DPP行列式點過程更精細它通過核函數(shù)定義“相關(guān)性懲罰重復項”的聯(lián)合分布。DPP的優(yōu)勢在于能全局最優(yōu)地平衡相關(guān)性和多樣性但核參數(shù)的標定需要做離線網(wǎng)格搜索。在候選量不超過100時DPP的推理耗時通??煽厥潜容^推薦的重排后處理方案。5.5 常見問題速查表現(xiàn)象可能原因排查方法CTR漲但GMV跌點擊質(zhì)量下降、低價商品占比過高分流查看點擊商品的價格帶和毛利結(jié)構(gòu)離線NDCG高但線上無差異位置偏差、特征一致性斷裂影子模式對比線上排序日志重排輸出和置頂規(guī)則沖突規(guī)則與模型目標隔離不足硬規(guī)則前置到候選篩選階段多樣性低了壓不過去λ過低或全局統(tǒng)一λ按Query意圖分組設定λ重排接口耗時超標特征拼接慢、模型前向未批處理候選批量打分特征服務預計算模型學到的全是“跟隨精排”精排分特征過強、上下文特征不足降低精排分權(quán)重增加列表級特征5.6 一個容易被忽略的坑候選集長度變化重排模型在訓練時往往固定候選集長度比如K50但線上由于召回波動或上游降級候選條數(shù)可能偶爾變成30或80。如果模型對序列長度敏感效果就會抖動。對LambdaMART這類模型候選條數(shù)變化影響不大因為它是逐條打分。對Transformer交叉模型就很致命訓練時序列長度統(tǒng)一為50線上來了80條Positional Encoding和Attention計算都會出問題。通用做法是線上做一個“候選截斷分桶”超過K條時按精排分截斷到K條少于K條時Padding到K條保證序列長度與訓練一致。這里我吃過一次虧上線后單位小時出現(xiàn)了幾萬個“長度異?!钡恼埱笈挪榈搅璩坎哦ㄎ坏绞谴峙沤导墝е潞蜻x變長從那以后我在重排服務里加了候選長度的監(jiān)控報警。6. 最后說點實在的我做了幾個重排相關(guān)項目后最大的體會是不要試圖一步到位上最復雜的交叉模型。重排這個環(huán)節(jié)的特殊性在于它的上游有召回、粗排、精排下游有業(yè)務規(guī)則和用戶體驗任何一個環(huán)節(jié)的特征分布變化都會傳導到重排這里。先跑通LambdaMART基線把特征管道、影子評估、AB實驗平臺這三件事做扎實比模型本身值錢得多。當你把基線上線并穩(wěn)定運行幾個版本后再引入深度交叉模型你會發(fā)現(xiàn)很多問題比如特征穿越、時間一致、位置偏差已經(jīng)在管道層面解決掉了模型的迭代效率會高非常多。最后一個實用技巧上線重排模型后第一時間監(jiān)控“重排干預率”——也就是模型實際改動的相對精排順序的比例。干預率過低說明模型在“抄精排作業(yè)”補丁式迭代干預率過高則說明精排和重排的目標可能出現(xiàn)了系統(tǒng)性分歧。找到一個健康的干預率區(qū)間整個搜索鏈路才會處于良性分工的狀態(tài)。