CoolFace
Modelpublic

nectec/pathumma-crossborder-guardrail

sourceHugging Faceapache-2.0updated 2d agoView on Hugging Face
1likes72downloads
Model Card

Pathumma Cross-border Guardrail (OpenThai-SystemOne fine-tune)

โมเดลตัดสินใจ (decision model) ~0.8B สำหรับใช้เป็น guardrail ชั้นแรก ก่อน route prompt ไปยัง LLM: จำแนกว่าข้อความมี ข้อมูลประเภทใด (7 หมวด) แล้ว map เป็น สิทธิ์ส่งประมวลผลนอกประเทศ (3 ระดับ) ตาม PDPA และ ETDA Generative AI Governance Guideline ไม่ใช่โมเดล generative — คืน calibrated probability เหนือ option ที่กำหนด ใน forward pass เดียว

Intended use

ใช้ตัดสิน routing (foreign API vs sovereign/on-prem) เป็นชั้นแรกร่วมกับ regex/DLP pre-filter สำหรับข้อความไทย/อังกฤษในบริบทองค์กรไทย ไม่ได้ ออกแบบมาตรวจเนื้อหาอันตราย (violence, CSAM, hate) — ต้องมี content-safety guardrail แยก

Taxonomy

#keyคำอธิบายrouting
1publicความรู้ทั่วไป งานเขียน โค้ด หรือคำถามเชิงแนวคิด ที่ไม่มีชื่อ…foreign_ok
2pdpa_generalมีข้อมูลระบุตัวบุคคลจริง เช่น ชื่อ-สกุล เบอร์โทร อีเมล ที่อย…conditional
3pdpa_sensitiveมีข้อมูลบุคคลจริงประเภทอ่อนไหว: สุขภาพ/โรค/ผลตรวจ พันธุกรรม …sovereign_only
4confidentialเอกสารบริหาร/การเงิน/กฎหมายภายในของบริษัทเอกชน ที่ยังไม่เปิด…sovereign_only
5system_secretมี credential หรือรายละเอียดเทคนิคของระบบ: API key รหัสผ่าน …sovereign_only
6govt_classifiedเอกสารของหน่วยงานรัฐ/ทหาร/ตำรวจ/ข่าวกรอง ที่มีชั้นความลับ (ล…sovereign_only
7trade_secretทรัพย์สินทางปัญญาเชิงเทคนิค/วิจัย ที่ยังไม่เปิดเผย: สูตรการผ…conditional

conditional = ส่งได้เฉพาะผู้ให้บริการที่มี SCC/BCR/Enterprise DPA พร้อมข้อ no-train หรือมีความยินยอม · sovereign_only = ประมวลผลในประเทศเท่านั้น

How to use

โมเดลถูก fine-tune กับ instructions + criteria ชุดเดียว ซึ่งเก็บใน `guardrail_config.json`

python
import json
from openthai_systemone import SystemOneClient, Choice
from huggingface_hub import hf_hub_download
cfg = json.load(open(hf_hub_download("nectec/pathumma-crossborder-guardrail", "guardrail_config.json")))
client = SystemOneClient("nectec/pathumma-crossborder-guardrail")
resp = client.system_one(state={"prompt": "ช่วยสรุปผลตรวจสุขภาพของ นายสมชาย ใจดี HN 123456"},
                         questions={"data_sensitivity": Choice(instructions=cfg["instructions"], criteria=cfg["criteria"])})
a = resp.answers["data_sensitivity"]
print(a.choice, cfg["routing"][a.choice], round(a.confidence, 3))

Wrapper พร้อม pre-filter/fail-closed: `guardrail.py` · FastAPI + OpenAI-compatible /v1/moderations: `serve.py`

Training

  • —Base: `iapp/OpenThai-SystemOne` · full fine-tune backbone + slot head ด้วย loss ที่มากับโมเดล (CE + label_smoothing 0.05 + brier 0.1), shuffle ลำดับ option ทุก batch, temperature calibrate แยกบน held-out val
  • —AdamW lr backbone 1e-05 / head 0.0001, batch 8, ≤4 epochs + early stopping (best epoch n/a), bf16 autocast
  • —Data: synthetic 3,500 ตัวอย่าง (500/หมวด) จาก template 20-39 แบบต่อหมวด — ชื่อ/เลขบัตร/เบอร์/องค์กร สมมติทั้งหมด, credential ในหมวด 5 เป็น placeholder
  • —Split ระดับ template 60/15/25 → val/test เป็นรูปประโยคที่ไม่เคยเห็น

Evaluation (template-held-out test, n = 880)

modelaccuracymacro-F1
base zero-shot0.85570.8544
fine-tuned (this repo)0.92840.9267
                 precision    recall  f1-score   support

         public      0.953     0.865     0.907       141
   pdpa_general      0.867     1.000     0.929       130
 pdpa_sensitive      1.000     0.821     0.902       112
   confidential      0.745     1.000     0.854       108
  system_secret      1.000     1.000     1.000       137
govt_classified      1.000     0.992     0.996       126
   trade_secret      1.000     0.817     0.900       126

       accuracy                          0.928       880
      macro avg      0.938     0.928     0.927       880
   weighted avg      0.941     0.928     0.929       880

Confusion matrix (rows=gold, cols=pred, 1..7):

[[122   0   0  19   0   0   0]
 [  0 130   0   0   0   0   0]
 [  0  20  92   0   0   0   0]
 [  0   0   0 108   0   0   0]
 [  0   0   0   0 137   0   0]
 [  0   0   0   1   0 125   0]
 [  6   0   0  17   0   0 103]]

Calibration: T = 1.068 (val NLL 0.2766 → 0.2766)

Coverage vs accuracy ตาม confidence threshold (ใช้ตั้ง min_confidence, ค่าเริ่มต้น 0.6): | threshold | coverage | acc on kept | |---|---|---| | 0.5 | 0.993 | 0.935 | | 0.6 | 0.989 | 0.938 | | 0.7 | 0.981 | 0.944 | | 0.8 | 0.975 | 0.946 | | 0.9 | 0.951 | 0.964 |

Limitations

  • —ข้อมูลฝึกเป็น synthetic จาก template — ผลบน prompt จริงอาจต่ำกว่านี้ ควร shadow-deploy และ label ข้อมูลจริงเพิ่ม
  • —ไม่ได้เทรนให้จำ secret จริง → ต้องมี regex/entropy pre-filter เสมอ (มีใน guardrail.py)
  • —single-label: ข้อความหลายประเภทได้หมวดเข้มงวดสุดตาม priority rule
  • —ไม่ครอบคลุม content safety · base model มี order sensitivity สำหรับ ≤10 options (fine-tune ด้วย shuffle ช่วยลด)
  • —ควร fail-closed: confidence ต่ำ/abstain สูง/error → sovereign_only

Deployment

รันโมเดลนี้ on-prem/ในประเทศเสมอ · pipeline pre-filter → model → threshold → routing · log ทุก decision · เก็บเคส needs_review ส่ง human label แล้ว fine-tune รอบถัดไป

Acknowledgements

Base model และ pipeline โดย iApp Technology (OpenThai-SystemOne, Apache-2.0) ซึ่งได้แรงบันดาลใจจาก TypeSafe AI System One. Taxonomy อ้างอิง ETDA AI Governance Center

Author: Sarawoot Kongyoung, NECTEC/AINRG · Contact: sarawoot.kon@nectec.or.th