สกิล token-router แบบไม่สูญเสียข้อมูล ใช้โมเดล Gemma4 2b เพื่อลดค่าโทเค็นของ Codex และ Claude Code ลง 99% ด้วยเราเตอร์แบบโลคัล
(github.com/sleeplesshan)สวัสดีครับ
สำหรับคนที่ปกติใช้ AI agent อย่าง Claude Code หรือ Codex เพื่อวิเคราะห์ล็อกขนาดใหญ่หรือแก้ไขโค้ด legacy แล้วต้องกังวลกับค่าโทเค็นและเวลาแฝงที่พุ่งขึ้นอย่างรวดเร็ว ผมขอมาแชร์สกิลที่ผมสร้างไว้ครับ
มันคือ token-router ซึ่งเป็น hybrid context router สำหรับจัดการไฟล์ขนาดใหญ่ด้วยแนวคิด "สำรวจบนเครื่องฟรี, ให้เหตุผลบนคลาวด์ด้วยประสิทธิภาพสูง"
🛑 มันแก้ปัญหาอะไร?
ถ้าเอาล็อกการ deploy infra ที่ยาวเกิน 2,000 บรรทัดหรือไฟล์ซอร์สโค้ดขนาดมหึมาใส่เข้า cloud LLM ทั้งก้อนไปเลย ก็จะสิ้นเปลือง input token อย่างมากและใช้เวลารอนานขึ้นด้วย
บางคนพยายามประหยัดด้วยการให้โมเดลขนาดเล็กสรุปโค้ดล่วงหน้า แต่แนวทางนี้มีความเสี่ยง เพราะทันทีที่มีบรรทัด error หรือจุดที่นิยามตัวแปรหายไป Cloud AI ก็จะสูญเสียบริบทและตอบผิดไปคนละทางได้
และในเวอร์ชันล่าสุด ยังได้ขยายขอบเขตการ routing ไปยังไฟล์คำสั่ง agent แบบคงที่ที่ถูกแนบซ้ำทุกเทิร์นอย่าง CLAUDE.md, AGENTS.md, .cursorrules ด้วย อย่างไรก็ตาม ไม่สามารถลดค่าโทเค็นของไฟล์ root ขนาดยาวที่ถูก inject อัตโนมัติไปแล้วในภายหลังได้ ดังนั้นจึงแนะนำให้คงไฟล์คำสั่ง root ให้สั้น และแยกกฎยาว ๆ ตามงานไปไว้ใน reference file แยกต่างหาก แล้วค่อย routing เฉพาะตอนที่จำเป็น
🧠 มันแก้อย่างไร? (วิธีทำงานจากมุมมองผู้ใช้)
เครื่องมือนี้ไม่สรุปข้อความ แต่ใช้วิธีตัดเอาต้นฉบับจริงออกมาเฉพาะส่วนที่จำเป็นเท่านั้นอย่างเคร่งครัด
- สำรวจในเครื่อง (Local Triage): รันบนคอมพิวเตอร์ของผมผ่าน Ollama โดยใช้โมเดล Gemma 4 2B ขนาดเบา โมเดลโลคัลนี้จะค้นหาเฉพาะหมายเลขบรรทัด (พิกัด) ที่ตรงกับคำถามของผู้ใช้ได้อย่างรวดเร็วและแม่นยำ
- ดึงต้นฉบับ (Raw Slicing): สคริปต์ Python จะใช้หมายเลขบรรทัดเหล่านั้นเพื่อตัดข้อความจากดิสก์ออกมาเป็นชิ้นข้อความสะอาด ๆ โดยคงต้นฉบับไว้ทุกประการ
- ให้เหตุผลบนคลาวด์ (Reasoning): โมเดลคลาวด์หลักจะรับเพียงชิ้นต้นฉบับความหนาแน่นสูงที่ตัดเสียงรบกวนออกแล้ว พร้อมแผนผังโครงสร้างไฟล์ เพื่อโฟกัสเฉพาะการดีบักและการเขียนโค้ด
เพราะส่งข้อมูลเป็นต้นฉบับที่ไม่ผ่านการแปลงใด ๆ จึงใช้ความสามารถในการให้เหตุผลของโมเดลคลาวด์ได้เต็ม 100% พร้อมลดค่าใช้จ่ายลงอย่างมาก
ตอนนี้รองรับ 3 โหมดคือ error_log, heavy_code, agent_context โดย agent_context เป็นโหมดที่ค้นหาเฉพาะบรรทัดต้นฉบับที่เกี่ยวข้องกับงานปัจจุบันจากเอกสารอ้างอิงคำสั่ง agent อย่าง CLAUDE.md, AGENTS.md, GEMINI.md, .cursorrules, agent-context/*.md
📊 ผลทดสอบจริงบนพีซีของผม
- ล็อกอินฟราขนาดใหญ่ (2,000 บรรทัด): ลด input context จาก 41,711 โทเค็นเหลือ 131 โทเค็น (ประหยัด 99.69%, ใช้เวลา 5.37 วินาที)
- ซอร์สโค้ดบั๊กแบบ legacy (2,155 บรรทัด): ส่งข้อมูลจากเดิม 7,520 โทเค็นโดย ย่อเหลือเพียง 70 โทเค็น (ประหยัด 99.06%, ใช้เวลา 4.46 วินาที)
🛠️ จุดที่ใช้งานจริงแล้วสะดวก
- กันพีซีหน่วง: ถ้ากังวลว่าการใช้ AI บนเครื่องจะทำให้คอมช้า เครื่องมือนี้จะปล่อย local model ออกจากหน่วยความจำ VRAM ทันทีในจังหวะที่ดึงพิกัดสำหรับ routing เสร็จพอดี
- ขยายบริบทแบบย้อนกลับอย่างฉลาด: ถ้าโค้ดที่ตัดมาแคบเกินไปจนดู dependency ก่อนหลังได้ยาก Cloud AI จะไม่เดาสุ่มตอบ แต่มี prompt safety guard ที่ฝังไว้ให้ส่งคำขอกลับไปยังสคริปต์ว่า "ให้ตัดช่วงที่กว้างขึ้นมาใหม่"
- สตรีมไฟล์ขนาดใหญ่: แม้ไฟล์จะใหญ่เกินหน่วยความจำของ local model แต่ก็ยังปลอดภัย เพราะแบ็กเอนด์มี streaming logic ที่จะสแกนคีย์เวิร์ดและส่วนท้ายของไฟล์ก่อนโดยอัตโนมัติ
- รองรับ Claude Code: เวอร์ชันล่าสุดยังมี compact
CLAUDE.mdbootstrap สำหรับ Claude Code มาด้วย โดยสามารถแยกคำสั่งยาวเฉพาะของ Claude ไปไว้ใน reference file แล้วเรียกผ่านagent_contextได้
เปิดให้ใช้ฟรีทั้งหมดภายใต้ MIT license และสามารถนำไปลงทะเบียนใช้งานได้ทันทีทั้งในรูปแบบสคริปต์เดี่ยวหรือเป็นสกิลของ OpenAI Codex ส่วนใน Claude Code ก็สามารถอ้างอิง CLAUDE.md bootstrap เพื่อเรียกใช้สคริปต์เราเตอร์ตัวเดียวกันได้ หวังว่าจะช่วยเพิ่มประสิทธิภาพการพัฒนาให้กับคนที่ต้องดีบักล็อกขนาดใหญ่หรือจัดการโค้ดหนัก ๆ อยู่บ่อยครั้งครับ
หากมีฟีดแบ็กหรือความคิดเห็นเกี่ยวกับสถาปัตยกรรมหรือการปรับแต่งพรอมป์ต์ในมุมต่าง ๆ ผมยินดีมากครับ!
2 ความคิดเห็น
เป็นสกิลที่ดีนะครับ ลองใช้แบบเบา ๆ ดูแล้ว
ตอนสร้าง JSON ที่จะส่งด้วย Python บางครั้งมีเคสที่ทำผิดไวยากรณ์ของ JSON จนเกิดข้อผิดพลาด พอลองเปลี่ยนไปใช้ 4b หรือ qwen2.5-coder:7b ก็พบว่าอัตราการเกิดข้อผิดพลาดลดลงอย่างชัดเจน
โอ้ ขอบคุณมากจริง ๆ ครับที่ช่วยทดสอบให้ทันทีตั้งแต่เพิ่งโพสต์ และยังฝากฟีดแบ็กเปรียบเทียบตามขนาดโมเดลแบบละเอียดไว้ด้วย!
อย่างที่คุณบอกไว้ โมเดลขนาดเล็กมากระดับ 2B อาจมีข้อจำกัดตรงที่บางครั้งเมื่ออยู่ในสภาพแวดล้อมที่มีล็อกซับซ้อนหรือมีอักขระพิเศษปะปนกัน ก็อาจหลุดข้อจำกัดของ system prompt และส่งออก JSON ที่ผิดไวยากรณ์ได้ หากมีทรัพยากร VRAM เหลือเพียงพอ ก็ดูเหมือนว่า Qwen 2.5 Coder 7B หรือสาย Gemma 4B จะดึงพิกัดการ routing ออกมาได้เสถียรกว่ามากครับ
หากท่านอื่น ๆ ทดลองแล้วเจอข้อผิดพลาดไวยากรณ์ JSON เช่นกัน ลองตั้งค่าผ่าน environment variable แล้วเปลี่ยนไปรันด้วยโมเดลขนาดใหญ่ขึ้นตามด้านล่างนี้ น่าจะช่วยให้นำไปใช้งานได้สะดวกมากขึ้นครับ
OLLAMA_MODEL=qwen2.5-coder:7b python3 scripts/router.py ...ขอบคุณมากครับที่แชร์ความเห็นจากการ benchmark ใช้งานจริงอันมีค่านี้