Boom Leverage
บทความทั้งหมด

Context Budget: 6 เทคนิคทำให้ Claude Code ไม่ลืมงานกลางทาง (ฉบับคนทำงาน data)

งาน data ยาว ๆ ใน Claude Code มักพังเพราะ context เต็มแล้วลืมบริบท นี่คือ 6 เทคนิคจริงที่ผมใช้คุมงบ context ให้ agent ทำงานยาวได้โดยไม่หลุด

Varanchai Yingkhamnueng·
claude-codeBoom Leverage

Context Budget: 6 เทคนิคทำให้ Claude Code ไม่ลืมงานกลางทาง (ฉบับคนทำงาน data)

งาน data ยาว ๆ ใน Claude Code มักพังเพราะ context เต็มแล้วลืมบริบท นี่คือ 6 เทคนิคจริงที่ผมใช้คุมงบ context ให้ agent ทำงานยาวได้โดยไม่หลุด

งาน data ที่เจ็บที่สุดเวลาใช้ AI agent ไม่ใช่ตอนมันตอบผิด แต่คือตอนที่มันทำงานมายาว ๆ แล้วจู่ ๆ ก็ "ลืม" ว่ากำลังทำอะไรอยู่ — สรุปบริบทตัวเองทิ้ง แล้วเดินงานต่อบนความเข้าใจที่หายไปครึ่งหนึ่ง ในการทำงานจริงกับ Claude Code ทุกวันบนงานสาย data/risk ผมเจอว่าเบื้องหลังอาการนี้เกือบทั้งหมดคือเรื่องเดียว: การบริหารงบ context (context budget) ไม่ดี พอ context ใกล้เต็ม ระบบจะบีบอัดประวัติการสนทนาเพื่อไปต่อ และทุกครั้งที่บีบอัด รายละเอียดบางอย่างจะหลุดเสมอ บทความนี้คือ 6 เทคนิคที่ผมใช้คุมงบตรงนี้ ให้ agent ทำงานยาว ๆ ได้โดยไม่หลุดบริบท

มุมคนทำ model validation: ผมมองงบ context เหมือนงบความเสี่ยง — ไม่ใช่ของที่ "มีไว้ใช้ให้หมด" แต่เป็นของที่ต้องกันเผื่อไว้ ยิ่งเหลือ headroom มาก โอกาสที่ระบบจะบีบอัดกลางงานสำคัญยิ่งน้อย

1. อย่าดึงทั้งไฟล์เข้ามา ถ้าต้องการแค่บางส่วน

ความสิ้นเปลือง context อันดับหนึ่งที่ผมเจอคือการอ่านไฟล์ยาวทั้งไฟล์ทั้งที่ต้องการแค่ฟังก์ชันเดียว log ทั้งไฟล์ที่มีเป็นหมื่นบรรทัดโดนดูดเข้ามากินงบทันที

เครื่องมือ Read ใน Claude Code รับพารามิเตอร์ offset กับ limit ได้ — สั่งให้อ่านเฉพาะช่วงบรรทัดที่ต้องการ และถ้ายังไม่รู้ว่าของอยู่บรรทัดไหน ให้ค้นด้วย Grep ก่อนเพื่อระบุตำแหน่ง แล้วค่อย Read เฉพาะจุด แทนที่จะกวาดทั้งไฟล์เข้ามาหา

กฎจากงานวัดความเสี่ยง: "ค้นก่อน อ่านทีหลัง" — Grep บอกว่าของอยู่ตรงไหน แล้ว Read เฉพาะช่วงนั้น เป็นนิสัยที่ประหยัดงบมากที่สุด และมันเป็นวิธีเดียวกับที่เราไล่หาต้นตอในโค้ดจริง ไม่มีใครพิมพ์ทั้งไฟล์ออกมาอ่านหาบั๊ก

2. โยนงานค้นหาใหญ่ให้ subagent ทำในบริบทแยก

เวลาต้องกวาดหาอะไรข้ามหลายไฟล์ — เช่น "ฟังก์ชันนี้ถูกเรียกจากตรงไหนบ้าง" — ถ้าให้ agent หลักไล่อ่านเอง ทุกไฟล์ที่มันเปิดจะค้างอยู่ในบริบทหลักไปตลอด

Claude Code ให้เรามอบงานแบบนี้ให้ subagent ได้ และ subagent แต่ละตัวทำงานในหน้าต่างบริบทของตัวเองแยกจากบทสนทนาหลัก มันจะไปเปิดไฟล์ อ่าน ค้น จนได้คำตอบ แล้วส่งกลับมาเฉพาะ "ข้อสรุป" ไฟล์ดิบทั้งหมดที่มันเปิดระหว่างทางไม่ตกมาถึงบริบทหลักเลย เท่ากับเราได้คำตอบโดยจ่ายงบ context แค่ย่อหน้าเดียว

ทำไมมันสำคัญกับเรา: งานค้นหาคืองานที่ "อ่านเยอะ ใช้จริงนิดเดียว" — เป็นเคสที่เหมาะกับการ delegate ที่สุด หลักเดียวกับที่ผมใช้เวลากระจายงานให้ทีมย่อยในระบบ ซึ่งผมเขียนไว้ใน Gemma Delegation: สถาปัตยกรรม 3 ชั้น

3. สั่ง /compact เองตอนจบก้อนงาน อย่ารอให้ระบบบีบเอง

Claude Code จะบีบอัดบทสนทนาให้อัตโนมัติเมื่อ context ใกล้เต็ม ปัญหาคือมัน "เลือกจังหวะเองไม่เป็น" — มันอาจไปบีบเอาตอนที่เรากำลังอยู่กลางการดีบั๊กที่ซับซ้อนพอดี แล้วรายละเอียดสำคัญหลุด

วิธีที่ผมใช้คือ สั่ง /compact เองที่ขอบเขตของงาน พอทำงานย่อยเสร็จหนึ่งก้อน (เช่น เขียนฟังก์ชันเสร็จ เทสต์ผ่าน) และกำลังจะขึ้นงานถัดไปที่ไม่ต้องใช้บริบทเก่า นั่นคือจังหวะที่ compact ได้ปลอดภัยที่สุด เพราะเราเลือกจุดตัดเองในตอนที่บริบทเก่าหมดประโยชน์แล้ว ไม่ใช่ปล่อยให้ระบบสุ่มตัดกลางอากาศ

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

4. ออกแบบ CLAUDE.md ให้กฎสำคัญรอดจากการบีบอัด

หลังบีบอัด สิ่งที่รอดกลับเข้าบริบทไม่เท่ากันทุกไฟล์ CLAUDE.md ตัว root จะถูกใส่กลับให้อัตโนมัติ แต่ CLAUDE.md ที่ซ้อนอยู่ในโฟลเดอร์ย่อยจะไม่ถูกใส่กลับเอง — มันจะโหลดใหม่ก็ต่อเมื่อ agent ไปแตะไฟล์ในโฟลเดอร์นั้นอีกครั้ง

หลักที่ตามมาชัดเจน: กฎที่ agent ต้องรู้ตลอดเวลา (safety, ห้ามทำอะไร, ขั้นตอนหลัก) ให้อยู่ root ส่วนกฎเฉพาะโดเมนที่ใช้เป็นครั้งคราว ค่อยแยกไปไฟล์ย่อยแล้วดึงเข้ามาเมื่อจำเป็น ผมเขียนเรื่องการออกแบบ CLAUDE.md ให้ทนต่อ compaction ไว้ละเอียดใน CLAUDE.md Design: กฎที่รอดจาก Context Compaction

5. ใช้ @import ดึงไฟล์อ้างอิงเข้ามาแบบคุมได้

แทนที่จะแปะเนื้อหายาว ๆ ลงในพรอมป์ทุกครั้ง CLAUDE.md รองรับการ import ไฟล์อื่นด้วยไวยากรณ์ @path/to/file — ไฟล์ที่ถูกอ้างจะถูกกางเนื้อหาเข้าบริบทให้ตอนเปิดใช้งาน ทำให้เราจัดระเบียบความรู้เป็นไฟล์ ๆ แล้วประกอบเข้ามาเท่าที่ต้องการ นี่คือโครงย่อ ๆ ที่ผมใช้จริง ก็อปไปปรับได้เลย:

# CLAUDE.md (root — อยู่ในบริบทเสมอ)

## กฎที่ห้ามพลาด (ต้องรอด compaction)
- อ่านไฟล์ยาว: ใช้ Grep ก่อน แล้ว Read เฉพาะช่วง (offset/limit)
- งานค้นหาข้ามไฟล์: มอบให้ subagent ทำในบริบทแยก
- ปิดงานย่อยให้จบก่อน แล้วค่อย /compact เอง

## ความรู้เฉพาะโดเมน (โหลดเมื่อต้องใช้)
@docs/data-pipeline-rules.md
@docs/model-validation-checklist.md

มุมคนทำ model validation: ข้อดีของ @import คือมัน "ตรวจสอบได้" — ความรู้ที่ agent ใช้อยู่ในไฟล์ที่เราเห็นและแก้ได้ ไม่ใช่ prompt ยาวที่ฝังจนตามไม่ทันว่ากฎไหนมาจากไหน

6. หลัง compaction ให้ถือว่าไฟล์อ้างอิงต้องโหลดใหม่

เทคนิคสุดท้ายเป็นเรื่องวินัย ไม่ใช่ฟีเจอร์ พอเห็นว่ามีการบีบอัดเกิดขึ้น (บทสนทนาถูกสรุป) ให้ถือเป็นสัญญาณว่า CLAUDE.md ย่อยและไฟล์ที่ import ด้วย @ อาจหลุดจากบริบทไปแล้ว ก่อนจะสั่งงานที่พึ่งกฎเหล่านั้นต่อ ให้โหลดกลับมาก่อน อย่าเดาว่ามันยังอยู่

ผมทำเรื่องนี้จนเป็นนิสัย เพราะบั๊กที่แพงที่สุดของ agent คือมัน "ทำต่อด้วยความมั่นใจบนกฎที่หายไปแล้ว" — ผลลัพธ์ดูสมเหตุสมผลแต่ผิดกฎที่เราวางไว้ ตรวจจับยากกว่าการที่มันฟ้อง error ตรง ๆ เยอะ

กฎจากงานวัดความเสี่ยง: "ไม่แน่ใจว่ากฎยังอยู่ไหม ให้โหลดใหม่" ต้นทุนโหลดซ้ำต่ำมากเมื่อเทียบกับต้นทุนของงานที่เดินผิดทางเพราะกฎหาย — เป็นการแลกที่คุ้มเสมอ

ภาพรวม

หกเทคนิคนี้มีแกนเดียวกัน: อย่าให้ของที่ไม่จำเป็นมากินงบ context และคุมจังหวะการบีบอัดเอง — อ่านเฉพาะช่วงที่ต้องการ, โยนงานค้นหาให้ subagent, สั่ง /compact ตอนจบก้อนงาน, วางกฎสำคัญไว้ root, ประกอบความรู้ด้วย @import, และโหลดกฎกลับหลังบีบอัด ทำได้ครบ agent จะทำงาน data ยาว ๆ ได้โดยไม่ลืมงานกลางทาง

ทั้งหมดนี้คือหลักการที่ก็อปไปใช้ได้ทันที ส่วนของจริงที่ผมใช้ในระบบ — CLAUDE.md ฉบับเต็มที่ calibrate ค่าเพดานและ load-trigger มาแล้ว, เทมเพลต brief สำหรับสั่ง subagent, และ hook ที่บังคับวินัยพวกนี้ให้อัตโนมัติ — ประกอบเป็น workspace ทั้งก้อนที่อยู่ใน คอร์ส Claude Code ถ้าอยากได้ทั้งชุดไปวางทับงานตัวเองเลย

อ่านต่อ