1 為什么要引入 LTR?
常規檢索(BM25、語義檢索、Hybrid、RRF …)往往只能基于少量信號(關鍵詞命中、向量相似度)排序。
Learning-to-Rank 通過機器學習模型把多維度特征(文檔屬性、查詢屬性、查詢-文檔相關特征)融合為一個“最終得分”,在 Top-K 結果里做二階段重排,可顯著提升業務相關性。
經典場景:
場景 | LTR 作用 |
---|---|
電商搜索 | 同時考慮 BM25、銷量、庫存、價格區間、點擊率等特征,綜合排序 |
內容推薦 / 新聞 | 結合閱讀時長、作者權重、文本相似度、用戶畫像特征做重排 |
RAG 檢索 | 首階段召回數百段文本,再用 LTR 精排 20 段注入 LLM,顯著降低幻覺 |
1.1 Judgment List(標注集)
-
內容:<query, doc_id, relevance_label>
-
來源:人工標注 / 點擊轉化日志(加權采樣)
-
平衡性:
- 各查詢類型(標題、演員、品牌…)樣本數要均衡
- 正負樣本比例適當(例如 1:4),防止模型傾向“認為全是相關”
1.2 特征工程
類型 | 示例 | 作用 |
---|---|---|
Document 特征 | 價格、評分、發布時間 | 反映文檔本身屬性 |
Query 特征 | 詞數、是否包含數字 | 反映查詢意圖 |
Query–Doc 特征 | match 分數、向量相似度 | 關聯度核心指標 |
在 ES 中用 templated query 把一段 DSL 轉成特征抽取器,既用于離線生成訓練集,也用于線上推理。
[{"query_extractor": {"feature_name": "title_bm25","query": { "match": { "title": "{{query}}" } }}},{"query_extractor": {"feature_name": "price_norm","query": { "script_score": { "script": "doc['price'].value / 1000" } }}}
]
2 訓練 LTR 模型(LambdaMART)
-
生成訓練 TSV/CSV
relevance qid:123 1:title_bm25 2:price_norm 3:clicks ...
-
XGBoost/LGBM 訓練
- Objective 設為
rank:pairwise
或rank:ndcg
- 評估指標:nDCG@10、MAP 等
- Objective 設為
-
導出模型 (
model.json
)
📦 eland 工具一鍵上傳:
eland_import_hub_model --url $ES --model_id my_ltr --task text_similarity --model_path model.json
3 在 Elasticsearch 中部署 reranker
POST _inference/_deployments
{"inference_id": "my-ltr-reranker","task_type": "text_similarity","model_id" : "my_ltr"
}
4 檢索 + LTR 二階段重排示例
POST /products/_search
{"size": 10, // 最終返回 10 條"retriever": { // Stage-1 召回"rrf": {"retrievers": [{ "standard": { "query": { "match": { "title": "wireless headset" } }, "k": 100 } },{ "standard": { "query": { "semantic": { "field": "semantic_text", "query": "wireless headset" } }, "k": 100 } }]}},"reranker": { // Stage-2 LTR"text_similarity_reranker": {"model_id": "my-ltr-reranker","field": "{{{features}}}", // 模板內包含多特征拼接"max_passages": 10}}
}
- retriever:先用 Hybrid + RRF 召回 100 條文檔
- text_similarity_reranker:調用 cross-encoder LambdaMART 模型重新排序
返回字段 _rank
即為 LTR 排名,_score
為 LTR 預測分。
5 常見問題與優化
癥狀 | 排查 & 建議 |
---|---|
模型上傳失敗 | 確保 task_type 設置為 text_similarity ;XGBoost 轉 eland 時指定正確輸入維度 |
線上 QPS 降低 | rerank 僅對 Top-K 做,K 建議 ≤ 100;可橫向擴容 inference 節點 |
未見提升 | 檢查 judgment list 質量、正負樣本比例;確認特征覆蓋業務邏輯點 |
特征與線上不一致 | 保證離線特征模板與線上 query_extractor 完全相同;可在模板中打印 debug 字段 |
6 小結
- Judgment list → Feature → GBDT 訓練
- eland 上傳模型 → Inference Endpoint
- Retriever 首召回 + LTR rerank 單請求搞定
借助 Elasticsearch 9.x 內置的 text_similarity_reranker,你無需改動索引結構,即可把成熟的 LambdaMART/XGBoost 排序模型接入查詢鏈路,在百毫秒級實時重排 Top-K 結果,輕松獲得更貼近用戶意圖的搜索體驗 🚀