ทำไม Text-to-SQL ถึงล้มเหลวในระดับองค์กร
เดโม Text-to-SQL ส่วนใหญ่มักจะดูง่ายเกินไป
พวกเขามักใช้สกีมาที่เรียบง่ายและชื่อตารางที่ชัดเจน โดยสมมติว่าตารางหนึ่งหรือสองตารางเชื่อมโยงกันได้อย่างสมบูรณ์แบบ ซึ่งแบบนี้ใช้ได้สำหรับการทำเดโม แต่จะล้มเหลวเมื่อนำไปใช้ในบริษัทจริง
ในฐานข้อมูลระดับองค์กร ส่วนที่ยากไม่ใช่ clause SELECT แต่ส่วนที่ยากคือเส้นทางการ Join (join path)
โมเดลอาจเขียน query ที่ถูกต้องเพื่อหา รายได้ตามลูกค้า (revenue by customer) ตัว SQL รันผ่าน แดชบอร์ดแสดงตัวเลข แต่คำตอบนั้นผิด
ทำไมถึงเป็นเช่นนี้?
- ตารางลูกค้าไม่ใช่รายการหลัก (master list) อย่างเป็นทางการ
- ฟิลด์รายได้ไม่ใช่เวอร์ชันที่ฝ่ายการเงินรับรอง
- ข้อมูลมีการซ้ำซ้อนกันในแต่ละภูมิภาค
- การ Join ทำให้เกิดข้อผิดพลาดแบบ fanout
- ปฏิทินปีงบประมาณแตกต่างจากปีปฏิทิน
Query ที่ถูกต้องตามไวยากรณ์ ไม่ได้หมายความว่าเป็น Query ที่เชื่อถือได้เสมอไป
ระบบที่ใช้งานจริง (production) นั้นวุ่นวาย คุณต้องเจอกับ foreign keys ที่หายไป, ตารางเก่า (legacy tables) และความสัมพันธ์แบบ one-to-many ที่ทำให้ตัวเลขพุ่งสูงเกินจริง แม้แต่คนยังต้องตรวจสอบรายงานเก่าๆ หรือถามฝ่ายการเงินก่อนที่จะเชื่อถือการ Join ข้อมูลเลยด้วยซ้ำ
โมเดล AI เห็นเพียงแค่ชื่อและคอลัมน์ มันจึงใช้วิธีการเดา และบางครั้งการเดานั้นก็นำไปสู่ความเสียหายได้
ลองพิจารณาเรื่อง fanout หากคุณ Join ตาราง orders เข้ากับ order lines และตามด้วย shipments คำสั่งซื้อหนึ่งรายการอาจถูกนับซ้ำหลายครั้ง ตัว SQL นั้นถูกต้อง แต่ผลลัพธ์นั้นผิด
Metadata ช่วยได้ แต่ยังไม่เพียงพอ ชื่อคอลัมน์ไม่ได้บอกคุณว่าความสัมพันธ์นั้นปลอดภัยสำหรับการรายงานทางการเงินหรือไม่ และ foreign keys ก็ไม่ได้อธิบายถึงข้อยกเว้นทางประวัติศาสตร์ (historical exceptions)
Text-to-SQL ต้องการความฉลาดด้านความสัมพันธ์ (relationship intelligence)
ระบบที่เชื่อถือได้ต้องรู้ว่า:
- เส้นทางการ Join ที่ได้รับการอนุมัติสำหรับคำถามทางธุรกิจเฉพาะเจาะจง
- ค่า Cardinality ของความสัมพันธ์
- ความเสี่ยงเรื่อง fanout ที่ทราบกันดี
- เส้นทางใดที่เลิกใช้งานแล้ว (deprecated)
แทนที่จะแค่เขียนโค้ด ระบบควรจะใช้เหตุผลในเรื่องความปลอดภัยด้วย ควรเลือกเส้นทางที่เชื่อถือได้ หรือขอความช่วยเหลือเมื่อเส้นทางไม่ชัดเจน
ช่องว่างในระบบปัจจุบันคือการก้าวกระโดดจากการจับคู่ชื่อ (mapping names) ไปสู่การสร้าง SQL คุณต้องเพิ่มเลเยอร์ของบริบทด้านความสัมพันธ์ (relationship context) เข้าไปด้วย
Text-to-SQL ไม่ใช่แค่ปัญหาด้านภาษา แต่มันคือปัญหาด้านบริบท
จนกว่าโมเดลจะเข้าใจว่าการ Join แบบไหนที่ปลอดภัย พวกมันจะใช้งานได้ดีในเดโม แต่จะล้มเหลวในระบบที่ใช้งานจริง
Source: https://dev.to/arisyndata/why-text-to-sql-breaks-when-the-join-path-is-not-obvious-3bk0
Optional learning community: https://t.me/GyaanSetuAi
