Research Task · RT-T4 · 2025.02
🪜 LTR 피드백 학습 구현
TMS AI 라우팅 엔진 · Learning-to-Rank + Preference Calibrator · 김지훈 수석연구원 · 연구노트 4p 대응
🎯 Learning-to-Rank (LTR) 개요분류 손실 + 순위 손실 결합
배차 담당자가 AI 추천을 수정할 때마다 "사람이 선택한 ShipTo i > 선택 안 한 j" 쌍(pair)을 생성하여 LightGBM Ranker(LambdaRank)로 학습한다. 기존의 단순 분류 손실 위에 순위 손실(pairwise loss)을 결합하면 후보 간 상대적 선호도를 직접 학습할 수 있어 Recall@K가 유의미하게 향상된다.
이는 단순히 score_hat 점수만 맞추는 것보다 "담당자가 i를 j보다 선호했다"라는 상대 비교 신호가 배차 문제의 본질에 더 가깝기 때문이다.
🔗 Pair 생성 파이프라인
STEP 1
담당자 수정
배차 담당자가 AI 추천 상위 K개 중 다른 ShipTo를 최종 선택하여 수정한다.
STEP 2
chosen / rejected 식별
담당자 선택 = chosen, 나머지 후보 = rejected로 라벨링한다.
STEP 3
pair 데이터 생성
chosen > rejected 쌍을 생성하여 (x_i, x_j, label=1) 형태로 누적한다.
STEP 4
LightGBM Ranker 학습
LambdaRank objective로 route_group 단위 순위 학습을 수행한다.
🐍 학습 파이프라인 (Python pseudocode)
# 페어 데이터 생성 for chosen, rejected in dispatcher_corrections: pairs.append( (chosen_features, rejected_features, label=1) ) model = lgb.LGBMRanker( objective="lambdarank", label_gain=[0, 1, 2], n_estimators=500, learning_rate=0.03 ) model.fit(X_train, y_rank, group=route_groups, eval_set=[(X_val, y_val)], eval_group=[val_groups])
📐 Preference Calibrator (보정 레이어)담당자별 선호 패턴 빠른 적응
scorefinal = sigmoid(w₀·score_base + w₁·gap + w₂·famil + b)
# dispatcher_id 임베딩 추가 시 개인화 가능
w₀ LTR에서 출력한
score_base의 가중치 — 기본 점수 반영 강도w₁ 1위-2위 점수 차
gap — 확신이 클수록 보정 강화w₂ 담당자-ShipTo 친숙도
famil — 과거 배차 이력 반영b bias — 담당자별 기본 편향치
기존 score_base 위에 경량 Sigmoid 선형 보정기를 추가하여, 전체 모델을 재학습하지 않고도 담당자별 선호 패턴을 빠르게 적응시킬 수 있다. 추후 dispatcher_id 임베딩을 더하면 개인화까지 확장 가능하다.
참고문헌
[1] closeloop.com, "AI in Transportation and Logistics: 2025 Trends" (2025.11)
[2] Supply Chain Dive, "Logistics management is leveling up with generative AI" (2025.08)
[1] closeloop.com, "AI in Transportation and Logistics: 2025 Trends" (2025.11)
[2] Supply Chain Dive, "Logistics management is leveling up with generative AI" (2025.08)