- 主流程:
main.py(預處理 → 推論 → 評估),所有參數集中於config.py。 - 原始資料:
data/train.json、data/test.json、data/sasb/*.md、data/reports/*.pdf。 - 預處理產物:
data/processed/esg_segments_v9.jsonl(預設使用)、data/processed/sasb_metrics.json。 - 結果輸出:
results/<mode>_<version>_selective_merge.csv,格式x1,y1,x2,y2:CODE或NONE。
- 來源:
*_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 僅保留有效框。
- 來源:
data/sasb/*.md,偵測指標代碼、主題、主題彙總、完整技術協定內容。 - 產出欄位:
{sasb_report, sics_code, industry, industry_description, standard, topic, topic_summary, code, title, content}。 - 移除重複代碼並合併「之註 / Note to」內容。
03_make_train_solution_csv.py將train.json轉為data/train_solution.csv供評估。
-
載入模型
- Bi-encoder:
BAAI/bge-m3(normalize 後 cosine 相似度);裝置cuda優先。 - LLM reranker:預設 Gemini (
gemini-2.5-pro);可切換 Ollama (qwen3:8b等)。
- Bi-encoder:
-
載入資料
- 依
mode讀train.json/test.json。 - 載入
sasb_metrics.json並依sasb_report分組;讀入 ESG segments(v9,若use_v4_supplement=True會併入 v4 非重疊段落)。
- 依
-
預編碼 SASB 指標
build_metric_text = code + title + topic + topic_summary[:200]。- 每個
sasb_report先算好 embedding;中文報告另外保留文字供 BM25。
-
逐樣本處理(頁面級)
- 取該頁所有 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...]}。
- 取該頁所有 segments,過濾
-
LLM 重排序(文字→類別的關鍵判斷)
- Prompt 提供
code/title/topic/summary+ 段落文本,表格加提示行。 - LLM 僅回傳 1–10 分;
>=7才視為通過。 - 對每個 metric 取最高 LLM 分的 segment;在所有 metric 中選擇 LLM 分最高者作最終預測。
- Prompt 提供
-
BBox 後處理
- 若多個高分段落橫向分散、LLM 分 ≥ 6:Selective merge(合併 bbox,限制 merged 面積 ≤ 50% 頁面)。
- 若選中 bbox 面積 < 25,000:嘗試與鄰近 bbox 擴張(margin 80,expand ratio 0.02)。
- 驗證 bbox 合法後輸出;否則回傳
NONE。
-
增量儲存與結果
- 每處理一筆樣本即寫入
<mode>_<version>_partial.csv,全程完成後寫正式 CSV。
- 每處理一筆樣本即寫入
- 讀
data/train_solution.csv比對預測 CSV。 - 每筆可能多個標註;同 code 且 IoU ≥ 0.5 計 TP,否則計 FP/FN。
- 指標:Precision / Recall / F1;另列出「code 正確但 IoU < 0.5」數量與 IoU 分佈。
- 多訊號混合:語意向量 + 關鍵字(BM25) + 顯式 code + 語言自適應閾值。
- 保守候選:單段只保留最相關 metric,並限制「高分競品」數量避免泛用描述誤配。
- LLM 精核判斷:10 分制、閾值 7,表格類型附提示,確保匹配是「具體揭露」而非泛談。
- 空間對齊:若文字分散或 bbox 偏小,透過 selective merge/expand 提升 IoU,讓語意匹配能對應到實際標註區域。
- 候選召回
- 對同一指標生成多視角 embedding(code/title/topic_summary/full content)取最大值,減少語意面遺漏。
- 在 BM25 前加入 IDF 共享字典或 jieba/Spacy 分詞,提升中英文混排的詞彙召回。
- 針對表格段落調低 bi-encoder 閾值或額外加權數值/單位詞。
- 重排序
- Few-shot + Chain-of-Thought prompt(舉正反例,強制列出是否包含「數據/措施/範圍」)再給分,降低 LLM 偏好泛談的風險。
- 輕量 cross-encoder(如
bge-reranker-base)預篩 top-K,再交給 LLM,節省 LLM 次數並過濾噪音。 - 自適應閾值:依
sasb_report或段落長度調整 LLM 閾值,防止長文本被高估、短文本被低估。
- 代碼與關鍵字增強
- 建立指標同義詞/單位詞典(GHG/溫室氣體、用水量/withdrawal 等),在 BM25 和 code_match 中同時擴展匹配。
- 正則偵測數值 + 單位(tCO2e、m³、kWh)並對應到指標要求的量測項,作為額外加分。
- BBox 對齊
- 先依語意相關度合併同指標的相鄰段落,再做幾何合併,避免把不相關的鄰居一起拉大。
- 導入版面模型(LayoutLMv3/DocFormer)做區塊級 relevance,減少過度擴張造成 IoU < 0.5。
- 數據與回饋
- 錯誤類型分類(code 錯 / IoU 低 / FP / FN)並回寫樣本清單,指導 prompt 或閾值調參。
- 為高不確定樣本(LLM 分接近閾值)做主動學習,補標或少量人工校正。
以上內容可作為 pipeline.md 的補充版本,涵蓋完整資料流與文字對應到 SASB 類別的實作細節,便於後續調參與改進。