審核、打分與分級規格

日期:2026-03-20 目的:定義 invoice_name_cluster -> SI 的審核流程、候選打分、金銀銅分級、AI 與眾包介面,以及最小 API 契約。 相關文件:

1. 核心原則

審核流程真正要決定的不是某筆通路資料真不真,而是:

這個 invoice_name_cluster 應該對到哪個 SI

所以:

  1. 審核單位是 invoice_name_cluster
  2. barcode、圖片、通路資料、crowd 回報都只是證據
  3. 打分的目的是縮小候選,不是取代審核
  4. 金銀銅分級是成熟度,不是身份

2. 審核佇列的最小單位

每個 queue item 至多呈現 2 到 5 個候選 SI,至少要附上:

  1. cluster_id
  2. merchant_code
  3. channel_code
  4. store_tax_id
  5. representative_pn
  6. line_count
  7. invoice_date_range
  8. brand_hint
  9. category_hint
  10. candidate_count
  11. top_candidate_score
  12. review_reason
  13. current_mapping_tier

3. 候選打分規則

3.1 建議特徵與權重區間

特徵 建議權重區間 說明
名稱相似度 0 到 35 發票名稱與候選名稱、別名的相似程度
歷史已確認對照 0 到 20 同商家同名稱曾被確認過
barcode 支持 0 到 20 條碼直接支持候選,但需先過風險檢查
包裝層級與容量一致 0 到 12 unit / bundle / carton、容量、入數是否一致
品牌一致 0 到 8 品牌提示一致時加分
品類一致 0 到 5 作為候選過濾與 sanity check
圖片支持 0 到 8 圖片相似或人工確認
通路、店點、時間上下文 0 到 10 同商家、同統編、有效時間內

3.2 Veto 規則

命中以下任一條件,就不應直接 auto_confirm

3.3 放行門檻

auto_confirm 建議同時滿足:

其他情況:

3.4 來源先驗

先驗可分三層,但不能取代其他證據:

3.5 品牌、品類、時間與店點的角色

4. 金級、銀級、銅級分級

4.1 兩種 tier 的差別

4.2 mapping_tier 標準

分級 建議條件
銅級 分數低於 60,只有單一弱證據,或仍有明顯衝突
銀級 分數 6084,且至少兩種證據支持,或已有一次人工確認
金級 分數 >= 85,與第二名有差距,沒有 veto,且已人工確認或長期穩定

4.3 item_tier 標準

分級 建議條件
銅級 已建立 BI / SI,但欄位仍缺、證據來源少,或包裝層級待釐清
銀級 名稱、品牌、包裝層級、容量等主欄位已完整,且至少兩種證據支持
金級 主要衝突已解,條碼與包裝關係清楚,且可穩定供下游使用

4.4 誰可以標什麼

角色 可提議 mapping_tier 可提議 item_tier 備註
規則引擎 可以 可以 不直接當最終裁決
AI 可以 可以 必須輸出理由與阻擋旗標
眾包 不可直接標 不可直接標 只做拆解任務
人工審核 可以確認 可以確認 最終升降級權在人工

4.5 實務操作原則

  1. 清整時先標 mapping_tier
  2. 新建 BI / SI 時,item_tier 先預設為 銅級
  3. 眾包一致不等於直接金級
  4. AI 不確定時應停在低級別並要求人工

5. 狀態機與決策類型

5.1 狀態機

open
  ↓
shortlisted
  ↓
under_review
  ↓
confirmed / rejected / needs_more_evidence / create_new_item

5.2 決策類型

6. 審核畫面最小需求

左側
- 代表發票名稱
- 同群組別名
- 商家 / 通路 / 統編
- 出現次數
- 日期範圍

中間
- 候選 A / B / C
- 候選名稱
- item_level
- 品牌 / 品類 / 規格
- package_form 與 net_content
- 主要 barcode
- 主要圖片
- 支持與衝突證據摘要

右側
- 確認候選
- 全部駁回
- 需要更多證據
- 新建商品

審核者至少要同時看到:

7. AI 與眾包規格

7.1 AI 輸出格式

AI 或規則引擎若要提議分級,最少應輸出:

{
  "target": "mapping_tier",
  "label": "silver",
  "reasons": [
    "名稱相似度高",
    "容量與 item_level 一致",
    "同商家歷史對照支持"
  ],
  "blocking_flags": [],
  "needs_human_review": false
}

7.2 AI 禁止規則

遇到以下情況,AI 不應硬給 金級

7.3 眾包任務類型

眾包不應自由上傳大雜燴,應只做候選確認任務:

  1. candidate_confirm
  2. barcode_confirm
  3. image_confirm
  4. new_item_triage

7.4 眾包禁止規則

眾包不應直接做這些事:

7.5 眾包結果怎麼換算成 tier

但系統仍須再檢查:

8. API 介面

8.1 GET /review/clusters

用途:取得待審核 cluster 清單。

查詢參數:

回傳範例:

{
  "items": [
    {
      "cluster_id": 123,
      "merchant_code": "PXMART",
      "channel_code": "PXMART_ONLINE",
      "store_tax_id": "12345678",
      "representative_pn": "白蘭氏雞精6入",
      "line_count": 87,
      "invoice_date_range": ["2025-01-01", "2026-03-01"],
      "candidate_count": 3,
      "top_candidate_score": 0.93,
      "review_reason": "close_candidates",
      "current_mapping_tier": "bronze"
    }
  ],
  "next_cursor": "abc123"
}

8.2 GET /review/clusters/{cluster_id}

回傳至少應包含:

8.3 POST /review/decisions

請求範例:

{
  "cluster_id": 123,
  "decision_type": "confirm_candidate",
  "candidate_id": 1001,
  "reviewer": "alice",
  "mapping_tier": "silver",
  "decision_note": "名稱、容量、通路與歷史資料一致"
}

8.4 POST /crowd/tasks

請求至少應包含:

9. 最小實作建議

  1. 先做 rule-first 版本,不要一開始就做黑盒模型
  2. 所有加分、扣分、降級都要能解釋
  3. 每次審核結果都要能回寫成下一輪候選生成的歷史證據

10. 一句話收尾

這份文件現在同時負責審核流程、候選打分與金銀銅分級。
真正目標只有一個:替每個 invoice_name_cluster 選出最合理的 SI