ผมรันดิจิทัลทวิน (digital twin) ไว้บนเว็บไซต์ของผม มันทำหน้าที่ตอบคำถามเกี่ยวกับชีวิตและทักษะของผม ผมตั้งกฎเหล็กไว้ข้อหนึ่งคือ: ห้ามกุเรื่องขึ้นมาเด็ดขาด หากมีคนถามถึงทักษะที่ผมไม่มี มันจะต้องยอมรับว่าไม่รู้ เป็นเวลาหลายเดือนที่ผมเชื่อว่าระบบทำงานได้ดี ผมทดสอบมันด้วยตัวเองเป็นระยะๆ และคำตอบที่ได้ก็ดูสมเหตุสมผล จนกระทั่งผมสร้างระบบประเมินผล (evaluation harness) ที่เหมาะสมขึ้นมา ตัวเลขที่ออกมาทำให้ผมหน้าหงาย จากคำถาม 35 ข้อ มีถึง 9 ข้อที่มีการโกหกอย่างชัดเจน และจากคำถาม 8 ข้อที่ตั้งใจออกแบบมาให้ตอบไม่ได้ โมเดลปฏิเสธคำถามเพียงแค่ 4 ข้อเท่านั้น พรอมต์ (prompt) ป้องกันการหลอน (anti-hallucination prompt) ของผมล้มเหลวประมาณหนึ่งในสี่ของเวลาทั้งหมด ผมกำลังส่งมอบผลิตภัณฑ์ที่โกหกผู้ใช้งานของตัวเอง
การตั้งค่าการดึงข้อมูล (Retrieval) แบบง่ายสุดๆ
ผมไม่ได้ใช้ Pinecone หรือฐานข้อมูลเวกเตอร์ (vector database) ที่หนักเครื่องเลย การตั้งค่าทั้งหมดอยู่บนไฟล์ JSON ธรรมดาๆ โค้ดของผมจะแบ่งโปรไฟล์ของผมออกเป็นส่วนๆ เมื่อมีคำถามเข้ามา ระบบจะคำนวณค่าความคล้ายคลึงแบบ cosine (cosine similarity) ระหว่างคำถามกับข้อความแต่ละส่วน (chunk) เลือกส่วนที่ใกล้เคียงที่สุด แล้วใส่พวกมันเข้าไปในพรอมต์เพื่อใช้เป็นบริบท (context) จากนั้นโมเดลจะสร้างคำตอบโดยอิงจากสิ่งที่เห็นในหน้าต่างข้อมูลนั้นอย่างเคร่งครัด
สำหรับการใช้งานบนเว็บไซต์ส่วนตัวขนาดเล็กที่ให้บริการข้อมูลเฉพาะกลุ่ม วิธีนี้รวดเร็วและแทบไม่มีค่าใช้จ่าย ไม่ต้องมีการรับส่งข้อมูลผ่านเครือข่าย (network round-trip) ไปยังเวกเตอร์สโตร์ระยะไกล ไม่ต้องมีภาระในการทำดัชนี (indexing overhead) และไม่ต้องมีการจัดการระบบ (orchestration) ที่ซับซ้อน คุณแค่เปิดไฟล์ คำนวณคะแนนของแต่ละส่วน สร้างพรอมต์ แล้วก็จบ แต่ความเรียบง่ายในส่วนหลังบ้านไม่ได้การันตีความซื่อสัตย์ของผลลัพธ์ พายป์ไลน์ (pipeline) ที่เบาบางยังสามารถสร้างปัญหาใหญ่ได้ เมื่อโมเดลตัดสินใจที่จะ "ด้นสด" ช่องว่างระหว่าง "นี่คือบริบท" กับ "นี่คือสิ่งที่ฉันจะพูดเกี่ยวกับมัน" คือที่ที่การหลอน (hallucinations) อาศัยอยู่ คุณสามารถส่งย่อหน้าเกี่ยวกับประวัติการทำงานให้โมเดล แต่คุณก็ยังอาจได้รับคำตอบที่มั่นใจผิดๆ เกี่ยวกับภาษาโปรแกรมที่คุณไม่เคยแตะต้องเลยก็ได้
ตัวเลขที่ทำลายความมั่นใจของผม
เป็นเวลาหลายเดือนที่ผมคิดว่าการสุ่มตรวจด้วยตัวเอง (manual spot-checking) นั้นเพียงพอแล้ว ผมจะเปิดแชท ถามคำถามที่ผมรู้อยู่แล้วว่าคำตอบคืออะไร และพยักหน้าเมื่อคำตอบดูถูกต้อง นั่นคือกลยุทธ์การทดสอบของผม มันให้ความรู้สึกว่าละเอียดถี่ถ้วนเพราะผมเป็นคนใช้งานอินเทอร์เฟซนั้นเอง แต่มันไม่ใช่เลย
เมื่อในที่สุดผมเขียนระบบประเมินผลที่สามารถรันได้อย่างเป็นระบบ ภาพที่เห็นก็เปลี่ยนไป ชุดทดสอบยิงคำถาม 35 ข้อใส่ดิจิทัลทวิน คำตอบ 9 ข้อมีการโกหก ผมยังรวมคำถามอีก 8 ข้อที่ไม่มีคำตอบอยู่ในโปรไฟล์ของผมเลยด้วย โมเดลควรจะปฏิเสธคำถามเหล่านั้นทั้งหมด แต่มันปฏิเสธเพียงแค่ 4 ข้อ พรอมต์ป้องกันการหลอนที่ผมบรรจงเขียนขึ้นมาอย่างดี ซึ่งรวมถึงภาษาที่เด็ดขาดว่าห้ามกุเรื่องขึ้นมาเด็ดขาด ล้มเหลวประมาณ 25 เปอร์เซ็นต์ หนึ่งในสี่ นั่นไม่ใช่ความคลาดเคลื่อนจากการปัดเศษ แต่นั่นคือผลิตภัณฑ์ที่พัง
เลิกทดสอบด้วยคำถามที่เป็นมิตร
คุณไม่สามารถหาบั๊กได้ด้วยการแค่ใช้งานผลิตภัณฑ์ของตัวเอง คุณจะหาพวกมันได้ก็ต่อเมื่อคุณพยายามจะทำลายมัน การทดสอบด้วยมือของผมนั้น "เป็นมิตร" เกินไป ผมถามเฉพาะคำถามที่ผมรู้คำตอบที่แน่นอน ซึ่งหมายความว่าผมกำลังชี้นำโมเดลไปสู่เขตปลอดภัยโดยไม่รู้ตัว ผมไม่เคยทดสอบขอบเขต (edges) ผมไม่เคยถามถึงทักษะที่ผมอยากจะมี หรือประสบการณ์ที่ไม่เคยเกิดขึ้นจริง
การทดสอบที่แท้จริงต้องมีเจตนาแบบโต้แย้ง (adversarial intent) คุณต้องสร้างคำถามที่ออกแบบมาเพื่อให้ AI พลาด คุณต้องการให้มันพลาดในห้องแล็บ เพื่อที่มันจะได้ไม่พลาดต่อหน้าผู้เข้าชม ชุดทดสอบที่ทำเพียงแค่ยืนยันสิ่งที่คุณเชื่ออยู่แล้ว ก็เป็นแค่การสาธิต (demo) ที่แต่งตัวสวยงามเท่านั้น หากคุณไม่ได้พยายามสร้างกรณีขอบเขต (edge cases) และคำถามดักทาง (trap questions) อย่างจริงจัง คุณไม่ได้กำลังทดสอบ คุณแค่กำลังภาวนา
ความผิดพลาดสองประการที่สำคัญ
การเขียนพรอมต์ไม่ใช่การรับประกัน คำสั่งที่ยาวและละเอียดที่บอก AI ว่าอย่าหลอน เป็นเพียงแค่คำแนะนำที่แต่งตัวมาในรูปแบบของคำสั่งเท่านั้น โมเดลอาจจะทำตามในเกือบทุกครั้ง แต่มันจะเพิกเฉยต่อคำสั่งนั้นทันทีที่แรงกดดันทางสถิติบีบให้มันไปทางอื่น ค่า Temperature, ความน่าจะเป็นของโทเคน (token probability) และรูปแบบของข้อมูลที่ใช้ฝึกฝน (training data) ล้วนมีน้ำหนักมากกว่าประโยคในระบบพรอมต์ของคุณ คุณต้องวัดความเชื่อฟังด้วยข้อมูล ไม่ใช่ความหวัง คำสั่งที่แข็งกร้าวไม่ใช่ข้อเท็จจริงที่ได้รับการตรวจสอบแล้ว มันเป็นเพียงคำขอ และคำขอก็ถูกปฏิเสธได้ หากกลยุทธ์ความปลอดภัยทั้งหมดของคุณขึ้นอยู่กับการใช้คำในพรอมต์ที่หนักแน่น คุณก็แค่สร้างราวกั้นที่ทำจากกระดาษทิชชู่ คุณต้องการระบบประเมินผลที่นับว่าโมเดลเชื่อฟังบ่อยแค่ไหน ภายใต้เงื่อนไขใด และทำไมมันถึงล้มเหลวเมื่อมันล้มเหลว ตัวเลขไม่สนใจน้ำเสียงของคุณหรอก
ลูปการประเมินผลนั้นมีข้อบกพร่อง นี่คือกับดักที่แนบเนียนซึ่งเกือบจะทำให้ผมพลาด เครื่องมือทดสอบเดิมของผมรันกระบวนการดึงข้อมูลสองครั้ง การรันครั้งแรกเป็นการดึงบริบทเพื่อนำมาตรวจสอบกับ ground truth ส่วนการรันครั้งที่สองเป็นการดึงบริบทเพื่อใช้ในการสร้างคำตอบจริง ในทางปฏิบัติ สิ่งนี้หมายความว่าข้อมูลส่วนย่อย (chunks) ที่ตัวตัดสินเห็นอาจแตกต่างจากข้อมูลส่วนย่อยที่โมเดลเห็น ตัวตัดสินกำลังให้คะแนนคำตอบโดยเทียบกับข้อมูลที่ AI อาจจะไม่เคยได้รับเลยด้วยซ้ำ การประเมินที่ให้คะแนนจากข้อมูลนำเข้าที่ผิดพลาดนั้นแย่ยิ่งกว่าการไม่มีการประเมินเสียอีก มันทำให้คุณรู้สึกปลอดภัยแบบผิดๆ คุณดูคะแนน เห็นอัตราการผ่านที่สูง แล้วก็วางใจ ในขณะที่ผู้ใช้งานของคุณกำลัง
