# ระบบคิดอย่างไร · How the system thinks

เอกสารนี้อธิบายทุกเกณฑ์และทุกสูตรที่ระบบใช้ตัดสินใจ — ภาษาคนธรรมดา ไม่ใช่ภาษาวิชาการ
Every threshold and formula the system uses, in plain language.

## น้ำ: สถานีบอกสถานะอย่างไร · Flood station status

สถานีโทรมาตรแต่ละแห่งวัด "ระดับน้ำ" เทียบกับ "ระดับตลิ่ง" (ความจุก่อนน้ำล้น):

- ปกติ: ต่ำกว่า 70% ของตลิ่ง
- เฝ้าระวัง: 70–85% หรือ สสน. ให้ระดับสถานการณ์ 2
- เตือน: 85% ขึ้นไป หรือระดับสถานการณ์ 3
- วิกฤต: ถึง/เกินตลิ่ง หรือระดับสถานการณ์ 5 (น้ำล้นจริง)

สถานีวัดฝนใช้เกณฑ์กรมอุตุฯ: 35 มม./24ชม. = ฝนหนัก (เฝ้าระวัง), 60 = เตือน, 90 = วิกฤต

**กติกาพิเศษของลพบุรี — เกณฑ์คลองชลประทาน:** คลองที่ชลประทานตั้งใจเก็บน้ำเต็ม
จะถูกระบบของ สสน. ตีความว่า "น้ำมาก" (ระดับ 4) ตลอดเวลา ทั้งที่เป็นการบริหารปกติ
สำนักชลประทานลพบุรีเคยทักท้วงเรื่องนี้ตรง ๆ ระบบนี้จึงไม่ยกระดับ "ระดับ 4" เป็นวิกฤต
เว้นแต่ระดับน้ำจริงจะยืนยัน (เกิน 85% ของตลิ่ง) — แต่ "ระดับ 5" (ล้นจริง) ไม่ถูกลดเกรดเด็ดขาด

The Lopburi-specific rule: irrigation-managed canals held deliberately full read as
HII situation level 4 forever. Level 4 alone no longer escalates to critical unless the
physical level corroborates; level 5 is never discounted.

## อากาศ: เกณฑ์ AQI ไทย 2566 · Thai AQI 2023 bands (PM2.5, µg/m³)

| ช่วง | ระดับ | การปฏิบัติ (คำกริยาเดียว) |
|---|---|---|
| 0–15 | ดีมาก | ใช้ชีวิตตามปกติ |
| 15.1–25 | ดี | ใช้ชีวิตตามปกติ |
| 25.1–37.5 | ปานกลาง | ติดตามสถานการณ์ |
| 37.6–75 | เริ่มมีผลต่อสุขภาพ | ลดกิจกรรมกลางแจ้ง |
| >75 | มีผลต่อสุขภาพ | ป้องกันทันที งดกิจกรรมกลางแจ้ง |

**กติกาสำคัญ:** ทั้งจังหวัดถูกให้คะแนนตาม "สถานีที่แย่ที่สุด" เสมอ ไม่ใช่ค่าเฉลี่ย —
ชุมชนที่อากาศแย่หนึ่งแห่งจะไม่ถูกเฉลี่ยจนหายไป
The province is always scored on its WORST fresh station, never the average.

**เทียบบุหรี่:** PM2.5 หาร 22 ≈ จำนวนมวนบุหรี่ต่อวันที่ปอดได้รับเทียบเท่า
(Berkeley Earth rule of thumb: cigarettes/day = PM2.5 / 22)

**ไม่มีข้อมูล ≠ ปลอดภัย:** ถ้าไม่มีค่าตรวจวัดล่าสุด ระบบแสดง "ข้อมูลไม่พอ"
ไม่แสดงสีเขียว — ความเงียบไม่ใช่ความปลอดภัย
No data is never shown as all-clear.

## อีกกี่ชั่วโมงต้องหนี · Hours to act

คำถามที่สำนักชลประทานและผู้ว่าฯ ต้องการคำตอบไม่ใช่ "ระดับน้ำเท่าไหร่" แต่คือ
"อีกกี่ชั่วโมงต้องเก็บของหนี" ระบบคำนวณให้ดังนี้:

- **อัตราการขึ้นของน้ำ** = ความชันกำลังสองน้อยที่สุด (least squares) จากค่าระดับน้ำ
  ย้อนหลัง 7 วันในฐานข้อมูล ต้องมีอย่างน้อย 3 จุดจึงจะเชื่อถือได้
- **เวลาถึงตลิ่ง** = ระยะเหลือถึงตลิ่ง ÷ อัตราการขึ้น (ปัดเป็นชั่วโมง)
- ต่ำกว่า 5 มม./ชม. ถือว่าน้ำทรงตัว ไม่ใช่กำลังขึ้น (เป็นสัญญาณรบกวนของเซ็นเซอร์)
- เกิน 72 ชม. ไม่ประกาศเป็นตัวเลข เพราะไม่มีความหมายเชิงปฏิบัติ

**ในโหมดสาธิต (`?scenario=`)** ไม่มีข้อมูลย้อนหลังในฐานข้อมูล ระบบจึงสร้างแนวโน้ม
จำลองแบบคงที่ให้แต่ละสถานีตามสถานะของตัวเอง เพื่อให้เห็นตัวเลข "อีกกี่ชั่วโมง" ได้จริง
ในการสาธิต และกำกับไว้ชัดเจนว่า "แนวโน้มจำลอง · scenario trend" ไม่ใช่ข้อมูลย้อนหลังจริง
ข้อมูลสดและข้อมูลสำรอง (modeled) ที่ยังไม่มีประวัติจะยังคงบอกว่าไม่มีข้อมูลพอ ไม่สร้างตัวเลขขึ้นมาเอง
แนวโน้มจำลองไม่ปนกับแถวจริงในฐานข้อมูล — สถานการณ์จำลองต้องซ้ำได้ทุกเครื่อง

**กฎความซื่อสัตย์ 3 ข้อ:**
1. น้ำล้นตลิ่งที่ "สังเกตได้จริง" ชนะการพยากรณ์เสมอ — แสดง "ล้นตลิ่งแล้ว" ไม่ใช่ตัวเลข
2. ถ้าระยะถึงตลิ่งติดลบแต่ไม่มีการยืนยันระดับวิกฤต = หมุดระดับผิด ไม่ใช่น้ำท่วม —
   ระบบแจ้งว่า "ค่าไม่น่าเชื่อถือ" และไม่ประกาศเวลาเด็ดขาด
3. ไม่มีข้อมูลย้อนหลังพอ = บอกว่าไม่พอ ไม่ใช่แต่งตัวเลขนับถอยหลัง

**ต้องสงสัยสิ่งกีดขวาง (blockage watch):** ถ้าเซ็นเซอร์สองตัวอยู่บนลำน้ำเดียวกัน
แต่ปริมาณน้ำที่ผ่านต่างกันมาก (ตัวท้ายน้ำเหลือน้อยกว่า 60%) แปลว่าน่าจะมีสิ่งกีดขวาง
หรือประตูระบายระหว่างสองจุด — เป็นสัญญาณให้ไปตรวจ ไม่ใช่คำตัดสิน
(หลักการ: ถ้าไม่มีอะไรขวาง ความเร็วน้ำต้องไม่เปลี่ยน)

## หลังคาเมือง: ระบบรู้ได้อย่างไรว่าเป็นหลังคาแบบไหน · Roof forms

ลพบุรีเป็นเมืองเตี้ย การวาดอาคารเป็นกล่องสี่เหลี่ยมทิ้งข้อมูลสำคัญที่สุดไป
นั่นคือ "หลังคา" — ตึกแถวหน้าแคบเป็นดาดฟ้าแบน บ้านทั่วไปเป็นจั่ว วัดเป็นหลังคาซ้อนชั้น
มัสยิดเป็นโดม ปรางค์เป็นทรงเรียวซ้อนชั้น ระบบจึงอ่านภาพถ่ายทางอากาศทีละอาคาร

**ขั้นตอน:**
1. ดึงผังอาคาร (footprint) จาก OpenStreetMap ผ่าน Overpass เฉพาะเขตเมือง 6 แห่ง
2. หาแกนของอาคารเอง (สี่เหลี่ยมพื้นที่น้อยที่สุด) แล้วดึงภาพถ่ายทางอากาศมาจัดวางใหม่
   ตามแกนนั้น — "ตัดขวางหลังคา" จึงเป็นแกนเดียวกันเสมอไม่ว่าบ้านจะหันทางไหน
3. ตัดขอบเข้ามา 0.6 ม. เพื่อไม่ให้ชายคา รางน้ำ หรือผนังบ้านข้าง ๆ มีสิทธิ์ออกเสียง
4. วัดสิ่งที่ฟิสิกส์บอกได้:
   - **รอยต่อกลางหลังคา** หลังคาเอียงสองด้านคือระนาบสองระนาบที่รับแดดต่างมุม
     ในภาพถ่ายจึงเห็นเป็น "ขั้น" ความสว่างกลางหลังคา ไม่ใช่การไล่เฉด
   - **ขั้น หรือ ทางลาด** ระบบเทียบสองสมมติฐานตรง ๆ ว่าอธิบายภาพได้ดีกว่ากัน —
     ถ้าเป็นทางลาดยาวตลอด ไม่มีขั้น = เพิงหมาแหงน ไม่ใช่จั่ว
   - **สันหลังคายาวถึงผนังหัวท้ายไหม** ถ้าความต่างของสองระนาบจางลงที่ปลายอาคาร
     แปลว่าปลายถูกตัดเอียง = ปั้นหยา ไม่ใช่จั่ว
   - **สีและความซับซ้อนของผิว** กระเบื้องวัดสีส้ม/แดง/เขียวอิ่มตัว มีแถบทอง (ช่อฟ้า/หน้าบัน)
     และมีขอบซ้อนหลายชั้น
   - **สัดส่วนผัง** หน้ากว้าง ≤ 9 ม. ลึกกว่ากว้าง = ตึกแถว, ผังเกือบกลม = โดม
5. นำผลจากภาพมาชั่งกับแท็ก OSM (วัด/มัสยิด/โรงเรียน/roof:shape) แล้วเลือกคะแนนสูงสุด

**กติกาความซื่อสัตย์ของชั้นนี้:**
- ทุกอาคารบอกได้ว่า "ตัดสินจากภาพถ่าย" หรือ "จากแท็ก OSM" หรือ "จากสัดส่วนอาคาร"
  พร้อมเหตุผลเป็นภาษาไทย กดที่อาคารเพื่ออ่านได้ทันที
- ผังที่ไม่เป็นสี่เหลี่ยมพอ (เช่นตัว L) ระบบไม่ยอมวางสันหลังคาให้ — แสดงเป็นดาดฟ้าแทน
  เพราะเดาทิศสันไม่ได้
- **ความสูงเป็นค่าประมาณเสมอ** จากแท็กความสูง → จำนวนชั้น × 3.2 ม. → ค่ามาตรฐานของอาคาร
  ประเภทนั้น ไม่ใช่ค่ารังวัด และป้ายบอกที่มาทุกครั้ง
- พื้นที่ที่ยังไม่ได้อ่านภาพถ่าย ระบบใช้ผังอาคารจากแผนที่เวกเตอร์ที่โหลดอยู่แล้ว
  และประมาณรูปทรงหลังคาจาก "สัดส่วนอาคาร" เท่านั้น พร้อมป้ายกำกับชัดเจนว่า
  "ยังไม่ได้อ่านภาพถ่ายทางอากาศ" — เห็นเมืองเป็นสามมิติได้ทันทีโดยไม่อ้างว่าเป็นของจริง

Roof forms are read from aerial imagery with classical CV (brightness
step across the ridge, step-vs-ramp model selection, hip taper, tile
colour, edge density) and weighed against the OSM tag. Every building
reports which evidence decided it. Heights are always estimates and say
so. Unrectangular footprints get a flat deck rather than an invented ridge.

## ถาม AI ค้นคำตอบอย่างไร · How the chatbot retrieves

ช่อง "ถาม AI" ไม่ได้ถามอินเทอร์เน็ต แต่ค้นจากคลังของระบบเอง 3 ส่วน:
ความรู้จังหวัดที่เรียบเรียงไว้ แค็ตตาล็อกชุดข้อมูลเปิด data.go.th ที่กวาดมา และ
สถานการณ์สดขณะนั้น (ระดับน้ำ เขื่อน ฝุ่น ประกาศกรมอุตุฯ) แล้วจึงให้โมเดลภาษาเรียบเรียง

**การจัดอันดับใช้ BM25 ไม่ใช่การนับคำ** เพราะทุกชุดข้อมูลในคลังพูดคำว่า "ลพบุรี"
นับร้อยครั้ง การนับจำนวนครั้งจึงตอบทุกคำถามด้วยไฟล์ที่ยาวที่สุด (ถามเรื่องฝุ่น
แล้วได้ทะเบียนหมู่บ้านกองทุนแม่ฯ) BM25 แก้สองจุด: คำที่พบในทุกเอกสารแทบไม่มีน้ำหนัก
(IDF) และเอกสารยาวไม่ได้เปรียบเอกสารสั้นที่ตอบตรงกว่า (length normalisation)

**ตัดคำซ้ำซากทิ้งก่อนค้น** ภาษาไทยไม่เว้นวรรค การตัด 3 ตัวอักษรจึงสร้าง "คำ" ปลอม
ตัวร้ายที่สุดคือ "จังหวัด" ซึ่งมี "วัด" อยู่ข้างใน — คำถามว่าจังหวัดมีวัดกี่แห่ง
เคยไปตรงกับทุกเอกสารที่พูดว่า "จังหวัด" ระบบจึงตัดคำว่า จังหวัด/ลพบุรี ออกจากทั้ง
คำถามและเอกสารก่อนจัดอันดับ

**ชุดข้อมูลเดียวห้ามกินคำตอบทั้งหมด** หลักฐานที่ส่งให้โมเดลจำกัดไม่เกิน 2 ท่อนต่อ
ชุดข้อมูล คำตอบหนึ่งครั้งจึงมาจากหลายแหล่ง ไม่ใช่ตารางเดียวซ้ำ 8 แถว

**ถ้าไม่มีอะไรตรงจริง ๆ ต้องบอกว่าไม่มี** คะแนนอย่างเดียวแยกไม่ออกระหว่างคำถาม
นอกเรื่องกับคำถามในเรื่อง (วัดแล้ว: คำถามเรื่องราคาทองยังได้คะแนนสูงกว่าคำถามจริงบางข้อ)
ระบบจึงดูว่าคำถามกับหลักฐานมี "ข้อความยาวร่วมกัน" อย่างน้อย 6 ตัวอักษรหรือไม่
ถ้าไม่มี ถือว่าไม่ตรง ระบบจะไม่เอาหลักฐานที่ไม่เกี่ยวมาแสดงเป็นคำตอบ แต่บอกตรง ๆ
ว่าไม่พบข้อมูลที่ตรงกับคำถามนี้ และบอกว่าระบบครอบคลุมเรื่องใดบ้าง

The chatbot ranks with BM25 (IDF + length normalisation), strips the
"จังหวัด/ลพบุรี" boilerplate that otherwise decides every ranking (and
whose "วัด" substring broke temple questions), caps each dataset at two
chunks per answer, and refuses to dress up a stray match: unless the
question shares a 6-character run with its best evidence, it says so
instead of citing something irrelevant.

## เขื่อน: บัญชีน้ำ · The Water Ledger

เขื่อนป่าสักชลสิทธิ์ (ความจุ ~960 ล้าน ลบ.ม.) คือ "บัญชี" ระหว่างสองฤดู:
- ฤดูมรสุม (พ.ค.–ต.ค.): ทุกการระบายคือประกันน้ำท่วมท้ายน้ำ ทุกการเก็บคือน้ำแล้งปีหน้า
- ฤดูแล้ง: น้ำต้นทุนถูกจ่ายให้อ้อยและนาข้าวจนกว่าฝนกลับมา
- ระบาย > 30 ล้าน ลบ.ม./วัน = "เพิ่มการระบาย" — แจ้งเตือนอำเภอท้ายน้ำ (พัฒนานิคม ท่าหลวง)

## เหตุการณ์สด · Live incidents (Longdo/iTIC)

- รับเฉพาะประเภทที่เป็น "เหตุการณ์" จริง: อุบัติเหตุ น้ำท่วม ไฟไหม้ รถติด ปิดถนน ฝนหนัก แผ่นดินไหว ชุมนุม เตือนภัย
- ตัดงานก่อสร้างระยะยาว (diversion) และเหตุการณ์ที่ประกาศยาวเกิน 24 ชม. (เป็น "สภาพถาวร" ไม่ใช่เหตุการณ์)
- เวลาในฟีดเป็นเวลาไทยไม่ระบุโซน — ระบบแปลงให้ถูกก่อนคำนวณหมดอายุ

## โซเชียล · Social listening

คำค้น "ลพบุรี" + "Lopburi" จาก Google News RSS และ GDELT วิเคราะห์อารมณ์ด้วยคลังคำ
(ไม่ใช่ AI ทำนาย) — บวก/กลาง/ลบ ตรวจสอบย้อนกลับได้ทุกรายการ

## กติกาความซื่อสัตย์ · The honesty rules

1. ทุกตัวเลขมีป้ายแหล่งที่มา (สด / จำลอง / แบบจำลอง) — ไม่มีตัวเลขแต่งขึ้น
2. ภาพกล้องสาธิตติดป้าย "สาธิต DEMO" สีเหลืองเสมอ พร้อมลิงก์ต้นทางและตำแหน่งจริง
3. ข้อมูลไม่พอ = บอกว่าไม่พอ ไม่ใช่สีเขียว
4. ชุดข้อมูลที่ระบบอ่านไม่ได้ ถูกบันทึกไว้ให้เห็น (listed/failed) ไม่ถูกซ่อน
5. เมื่อฟีดสดล่ม ระบบใช้แบบจำลองอ้างอิงและติดป้ายชัดเจน — จอไม่มืด แต่ไม่โกหก
