當人們談論電子商務的規模化時,他們關注的是重大工程挑戰:分散式搜尋、即時庫存、推薦引擎和結帳最佳化。但在這一切之下,存在著一個更安靜、更持久的問題,幾乎每個零售商都在為之掙扎:屬性值。
屬性是產品發現的骨幹。它們驅動篩選器、比較、搜尋排名和推薦邏輯。但在實際目錄中,屬性值很少是乾淨的。它們不一致、重複、格式錯誤或語義模糊。
以簡單的尺寸為例。你可能會看到:
Code
["XL", "Small", "12cm", "Large", "M", "S"]
或顏色:
Code
["RAL 3020", "Crimson", "Red", "Dark Red"]
單獨來看,這些不一致似乎無害。但將它們乘以超過300萬個SKU,每個SKU都有數十個屬性,問題就變得系統性了。篩選器行為變得不可預測,搜尋引擎失去相關性,商品管理人員淹沒在手動清理工作中,產品發現對客戶來說變得更慢、更令人沮喪。
這就是我作為Zoro的全端軟體工程師所面臨的挑戰,一個容易被忽視但影響每個產品頁面的問題。
我不想要一個神秘的黑盒子AI來簡單地分類事物。這樣的系統難以信任、除錯或擴展。相反,我的目標是建立一個具有以下特點的流程:
結果是一個混合AI流程,它將LLM的情境推理與清晰的規則和商品管理人員控制相結合。它在需要時表現得很聰明,但始終保持可預測性。這是有護欄的AI,而不是失控的AI。
所有屬性處理都在離線背景作業中進行,而不是即時進行。這不是妥協;這是一個策略性的架構選擇。
即時流程聽起來很吸引人,但在電子商務規模下,它們會帶來:
另一方面,離線作業為我們帶來了:
在處理數百萬個SKU時,將面向客戶的系統與資料處理流程分開是至關重要的。
在對資料使用AI之前,我執行了一個清晰的預處理步驟來消除雜訊和混亂。這一步驟聽起來很簡單,但它大大改善了LLM的推理能力。
清理流程包括:
這確保了LLM接收到乾淨、清晰的輸入,這是獲得一致結果的關鍵。垃圾進,垃圾出。在這種規模下,即使是小錯誤也可能導致更大的問題。
LLM不僅僅是按字母順序排序值。它在對它們進行推理。
該服務接收:
有了這個情境,模型可以理解:
模型返回:
這使流程可以處理不同的屬性類型,而無需為每個類別硬編碼規則。
並非每個屬性都需要AI。
事實上,許多屬性由確定性邏輯處理會更好。
數字範圍、基於單位的值和簡單集合通常受益於:
流程自動檢測這些情況並對它們使用確定性邏輯。這使系統保持高效並避免了不必要的LLM調用。
商品管理人員仍然需要控制權,特別是對於業務敏感的屬性。
因此每個類別可以被標記為:
這種雙標記系統讓人們做出最終決定,而AI完成大部分工作。它還建立了信任,因為商品管理人員可以在需要時覆蓋模型而不破壞流程。
所有結果直接儲存在Product MongoDB資料庫中,保持架構簡單和集中。
MongoDB成為以下內容的單一操作儲存:
這使得審查更改、覆蓋值、重新處理類別和與其他系統同步變得容易。
排序後,值流入:
這確保了:
搜尋是屬性排序最明顯的地方,也是一致性最重要的地方。
為了使這在數百萬個SKU中運作,我設計了一個圍繞背景作業、AI推理和搜尋整合建立的模組化流程。下面的架構圖捕捉了完整的流程:
此流程確保每個屬性值,無論是由AI排序還是手動設定,都反映在搜尋、商品銷售和客戶體驗中。
以下是混亂值如何被轉換的:
| Attribute | Raw Values | Ordered Output | |----|----|----| | Size | XL, Small, 12cm, Large, M, S | Small, M, Large, XL, 12cm | | Color | RAL 3020, Crimson, Red, Dark Red | Red, Dark Red, Crimson, Red (RAL 3020) | | Material | Steel, Carbon Steel, Stainless, Stainless Steel | Steel, Stainless Steel, Carbon Steel | | Numeric | 5cm, 12cm, 2cm, 20cm | 2cm, 5cm, 12cm, 20cm |
這些範例展示了流程如何將情境推理與清晰規則相結合,以創建乾淨、易於理解的序列。
即時處理會帶來:
離線作業為我們帶來:
權衡是資料擷取和顯示之間的小延遲,但好處是規模上的一致性,這是客戶更看重的。
結果是顯著的:
這不僅僅是技術上的勝利;它也是使用者體驗和收入的勝利。
排序屬性值聽起來很簡單,但當你必須為數百萬個產品執行時,它就成為一個真正的挑戰。
通過將LLM智慧與清晰規則和商品管理人員控制相結合,我將一個複雜、隱藏的問題轉化為一個乾淨、可擴展的系統。
這提醒我們,一些最大的勝利來自解決無聊的問題,那些容易被忽視但出現在每個產品頁面上的問題。
\n \n \n


