ทำไม AI ถึงไม่ใช่คำตอบสุดท้าย และทำไมเราต้องสร้างเขตแดนให้มัน
เวลาที่เราเขียนโปรแกรมเชื่อมต่อกับ AI (ปัญญาประดิษฐ์) หลายคนมักจะเชื่อใจคำตอบที่มันส่งกลับมาแบบร้อยเปอร์เซ็นต์ แต่ในโลกของการทำงานจริง ข้อมูลที่ AI ส่งมาอาจจะเป็น JSON (รูปแบบการเก็บข้อมูลแบบตัวอักษรที่คอมพิวเตอร์อ่านง่าย) ที่ถูกต้องตามโครงสร้าง แต่เนื้อหาข้างในกลับนำไปใช้งานต่อไม่ได้เลย เช่น ชื่อคิวงานที่ไม่มีอยู่จริง หรือค่าความมั่นใจที่ผิดพลาด
ลองจินตนาการว่าคุณเป็นพนักงานต้อนรับที่ต้องส่งจดหมายลูกค้าไปให้แผนกต่างๆ ถ้ามีคนส่งกระดาษเปล่ามาให้คุณ หรือส่งกระดาษที่เขียนว่า "ส่งไปแผนกเวทมนตร์" ซึ่งไม่มีอยู่จริง คุณย่อมไม่สามารถทำงานต่อได้ การสร้าง Decision Boundary (เขตแดนการตัดสินใจ) คือการเขียนโค้ดมาดักตรวจสอบข้อมูลก่อนที่เราจะเอาไปใช้งานจริง เพื่อให้มั่นใจว่าระบบของเราจะไม่พังเพราะข้อมูลขยะ
ในบทความนี้เราจะมาเขียนโค้ด JavaScript เล็กๆ เพื่อทำหน้าที่เป็น "ยามเฝ้าประตู" ให้กับระบบ AI ของเรา โดยเราจะเน้นไปที่การตรวจสอบความถูกต้องของข้อมูล (Validation) และการกำหนดเงื่อนไขว่าเมื่อไหร่ที่ AI ควรทำงานต่อ และเมื่อไหร่ที่ควรส่งเรื่องให้คนเข้ามาช่วยตัดสินใจแทน เพื่อให้แอปพลิเคชันของเราทำงานได้อย่างปลอดภัยและแม่นยำที่สุด
วางโครงสร้างข้อตกลงร่วมกับ AI (Contract)
ก่อนจะเริ่มเขียนโค้ด เราต้องมี Contract (ข้อตกลงระหว่างระบบ) ที่ชัดเจนก่อน เปรียบเสมือนการตกลงกับเพื่อนร่วมงานว่า "ถ้าฉันถามคุณ คุณต้องตอบกลับมาเป็นฟอร์มแบบนี้เท่านั้นนะ" หาก AI ส่งคำตอบที่นอกเหนือจากฟอร์มนี้มา ระบบของเราจะปฏิเสธการทำงานทันทีเพื่อป้องกันความผิดพลาด
เราจะกำหนดชุดตัวเลือก (Options) ให้ AI เลือก เช่น billing (การเงิน), support (ช่วยเหลือ), security (ความปลอดภัย) และ human (ให้คนจัดการ) หากเราเผลอไปเปลี่ยนชื่อตัวเลือกในระบบ AI แต่ไม่ได้อัปเดตโค้ดฝั่งเรา ระบบจะเกิดบั๊ก (ข้อผิดพลาดในโปรแกรม) ทันที ดังนั้นเราจึงต้องเก็บรายการตัวเลือกเหล่านี้ไว้ในตัวแปรกลางที่ทั้งสองฝั่งต้องอ้างอิง
นี่คือตัวอย่างการตั้งค่าคำถามที่ส่งไปให้ AI เพื่อให้ได้คำตอบที่คาดเดาได้:
// กำหนดตัวเลือกที่เรายอมรับได้เท่านั้น
const OPTIONS = ['billing', 'support', 'security', 'human'];
// ตัวอย่างโครงสร้างคำถามที่ส่งไปให้ AI
const requestBody = {
"questions": {
"route": {
"type": "choice",
"criteria": {
"billing": "คำถามเรื่องใบแจ้งหนี้",
"support": "คำถามเรื่องเทคนิค",
"security": "เรื่องความปลอดภัย",
"human": "เรื่องที่ AI ตัดสินใจไม่ได้"
}
}
}
};
ในโค้ดนี้เราประกาศตัวแปร OPTIONS เพื่อเป็นรายการหลักที่ใช้ตรวจสอบ requestBody คือโครงสร้างข้อมูลที่ส่งให้ AI โดยมี criteria เป็นคำอธิบายให้ AI เข้าใจว่าแต่ละทางเลือกหมายถึงอะไร ผลลัพธ์ที่ได้คือระบบจะยอมรับแค่ 4 คำนี้เท่านั้น ถ้า AI ตอบมาว่า "refund" (คืนเงิน) ซึ่งไม่อยู่ในรายการ ระบบจะตีกลับทันที
สร้างด่านตรวจข้อมูลด้วย JavaScript
เมื่อได้คำตอบจาก AI มาแล้ว เราต้องมีฟังก์ชันสำหรับตรวจสอบข้อมูลนั้นก่อนจะนำไปใช้ต่อ เราจะใช้ Node.js (สภาพแวดล้อมที่ช่วยให้รัน JavaScript นอกเบราว์เซอร์ได้) ในการเขียนฟังก์ชันนี้ โดยเน้นการตรวจสอบว่าค่าที่ส่งมาเป็นตัวเลขที่ถูกต้องหรือไม่ และโครงสร้างข้อมูลครบถ้วนตามที่เราตกลงกันไว้
มือใหม่มักพลาดตรงที่ลืมเช็คว่าค่าที่ได้เป็น null (ค่าว่างเปล่า) หรือไม่ หรือบางครั้ง AI อาจส่งค่ามาเป็น "0.9" (ที่เป็นข้อความ) แทนที่จะเป็น 0.9 (ที่เป็นตัวเลข) การตรวจสอบให้ละเอียดจะช่วยป้องกันปัญหา Runtime Error (ข้อผิดพลาดขณะโปรแกรมกำลังทำงาน) ที่อาจทำให้แอปพลิเคชันของเราหยุดชะงักได้
เราจะเขียนฟังก์ชัน proposeRoute เพื่อคัดกรองคำตอบ ดังนี้:
const isObject = value => value !== null && typeof value === 'object';
const probability = value => typeof value === 'number' && value >= 0 && value <= 1;
function proposeRoute(body) {
// ตรวจสอบว่าคำตอบมีโครงสร้างที่ถูกต้องตามที่ตกลงไว้หรือไม่
const answer = isObject(body.answers) ? body.answers.route : null;
if (!answer || !OPTIONS.includes(answer.choice)) {
return { action: 'review', reason: 'invalid_choice' };
}
return { action: 'propose', queue: answer.choice };
}
โค้ดส่วนนี้ใช้ฟังก์ชัน isObject เพื่อเช็คว่าข้อมูลที่ได้รับมาเป็น Object (กลุ่มข้อมูลที่มีหลายฟิลด์) หรือไม่ ส่วน probability เช็คว่าค่าความน่าจะเป็นต้องอยู่ระหว่าง 0 ถึง 1 หากเงื่อนไขไม่ผ่าน เราจะส่งค่า review กลับไปแทนการสั่งงานจริง เพื่อให้คนเข้ามาตรวจสอบข้อมูลอีกครั้ง
เงื่อนไขความปลอดภัยและเกณฑ์การตัดสินใจ
บางสถานการณ์ AI ไม่ควรตัดสินใจเองเด็ดขาด เช่น เรื่องความปลอดภัย (security) หรือกรณีที่ AI ไม่มั่นใจ (low confidence) เราต้องสร้าง Threshold (ค่าเกณฑ์มาตรฐาน) ขึ้นมาเพื่อตัดสินว่า "ถ้า AI มั่นใจต่ำกว่า 95% ให้ส่งงานนี้ไปให้คนทำแทน" นี่คือการปกป้องระบบจากการเดาสุ่มของ AI
เราต้องเช็คด้วยว่าตัวเลือกที่ AI เลือกมานั้น มีความโดดเด่นกว่าตัวเลือกอื่นมากน้อยแค่ไหน ถ้า AI บอกว่าโอกาสเป็น "billing" คือ 50% และ "support" คือ 49% แสดงว่า AI กำลังลังเล การปล่อยให้ระบบทำงานตามคำตอบนี้ถือว่ามีความเสี่ยงสูงมาก เราจึงต้องเขียนเงื่อนไขดักไว้
ตัวอย่างการตั้งเงื่อนไขความมั่นใจ:
// สมมติค่าเกณฑ์ความมั่นใจที่ 0.95
const minConfidence = 0.95;
// เช็คว่า AI มั่นใจพอไหม
if (answer.confidence < minConfidence) {
return { action: 'review', reason: 'uncertain' };
}
// เช็คว่าตัวเลือกที่เลือกชนะตัวเลือกอื่นขาดลอยไหม
if (selected - runnerUp < 0.20) {
return { action: 'review', reason: 'inconsistent_choice' };
}
บรรทัด answer.confidence < minConfidence จะตรวจสอบค่าความมั่นใจที่ AI ส่งมา หากต่ำกว่าเกณฑ์เราจะปฏิเสธทันที ส่วน selected - runnerUp คือการหาผลต่างระหว่างตัวเลือกที่ชนะกับตัวเลือกที่ใกล้เคียงที่สุด เพื่อดูว่า AI เลือกแบบลังเลหรือไม่ ผลลัพธ์คือหากค่าต่างกันน้อยกว่า 0.2 ระบบจะสั่งให้คนตรวจสอบทันที
ทดสอบระบบโดยไม่ต้องเสียเงินเรียก AI
การทดสอบโค้ดโดยการส่งรีเควสไปหา AI จริงๆ ทุกครั้งจะทำให้คุณเสียค่าใช้จ่าย (Inference Credits) โดยไม่จำเป็น เราจึงควรเขียน Unit Test (การทดสอบโค้ดส่วนเล็กๆ เพื่อดูว่าทำงานถูกต้องไหม) โดยการจำลองข้อมูลขึ้นมาเอง เพื่อเช็คว่าด่านตรวจของเราทำงานได้แม่นยำตามเงื่อนไขที่วางไว้
คุณควรสร้างไฟล์ทดสอบแยกต่างหากและจำลองสถานการณ์ที่เลวร้ายที่สุด เช่น ส่งค่าที่เป็นข้อความแทนตัวเลข, ส่งค่าว่าง, หรือส่งตัวเลือกที่ไม่มีอยู่จริง หากโค้ดของคุณสามารถรับมือกับข้อมูลขยะเหล่านี้ได้โดยไม่พัง นั่นหมายความว่าด่านตรวจที่คุณสร้างขึ้นมีความแข็งแกร่งเพียงพอแล้ว
นี่คือตัวอย่างการทดสอบระบบแบบง่าย:
import assert from 'node:assert/strict';
// จำลองข้อมูลที่ผิดพลาด
const badData = { answers: { route: { choice: 'refund' } } };
// ทดสอบว่าระบบปฏิเสธข้อมูลที่ไม่มีใน OPTIONS
const result = proposeRoute(badData);
assert.equal(result.reason, 'invalid_choice');
console.log('ทดสอบผ่าน: ระบบปฏิเสธข้อมูลผิดประเภทได้!');
เราใช้ assert.equal เพื่อยืนยันว่าผลลัพธ์ที่ได้จากฟังก์ชัน proposeRoute ตรงกับเหตุผลที่เราคาดไว้คือ invalid_choice หากรันโค้ดนี้แล้วไม่มีข้อความแจ้งเตือนแสดงว่าระบบทำงานถูกต้อง ผลลัพธ์ที่เห็นจะเป็นการยืนยันว่าโค้ดของคุณพร้อมใช้งานจริง
สรุป: การสร้างระบบที่ไว้ใจได้
การเป็นโปรแกรมเมอร์ที่ดีไม่ใช่แค่การเขียนโค้ดให้ทำงานได้ แต่คือการเขียนโค้ดที่ Robust (ทนทานต่อข้อผิดพลาด) ไม่ว่าจะเจอข้อมูลแบบไหนเข้ามา ระบบของคุณต้องไม่พังง่ายๆ การสร้างเขตแดน (Boundary) รอบๆ AI จะช่วยให้คุณสามารถนำเทคโนโลยีล้ำสมัยมาใช้ในโปรเจกต์ได้อย่างมั่นใจและปลอดภัย
จำไว้เสมอว่า AI คือผู้ช่วย ไม่ใช่คนตัดสินใจแทนคุณ คุณต้องเป็นคนกำหนดกฎเกณฑ์และตรวจสอบข้อมูลเสมอ การฝึกเขียนโค้ดดักตรวจสอบข้อมูลในวันนี้ จะเป็นพื้นฐานสำคัญที่ทำให้คุณก้าวไปเป็นโปรแกรมเมอร์ที่เขียนซอฟต์แวร์ระดับมืออาชีพได้ในอนาคต
ลองนำแนวคิดนี้ไปใช้กับโปรเจกต์ของคุณดู เช่น ถ้าคุณทำแอปพลิเคชันแนะนำร้านอาหาร ให้ลองสร้างด่านตรวจสอบว่าข้อมูลที่ AI ส่งมามีรูปภาพประกอบไหม หรือมีชื่อร้านที่ถูกต้องหรือเปล่า การฝึกฝนเล็กๆ น้อยๆ แบบนี้จะทำให้คุณมองเห็นภาพรวมของระบบใหญ่ได้ชัดเจนขึ้นครับ
ที่มา: A Jev AI Decision Is a Proposal: Build a Tested Review Boundary in JavaScript — DEV Community