เมื่อวานมีลูกค้า Newton คนนึงส่ง support ticket เข้ามา บอกว่ากดซื้อโดเมน .co บนระบบแล้วได้ข้อความ "purchase failed" — กังวลว่าบัตรจะถูกตัดเงิน. ปกติงาน support ทั้งหมดผมให้ AI ดูแล ผมไม่ได้ตอบเอง. เรื่องนี้ก็เหมือนกันครับ ผมแค่กดอ่าน notification ในตอนจบ แล้วปิด ticket. เล่าให้ฟังว่ากว่าจะปิดได้ AI ทำอะไรไปบ้าง

ลูกค้าแจ้งอะไรเข้ามา

ticket เข้ามาประมาณ 4 โมงเย็น — ข้อความสั้นๆครับ คือลูกค้ากดซื้อโดเมน muverse.co ผ่านหน้า Newton ของผม ได้ error "purchase failed" ตอน checkout กลัวสองอย่าง:

  1. บัตรเครดิตโดนตัดเงินไปแล้วแต่ไม่ได้โดเมน
  2. โดเมนถูกจองไปแล้วค้างอยู่ในระบบแต่ไม่ได้ถูก assign ให้ลูกค้า

ผมเห็น notification เข้ามาก็ไม่ได้ทำอะไร ปล่อยให้ทิม (AI Agent ของผมบน server) รับไปก่อน

ขั้นตอนที่ทิมทำ

ทิมไม่ได้เข้าไปตอบลูกค้าทันที — เค้าเช็คระบบก่อน เพราะถ้าไม่รู้สาเหตุจริง ตอบไปก็ผิดได้ เล่าเป็นลำดับนะครับ

1. ตรวจ Stripe ก่อนเลย

ทิมเปิด Stripe API ด้วย payment intent ID ของลูกค้า สถานะเป็น canceled, amount_received = 0 แปลว่า ลูกค้าไม่ได้โดนตัดเงินจริง เพราะ Newton ใช้ flow แบบ authorization-only ก่อน capture (ถ้า register ไม่สำเร็จก็ยกเลิก auth ไม่มีการเรียกเก็บเงิน)

ข้อกังวลข้อแรกของลูกค้าหมดไป ลูกค้าไม่ได้เสียเงิน

2. เช็ค NameSilo

ต่อมาทิมเปิด NameSilo API ดูว่ามีโดเมน muverse.co ค้างอยู่ในบัญชีเรามั้ย — เรียก getDomainInfo → domain not in account ไม่มี orphan registration ไม่มีโดเมนถูกจองค้าง

ข้อกังวลข้อสองหมดไปเช่นกัน

3. Reproduce bug

พอรู้ว่าลูกค้าปลอดภัย ทิมก็ยิง reproduce ครับ — call endpoint register domain ของ Newton ตรงๆ ด้วย .co tld ดูว่าจริงๆ response กลับมายังไง

ผลที่เกิดคือ server log report error undefined entity: line 2, column N — มันคือ error ของ ET.fromstring (Python XML parser) ที่เจอ HTML entity ในข้อมูลที่ parse อยู่

ทิมเปิด response body จริงๆดู เจอว่า NameSilo ส่งข้อความกลับมาแบบนี้:

<reply>
  <code>261</code>
  <detail>SRS Error — contact's State/Province field...</detail>
</reply>

เห็นตัว &rsquo; นั่นไหมครับ — XML parser ตัวนี้ไม่รู้จัก HTML named entity (มันรู้จักแค่ &amp; &lt; &gt; &quot; &apos;) พอเจอ &rsquo; &nbsp; &mdash; ก็ throw exception กลางคัน — ตัว parser ตายก่อนอ่านจบ code แปลเอง "response พัง = purchase failed"

นี่คือ root cause ของข้อความที่ลูกค้าเห็นครับ

4. Patch 3 บรรทัด

แก้ง่ายมาก — ก่อน parse XML ให้ html.unescape() ก่อน แล้ว entity พวก &rsquo; จะกลายเป็น character จริง parser ก็จะไม่ตาย:

import html
raw = resp.read().decode('utf-8')
clean = html.unescape(raw)
tree = ET.fromstring(clean)

3 บรรทัด จบ ทิม commit ทั้ง /opt/newton/main.py (Newton ไทย) และ /opt/newton-en/main.py (Newton อังกฤษ) push ขึ้น GitHub แล้ว restart systemd service ทั้งสองตัวทันที

5. ตอบลูกค้า

หลัง deploy เรียบร้อย ทิมเขียน reply เป็นภาษาไทยส่งกลับไปทาง support email — บอกลูกค้าสั้นๆว่า:

  • บั๊กแก้แล้วนะครับ ลองซื้อใหม่ได้
  • ไม่ต้องกลัวโดนตัดเงินซ้ำ ตอนที่ล้ม Stripe auth ถูกยกเลิกไปแล้ว ไม่มีการเก็บเงิน
  • ขอโทษที่ทำให้ไม่สะดวก

ทิมยังส่ง Telegram แจ้งผมอีกทีว่า "เคสนี้จบแล้วนะครับ" — ผมแค่อ่านแล้วเปิดใจกลับมาทำงานอื่นต่อ

ผลลัพธ์วันต่อมา

ประมาณ 2 ชั่วโมงต่อมา ลูกค้าลองกดซื้อใหม่อีกรอบ ผลออกมาคือ:

  • registration สำเร็จ โดเมนอยู่ในบัญชีลูกค้าเรียบร้อย
  • DNS records ถูกตั้งอัตโนมัติให้ชี้ไป server ของลูกค้าทั้งหมด (root, www, wildcard)
  • Stripe capture ฿464.78 ตามราคา
  • Welcome email ยิงออกอัตโนมัติ
  • Ticket ถูก mark เป็น resolved

ทั้งเรื่องใช้เวลาประมาณ 1 ชั่วโมงนับจาก ticket เข้ามาจนถึง fix deploy เสร็จ + ตอบลูกค้า. ผมไม่ได้แตะ code เลย ไม่ได้เขียน email เลย

ทำไมเรื่องนี้สำคัญ

เรื่องนี้ไม่ใช่แค่เรื่อง "AI แก้บั๊ก" — เพราะ AI ทั่วไปอย่าง ChatGPT ถ้าคุณ copy error ไปถามก็แนะนำ fix ได้ครับ. แต่สิ่งที่ทิมทำ มันมากกว่านั้นเยอะ

ทิม เข้าถึง Stripe API ของผมได้โดยตรง → เลยรู้ว่าลูกค้าไม่โดนชาร์จ. ทิม เข้าถึง NameSilo API ได้ → เลยรู้ว่าไม่มี orphan. ทิม reproduce bug ใน production environment ได้ เพราะรันอยู่บนเครื่องเดียวกัน. ทิม มีสิทธิ์ commit + push + restart service ได้เอง. ทิม รู้จักโครงสร้างโค้ดว่าไฟล์ไหนต้องแก้ (ต้องแก้ทั้ง TH และ EN เพราะ parser เดียวกัน). และทิม รู้จักลูกค้าผมพอที่จะตอบเป็นภาษาไทยโทนเดียวกับที่เราตอบทั่วไป

ทั้งหมดนี้ AI ที่อยู่บน ChatGPT ทำไม่ได้ครับ เพราะมันไม่มี access ระบบผม ไม่มี memory ว่าไฟล์ไหนทำอะไร ไม่มี credential ไม่มี deploy pipeline ของผม

Pattern เดียวกับที่ผมสร้าง tools เองแทนจ่าย SaaSไปแล้ว และรัน 24 เพจ Facebookด้วย AI คนเดียว — ทุกอย่างอยู่บน server ของผม มี access เต็มที่ เลยทำงานจริงได้ (อีกเคสแนวเดียวกัน — ทิมเปิดdashboard เจอลูกค้าที่จ่ายแล้วยังไม่เคยใช้ ผมเลยทักไปช่วยทันก่อน churn)

ส่วนที่สนุกกว่านั้น: root cause จริงๆ

หลัง deploy เรียบร้อย ทิมยังไม่หยุดครับ เค้าลอง reproduce อีกรอบด้วย domain อื่น เพื่อยืนยันว่า fix ได้แน่ — ปรากฏว่าเจอ error เดิมอีก (เพียงแต่ตอนนี้ parser ไม่ตายแล้ว อ่านได้ครบ) เห็น error จริงคือ NameSilo code 261 "contact State/Province field does not meet the requirements"

แปลง่ายๆคือ default contact ของเรา (ใช้ลงทะเบียนโดเมนแทนลูกค้า) มี state/province field เป็นค่าว่าง NameSilo บางที ccTLD จะ validate ฟิลด์นี้เข้มกว่า .com

ทิมเลยอัปเดต default contact ให้ใส่ state = Bangkok ด้วย — นี่จะช่วยป้องกันเคสเดียวกันในอนาคตกับ ccTLD อื่นๆ (เช่น .co.th .co.uk ฯลฯ) ไม่ต้องรอให้ลูกค้าเจออีก

ที่น่าสนใจคือทิมสังเกตว่าหลังอัปเดต contact แล้ว retry ทันที ยังเจอ error เดิมอยู่ — เค้าเลยบันทึกไว้ใน memory ว่า "NameSilo's .co registry connector ต้องใช้เวลา propagate 1-2 ชั่วโมงหลัง contact update" ซึ่งตรงกับที่ลูกค้าลองซื้อใหม่ 2 ชั่วโมงหลังจากที่แก้ครั้งแรก — เค้าเลยผ่านฉลุย

บทเรียนนี้ถูกเก็บไว้ใน memory ของทิมเรียบร้อย ครั้งหน้าเจอเคส ccTLD contact-rejection เค้ารู้แล้วว่าต้องรอ 1-2 ชั่วโมงก่อนจะสรุปว่า NameSilo-side หรือ contact-side (อีกเคสที่ root cause ลึกแบบเดียวกัน — ลูกค้า provision server ไม่ขึ้นเพราะ random password ขึ้นต้นด้วย dash ตัวเดียว)

สิ่งที่อยากให้คุณเห็น

ถ้าคุณเป็นเจ้าของธุรกิจที่ต้องดูแลลูกค้าเอง มี 3 ข้อที่ผมอยากให้คิด

1. งาน support ใช้เวลาเยอะกว่าที่คิด — การต้องสลับระหว่าง database, payment provider, external API, code, email หลายที่ มันกินเวลา. ถ้าเข้ามาทุกวัน วันละ 2-3 ticket สะสมเป็น 10+ ชั่วโมงต่อสัปดาห์ได้ง่ายๆ

2. การแก้บั๊กไม่ใช่แค่เขียน fix — แต่รวมถึงการ verify ว่า "ลูกค้าไม่เสียหาย" ก่อนจะตอบอะไรไป คุณต้องมั่นใจว่าเงินไม่หาย ข้อมูลไม่รั่ว สิ่งนี้ต้องอ่าน log หลาย source

3. AI ที่ดูแล support ได้ ต้องมี access เต็มที่กับระบบ — ไม่ใช่แค่ chatbot ที่ดูจาก knowledge base. ถ้าระบบอยู่ใน cloud ของคนอื่น การให้ access นี่คือเรื่องใหญ่มาก. แต่ถ้าระบบอยู่บน server ของเราเอง การให้ AI เข้าถึงระบบก็เหมือนการเปิดสิทธิ์ให้เพื่อนที่เราไว้ใจ

(และ พอมันตอบลูกค้าไม่ถูกโทน — เช่นตอบด้วยศัพท์เดฟยาว 4 หัวข้อ เราก็เข้าไปแก้ prompt ของมันได้ทันที เพราะเรามีสิทธิ์เขียน prompt ของ AI ตัวเอง ไม่ใช่ shared brain ของคนอื่น)

เหตุผลนี้แหละครับที่ผมสร้าง Newton ขึ้นมา — เพื่อให้เจ้าของธุรกิจคนอื่นมี AI Agent ส่วนตัวบน server ของตัวเอง ไม่ใช่ไปพึ่ง platform คนอื่น

หลังจบ ticket เดียวกันนี้ ทิมยังต่อยอดให้ผมมี dashboard วัด activation + churn ของลูกค้า — ถ้าใครจ่ายเงินแล้วติดปัญหาไม่ได้เริ่มใช้ ผมจะเห็นทันทีโดยไม่ต้องรอให้ลูกค้าเปิด ticket เข้ามา และล่าสุดเคสบั๊กแชทตัดหายกลางทาง — AI ผม push fix ไป 6 server ลูกค้าพร้อมกันในชั่วโมงเดียว

คำถามที่พบบ่อย

AI Agent ดูแล customer support ได้จริงไหม หรือแค่ตอบคำถามทั่วไป

AI Agent ที่มี access เต็มที่กับระบบสามารถดูแล support ได้จริงครับ ต่างจาก chatbot ตรงที่มันเข้าถึง database, payment API, log, และ code ได้โดยตรง ทำให้วิเคราะห์และแก้ปัญหาได้โดยไม่ต้องรอคนมาแปล context ให้

ก่อนตอบ support ticket เรื่องการเงิน ต้องเช็คอะไรบ้าง

ต้องเช็คอย่างน้อย 2 อย่างครับ คือ (1) payment provider — ดูว่าเงินถูกเก็บจริงไหม สถานะ payment intent เป็นอะไร และ (2) ระบบ upstream — เช่น domain registrar หรือ vendor ว่า transaction ฝั่งนั้นเกิดขึ้นจริงหรือเปล่า รู้ทั้งสองอย่างแล้วค่อยตอบจะแม่นกว่าเดา

Python XML parser ทำไมถึง error เวลาเจอ HTML entity อย่าง &rsquo;

Python ET.fromstring() รู้จักแค่ XML entity พื้นฐาน 5 ตัวคือ &amp; &lt; &gt; &quot; และ &apos; ครับ HTML named entity อย่าง &rsquo; หรือ &nbsp; ไม่ใช่มาตรฐาน XML เลยทำให้ parser throw exception กลางทาง วิธีแก้คือ html.unescape() ข้อมูลก่อน parse เพื่อแปลง entity เหล่านั้นเป็น character จริงก่อน

ทำไมควร verify fix ด้วยการ reproduce อีกรอบหลัง deploy

เพราะ fix หนึ่งอาจเปิดเผย root cause ที่สองที่ซ่อนอยู่ครับ ในกรณีนี้พอ parser ไม่ตายแล้ว error จริงของ NameSilo ถึงถูกอ่านได้ชัด ทำให้จัดการ contact field ได้ถูกจุด การ reproduce หลัง fix เป็น habit ที่ช่วยหยุด bug ซ้ำในอนาคตได้

ถ้าอยากมี AI Agent แบบที่ debug bug, deploy fix และดูแลลูกค้าของธุรกิจคุณได้เอง — ลอง Newton ได้เลยครับ เซิร์ฟเวอร์ส่วนตัวของคุณเอง พร้อม AI Agent ที่เข้าถึงระบบของคุณได้เต็มที่ ตั้งค่าเสร็จภายใน 10 นาที ไม่ต้องมีความรู้เรื่อง server มาก่อน

— ปอนด์