ระบบ AI ตรวจจับข้อความสแปมและฟิชชิ่งสำหรับผู้สูงอายุ
- Python 3.11+
- Docker Desktop (สำหรับรันแบบ container)
- Groq API Key — สมัครฟรีได้ที่ console.groq.com
- LINE Messaging API Channel — สร้างได้ที่ developers.line.biz (ถ้าต้องการใช้ LINE Bot)
pip install -r requirements.txt
python -m src.data.generator # สร้างชุดข้อมูล
python -m src.data.ingestion # แบ่ง train/val/test
python -m src.models.trainer # เทรนโมเดล (~2-3 นาที)สร้างไฟล์ .env (copy จาก .env.example):
cp .env.example .envแก้ไขค่าใน .env:
GROQ_API_KEY=ใส่ key ที่ได้จาก console.groq.com ตรงนี้
# LINE Bot (ไม่บังคับ — ข้ามได้ถ้าไม่ใช้)
LINE_CHANNEL_SECRET=ใส่ channel secret ตรงนี้
LINE_CHANNEL_ACCESS_TOKEN=ใส่ channel access token ตรงนี้
docker compose up -d| บริการ | URL |
|---|---|
| หน้าเว็บ (Streamlit) | http://localhost:8501 |
| API | http://localhost/docs |
| MLflow | http://localhost:5000 |
เปิด terminal 3 หน้าต่าง:
Terminal 1 — API:
set GROQ_API_KEY=ใส่ key ที่นี่
uvicorn src.api.main:app --reload --port 80Terminal 2 — หน้าเว็บ:
streamlit run app/streamlit_app.pyTerminal 3 — MLflow:
mlflow server --backend-store-uri mlruns --host 0.0.0.0 --port 5001ส่ง POST request ไปที่ /predict:
curl -X POST http://localhost/predict \
-H "Content-Type: application/json" \
-d '{"text": "ยินดีด้วย! คุณได้รับรางวัล 100,000 บาท กดลิงก์เพื่อรับ: bit.ly/claim"}'ผลลัพธ์:
{
"label": "spam",
"label_th": "สแปม",
"confidence": 0.99,
"risk_level": "high",
"explanation": "พบคำเสี่ยง: รางวัล, กด | พบลิงก์ URL",
"confidence_source": "ml",
"llm_explanation": null
}เมื่อโมเดล ML ไม่มั่นใจ (confidence < 80%) ระบบจะเรียก Groq LLM โดยอัตโนมัติ:
{
"label": "ham",
"confidence": 0.87,
"confidence_source": "hybrid",
"llm_explanation": "ข้อความแจ้งเตือนดอกเบี้ยจากธนาคาร ไม่มีการขอข้อมูลส่วนตัวหรือลิงก์น่าสงสัย"
}ScamGuard รองรับ LINE Messaging API — ผู้ใช้ส่งข้อความมาที่บอทแล้วได้รับผลวิเคราะห์กลับเป็นภาษาไทยทันที
- ไปที่ developers.line.biz → Console
- สร้าง Provider → สร้าง Channel ประเภท Messaging API
- เข้าไปที่ Channel → Messaging API tab
- คัดลอก Channel secret (จาก Basic settings) และ Channel access token (กด Issue)
LINE_CHANNEL_SECRET=<channel secret>
LINE_CHANNEL_ACCESS_TOKEN=<channel access token>
ใน LINE Developers Console → Messaging API tab:
- เปิด Use webhook → ON
- ใส่ Webhook URL:
https://<your-domain>/line/callback - กด Verify — ต้องได้
200 OK - ปิด Auto-reply messages และ Greeting messages (ไม่งั้นบอทตอบซ้ำ)
Local development: ใช้ ngrok เพื่อให้ LINE เข้าถึง localhost ได้
ngrok http 80 # จะได้ URL เช่น https://xxxx.ngrok.io → ใช้ https://xxxx.ngrok.io/line/callback
🚨 ฟิชชิ่ง (หลอกลวง) | ความเสี่ยง: สูงมาก (98%)
พบคำที่ใช้หลอกลวง: รางวัล | พบลิงก์ URL ในข้อความ
⚠️ คำเตือน: รางวัล, URL
📞 โทร 1599 สายด่วนไซเบอร์ (ฟรี 24 ชม.)
git push main
│
▼
1. Lint — black, isort, flake8
2. Test — pytest + coverage ≥ 70%
3. Docker Build — ตรวจสอบว่า image build ได้
4. Deploy — SSH เข้า GCP VM อัตโนมัติ
git pull origin main ← ดึง code ใหม่
inject secrets → .env ← อัปเดต GROQ / LINE keys
docker compose build ← build image ใหม่
│
├── models/best_model.joblib มีอยู่แล้ว?
│ NO → docker compose run --rm train
│ (สร้างข้อมูล + เทรนโมเดล อัตโนมัติ)
│ YES → ข้ามการเทรน
│
docker compose up -d ← เริ่ม api + app + mlflow
ครั้งแรกที่ deploy: โมเดลยังไม่มี → เทรนอัตโนมัติ (~2-3 นาที) deploy ครั้งถัดไป: โมเดลมีอยู่แล้วบน VM disk → ข้ามการเทรน ทำให้เร็วขึ้น
ไปที่ Settings → Secrets and variables → Actions แล้วเพิ่ม:
| Secret | คำอธิบาย |
|---|---|
GCP_HOST |
IP หรือ hostname ของ GCP VM |
GCP_USER |
ชื่อ user สำหรับ SSH (เช่น ubuntu) |
GCP_SSH_KEY |
Private key สำหรับ SSH (ทั้งหมด รวม header) |
GCP_APP_PATH |
path ของโปรเจกต์บน VM (เช่น /home/ubuntu/scamguard) |
GROQ_API_KEY |
Groq API key |
LINE_CHANNEL_SECRET |
LINE channel secret |
LINE_CHANNEL_ACCESS_TOKEN |
LINE channel access token |
ผ่าน Docker (แนะนำ):
docker compose run --rm train
docker compose restart apiผ่าน Python โดยตรง:
python -m src.data.generator # สร้างข้อมูลใหม่
python -m src.data.ingestion # แบ่งชุดข้อมูล
python -m src.models.trainer # เทรน + บันทึกผลใน MLflow
docker compose restart apipip install -r requirements-dev.txt
pytest tests/ -v --cov=src --cov-report=term-missing