台灣交通事故法律分析助理 — 以 Llama-3-Taiwan-8B-Instruct-rc2 為基底, 透過 LoRA 微調,讓模型能根據使用者以口語描述的車禍事故,自動分析:
本 repo 同時包含兩條獨立的資料集建置路線(本團隊 Step1-4 規則式 pipeline + Claude Sonnet 4.6 改寫, 以及教學組以 GPT-4o 直接抽取),並以相同基底模型分別微調、在共享的 18 筆 test set 上做對照評估, 詳見
report.md。
司法院資料開放平台「裁判書」資料集(202602 / 202603,20260516 更新版)
↓ 手動下載 .rar 壓縮檔並解壓
data/raw/ ← 原始判決書 JSON(已 gitignore,見第 4 節)
↓ Step1 規則式篩選
│ scripts/02_filter.py (刑事:JCASE 含「交」+ JTITLE 過失傷害/致死/致重傷 等)
│ scripts/02b_filter_civil.py (民事:JTITLE 含「交通」+「損害賠償/侵權行為」)
data/filtered/traffic_cases*.json ← 篩選後判決書
↓ Step2 人工 QC(scripts/qc_sample.py 等)
↓ Step3 結構化抽取(規則式,零 LLM)
│ scripts/03_extract.py
data/extracted/structured_cases.json ← 1,918 筆結構化資料(事故摘要 / 核心爭議 / 責任類型 / 適用法條)
↓ Step4 白話化改寫(Claude Sonnet 4.6,32 個並行 sub-agent)
│ scripts/make_chunks.py → 32 個 chunk → out_00~31.json
│ scripts/sanitize_and_assemble.py
data/colloquial/training_pairs.json ← 1,759 筆 Alpaca 格式訓練對
↓ scripts/split_dataset.py
data/colloquial/{train,val,test}.json ← 1,691 / 50 / 18 筆
Step4 的詳細設計與執行紀錄見 docs/step4_workflow_record.md。
12 類核心爭議標籤:轉彎車未讓直行車、變換車道未讓直行車、支線道未讓幹線道、左方車未讓右方車、違反號誌、 未注意車前狀況、閃紅燈未停讓、閃黃燈未減速、與有過失、過失致死致重傷、過失傷害成立、民事損害賠償。
法條範圍經 scripts/analyze_learnability.py 分析,過濾掉「無法從事故描述本身學到」的
量刑/程序/利息類條文(如刑法第41/50/51/53/55/57/71/74/75條、民法第203/229/233條)。
Traffic_Legal_LM/
├── data/
│ ├── raw/ # 原始判決書(gitignore,公開資料來源見第4節)
│ ├── filtered/ # Step1 篩選結果
│ ├── extracted/ # Step3 結構化抽取結果(1,918 筆)
│ ├── colloquial/ # Step4 最終訓練資料(本團隊資料集)
│ ├── final_fine_tuning_data/ # 教學組 GPT-4o 資料集(2 月)
│ ├── traffic_202603_alpaca_gpt4o_outputs/ # 教學組 GPT-4o 中間產物(3 月)
│ ├── mar_gpt4o_train.json / mar_gpt4o_val.json / mar_test.json # 教學組 GPT-4o 資料集(3 月)
│ └── dataset_info.json # LLaMA-Factory 資料集註冊
├── scripts/
│ ├── 02_filter.py / 02b_filter_civil.py # Step1 篩選
│ ├── 03_extract.py # Step3 結構化抽取
│ ├── make_chunks.py / sanitize_and_assemble.py / split_dataset.py # Step4 切分與組裝
│ ├── analyze_learnability.py # 法條可學習性分析
│ ├── train_round1.yaml / train_round2_sonnet46.yaml / train_round2_gpt4o_baseline.yaml # LLaMA-Factory 訓練設定
│ ├── eval_comparison.py # Round2 兩模型對照評估
│ ├── upload_models_to_hf.py # 將 LoRA adapter 上傳到 Hugging Face Hub
│ └── test_*.py # Docker 環境驗證腳本
├── models/ # LoRA adapter(gitignore,見第5節 Hugging Face Hub 連結)
├── eval/ # 評估結果(eval_results.json / eval_summary.json / test_cases.json)
├── demo/ # Gradio demo(app.py:Base / GPT-4o LoRA / Sonnet LoRA 三模型對照)
├── docs/ # 開發流程記錄(Step4 workflow 等)
├── report.md # 完整分析報告(資料集品質、Round1/2 模型對照評估)
├── Dockerfile # 訓練環境(CUDA 12.1 + LLaMA-Factory)
└── LICENSE # MIT License
data/raw/data/raw/ 已加入 .gitignore(不上傳,原始解壓後約 1.9GB)data/colloquial/)scripts/,
Step4 改寫的 prompt 見 scripts/subagent_prompt.md)instruction / input / output),output 為三行結構化標籤:
【核心爭議】違反號誌、未注意車前狀況、過失傷害成立
【責任類型】刑事
【適用法條】道路交通安全規則第90條第1項、刑法第284條前段、刑法第62條前段
traffic_legal_0603_train / traffic_legal_0603_valdata/final_fine_tuning_data/、data/mar_gpt4o_*.json)traffic_law_round1)與 Round2 對照組(traffic_law_mar_gpt4o_train / traffic_law_mar_gpt4o_val)report.md 第八章3 個 LoRA adapter 皆以 yentinglin/Llama-3-Taiwan-8B-Instruct-rc2 為基底,使用 LLaMA-Factory 訓練,已上傳至 Hugging Face Hub:
| 模型 | Hugging Face | 說明 |
|---|---|---|
| Round 1 LoRA | traffic-legal-lm/round1-lora | 初版小規模資料集,驗證訓練流程用 |
| Round 2 — 本團隊資料集 | traffic-legal-lm/round2-sonnet46-lora | data/colloquial/,12 類封閉核心爭議標籤、過濾過後法條 |
| Round 2 — GPT-4o baseline | traffic-legal-lm/round2-gpt4o-baseline-lora | 教學組 GPT-4o 資料集,自由格式、法條範圍較廣 |
pip install llamafactory 安裝,見 Dockerfile)lora_target=all,rank=16,alpha=32,dropout=0.05eval_loss 做 early stoppingscripts/train_round1.yaml、scripts/train_round2_sonnet46.yaml、scripts/train_round2_gpt4o_baseline.yaml於兩個 Round2 模型共享的 18 筆 test set 上評估(scripts/eval_comparison.py,結果見 eval/eval_summary.json):
| 指標 | Round2-Sonnet46 | Round2-GPT4o-baseline |
|---|---|---|
| 責任類型 accuracy | 1.0 | 1.0 |
| 適用法條 F1 | 0.573(precision 0.586 / recall 0.627) | 0.701(precision 0.753 / recall 0.694) |
| 核心爭議 F1 | 0.811(precision 0.833 / recall 0.83) | — (自由生成句子,無封閉 ground truth) |
兩種路線的取捨(輸出格式、可驗證性、法條範圍與噪音等)詳細分析見 report.md 第八章。
docker build -t legal-lora:latest .
容器基於 nvidia/cuda:12.1.1-cudnn8-devel-ubuntu22.04,內含 PyTorch 2.5.1+cu121、LLaMA-Factory、bitsandbytes。
# 驗證環境
docker run --gpus all --rm -v $(pwd):/workspace -w /workspace \
legal-lora:latest python scripts/test_setup.py
# GPU 記憶體用量
docker run --gpus all --rm -v $(pwd):/workspace -w /workspace \
legal-lora:latest python scripts/test_gpu_memory.py
# 先於 https://opendata.judicial.gov.tw/ 申請帳號,下載「裁判書」202602/202603 月份壓縮檔並解壓至 data/raw/
python scripts/02_filter.py # Step1 刑事篩選
python scripts/02b_filter_civil.py # Step1 民事篩選
python scripts/03_extract.py # Step3 結構化抽取
# Step4 白話化改寫需透過 Claude sub-agent,prompt 見 scripts/subagent_prompt.md
python scripts/split_dataset.py # 切分 train/val/test
llamafactory-cli train scripts/train_round2_sonnet46.yaml
from transformers import AutoModelForCausalLM, AutoTokenizer
from peft import PeftModel
base_model_id = "yentinglin/Llama-3-Taiwan-8B-Instruct-rc2"
adapter_id = "traffic-legal-lm/round2-sonnet46-lora"
tokenizer = AutoTokenizer.from_pretrained(base_model_id)
model = AutoModelForCausalLM.from_pretrained(base_model_id, torch_dtype="bfloat16", device_map="auto")
model = PeftModel.from_pretrained(model, adapter_id)
demo/app.py 為 Gradio 介面,同時載入 Base model、GPT-4o LoRA、Sonnet LoRA 三個模型,可並排比較回答:
python demo/app.py
report.md — 完整分析報告:資料集品質問題、Step1-4 pipeline 設計、Round1/2 模型對照評估docs/step4_workflow_record.md — Step4 白話化改寫設計與執行紀錄roadmap.md、專案規劃.md、資料集製作.md、
如何結構化抽取判決書.md — 開發歷程文件本 repo 程式碼採 MIT License。
基底模型 Llama-3-Taiwan-8B-Instruct-rc2 採 Llama 3 Community License, 使用本專案 LoRA adapter 時請一併遵守該授權條款。
台灣交通事故法律分析助理 — 以 Llama-3-Taiwan-8B-Instruct-rc2 為基底, 透過 LoRA 微調,讓模型能根據使用者以口語描述的車禍事故,自動分析:
本 repo 同時包含兩條獨立的資料集建置路線(本團隊 Step1-4 規則式 pipeline + Claude Sonnet 4.6 改寫, 以及教學組以 GPT-4o 直接抽取),並以相同基底模型分別微調、在共享的 18 筆 test set 上做對照評估, 詳見
report.md。
司法院資料開放平台「裁判書」資料集(202602 / 202603,20260516 更新版)
↓ 手動下載 .rar 壓縮檔並解壓
data/raw/ ← 原始判決書 JSON(已 gitignore,見第 4 節)
↓ Step1 規則式篩選
│ scripts/02_filter.py (刑事:JCASE 含「交」+ JTITLE 過失傷害/致死/致重傷 等)
│ scripts/02b_filter_civil.py (民事:JTITLE 含「交通」+「損害賠償/侵權行為」)
data/filtered/traffic_cases*.json ← 篩選後判決書
↓ Step2 人工 QC(scripts/qc_sample.py 等)
↓ Step3 結構化抽取(規則式,零 LLM)
│ scripts/03_extract.py
data/extracted/structured_cases.json ← 1,918 筆結構化資料(事故摘要 / 核心爭議 / 責任類型 / 適用法條)
↓ Step4 白話化改寫(Claude Sonnet 4.6,32 個並行 sub-agent)
│ scripts/make_chunks.py → 32 個 chunk → out_00~31.json
│ scripts/sanitize_and_assemble.py
data/colloquial/training_pairs.json ← 1,759 筆 Alpaca 格式訓練對
↓ scripts/split_dataset.py
data/colloquial/{train,val,test}.json ← 1,691 / 50 / 18 筆
Step4 的詳細設計與執行紀錄見 docs/step4_workflow_record.md。
12 類核心爭議標籤:轉彎車未讓直行車、變換車道未讓直行車、支線道未讓幹線道、左方車未讓右方車、違反號誌、 未注意車前狀況、閃紅燈未停讓、閃黃燈未減速、與有過失、過失致死致重傷、過失傷害成立、民事損害賠償。
法條範圍經 scripts/analyze_learnability.py 分析,過濾掉「無法從事故描述本身學到」的
量刑/程序/利息類條文(如刑法第41/50/51/53/55/57/71/74/75條、民法第203/229/233條)。
Traffic_Legal_LM/
├── data/
│ ├── raw/ # 原始判決書(gitignore,公開資料來源見第4節)
│ ├── filtered/ # Step1 篩選結果
│ ├── extracted/ # Step3 結構化抽取結果(1,918 筆)
│ ├── colloquial/ # Step4 最終訓練資料(本團隊資料集)
│ ├── final_fine_tuning_data/ # 教學組 GPT-4o 資料集(2 月)
│ ├── traffic_202603_alpaca_gpt4o_outputs/ # 教學組 GPT-4o 中間產物(3 月)
│ ├── mar_gpt4o_train.json / mar_gpt4o_val.json / mar_test.json # 教學組 GPT-4o 資料集(3 月)
│ └── dataset_info.json # LLaMA-Factory 資料集註冊
├── scripts/
│ ├── 02_filter.py / 02b_filter_civil.py # Step1 篩選
│ ├── 03_extract.py # Step3 結構化抽取
│ ├── make_chunks.py / sanitize_and_assemble.py / split_dataset.py # Step4 切分與組裝
│ ├── analyze_learnability.py # 法條可學習性分析
│ ├── train_round1.yaml / train_round2_sonnet46.yaml / train_round2_gpt4o_baseline.yaml # LLaMA-Factory 訓練設定
│ ├── eval_comparison.py # Round2 兩模型對照評估
│ ├── upload_models_to_hf.py # 將 LoRA adapter 上傳到 Hugging Face Hub
│ └── test_*.py # Docker 環境驗證腳本
├── models/ # LoRA adapter(gitignore,見第5節 Hugging Face Hub 連結)
├── eval/ # 評估結果(eval_results.json / eval_summary.json / test_cases.json)
├── demo/ # Gradio demo(app.py:Base / GPT-4o LoRA / Sonnet LoRA 三模型對照)
├── docs/ # 開發流程記錄(Step4 workflow 等)
├── report.md # 完整分析報告(資料集品質、Round1/2 模型對照評估)
├── Dockerfile # 訓練環境(CUDA 12.1 + LLaMA-Factory)
└── LICENSE # MIT License
data/raw/data/raw/ 已加入 .gitignore(不上傳,原始解壓後約 1.9GB)data/colloquial/)scripts/,
Step4 改寫的 prompt 見 scripts/subagent_prompt.md)instruction / input / output),output 為三行結構化標籤:
【核心爭議】違反號誌、未注意車前狀況、過失傷害成立
【責任類型】刑事
【適用法條】道路交通安全規則第90條第1項、刑法第284條前段、刑法第62條前段
traffic_legal_0603_train / traffic_legal_0603_valdata/final_fine_tuning_data/、data/mar_gpt4o_*.json)traffic_law_round1)與 Round2 對照組(traffic_law_mar_gpt4o_train / traffic_law_mar_gpt4o_val)report.md 第八章3 個 LoRA adapter 皆以 yentinglin/Llama-3-Taiwan-8B-Instruct-rc2 為基底,使用 LLaMA-Factory 訓練,已上傳至 Hugging Face Hub:
| 模型 | Hugging Face | 說明 |
|---|---|---|
| Round 1 LoRA | traffic-legal-lm/round1-lora | 初版小規模資料集,驗證訓練流程用 |
| Round 2 — 本團隊資料集 | traffic-legal-lm/round2-sonnet46-lora | data/colloquial/,12 類封閉核心爭議標籤、過濾過後法條 |
| Round 2 — GPT-4o baseline | traffic-legal-lm/round2-gpt4o-baseline-lora | 教學組 GPT-4o 資料集,自由格式、法條範圍較廣 |
pip install llamafactory 安裝,見 Dockerfile)lora_target=all,rank=16,alpha=32,dropout=0.05eval_loss 做 early stoppingscripts/train_round1.yaml、scripts/train_round2_sonnet46.yaml、scripts/train_round2_gpt4o_baseline.yaml於兩個 Round2 模型共享的 18 筆 test set 上評估(scripts/eval_comparison.py,結果見 eval/eval_summary.json):
| 指標 | Round2-Sonnet46 | Round2-GPT4o-baseline |
|---|---|---|
| 責任類型 accuracy | 1.0 | 1.0 |
| 適用法條 F1 | 0.573(precision 0.586 / recall 0.627) | 0.701(precision 0.753 / recall 0.694) |
| 核心爭議 F1 | 0.811(precision 0.833 / recall 0.83) | — (自由生成句子,無封閉 ground truth) |
兩種路線的取捨(輸出格式、可驗證性、法條範圍與噪音等)詳細分析見 report.md 第八章。
docker build -t legal-lora:latest .
容器基於 nvidia/cuda:12.1.1-cudnn8-devel-ubuntu22.04,內含 PyTorch 2.5.1+cu121、LLaMA-Factory、bitsandbytes。
# 驗證環境
docker run --gpus all --rm -v $(pwd):/workspace -w /workspace \
legal-lora:latest python scripts/test_setup.py
# GPU 記憶體用量
docker run --gpus all --rm -v $(pwd):/workspace -w /workspace \
legal-lora:latest python scripts/test_gpu_memory.py
# 先於 https://opendata.judicial.gov.tw/ 申請帳號,下載「裁判書」202602/202603 月份壓縮檔並解壓至 data/raw/
python scripts/02_filter.py # Step1 刑事篩選
python scripts/02b_filter_civil.py # Step1 民事篩選
python scripts/03_extract.py # Step3 結構化抽取
# Step4 白話化改寫需透過 Claude sub-agent,prompt 見 scripts/subagent_prompt.md
python scripts/split_dataset.py # 切分 train/val/test
llamafactory-cli train scripts/train_round2_sonnet46.yaml
from transformers import AutoModelForCausalLM, AutoTokenizer
from peft import PeftModel
base_model_id = "yentinglin/Llama-3-Taiwan-8B-Instruct-rc2"
adapter_id = "traffic-legal-lm/round2-sonnet46-lora"
tokenizer = AutoTokenizer.from_pretrained(base_model_id)
model = AutoModelForCausalLM.from_pretrained(base_model_id, torch_dtype="bfloat16", device_map="auto")
model = PeftModel.from_pretrained(model, adapter_id)
demo/app.py 為 Gradio 介面,同時載入 Base model、GPT-4o LoRA、Sonnet LoRA 三個模型,可並排比較回答:
python demo/app.py
report.md — 完整分析報告:資料集品質問題、Step1-4 pipeline 設計、Round1/2 模型對照評估docs/step4_workflow_record.md — Step4 白話化改寫設計與執行紀錄roadmap.md、專案規劃.md、資料集製作.md、
如何結構化抽取判決書.md — 開發歷程文件本 repo 程式碼採 MIT License。
基底模型 Llama-3-Taiwan-8B-Instruct-rc2 採 Llama 3 Community License, 使用本專案 LoRA adapter 時請一併遵守該授權條款。