資料管線
資料處理流程架構
資料層
- ·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
樣本資料欄位
| asin | rating | text | timestamp |
|---|---|---|---|
| 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 · 情緒標籤 清理前
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 資料表💾
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
倒排索引(部分)
最高分文件: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
Pre-Seasoned Iron Pan
B09HS · Calphalon
Carbon Steel Wok 14"
B0NK7 · Craft
向量儲存
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
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 結果
#10.91
Coffee Maker Drip 12-Cup
B08N
#20.84
Espresso Machine Auto
B07C
#30.79
French Press Coffee Set
B09X
Stage 7
推薦系統
ContentBasedModel · ColdStartModel · PopularityModel推薦策略決策樹
使用者範例
🏆協同過濾
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
BM250.500
Vector0.575
Hybrid0.575
nDCG@10
BM250.780
Vector0.792
Hybrid0.792
Recall@10
BM250.455
Vector0.545
Hybrid0.545
Precision@10
BM250.064
Vector0.073
Hybrid0.073
Hit Rate@10
BM250.455
Vector0.545
Hybrid0.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% 新用戶場景。