นักพัฒนาได้เปิดตัวแผนผังฐานโค้ดแบบสามเลเยอร์ (three-layer code-base map) ที่ช่วยให้ AI coding agents สามารถจดจำบริบทของตำแหน่งที่อยู่ได้แม้จะเปลี่ยนเซสชันการทำงาน

ทำไม AI agents จึงต้องการแผนผัง

ผู้ช่วยเขียนโค้ดแบบแชทจะสร้างโมเดลทางความคิด (mental model) ของ repository เฉพาะในขณะที่หน้าต่าง prompt ยังเปิดอยู่เท่านั้น เมื่อหน้าต่าง context ปิดลง โมเดลดังกล่าวจะหายไป ทำให้ agent ต้องค้นหาสัญลักษณ์ (symbols), การนำเข้า (imports) และความสัมพันธ์ระหว่างไฟล์ใหม่ทั้งหมดตั้งแต่ต้น การทำงานที่ต้องทำซ้ำไปมาเช่นนี้ทำให้สิ้นเปลืองทรัพยากรการประมวลผล (compute cycles) และทำให้ agent มีประสิทธิภาพลดลงเมื่อนักพัฒนาต้องสลับไปมาระหว่างไฟล์ หรือกลับมาทำโปรเจกต์เดิมหลังจากหยุดพักไป

สามเลเยอร์ที่ประกอบกันเป็นแผนผัง

  • Structural layer – แคตตาล็อกของ symbols, การเรียกใช้ฟังก์ชัน (function calls) และคำสั่ง import ซึ่งจะตอบคำถามเชิงสถิต (static) ว่า “อะไรเรียกใช้อะไร”
  • Temporal layer – สัญญาณที่ได้จาก git เช่น อัตราการเปลี่ยนแปลงของไฟล์ (file churn rates) และประวัติความเป็นเจ้าของ (ownership histories) ซึ่งจะแสดงให้เห็นว่าส่วนใดของโค้ดมีการเปลี่ยนแปลงบ่อยที่สุด และใครเป็นผู้แก้ไขส่วนนั้นๆ
  • Behavioral layer – รูปแบบการใช้งานจริงที่สกัดมาจากประวัติการแก้ไขและการนำทาง (navigation history) ของตัว agent เอง ซึ่งจะเผยให้เห็นว่าไฟล์ใดที่มักจะถูกเปิดขึ้นมาพร้อมกันในระหว่างเซสชันการเขียนโค้ด ทำให้เห็น “เพื่อนบ้านที่แท้จริง” (true neighbors) ที่การวิเคราะห์เชิงสถิต (static analysis) มักจะมองข้ามไป

เลเยอร์เชิงพฤติกรรม (behavioral layer) มีความสำคัญมากที่สุด เพราะมันสะท้อนถึงวิธีการทำงานที่แท้จริงของนักพัฒนา (และ agent) ไม่ใช่แค่เพียงโครงสร้างการเชื่อมต่อของโค้ดเท่านั้น

สองวิธีในการส่งแผนผังให้กับ agent

  1. Ambient Path – สรุปข้อมูลแบบกระชับที่ถูกใส่เข้าไปในการโต้ตอบทุกครั้ง ช่วยให้ agent เห็นภาพรวมทันทีว่า “คุณกำลังอยู่ในโมดูล X และมี symbols เหล่านี้อยู่ใกล้ๆ” โดยไม่ต้องมีการเรียกใช้ข้อมูลเพิ่มเติม
  2. Deep Path – เครื่องมือสอบถามข้อมูลตามความต้องการ (on-demand query tools) ที่ agent สามารถเรียกใช้เมื่อต้องการรายละเอียดที่ลึกขึ้น เช่น รายชื่อไฟล์ที่มักจะเปลี่ยนแปลงพร้อมกัน หรือไทม์ไลน์ของประวัติความเป็นเจ้าของล่าสุด

การแยกข้อมูลแบบ ambient ออกจากข้อมูลแบบ deep ช่วยให้ prompt ปกติมีขนาดเบา ในขณะที่ยังสามารถให้ข้อมูลเชิงลึกได้เมื่อจำเป็น

กฎการออกแบบที่ช่วยให้ระบบทำงานได้อย่างคล่องตัว

  • ข้ามการใช้ language servers ที่หนักเครื่อง แผนผังนี้อาศัยการวิเคราะห์แบบตื้น (shallow parsing) แทนที่จะเป็นการอนุมานประเภทข้อมูลแบบเต็มรูปแบบ (full type inference) เป้าหมายไม่ใช่การสร้างเครื่องมือที่เหนือกว่า static analyzers ที่มีอยู่แล้ว แต่เป็นการเสริมการทำงานด้วยข้อมูลเชิงลึกด้านพฤติกรรม
  • จำกัดขอบเขตของ graph ไว้เฉพาะในแต่ละโปรเจกต์ ระบบจะไม่เชื่อมโยง dependency graph เข้าด้วยกันในระดับ global ข้าม repository การจำกัดขอบเขตนี้ช่วยลดการใช้หน่วยความจำ (memory footprint) และทำให้การอัปเดตเร็วขึ้น
  • ใช้หน่วยจัดเก็บหน่วยความจำที่มีอยู่เดิม บันทึกการเปลี่ยนแปลงไฟล์ (file-change logs) มาจากหน่วยความจำของการเรียกใช้เครื่องมือของตัว agent เอง ซึ่งช่วยหลีกเลี่ยงการจัดเก็บข้อมูลซ้ำซ้อนและทำให้แหล่งข้อมูลมีความสอดคล้องกัน

การสร้างแผนผังในทางปฏิบัติ

  1. รวบรวมข้อมูลเชิงโครงสร้าง (structural data) โดยการไล่ดูไฟล์ต้นฉบับอย่างรวดเร็ว เพื่อดึง symbols และบรรทัดการ import ออกมา
  2. ดึงตัวชี้วัดเชิงเวลา (temporal metrics) จาก git history ของ repository โดยระบุว่าไฟล์ใดมีการ commit มากที่สุดและใครเป็นผู้เขียน
  3. เก็บรวบรวมสัญญาณเชิงพฤติกรรม (behavioral signals) โดยการบันทึกการเปิดไฟล์ การแก้ไข และการนำทางของ agent ในระหว่างเซสชันการเขียนโค้ดจริง บันทึกเหล่านี้จะกลายเป็นพื้นฐานสำหรับเมทริกซ์ "การปรากฏร่วมกัน" (co-occurrence matrix) ที่ใช้กำหนดเพื่อนบ้านเชิงพฤติกรรม
  4. เติมข้อมูลใน Ambient Path ด้วยรายการ symbols และไฟล์ที่เกี่ยวข้องที่สุดสำหรับงานปัจจุบัน โดยเรียงลำดับความสำคัญไว้
  5. เปิดใช้งาน Deep Path ในรูปแบบของชุดฟังก์ชันสอบถามข้อมูลที่มีน้ำหนักเบา (เช่น “แสดงรายชื่อไฟล์ที่ถูกแก้ไขพร้อมกันในเซสชันล่าสุด”)

Fast hooks จะดักจับการแก้ไขแต่ละครั้งทันทีที่เกิดขึ้น ในขณะที่การสแกนเบื้องหลัง (background sweeps) ที่ช้ากว่าจะทำหน้าที่คำนวณสถิติการเปลี่ยนแปลงใหม่ ทั้งสองส่วนทำงานร่วมกันเพื่อให้แผนผังมีความสดใหม่อยู่เสมอโดยไม่ทำให้ขั้นตอนการทำงานของนักพัฒนาล่าช้าลง

บทเรียนที่ได้รับระหว่างการพัฒนา

  • แยกข้อมูลแบบ ambient ออกจากแบบ on-demand การรักษาบทสรุปที่ต้องมีอยู่ตลอดเวลาให้มีขนาดเล็กจะช่วยป้องกันปัญหา token บวม (token bloat) ในขณะที่การสอบถามข้อมูลที่ละเอียดกว่าจะยังคงเป็นทางเลือกเสริม
  • จัดลำดับความสำคัญของบริบทตามงาน การเรียงลำดับ ambient symbols ตามจุดที่กำลังแก้ไขอยู่ในปัจจุบันจะช่วยให้ได้คำแนะนำที่มีประโยชน์มากขึ้น
  • อัปเดตข้อมูลอย่างรวดเร็วแต่ต้องชาญฉลาด ใช้ quick hooks เพื่อดักจับการเปลี่ยนแปลงที่มีความถี่สูง และใช้การสแกนเป็นระยะเพื่อจัดการกับการเปลี่ยนแปลงที่มีความถี่ต่ำและการเปลี่ยนเจ้าของไฟล์
  • การวิเคราะห์แบบตื้น (shallow parsing) ชนะในเรื่องความเร็ว การวิเคราะห์ประเภทข้อมูลเชิงลึก (deep type analysis) จะเพิ่มความหน่วง (latency) โดยไม่ช่วยให้ได้ข้อมูลเชิงลึกด้านพฤติกรรมซึ่งเป็นจุดแข็งหลักของแผนผังนี้

สรุป: ด้วยการวางโครงสร้างแบบเลเยอร์ที่ประกอบด้วยโครงสร้างเชิงสถิต, ประวัติจาก git และการใช้งานจริง เข้ากับโมเดลการเข้าถึงข้อมูลแบบสองระดับที่กะทัดรัด นักพัฒนาจึงสามารถมอบแผนผังฐานโค้ดที่ยั่งยืนให้กับ AI coding agents ได้ การรักษาบทสรุปที่ต้องมีอยู่ตลอดเวลาให้มีขนาดเล็กจะช่วยป้องกันปัญหา token บวม