วิธีที่ผมทำให้ AI หยุด "หลอน" (Hallucinating) ใน Codebase ของเรา

เครื่องมือเขียนโค้ดด้วย AI มักจะล้มเหลวเมื่อใช้กับโปรเจกต์ที่ใช้งานจริง (production) พวกมันทำงานได้ดีกับโค้ดใหม่ๆ แต่จะเริ่มพังเมื่อต้องเจอกับโค้ดเก่าที่มีประวัติการพัฒนามาอย่างยาวนาน

โปรเจกต์ Fintech ของเรามีประวัติการพัฒนามานานถึงสามปี ประกอบด้วย React frontend สองตัว, แผงควบคุมสำหรับแอดมิน (admin panel) และ FastAPI backend ส่วนฐานข้อมูลก็มีความซับซ้อน มีตารางจำนวนมากและการ Join ข้อมูลที่หนักหน่วง

เราพยายามใช้ AI เพื่อให้ทำงานได้เร็วขึ้น แต่มันล้มเหลว

ผมสั่งให้ AI สร้างตาราง contacts มันกลับสร้างคอลัมน์ใหม่สำหรับชื่อและอีเมล โดยไม่รู้เลยว่าเรามีข้อมูลเหล่านี้อยู่ในตาราง users อยู่แล้ว มันจึงสร้างข้อมูลซ้ำซ้อนแทนที่จะใช้ foreign key

AI ไม่ได้โง่ แต่มันไม่มีบริบท (context) มันตัดสินใจโดยใช้ข้อมูลที่ไม่ครบถ้วน

ผมเลิกถามว่าจะเขียนโค้ดให้ดีขึ้นได้อย่างไร แต่เปลี่ยนมาถามว่า AI ต้องการบริบทแบบไหนเพื่อให้ตัดสินใจได้อย่างถูกต้อง

เราสร้างเวิร์กโฟลว์ที่มีโครงสร้างชัดเจน AI จะเก่งได้เท่ากับบริบทที่คุณป้อนให้เท่านั้น เราจึงทำให้บริบทเหล่านั้นชัดเจนและเป็นรูปธรรม

นี่คือวิธีการที่เราตั้งค่าไว้:

  • ADR Directory: เราสร้างโฟลเดอร์สำหรับ Architecture Decision Records (ADR) ไฟล์เหล่านี้จะอธิบายว่าทำไมเราถึงเลือกตัดสินใจในเรื่องต่างๆ ไฟล์หนึ่งจะสั่งให้ AI ตรวจสอบตารางที่มีอยู่ก่อนที่จะสร้างตารางใหม่ และสั่งห้ามไม่ให้สร้างข้อมูลผู้ใช้ซ้ำซ้อน
  • context.md: ไฟล์นี้จะอธิบายคำศัพท์เฉพาะทางของเรา โดยบอก AI ว่าคำศัพท์เฉพาะเหล่านั้นมีความสัมพันธ์กันอย่างไร
  • plot.md: ไฟล์นี้จะให้แผนผังภาพรวมของโปรเจกต์และแสดงให้เห็นว่าส่วนประกอบต่างๆ เชื่อมต่อกันอย่างไร
  • Mandatory Tests: ทุกๆ API route ใหม่จำเป็นต้องมี test cases เสมอ

สิ่งนี้เปลี่ยนทุกอย่าง ครั้งหนึ่ง AI ได้แก้ไข shared utility function ซึ่งการเปลี่ยนแปลงนั้นทำให้ระบบส่วนอื่นๆ พังไปถึงแปดจุด แต่ชุดทดสอบ (test suite) ตรวจพบได้ทันที เมื่อ AI เห็นข้อผิดพลาด มันจึงแก้ไขความผิดพลาดของตัวเองด้วยการสร้างเวอร์ชันที่รองรับทั้งความต้องการแบบเก่าและแบบใหม่

หากไม่มีการทดสอบ บั๊กตัวนั้นคงหลุดไปถึง production แน่นอน

ให้ปฏิบัติกับ AI เหมือนเป็นนักพัฒนาคนใหม่ คุณจะไม่ตำหนิพนักงานใหม่ที่เขาไม่รู้จัก codebase ของคุณ แต่คุณจะให้เอกสารประกอบและทำการ onboarding ให้ เราทำแบบเดียวกันกับ AI

โครงสร้างของเรา:

  • docs/context.md: คำศัพท์เฉพาะทางและความเชื่อมโยงของโปรเจกต์
  • docs/plot.md: แผนผังภาพรวมของ codebase
  • docs/adr/: กฎเฉพาะทาง เช่น การสร้างตารางและโครงสร้าง API

กฎ 3 ข้อสำหรับทีมของคุณ:

  • ระบุให้ชัดเจนใน ADRs ใช้คำสั่งที่ชัดเจนแทนคำแนะนำที่คลุมเครือ
  • ทำให้เอกสารมีความสำคัญสูงสุด บอก AI ว่ากฎเหล่านี้ต้องมาก่อนเสมอ
  • เปลี่ยนความผิดพลาดให้เป็นกฎ ทุกครั้งที่ AI ทำพลาด ให้เขียน ADR ใหม่ขึ้นมา

ระบบนี้ไม่ได้ทำให้ AI สมบูรณ์แบบ แต่มันทำให้ AI คาดเดาผลลัพธ์ได้ เราต้องการ codebase ที่ AI ทำงานได้อย่างสม่ำเสมอ เพื่อให้ทีมทำงานได้รวดเร็วยิ่งขึ้น

Source: https://dev.to/jaskiratanand/how-i-made-ai-stop-hallucinating-on-our-3-year-old-fintech-codebase-3g0h