Skip to content

Latest commit

 

History

History
executable file
·
91 lines (76 loc) · 6.06 KB

File metadata and controls

executable file
·
91 lines (76 loc) · 6.06 KB

ESG-SASB 匹配系統 Pipeline(完整流程與文字對應機制)

1. 專案全貌與檔案

  • 主流程:main.py(預處理 → 推論 → 評估),所有參數集中於 config.py
  • 原始資料:data/train.jsondata/test.jsondata/sasb/*.mddata/reports/*.pdf
  • 預處理產物:data/processed/esg_segments_v9.jsonl(預設使用)、data/processed/sasb_metrics.json
  • 結果輸出:results/<mode>_<version>_selective_merge.csv,格式 x1,y1,x2,y2:CODENONE

2. 資料前處理

2.1 ESG 段落切分(01_build_esg_segments_v2.py)

  • 來源:*_content_list.json(OCR/MinerU 或 PPOCR 合併版,預設指向 v9)。
  • 解析 text/header/table/list/equation,表格以 HTML 轉純文字並附註腳。
  • 產出欄位:{esg_report, page, segment_id, text, bbox, type, page_width, page_height}
  • 篩掉極短文字;標準化檔名(處理 #Uxxxx 編碼);bbox 僅保留有效框。

2.2 SASB 指標解析(02_build_sasb_metrics.py)

  • 來源:data/sasb/*.md,偵測指標代碼、主題、主題彙總、完整技術協定內容。
  • 產出欄位:{sasb_report, sics_code, industry, industry_description, standard, topic, topic_summary, code, title, content}
  • 移除重複代碼並合併「之註 / Note to」內容。

2.3 標準答案(train_only)

  • 03_make_train_solution_csv.pytrain.json 轉為 data/train_solution.csv 供評估。

3. 推論:文字對應類別的核心流程(main.py)

  1. 載入模型

    • Bi-encoder:BAAI/bge-m3(normalize 後 cosine 相似度);裝置 cuda 優先。
    • LLM reranker:預設 Gemini (gemini-2.5-pro);可切換 Ollama (qwen3:8b 等)。
  2. 載入資料

    • modetrain.json / test.json
    • 載入 sasb_metrics.json 並依 sasb_report 分組;讀入 ESG segments(v9,若 use_v4_supplement=True 會併入 v4 非重疊段落)。
  3. 預編碼 SASB 指標

    • build_metric_text = code + title + topic + topic_summary[:200]
    • 每個 sasb_report 先算好 embedding;中文報告另外保留文字供 BM25。
  4. 逐樣本處理(頁面級)

    • 取該頁所有 segments,過濾 len(text) >= 10 且 bbox 有效。
    • 語言判斷:中文/英文決定 bi-encoder threshold(0.52 vs 0.50)。
    • 語意相似度seg_embs @ sasb_embs.T
    • BM25 加權(非英文 SASB 不啟用):同頁文本作 query,比對各 metric。若分數 > 0.3,+0.03
    • 代碼顯式匹配:段落含 code 或其前綴時 +0.05
    • 候選篩選:每個 segment 只取最高分 metric;需同時滿足
      • 分數 ≥ 閾值(依語言),且
      • 與最高分差距在 gap_threshold=0.05 內的高分數量 ≤ 3。
        產出 metric_to_segs = {code: [seg_info...]}
  5. LLM 重排序(文字→類別的關鍵判斷)

    • Prompt 提供 code/title/topic/summary + 段落文本,表格加提示行。
    • LLM 僅回傳 1–10 分;>=7 才視為通過。
    • 對每個 metric 取最高 LLM 分的 segment;在所有 metric 中選擇 LLM 分最高者作最終預測。
  6. BBox 後處理

    • 若多個高分段落橫向分散、LLM 分 ≥ 6:Selective merge(合併 bbox,限制 merged 面積 ≤ 50% 頁面)。
    • 若選中 bbox 面積 < 25,000:嘗試與鄰近 bbox 擴張(margin 80,expand ratio 0.02)。
    • 驗證 bbox 合法後輸出;否則回傳 NONE
  7. 增量儲存與結果

    • 每處理一筆樣本即寫入 <mode>_<version>_partial.csv,全程完成後寫正式 CSV。

4. 評估(evaluate)

  • data/train_solution.csv 比對預測 CSV。
  • 每筆可能多個標註;同 code 且 IoU ≥ 0.5 計 TP,否則計 FP/FN。
  • 指標:Precision / Recall / F1;另列出「code 正確但 IoU < 0.5」數量與 IoU 分佈。

5. 文字→類別對應機制重點

  • 多訊號混合:語意向量 + 關鍵字(BM25) + 顯式 code + 語言自適應閾值。
  • 保守候選:單段只保留最相關 metric,並限制「高分競品」數量避免泛用描述誤配。
  • LLM 精核判斷:10 分制、閾值 7,表格類型附提示,確保匹配是「具體揭露」而非泛談。
  • 空間對齊:若文字分散或 bbox 偏小,透過 selective merge/expand 提升 IoU,讓語意匹配能對應到實際標註區域。

6. 改進方向(聚焦文字對應品質)

  1. 候選召回
    • 對同一指標生成多視角 embedding(code/title/topic_summary/full content)取最大值,減少語意面遺漏。
    • 在 BM25 前加入 IDF 共享字典或 jieba/Spacy 分詞,提升中英文混排的詞彙召回。
    • 針對表格段落調低 bi-encoder 閾值或額外加權數值/單位詞。
  2. 重排序
    • Few-shot + Chain-of-Thought prompt(舉正反例,強制列出是否包含「數據/措施/範圍」)再給分,降低 LLM 偏好泛談的風險。
    • 輕量 cross-encoder(如 bge-reranker-base)預篩 top-K,再交給 LLM,節省 LLM 次數並過濾噪音。
    • 自適應閾值:依 sasb_report 或段落長度調整 LLM 閾值,防止長文本被高估、短文本被低估。
  3. 代碼與關鍵字增強
    • 建立指標同義詞/單位詞典(GHG/溫室氣體、用水量/withdrawal 等),在 BM25 和 code_match 中同時擴展匹配。
    • 正則偵測數值 + 單位(tCO2e、m³、kWh)並對應到指標要求的量測項,作為額外加分。
  4. BBox 對齊
    • 先依語意相關度合併同指標的相鄰段落,再做幾何合併,避免把不相關的鄰居一起拉大。
    • 導入版面模型(LayoutLMv3/DocFormer)做區塊級 relevance,減少過度擴張造成 IoU < 0.5。
  5. 數據與回饋
    • 錯誤類型分類(code 錯 / IoU 低 / FP / FN)並回寫樣本清單,指導 prompt 或閾值調參。
    • 為高不確定樣本(LLM 分接近閾值)做主動學習,補標或少量人工校正。

以上內容可作為 pipeline.md 的補充版本,涵蓋完整資料流與文字對應到 SASB 類別的實作細節,便於後續調參與改進。