🏠 居家廚房 · 8.3 萬商品
檢查中

資料管線

資料處理流程架構

管線架構

懸停查看詳情

原始資料
來源
資料擷取
ETL
DuckDB 倉儲
儲存
文字處理
NLP
特徵工程
ML
API 服務
API
前端介面
前端
資料層
  • ·DuckDB 單檔倉儲
  • ·9 個正規化資料表
  • ·持久化 BM25 + 向量索引
  • ·查詢記錄分析
ML 層
  • ·all-MiniLM-L6-v2 嵌入
  • ·混合 BM25 + 餘弦搜尋
  • ·規則式情感分析
  • ·熱門度加權重排序
API 層
  • ·/search · /products · /recommendations
  • ·/analytics/overview · /trends
  • ·/evaluation · /health
  • ·非同步 FastAPI + DuckDB

技術棧

DuckDB

嵌入式分析 SQL 引擎。將商品、評論、嵌入與 BM25 索引儲存於單一檔案中。

sentence-transformers

使用 all-MiniLM-L6-v2(384 維)生成語意搜尋的密集向量嵌入。

BM25

關鍵字搜尋的稀疏檢索算法,在混合模式中與向量搜尋互補。

FastAPI

高效能非同步 Python API,自動產生 OpenAPI 文件。提供所有 ML 推論端點。

Next.js 15

採用 App Router、TypeScript 與 Tailwind CSS 的 React 框架。將 /api/* 代理至 FastAPI port 8001。

Recharts

可組合的 React 圖表庫,驅動全站 AreaChart、BarChart 與 LineChart 視覺化。

▼ 資料管道互動旅程
Stage 1

原始資料輸入

Amazon Reviews 2023 · Parquet · 100K 筆
資料來源
📦
amazon_hk_reviews.parquet
100K rows · 38 MB
🗂️
products_meta.parquet
83K products · 12 MB
🖼️
image_embeddings.npy
83K × 512 dims
樣本資料欄位
asinratingtexttimestamp
B07KXZQ3L8⭐⭐⭐⭐⭐Excellent quality...2023-04
B08NP6FMGK⭐⭐⭐Decent but not...2023-06
B09TY3HMDQ⭐⭐⭐⭐Good value for...2023-08
Amazon HK 2023ASIN unique keyUTC timestampsParquet format
Stage 2

資料清理與標準化

normalize_reviews() · SHA256 ID · 情緒標籤
清理前
HTML 標籤殘留
<b>Great</b> product! <br/>
重複評論
ASIN B001 × 3 duplicates
缺失評分
rating: null → 無法使用
無結構化 ID
user_123abc (不穩定)
normalize
清理後
純文字內容
Great product!
去重完成
→ 保留最新評論
情緒標籤
sentiment: positive (0.91)
SHA256 ID
review_id: a3f9b2c1...
🔢
word_count 計算
⌀ 47 詞/評論
🔑
SHA256 去重
消除 2.1% 重複
💡
情緒分類
pos/neg/neu 三類
📊
評分標準化
1-5 → float 保留
Stage 3

資料倉庫入庫

DuckDB · 322 MB · products + reviews 資料表
products0 rows
asin 🔑
title
avg_rating
rating_number
negative_rate
reputation_score
reviews0 rows
review_id 🔑
asin 🔗
user_id
rating
text
sentiment_label
💾
DuckDB · 單檔資料庫
322 MB total
欄位式儲存
聚合查詢極快
🔍
SQL + Python API
雙介面存取
Stage 4

BM25 索引建立

BM25Okapi · 83K 文件 · 7.7 MB 索引
分詞過程
"cast iron skillet"
↓ Tokenizer + TF-IDF 權重
cast
IDF: 8.1
iron
IDF: 6.3
skillet
IDF: 9.8
BM25 公式
score(d,q) = Σ IDF(t) · TF(t,d) · (k₁+1) / (TF + k₁·(1-b+b·|d|/avgdl))
k₁=1.5 · b=0.75 · avgdl=47
倒排索引(部分)
Term文件列表文件數
cast[B0NK7R…, B08XQ…, B07KX…]8,142
iron[B07KX…, B0NK7R…, B09HS…]11,307
skillet[B07KX…, B09HS…, B0NK7R…]4,218
pan[B08NP…, B09TY…, B07KX…]15,634
最高分文件:B07KXZQ3L8
0.842
Stage 5

向量嵌入生成

all-MiniLM-L6-v2 · 384 維 · 餘弦相似度
向量編碼流程
"cast iron skillet 12 inch pan"
🤖 all-MiniLM-L6-v2
↓ 384 維正規化向量
嵌入向量熱圖(前 48 維 / 384 維)
← 負值 (藍)0正值 (紅) →
餘弦相似度結果
Cast Iron Skillet 12"
B07KX · Lodge
0.94
Pre-Seasoned Iron Pan
B09HS · Calphalon
0.87
Carbon Steel Wok 14"
B0NK7 · Craft
0.81
向量儲存
DuckDB FLOAT[] 欄位 · 83,119 向量 · 12M 浮點數
Stage 6

混合搜尋系統

HybridRanker · α=0.5 · 最大最小正規化
搜尋查詢:"coffee maker"
📝 BM25 (詞彙匹配)0.72
🧠 Vector (語意相似)0.89
混合比例 α0.50
0 = 純 BM251 = 純向量
⚡ Hybrid (α=0.50)0.805
混合公式
HybridRanker.score()
bm25_norm = (s - min) / (max - min)
vec_norm = (s - min) / (max - min)
score = (1-α) · bm25_norm + α · vec_norm
= (1-0.50) · 0.72 + 0.50 · 0.89
= 0.805
Top 3 結果
#1
Coffee Maker Drip 12-Cup
B08N
0.91
#2
Espresso Machine Auto
B07C
0.84
#3
French Press Coffee Set
B09X
0.79
Stage 7

推薦系統

ContentBasedModel · ColdStartModel · PopularityModel
推薦策略決策樹
用戶請求User Request評論 ≥ 5 篇評論 < 5 篇協同過濾Content-BasedEmbedding 相似度冷啟動Cold-Start人氣排行 + 分類個人化商品列表熱門商品列表
使用者範例
🏆
62 篇評論
正面評論者
協同過濾
大量歷史記錄 → 精準個人化
🌱
1 篇評論
新用戶
冷啟動
冷啟動 → 人氣商品推薦
用戶分佈
新用戶 (1 篇)52%
輕度 (2-4 篇)28%
一般 (5-19)15%
高活躍 (≥20)5%
Stage 8

評估指標

MRR@10=0.575 · nDCG@10=0.792 · Coverage=2.3%
搜尋模型指標比較
MRR@10
BM25
0.500
Vector
0.575
Hybrid
0.575
nDCG@10
BM25
0.780
Vector
0.792
Hybrid
0.792
Recall@10
BM25
0.455
Vector
0.545
Hybrid
0.545
Precision@10
BM25
0.064
Vector
0.073
Hybrid
0.073
Hit Rate@10
BM25
0.455
Vector
0.545
Hybrid
0.545
評估摘要
🏆
Hybrid 最佳
MRR@10: 0.575 (+15% vs BM25)
📊
nDCG@10
Hybrid=0.792 · BM25=0.780
🌡️
冷啟動覆蓋
Coverage: 2.3% 目錄商品
⚙️
評估方法
Leave-one-out holdout @ k=[5,10,20]
推薦系統結論
Hybrid 搜尋在語意理解上優於純 BM25,向量嵌入提升 Recall 15%。 冷啟動策略有效處理 52% 新用戶場景。
資料管道旅程1 / 8
Stage 1
原始資料輸入

100K 香港區 Amazon 評論以 Parquet 格式從商業 ML 資料集匯入,包含評分、評論文字、時間戳記與用戶 ID。

Amazon Reviews 2023 · Parquet · 100K 筆