bot นี้ทำอะไรได้บ้าง?
สมมติคุณขายเสื้อผ้าออนไลน์ในกรุงเทพฯ ลูกค้าทักทาง LINE ถามไซซ์ ค่าส่ง เวลาส่ง และวิธีสั่งซื้อซ้ำ ๆ ทั้งวัน bot นี้จะอ่านข้อความ ตอบจากข้อมูลร้านที่คุณเขียนไว้ และบอกให้ลูกค้ารอแอดมินถ้าเป็นเรื่องที่ตอบเองไม่ได้ เช่นการคืนเงิน
โครงสร้างมีสามส่วน: LINE ส่งข้อความมาที่ webhook ของคุณ → เซิร์ฟเวอร์ Python เรียกโมเดล AI ผ่าน https://api.macloudai.com/v1 → ส่งคำตอบกลับไปทาง LINE โค้ดฝั่งเราอยู่ด้านล่างครบทั้งไฟล์
ขั้นตอนทั้งหมด
- ใน LINE Developers Console สร้าง provider และ channel แบบ Messaging API ให้ร้านของคุณ
- ในหน้าตั้งค่า channel คัดลอก channel secret และออก channel access token เก็บไว้
- ใน MaCloud AI ไปที่ API Key สร้างคีย์ชื่อ
line-botแล้วคัดลอก - นำโค้ด Python ด้านล่างขึ้นเซิร์ฟเวอร์ที่มี HTTPS แล้วตั้งค่าตัวแปร 3 ตัว
- กลับไปที่ LINE Developers ใส่ webhook URL เป็น
https://โดเมนของคุณ/callbackแล้วเปิดใช้ webhook - แอดบัญชี LINE ของร้านเป็นเพื่อนด้วยมือถือ ส่งข้อความทดสอบ แล้วดูค่าใช้จ่ายในหน้าการใช้งาน
ฝั่ง LINE ชื่อเมนูและหน้าตาอาจเปลี่ยนตามเวอร์ชัน ให้ยึดเอกสารทางการของ LINE เป็นหลัก สิ่งที่ต้องได้มามีแค่ channel secret, channel access token และช่องสำหรับใส่ webhook URL ถ้าบัญชีตั้งข้อความตอบกลับอัตโนมัติไว้ ให้ปิดก่อน ไม่อย่างนั้นลูกค้าจะได้สองคำตอบ
โค้ดเซิร์ฟเวอร์ Python
ติดตั้งด้วย pip install flask openai requests แล้วบันทึกเป็น app.py:
import base64, hashlib, hmac, os
import requests
from flask import Flask, abort, request
from openai import OpenAI
LINE_SECRET = os.environ["LINE_CHANNEL_SECRET"]
LINE_TOKEN = os.environ["LINE_CHANNEL_ACCESS_TOKEN"]
ai = OpenAI(base_url="https://api.macloudai.com/v1", api_key=os.environ["MACLOUD_API_KEY"])
SHOP_INFO = """คุณคือแอดมินร้านเสื้อผ้าออนไลน์ในกรุงเทพฯ ตอบสุภาพ สั้น เป็นภาษาไทย
- ส่งทั่วประเทศ ในกรุงเทพฯ ได้รับใน 1-2 วัน ต่างจังหวัด 2-4 วัน
- เสื้อมีไซซ์ S M L XL ดูตารางไซซ์ในโพสต์ของร้าน
- เปลี่ยนไซซ์ได้ภายใน 7 วัน
ถ้าลูกค้าถามเรื่องคืนเงิน สถานะพัสดุ หรือเรื่องที่ไม่มีในข้อมูลนี้ ให้บอกว่าแอดมินจะติดต่อกลับ"""
app = Flask(__name__)
def ask_ai(text):
r = ai.chat.completions.create(
model="gem-3.8-flash",
max_tokens=300,
messages=[
{"role": "system", "content": SHOP_INFO},
{"role": "user", "content": text},
],
)
return r.choices[0].message.content
def reply(reply_token, text):
requests.post(
"https://api.line.me/v2/bot/message/reply",
headers={"Authorization": f"Bearer {LINE_TOKEN}"},
json={"replyToken": reply_token, "messages": [{"type": "text", "text": text[:4900]}]},
timeout=10,
)
@app.post("/callback")
def callback():
body = request.get_data()
sig = base64.b64encode(hmac.new(LINE_SECRET.encode(), body, hashlib.sha256).digest()).decode()
if not hmac.compare_digest(sig, request.headers.get("X-Line-Signature", "")):
abort(400)
for ev in request.get_json().get("events", []):
if ev.get("type") == "message" and ev["message"].get("type") == "text":
try:
answer = ask_ai(ev["message"]["text"])
except Exception:
answer = "ขออภัย ระบบตอบอัตโนมัติขัดข้อง แอดมินจะตอบกลับเร็ว ๆ นี้"
reply(ev["replyToken"], answer)
return "OK"
if __name__ == "__main__":
app.run(host="0.0.0.0", port=int(os.environ.get("PORT", 8000)))
โค้ดนี้ตรวจลายเซ็นของ LINE ด้วย channel secret ก่อนทุกครั้ง คำขอที่ไม่ได้มาจาก LINE จะถูกปฏิเสธ ถ้าเรียก AI ไม่สำเร็จ (เช่นยอดเงินหมดหรือโมเดลขัดข้อง) ลูกค้าจะได้ข้อความขออภัยแทนการเงียบหาย
รันและตั้ง webhook
export LINE_CHANNEL_SECRET=...
export LINE_CHANNEL_ACCESS_TOKEN=...
export MACLOUD_API_KEY=sk-...
python app.py
LINE ต้องการ webhook ที่เป็น HTTPS เซิร์ฟเวอร์ VPS ทั่วไปหรือบริการโฮสต์ที่ให้ HTTPS ก็ใช้ได้ ตอนทดสอบในเครื่องตัวเองใช้เครื่องมือ tunnel ที่ให้ที่อยู่ HTTPS ชั่วคราวก็ได้ เมื่อได้ที่อยู่แล้ว ใส่ในช่อง webhook URL ของ channel ต่อท้ายด้วย /callback แล้วกดตรวจสอบในหน้าเดียวกัน
ค่าใช้จ่ายต่อแชตประมาณเท่าไร?
ค่า AI คิดตาม token: ข้อมูลร้านใน SHOP_INFO กับข้อความลูกค้าเป็น token อินพุต คำตอบเป็น token เอาต์พุต ข้อมูลร้านถูกส่งทุกครั้ง จึงควรเขียนให้กระชับ ราคาต่อ 1 ล้าน token เป็นบาทของแต่ละโมเดล:
ราคาจริงตอนนี้
ประมาณจากราคาในหน้าโมเดล: แชทละ 2,000 token input และ 500 token output ยอดหักจริงดูได้ในคอนโซล
| โมเดล | ต่อแชท | 1,000 แชท |
|---|---|---|
| GEM 3.8 Flash | ฿0.0083 | ฿8.25 |
| TT-6 Luna | ฿0.02 | ฿19.8 |
| TT-6.1 Terra | ฿0.01 | ฿13.52 |
| HK-5.5 | ฿0.0065 | ฿6.49 |
| GEM 4 Argon | ฿0.16 | ฿158 |
| TT-6.1 Sol | ฿0.03 | ฿27.03 |
ตัวเลขจริงต่อแชตดูได้ในหน้าการใช้งาน หลังทดสอบไม่กี่ข้อความ วิธีคำนวณอยู่ในคู่มือค่า token ส่วนค่าบริการและโควตาข้อความของ LINE เป็นเรื่องแยกต่างหาก ให้ดูนโยบายและแพ็กเกจของ LINE Official Account
ทำให้ bot ฉลาดขึ้นและปลอดภัยขึ้น
- อยากให้จำบทสนทนา ให้เก็บข้อความล่าสุด 4-6 ข้อความต่อ
userIdแล้วส่งไปด้วย แต่ยิ่งยาวยิ่งเปลือง token - ร้านกาแฟในเชียงใหม่หรือร้านอาหารก็ใช้โค้ดเดียวกันได้ แค่เปลี่ยน
SHOP_INFOเป็นเมนู เวลาเปิด และวิธีจองโต๊ะ - อย่าให้ bot ยืนยันการชำระเงินหรือสัญญาเรื่องเงินเอง ให้ส่งต่อแอดมินเสมอ
- เก็บคีย์ทั้งสามไว้ในตัวแปรระบบของเซิร์ฟเวอร์ ห้ามใส่ใน repo