Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

การใช้ Rust หั่นโค้ดทิ้ง 90% ก่อนป้อนให้ LLM

📅 วันที่เผยแพร่: 2026-03-08

การทำงานร่วมกับ AI Coding Agents ข้อจำกัดหนึ่งที่เรามักเจอกันคือเรื่องของ Context Window แม้ว่าปัจจุบันโมเดลจะรองรับได้ถึงระดับหลักแสนหรือล้าน Token แต่ในทางปฏิบัติ การยัดโค้ดทั้งหมดลงไปกลับไม่ได้ทำให้ผลลัพธ์ดีขึ้นเสมอไป สมมติว่าเรามีโปรเจกต์ TypeScript ขนาด 80 ไฟล์ ซึ่งกินพื้นที่ประมาณ 63,000 Tokens ปัญหาที่เกิดขึ้นคือเมื่อบริบทยาวเกินไป โมเดลจะเริ่มเกิดอาการ “Attention Drop” การตอบสนองช้าลง และตรรกะการให้เหตุผลเริ่มผิดเพี้ยน นั่นเป็นเพราะโค้ดกว่า 80% ในโปรเจกต์คือ Implementation details อย่างเช่น การวนลูป, การจัดการ Error, หรือไส้ในของฟังก์ชัน CRUD ทั่วไป ซึ่งเป็น “Noise” ที่โมเดลไม่ได้ต้องการเลยเวลาที่เราถามถึงภาพรวมของ Architecture หรือการเชื่อมต่อระหว่าง Service

Skim เครื่องมือสกัดโครงสร้างโค้ดด้วย Rust

เพื่อแก้ปัญหานี้ Dean Sharon ได้พัฒนาเครื่องมือขึ้นมาตัวหนึ่งชื่อว่า Skim โดยเลือกใช้ Rust เป็นแกนหลักในการพัฒนา ตัวโปรเจกต์ถูกออกแบบมาให้เป็นเสมือน Streaming Reader คล้ายกับคำสั่ง cat ใน Unix แต่มีความฉลาดในระดับโครงสร้างภาษา หน้าที่ของมันคือการสกัดเอาเฉพาะแก่นของโค้ด เช่น โครงสร้างคลาส, Signatures, และ Type definitions ออกมา แล้วแทนที่ไส้ในของฟังก์ชันด้วยคอมเมนต์ /* ... */ ผลลัพธ์คือ มันสามารถลดจำนวน Token ลงได้มหาศาล อย่างโหมด Types สามารถลดขนาดโปรเจกต์ 63k Tokens ให้เหลือเพียง 5k Tokens ได้ (ลดไปกว่า 91%) ทำให้เราสามารถโยนโครงสร้างทั้งหมดเข้า LLM ได้ใน Prompt เดียว โดยยังมีพื้นที่เหลือให้โมเดลได้ประมวลผลตรรกะได้อย่างเต็มประสิทธิภาพ

สถาปัตยกรรม AST และการจัดการ Memory

แต่สิ่งที่ทำให้โปรเจกต์นี้น่าสนใจสำหรับชาว Rust คือสถาปัตยกรรมเบื้องหลังและการจัดการ Memory อย่างแยบคาย การทำงานระดับโครงสร้างภาษาจำเป็นต้องพึ่งพากระบวนการ Parse ระดับ AST (Abstract Syntax Tree) ซึ่งโปรเจกต์นี้เลือกใช้ tree-sitter (Incremental parser แบบเดียวกับที่ Editor สมัยใหม่ใช้) การออกแบบสถาปัตยกรรมภายในถูกจัดวางด้วย Strategy Pattern ผ่านฟีเจอร์ที่แข็งแกร่งอย่าง enum และ Pattern Matching ของ Rust โค้ดจะถูกแยกสายการทำงานตามประเภทของภาษาอย่างชัดเจน ตัวอย่างที่น่าสนใจคือ การจัดการไฟล์ JSON จะไม่ถูกโยนเข้า tree-sitter เพราะมันถือเป็น Data ไม่ใช่ Code ตัวโปรเจกต์จึงแยกให้ JSON วิ่งผ่าน serde_json โดยเฉพาะเพื่อความรวดเร็ว ในขณะที่ภาษาโปรแกรมอื่นๆ จะถูกส่งเข้าไป Transform โหนด AST ตามกฎของแต่ละภาษา

Zero-copy String Slicing

ในมุมของการรีด Performance นี่คือจุดที่ Rust ได้โชว์ศักยภาพอย่างแท้จริง การทำงานกับ String และ AST ขนาดใหญ่มักตามมาด้วยคอขวดของการจองหน่วยความจำ (Allocation) แต่ Skim ถูกออกแบบมาให้ทำงานแบบ Zero-copy string slicing โดยมันจะทำการอ้างอิง Source bytes จากต้นฉบับโดยตรงโดยไม่ต้อง allocate หน่วยความจำใหม่เลย ผลจากการจัดการ Memory ระดับลึกนี้ ทำให้มันสามารถ Parse ไฟล์ขนาด 3,000 บรรทัดได้ในเวลาเพียง 14.6 มิลลิวินาที เท่านั้น

การประมวลผลแบบขนานด้วย Rayon

นอกจากการประมวลผลไฟล์เดี่ยวที่รวดเร็วแล้ว การสเกลระดับโปรเจกต์ที่มีไฟล์จำนวนมากก็ทำได้อย่างไร้รอยต่อ ผู้เขียนได้นำ rayon เข้ามาช่วยจัดการ Parallel processing ดึงพลังของ Multi-core ออกมาใช้ทำ Data-parallelism ระหว่างไฟล์ต่างๆ ได้อย่างปลอดภัย (Fearless Concurrency) ยิ่งไปกว่านั้น ยังมีการทำ Caching layer ที่ใช้การตรวจสอบเวลาแก้ไขไฟล์ (mtime invalidation) เข้ามาช่วย ทำให้การอ่านไฟล์เดิมซ้ำในครั้งถัดๆ ไป (Repeated reads) ทำความเร็วได้พุ่งทะยานขึ้นอีกถึง 40-50 เท่า

บทสรุปของ Skim นวัตกรรม Tooling แห่งยุค AI

โปรเจกต์นี้นับเป็น Use Case ที่ตอบโจทย์ยอดเยี่ยมในยุค AI และเป็นตัวอย่างในการใช้ Rust พัฒนา Tooling ที่ต้องการความเร็วสูง การจัดการ I/O แบบสตรีมมิ่ง และการจัดการ Memory ที่แม่นยำ ตัวโปรเจกต์เป็น Open source (MIT) รองรับถึง 9 ภาษา (รวมถึง Rust ด้วย) ใครที่สนใจว่าเขาเขียนโค้ดจัดการ AST ร่วมกับ Zero-copy อย่างไรให้เนียนขนาดนี้ สามารถเข้าไปแกะโค้ดศึกษาหรือโหลดมาลองใช้กันได้ที่ GitHub dean0x/skim ครับ


Credit & Reference:

  1. skim GitHub repo
  2. How I strip 90% of code before feeding it to my coding agent