วิธีแก้ปัญหา Claude Code ทำงานช้าและค่าใช้จ่ายสูงเกินจริง
เซสชัน Claude Code ที่ยาวนานมักมีค่าใช้จ่ายสูงเนื่องจากการส่งบริบทซ้ำซ้อน เรียนรู้วิธีใช้คำสั่ง /context เพื่อตรวจสอบการใช้โทเค็น พร้อมเทคนิคการจัดการหน่วยความจำเพื่อลดต้นทุน
วิธีป้องกันไม่ให้เซสชัน Claude Code ที่ยาวนานทำงานช้าและมีค่าใช้จ่ายสูง
เซสชัน Claude Code ที่ยาวนานจะทำงานช้าและมีค่าใช้จ่ายสูงขึ้น เนื่องจากทุกรอบการสนทนาจะส่งบริบททั้งหมดกลับไปใหม่ และบริบทนั้นมีแต่จะเพิ่มขึ้นเรื่อยๆ วิธีแก้ไขคือการจัดการอย่างเป็นระเบียบตามลำดับ ให้รัน /context เพื่อดูว่าสิ่งใดที่กำลังทำให้หน้าต่างบริบทเต็ม จากนั้นให้ตัดรายการที่คุณต้องจ่ายเงินในทุกคำขอออก แล้วใช้ /clear ระหว่างงานที่ไม่เกี่ยวข้องกัน และใช้ /compact พร้อมคำสั่งภายในงานยาวๆ งานหนึ่ง ควรทำงานอย่างต่อเนื่องไม่ขาดช่วง เพราะการที่ prompt cache เย็นลงจะเปลี่ยนการอ่านที่มีราคาถูกให้กลายเป็นการเขียนใหม่ทั้งหมดของสิ่งที่คุณเคยพูดไป
สาเหตุที่มิเตอร์ทำงานตลอดเวลาสามารถดูได้ที่ มิเตอร์โทเค็นเบื้องหลังเซสชันของเอเจนต์
อ่าน /context ก่อนที่คุณจะเปลี่ยนแปลงสิ่งใด
อย่าคาดเดาสิ่งที่อยู่ในหน้าต่างการทำงาน Claude Code จะแจ้งให้คุณทราบเอง
/context [all] จะแสดงการใช้งานบริบทปัจจุบันเป็นตารางสี พร้อมคำแนะนำในการปรับแต่งสำหรับเครื่องมือที่ใช้บริบทสูงและปัญหาหน่วยความจำเกิน ส่วน all จะขยายรายละเอียดแยกตามรายการในโหมดเต็มหน้าจอ ให้อ่านผลลัพธ์โดยแบ่งเป็น 5 ส่วนดังนี้:
- System prompt: คำสั่งควบคุมการทำงานของ Claude Code ซึ่งจะคงที่ตลอดทั้งเซสชัน
- Tool definitions: โครงสร้างของทุกเครื่องมือที่เอเจนต์เรียกใช้ได้ รวมถึงทุก MCP (Model Context Protocol) server ที่เชื่อมต่ออยู่
- Memory files:
CLAUDE.mdและหน่วยความจำอัตโนมัติ ซึ่งจะถูกโหลดเมื่อเริ่มเซสชัน - Files and tool results: ไฟล์ทุกไฟล์ที่อ่าน และทุกสิ่งที่คำสั่งของคุณแสดงผลกลับมา
- Message history: ลำดับการสนทนาระหว่างคุณกับเอเจนต์
สามส่วนแรกถือเป็นค่าใช้จ่ายคงที่ ซึ่งต้องจ่ายในทุกคำขอตลอดอายุของเซสชัน ส่วนสองส่วนหลังจะเพิ่มขึ้นเรื่อยๆ ให้ลดค่าใช้จ่ายคงที่ตั้งแต่เริ่มต้น และจัดการส่วนที่เพิ่มขึ้นอย่างต่อเนื่อง
มีข้อความสองชุดที่แจ้งให้คุณทราบว่าหน้าต่างการทำงานเต็มแล้ว:
Context exceeds the 200k-token limit by 94k tokens — run /compact or /clear to continue.
Context is 94k tokens past the 200k-token compaction window — run /compact to reduce usage.ชุดแรกคือขีดจำกัดสูงสุด ซึ่งคำขอจะถูกปฏิเสธ โดยข้อผิดพลาดของ API (application programming interface) ที่ตรงกันจะแสดงเป็น Prompt is too long ส่วนชุดที่สองคือหน้าต่างการบีบอัดข้อมูล ซึ่งอาจมีขนาดเล็กกว่าหน้าต่างบริบทจริงของโมเดลในรุ่น 1 ล้านโทเค็น คำขอยังคงสำเร็จได้หากเกินจุดนี้ ดังนั้นจึงเป็นเพียงคำเตือนมากกว่าการปฏิเสธ
ในแผนการใช้งานแบบชำระเงิน /usage จะเพิ่มส่วนที่เหลือ โดยจะระบุพฤติกรรม เช่น การใช้บริบทที่ยาวเกินไปหรือการที่ cache ไม่พบข้อมูล และระบุการใช้งานล่าสุดให้กับทักษะย่อย, ซับเอเจนต์ และ MCP server แต่ละตัว หากระบบแจ้งว่าโควตาถูกใช้ไปหมดแล้ว หน้าต่างขีดจำกัดที่คุณกำลังรออยู่ จะเป็นตัวตัดสินว่าการตัดทอนบริบทจะช่วยคุณได้ในขณะนี้ หรือคุณจำเป็นต้องใช้วิธีอื่นในการทำงานต่อ
CLAUDE.md เป็นภาระภาษีถาวร ดังนั้นควรทำให้กระชับ
CLAUDE.md ของคุณจะถูกโหลดเข้าสู่บริบทเมื่อเริ่มเซสชันและคงอยู่ที่นั่น หากมันมีขั้นตอนการปรับใช้ (deployment) โดยละเอียด โทเค็นเหล่านั้นจะคงอยู่แม้ในขณะที่คุณแก้ไขคำผิดในไฟล์ทดสอบ คำแนะนำของ Anthropic คือให้ใส่เฉพาะสิ่งที่จำเป็นและรักษาความยาวไฟล์ไว้ไม่เกิน 200 บรรทัด
ให้ย้ายขั้นตอนการทำงานไปไว้ในทักษะ (skills) ทักษะจะถูกโหลดก็ต่อเมื่อมีการเรียกใช้ ดังนั้นขั้นตอนการทำงานที่คุณรันสัปดาห์ละสองครั้งจะไม่มีค่าใช้จ่ายในวันอื่นๆ ทักษะมีงบประมาณของตัวเองหลังจากการบีบอัด (compaction): เนื้อหาจะถูกฉีดกลับเข้าไปใหม่ โดยจำกัดไว้ที่ 5,000 โทเค็นต่อทักษะและรวมทั้งหมดไม่เกิน 25,000 โทเค็น โดยจะลบส่วนที่เก่าที่สุดออกก่อน การตัดทอน (truncation) จะรักษาช่วงต้นของไฟล์ไว้ ดังนั้นให้วางคำสั่งที่สำคัญที่สุดไว้ใกล้ส่วนบนของ SKILL.md
สิ่งที่เหลืออยู่หลังจากการบีบอัดจะเป็นตัวตัดสินว่าคำสั่งนั้นควรอยู่ที่ใด
- System prompt และรูปแบบการแสดงผลจะไม่เปลี่ยนแปลง เนื่องจากไม่ใช่ส่วนหนึ่งของประวัติการสนทนา
CLAUDE.mdในระดับ root ของโปรเจกต์, กฎที่ไม่ได้กำหนดขอบเขต (unscoped rules) และหน่วยความจำอัตโนมัติจะถูกฉีดกลับจากดิสก์- กฎที่มี frontmatter แบบ
paths:จะสูญหายไปจนกว่าจะมีการอ่านไฟล์ที่ตรงกันอีกครั้ง CLAUDE.mdที่ซ้อนอยู่ในไดเรกทอรีย่อยจะสูญหายไปจนกว่าจะมีการอ่านไฟล์ในไดเรกทอรีย่อยนั้นอีกครั้ง- Hooks จะไม่ได้รับผลกระทบ เนื่องจาก hook ทำงานเป็นโค้ดและไม่เคยเข้าสู่บริบท
ดังนั้น กฎที่คุณต้องพึ่งพาควรอยู่ใน CLAUDE.md ที่ระดับ root ของโปรเจกต์: Claude Code จะล้างผลลัพธ์ของเครื่องมือเก่าออกก่อนแล้วจึงสรุปผล ดังนั้นคำสั่งจากช่วงต้นของการสนทนาอาจสูญหายไป ให้แก้ไขหน่วยความจำด้วย /memory Claude Code จะเก็บสำเนาที่โหลดไว้เมื่อเริ่มเซสชัน ดังนั้นการตัดทอนระหว่างเซสชันจะคง prompt cache ไว้และจะยังไม่มีผลจนกว่าจะถึง /clear, /compact หรือการรีสตาร์ทครั้งถัดไป การสูญเสียบริบทเป็นเพียงเหตุผลหนึ่งที่ทำให้กฎไม่ถูกปฏิบัติตาม ดังนั้นเมื่อกฎยังคงอยู่ในหน้าต่างบริบทอย่างชัดเจนแต่กลับถูกเพิกเฉย ให้ตรวจสอบสาเหตุอื่นๆ ก่อนที่คุณจะเขียนกฎนั้นใหม่
/clear ระหว่างงาน, /compact ภายในงานเดียว
คำสั่งสองตัวนี้ดูเหมือนจะใช้แทนกันได้ แต่มีค่าใช้จ่ายที่แตกต่างกันมาก
/clear [name] จะเริ่มการสนทนาใหม่โดยล้างบริบทเดิมออกทั้งหมด คำสั่งนี้ไม่ได้ส่งคำขอใดๆ จึงไม่มีค่าใช้จ่าย คุณสามารถระบุชื่อเพื่อติดป้ายกำกับบทสนทนาก่อนหน้าในตัวเลือก /resume ได้ ส่วน /reset และ /new เป็นคำสั่งนามแฝง ให้ใช้คำสั่งนี้ทันทีที่คุณเปลี่ยนไปทำงานที่ไม่เกี่ยวข้องกัน เพราะหากไม่ทำเช่นนั้น ประวัติการสนทนาเดิมจะถูกส่งซ้ำและถูกเรียกเก็บเงินใหม่ในทุกข้อความของงานใหม่
/compact [instructions] จะช่วยเพิ่มพื้นที่ว่างในบริบทโดยที่ยังคงสนทนาต่อเนื่องในหัวข้อเดิม โดยคำสั่งนี้จะสรุปประวัติการสนทนาที่ผ่านมาและนำมาแทนที่เนื้อหาเดิม ให้ใช้คำสั่งนี้ภายในงานยาวๆ ที่คุณยังต้องการความต่อเนื่องของข้อมูล
ต้องให้คำสั่งแก่ /compact เสมอ การใช้ /compact เปล่าๆ จะเป็นการสรุปโดยใช้ prompt เริ่มต้นซึ่งไม่ทราบว่าส่วนใดของงานที่คุณยังจำเป็นต้องใช้ แต่การระบุคำสั่งกำกับไว้จะช่วยรักษาข้อมูลส่วนนั้นไว้ได้:
/compact focus on the auth bug fix
/compact keep only the plan and the diffหากคุณต้องทำการบีบอัด (compact) ด้วยเหตุผลเดิมซ้ำๆ ให้ใส่คำสั่งถาวรไว้ใน CLAUDE.md ของโปรเจกต์ภายใต้หัวข้อ # Compact instructions ในเซสชันใหม่ /compact จะแสดงผล Not enough messages to compact. ซึ่งหมายความว่ายังไม่มีประวัติการสนทนาเกิดขึ้น
มีค่าใช้จ่ายสองส่วนที่มักสับสนกัน คำขอสรุปข้อมูลจะใช้ prefix ร่วมกับคุณ ดังนั้นมันจะอ่านจาก cache ที่มีอยู่แทนที่จะประมวลผลประวัติการสนทนาใหม่ทั้งหมด และเวลาส่วนใหญ่จะใช้ไปกับการสร้างสรุป การบีบอัดบริบทขนาดใหญ่ยังคงเป็นคำขอที่มีขนาดใหญ่ เพราะบทสนทนาที่ถูกสรุปคือข้อมูลนำเข้า ส่วนการโต้ตอบหลังจากบีบอัดไม่ใช่ส่วนที่ช้า เพราะระบบจะสร้าง cache ใหม่สำหรับ prompt ที่สั้นลงมาก
ยังมีคำสั่งที่ประหยัดกว่าอีกสองคำสั่ง /rewind [description] จะย้อนกลับโค้ดและการสนทนาไปยังจุดตรวจสอบ (checkpoint) สำหรับเส้นทางที่คุณต้องการละทิ้งทั้งหมด คำสั่งนี้ดีกว่าการบีบอัดเพราะมันจะตัดประวัติกลับไปยัง prefix ที่ถูก cache ไว้แล้ว ส่วน /recap จะผนวกสรุปข้อมูลเป็นผลลัพธ์ของคำสั่งแทนที่จะแทนที่ประวัติการสนทนา ทำให้ prefix ที่ถูก cache ไว้ยังคงอยู่ครบถ้วน
หากการบีบอัดอัตโนมัติทำงานซ้ำๆ ระบบจะแสดงข้อความนี้:
Autocompact is thrashing: the context refilled to the limit...การบีบอัดสำเร็จ แต่ไฟล์หรือผลลัพธ์จากเครื่องมือทำให้หน้าต่างบริบทเต็มซ้ำๆ กันหลายครั้ง Claude Code จึงหยุดการพยายามใหม่ คุณสามารถแก้ไขได้โดยการอ่านไฟล์ขนาดใหญ่แบบระบุช่วงบรรทัด, รันคำสั่ง /compact โดยเน้นไปที่ส่วนที่ไม่รวมผลลัพธ์ขนาดใหญ่, ย้ายงานนั้นไปให้ subagent จัดการ หรือใช้ /clear หากการสนทนาก่อนหน้านี้เสร็จสิ้นแล้ว
MCP servers มีภาระงานคงที่
MCP server ทุกตัวที่คุณเชื่อมต่อจะเพิ่มภาระให้กับทุกคำขอตลอดทั้ง session คุณต้องเสียทรัพยากรไปไม่ว่าคุณจะเรียกใช้งานเครื่องมือเหล่านั้นหรือไม่ก็ตาม
Claude Code ช่วยลดปัญหานี้ โดยค่าเริ่มต้นจะเลื่อนการโหลดคำนิยามของ MCP tool ออกไปก่อน ดังนั้นจะมีเพียงชื่อของเครื่องมือเท่านั้นที่ถูกนำเข้าสู่ context จนกว่า Claude จะเลือกใช้เครื่องมือตัวใดตัวหนึ่ง ให้รัน /context เพื่อดูว่า server ของคุณใช้ทรัพยากรไปเท่าใด และรัน /mcp disable <name> เพื่อตัดการเชื่อมต่อ server ที่คุณไม่ได้ใช้งานในวันนี้ หากคุณรัน MCP servers ของคุณเองบน VPS หลักการคำนวณเดียวกันนี้จะเป็นตัวกำหนดว่า server หนึ่งเครื่องควรเปิดเผยเครื่องมือออกมามากน้อยเพียงใด
ควรดำเนินการในส่วนนี้ตั้งแต่เริ่ม session แม้ว่าคำนิยามจะถูกเลื่อนการโหลดออกไป แต่การเชื่อมต่อหรือตัดการเชื่อมต่อ server จะเป็นการเพิ่มข้อมูลต่อท้ายบทสนทนาเท่านั้น และ cache จะยังคงอยู่ ในกรณีที่คำนิยามถูกโหลดเข้าไปในส่วน prefix โดยตรงเนื่องจากปิดการค้นหาเครื่องมือหรือ server นั้นได้รับการยกเว้นจากการเลื่อนการโหลด การเปลี่ยนแปลงในลักษณะเดียวกันนี้จะส่งผลให้คำขอถัดไปต้องอ่านข้อมูลทั้งหมดใหม่อีกครั้ง
กรองผลลัพธ์จากเครื่องมือที่มีรายละเอียดมากเกินไปก่อนนำเข้าสู่บริบท
ผลลัพธ์จากเครื่องมือจะกลายเป็นข้อมูลนำเข้า และข้อมูลนำเข้านั้นจะถูกส่งซ้ำในทุกรอบการสนทนาถัดไป การรันการทดสอบที่แสดงผลลัพธ์ออกมาถึง 20,000 tokens ไม่ใช่ค่าใช้จ่ายที่เกิดขึ้นเพียงครั้งเดียว แต่คุณต้องจ่ายค่าประมวลผลซ้ำในทุกรอบจนกว่าข้อมูลนั้นจะหลุดออกจากหน้าต่างบริบท
ให้ทำการกรองข้อมูลตั้งแต่ต้นทาง การใช้ hook เพื่อลดทอนผลลัพธ์การทดสอบให้เหลือเพียงรายการที่ล้มเหลวก่อนที่ Claude จะเห็นข้อมูล จะเปลี่ยนผลลัพธ์จำนวนมหาศาลให้เหลือเพียงไม่กี่ร้อย tokens ทั้งในรอบปัจจุบันและทุกรอบที่มีการส่งข้อมูลซ้ำ:
npm test 2>&1 | grep -E "FAIL|Error:" | head -40ตัว hook เองจะไม่ถูกนำเข้าสู่บริบทเนื่องจากทำงานในรูปแบบของโค้ด ให้ใช้วิธีนี้กับเครื่องมือใดก็ตามที่ให้ผลลัพธ์ยาวเกินกว่าหนึ่งหน้าจอ ตรรกะเดียวกันนี้ยังใช้กับการอ่านไฟล์ขนาด 3,000 บรรทัดได้เช่นกัน โดยให้ระบุช่วงบรรทัดที่คุณต้องการแทน เพราะหากส่งไฟล์ไปทั้งไฟล์ ข้อมูลทั้งหมดจะค้างอยู่ในหน้าต่างบริบททันทีที่ส่งไปถึง
กำหนดขอบเขตสิ่งที่ Agent อ่านและมอบหมายงานที่สร้างภาระข้อมูล
Prompt ที่ระบุชื่อไฟล์และอาการของปัญหาจะอ่านเฉพาะไฟล์นั้น ในขณะที่คำสั่งให้จัดระเบียบโปรเจกต์แบบกว้างๆ จะทำให้ Agent อ่านทุกอย่างที่เห็นว่าเกี่ยวข้อง ซึ่งการอ่านแต่ละครั้งจะถูกเก็บไว้ใน context window ทั้งหมด
ให้มอบหมายงานที่มีรายละเอียดสูงแก่ subagent การรันการทดสอบและการประมวลผล log ล้วนใช้ context จริง subagent จะเก็บผลลัพธ์เหล่านั้นไว้ในหน้าต่างของตัวเองและส่งกลับมาเพียงบทสรุป ข้อแลกเปลี่ยนคือ subagent จะสร้าง cache ของตัวเองซึ่งจะไม่มีการดึงข้อมูลจาก cache ในการเรียกครั้งแรก และใช้ระยะเวลาคงอยู่ของ cache เพียง 5 นาทีแม้จะอยู่ในการสมัครสมาชิกแบบเสียค่าบริการ การมอบหมายงานช่วยปกป้อง context หลักของคุณได้อย่างน่าเชื่อถือ แต่วิธีนี้ไม่ได้ช่วยลดจำนวน token รวมเสมอไป
นาฬิกาของแคช: การทำงานเป็นช่วงเวลา
Prompt caching คือสิ่งที่ทำให้การส่งข้อมูลซ้ำมีราคาถูกลง โดยมีอัตราค่าใช้จ่ายอยู่ที่ 0.1 เท่าของอัตรา input พื้นฐานสำหรับการอ่าน prefix เทียบกับ 1.25 เท่าสำหรับการเขียน หรือ 2 เท่าสำหรับการเขียนในกรณีที่มีอายุการใช้งาน 1 ชั่วโมง การใช้งานแต่ละครั้งจะรีเฟรชรายการโดยไม่มีค่าใช้จ่ายเพิ่มเติม ดังนั้นนาฬิกาจะเริ่มนับใหม่จากการใช้งานครั้งล่าสุด ตัวคูณเหล่านี้บอกให้คุณทราบถึงรูปแบบของค่าใช้จ่ายแต่ไม่ใช่จำนวนเงิน ดังนั้นควรนำไปคำนวณร่วมกับ ราคาจริงของหนึ่งล้านโทเค็น เพื่อแปลงขนาด context window ทั้งหมดให้เป็นตัวเลขดอลลาร์
อายุการใช้งานที่คุณได้รับขึ้นอยู่กับวิธีการยืนยันตัวตน ซึ่งเป็นจุดที่ความเข้าใจผิดว่า "แคชของคุณจะหมดอายุหลังจากห้านาที" นั้นไม่ถูกต้องเสมอไป
- สำหรับการสมัครสมาชิก Claude ตัว Claude Code จะขออายุการใช้งาน 1 ชั่วโมงโดยอัตโนมัติ
- เมื่อคุณใช้งานเกินขีดจำกัดของแผนและเริ่มใช้ usage credits คุณจะถูกเรียกเก็บเงินตามการใช้งานนั้น ดังนั้นอายุการใช้งานจะลดลงเหลือ 5 นาที
- สำหรับ API key หรือผู้ให้บริการคลาวด์ อายุการใช้งานจะอยู่ที่ 5 นาที
ENABLE_PROMPT_CACHING_1H=1จะเป็นการเลือกใช้อายุการใช้งาน 1 ชั่วโมง และFORCE_PROMPT_CACHING_5M=1จะเป็นการบังคับให้ลดกลับลงมา
คำแนะนำเรื่องจังหวะการทำงานเหมือนกันในทุกกรณี คือควรทำงานเป็นช่วงต่อเนื่องกัน เพราะการปล่อยให้ว่างทิ้งไว้นานเกินอายุการใช้งานจะทำให้การโต้ตอบครั้งถัดไปของคุณต้องเขียน prefix ที่สะสมมาทั้งหมดใหม่ การใช้ เซสชัน Claude Code ที่แยกออกมาใน tmux จะไม่มีค่าใช้จ่ายในขณะที่ไม่ได้ใช้งาน แต่สิ่งที่คุณต้องเสียไปในช่วงเวลาที่ว่างนั้นคือความพร้อมของแคช
การกระทำบางอย่างจะทำให้แคชถูกล้างทิ้งในขณะที่คุณยังทำงานอยู่ เช่น การสลับโมเดล, การเปลี่ยนระดับความพยายาม (effort level), การเปิดโหมด fast mode, การเชื่อมต่อหรือตัดการเชื่อมต่อ MCP server, การเปิดหรือปิดปลั๊กอิน, การปฏิเสธการใช้เครื่องมือทั้งหมด, การบีบอัดข้อมูล (compacting) และการอัปเกรด Claude Code โดย /model มักเป็นสิ่งที่ทำให้ประหลาดใจ เพราะแต่ละโมเดลมีแคชเป็นของตัวเอง ดังนั้นคำขอถัดไปจะอ่านประวัติทั้งหมดโดยไม่มี cache hits แม้ว่าเนื้อหาจะเหมือนกันก็ตาม การอ่านซ้ำนั้นจะถูกเรียกเก็บเงินตามอัตราของโมเดลปลายทาง ดังนั้นการสลับไปใช้ Fable กลางคันจะทำให้ประวัติทั้งหมดที่คุณสะสมมาถูกคิดค่าใช้จ่ายตาม อัตรา input ที่ประกาศไว้ของ Fable 5
การแก้ไขไฟล์, การแก้ไข CLAUDE.md, การเรียกใช้ทักษะและคำสั่ง, การรัน /recap, การย้อนกลับ (rewinding) และการสร้าง subagent ทั้งหมดนี้จะยังคงรักษาแคชไว้ โดยแคชจะถูกจำกัดขอบเขตไว้ที่หนึ่งเครื่องและหนึ่งไดเรกทอรี ดังนั้นสองเซสชันในไดเรกทอรีที่ต่างกันจะไม่สามารถใช้แคชร่วมกันได้ ขอบเขตนี้จะยึดตาม CLI แทนที่จะเป็นบัญชีของคุณ ดังนั้นจึงไม่มีข้อมูลใดถูกส่งต่อไปยังแอป Claude บนเดสก์ท็อป ซึ่งบน Linux จะเป็น การติดตั้งรุ่นเบต้าแยกต่างหากควบคู่ไปกับ CLI
หากต้องการตรวจสอบว่าแคชทำงานหรือไม่ ให้ดูที่ current_usage โดย cache_creation_input_tokens จะถูกเขียนขึ้นด้วยอัตราการเขียนแคช และ cache_read_input_tokens จะถูกให้บริการด้วยอัตราประมาณหนึ่งในสิบของอัตรา input มาตรฐาน อัตราส่วนการอ่านต่อการสร้างที่สูงถือเป็นสัญญาณที่ดี หากอัตราการสร้างยังคงสูงอยู่ในการโต้ตอบแต่ละครั้ง แสดงว่ามีบางอย่างใน prefix ของคุณเปลี่ยนแปลงอยู่ตลอดเวลา
หน้าต่างบริบทที่ใหญ่ขึ้นช่วยแก้ปัญหานี้ได้หรือไม่
ช่วยได้ในระดับหนึ่ง โมเดลปัจจุบันหลายตัวรองรับหน้าต่างบริบทขนาด 1 ล้านโทเค็น และการบีบอัดข้อมูลยังคงทำงานในลักษณะเดิมที่ขีดจำกัดขนาดใหญ่ขึ้น ปัจจัยทางเศรษฐศาสตร์ไม่ได้เปลี่ยนไป เนื่องจาก prompt ทั้งหมดยังคงถูกส่งซ้ำและถูกเรียกเก็บเงินในทุกรอบการสนทนา หน้าต่างที่ใหญ่ขึ้นเป็นเพียงตัวกำหนดว่าเมื่อใดที่คุณถูกบังคับให้ต้องจัดการข้อมูล ส่วนการดูแลความสะอาดของข้อมูล (hygiene) เป็นตัวกำหนดค่าใช้จ่าย หากปัญหาคือค่าใช้จ่ายไม่ใช่ขีดจำกัดของหน้าต่าง แผนบริการ Claude แบบใดที่เหมาะกับวิธีการทำงานของคุณ จะเป็นตัวตัดสินว่าคุณกำลังจ่ายเงินจริงหรือใช้โควตาตามแผนบริการที่สมัครไว้
การแก้ไขบริบทและการบีบอัดข้อมูลใน API เป็นคนละเรื่องกัน
หากคุณกำลัง สร้างเอเจนต์ของคุณเองบน Messages API จะไม่มีคำสั่ง slash ให้ใช้งานและคุณต้องดำเนินการส่วนนี้ด้วยตนเอง โปรดจัดสรรงบประมาณสำหรับงานส่วนนี้ตั้งแต่เริ่มต้น เนื่องจาก API ไม่มีระดับการใช้งานฟรีนอกเหนือจากเครดิตเริ่มต้นจำนวนเล็กน้อย ดังนั้นประวัติการสนทนาที่ไม่ได้ตัดทอนทุกรอบจะถูกเรียกเก็บเงินเต็มจำนวน ผู้ให้บริการที่คุณเลือกใช้จะเป็นตัวกำหนดการคำนวณค่าใช้จ่ายก่อนที่จะมีการตัดทอนข้อมูลใดๆ ดังนั้นหากคุณยังอยู่ในขั้นตอนการตัดสินใจ ให้คำนวณต้นทุนของภาระงานเดียวกันบนทั้งสอง API แทนการเปรียบเทียบเพียงแค่อัตราค่าบริการต่อ token ที่แสดงไว้ ฟีเจอร์ฝั่งเซิร์ฟเวอร์สองรายการสามารถจัดการงานนี้ได้ แต่ทั้งสองฟีเจอร์นี้ไม่เหมือนกัน
การแก้ไขบริบท (Context editing) จะลบเนื้อหาเฉพาะเจาะจงออกจากประวัติการสนทนาเมื่อข้อมูลมีขนาดใหญ่ขึ้น โดยจะแทนที่เนื้อหาที่ถูกลบด้วยข้อความตัวแทนเพื่อให้ Claude ทราบว่ามีการลบข้อมูลบางส่วนออกไป ฟีเจอร์นี้ยังอยู่ในสถานะเบต้า: ให้ส่ง anthropic-beta: context-management-2025-06-27 และกำหนดค่ากลยุทธ์ภายใต้ context_management.edits โดย clear_tool_uses_20250919 จะลบผลลัพธ์จากเครื่องมือ และ clear_thinking_20251015 จะจัดการบล็อกการคิด (thinking blocks) ค่าเริ่มต้นของ trigger คือ 100,000 input tokens ส่วน keep คือการใช้งานเครื่องมือ 3 ครั้งล่าสุด และ clear_tool_inputs คือ false ดังนั้นข้อมูลนำเข้าจะยังคงอยู่และมีเพียงผลลัพธ์เท่านั้นที่จะถูกลบออก
การบีบอัดข้อมูล (Compaction) จะสร้างบทสรุปและแทนที่ประวัติการสนทนาทั้งหมดด้วยบทสรุปนั้น ฟีเจอร์นี้ยังอยู่ในสถานะเบต้าเช่นกัน: ให้ส่ง anthropic-beta: compact-2026-01-12 และใช้ประเภทการแก้ไข compact_20260112 โดยค่าเริ่มต้นของตัวกระตุ้น (trigger) คือ {"type": "input_tokens", "value": 150000} และค่าที่กำหนดต้องไม่ต่ำกว่า 50,000
การบีบอัดข้อมูลมีกฎการส่งต่อหนึ่งข้อที่อาจทำให้เอเจนต์หยุดทำงานโดยไม่คาดคิด การตอบกลับจะเริ่มต้นด้วยบล็อกเนื้อหา compaction ซึ่งบรรจุบทสรุปไว้ ตามด้วยบล็อกข้อความปกติ คุณต้องส่งบล็อกนั้นกลับไปในการร้องขอครั้งถัดไป จากนั้น API จะลบบล็อกเนื้อหาทั้งหมดที่อยู่ก่อนหน้าบล็อกดังกล่าว ในทางปฏิบัติ: ให้ผนวกเนื้อหาทั้งหมดของ response.content ไม่ใช่เพียงแค่ส่วนที่เป็นข้อความเท่านั้น
เอกสารของ Anthropic ระบุว่าการบีบอัดข้อมูลฝั่งเซิร์ฟเวอร์เป็นกลยุทธ์หลักสำหรับการจัดการบริบทในการสนทนาที่ยาวนาน และการแก้ไขบริบทเป็นตัวเลือกสำหรับการควบคุมสิ่งที่ถูกลบอย่างละเอียด โปรดตรวจสอบการรองรับของโมเดลก่อน โมเดล Opus, Sonnet และ Fable ในปัจจุบันรองรับการบีบอัดข้อมูล ส่วน claude-haiku-4-5 ไม่รองรับ และหน้าเว็บเกี่ยวกับการบีบอัดข้อมูลจะมีรายการที่อัปเดตล่าสุดอยู่เสมอ ฟีเจอร์เบต้าทั้งสองนี้ไม่ได้ขับเคลื่อน /compact ของ Claude Code ซึ่งเอกสารระบุว่าเป็นเพียงการร้องขอให้สรุปข้อมูลแบบครั้งเดียวที่ไคลเอนต์ส่งไปเท่านั้น
FAQ
ทำไมเซสชัน Claude Code ของฉันถึงทำงานช้าลงและมีค่าใช้จ่ายสูงขึ้นเมื่อใช้งานไปนานๆ?
เนื่องจากบทสนทนาทั้งหมดจะถูกส่งซ้ำในทุกครั้งที่มีการโต้ตอบ คำถามเพียงบรรทัดเดียวในเซสชันที่เปิดทิ้งไว้ตลอดทั้งวันจึงต้องแบกรับประวัติการสนทนาของทั้งวันไปด้วย Prompt caching ช่วยให้ค่าใช้จ่ายส่วนนี้ถูกลงในขณะที่ cache ยังคงทำงานอยู่ โดยคิดค่าบริการที่ 0.1 เท่าของอัตรา input พื้นฐานสำหรับการอ่าน แต่เมื่อใดที่การโต้ตอบนั้นไม่สามารถดึงข้อมูลจาก cache ได้ ระบบจะเขียน prefix เดิมซ้ำที่อัตรา 1.25 เท่า ให้รันคำสั่ง /context เพื่อดูว่าสิ่งใดที่กำลังเติมเต็มหน้าต่างบริบท (context window) ของคุณ และอ่าน สิ่งที่ Claude Code เรียกเก็บเงินคุณ เพื่อทำความเข้าใจกลไกการทำงาน
/clear และ /compact ใน Claude Code แตกต่างกันอย่างไร?
/clear เป็นการเริ่มบทสนทนาใหม่โดยที่บริบทว่างเปล่า คำสั่งนี้ไม่ส่งคำขอใดๆ จึงไม่มีค่าใช้จ่าย และเป็นตัวเลือกที่เหมาะสมเมื่อต้องการเปลี่ยนไปทำภารกิจที่ไม่เกี่ยวข้องกัน ส่วน /compact จะคงบทสนทนาเดิมไว้และแทนที่ประวัติการสนทนาด้วยบทสรุป จึงเป็นตัวเลือกที่เหมาะสมเมื่อทำงานชิ้นเดิมต่อเนื่องเป็นเวลานาน ควรระบุจุดเน้นให้ชัดเจน เช่นใน /compact keep only the plan and the diff เนื่องจากคำสั่งของคุณจะเป็นตัวกำหนดว่าข้อมูลใดจะถูกเก็บรักษาไว้
ฉันจะดูได้อย่างไรว่าสิ่งใดกำลังใช้พื้นที่ในหน้าต่างบริบทของ Claude Code?
ให้รันคำสั่ง /context หรือ /context all เพื่อดูรายละเอียดแยกตามรายการทั้งหมด ระบบจะแสดง system prompt, นิยามของเครื่องมือ, MCP servers, ไฟล์หน่วยความจำ และประวัติการสนทนาในรูปแบบตารางสี พร้อมคำแนะนำสำหรับเครื่องมือที่ใช้บริบทสูงและข้อมูลที่ทำให้หน่วยความจำบวม สำหรับแผนการใช้งานแบบชำระเงิน /usage จะแสดงการใช้งานล่าสุดแยกตามทักษะ, subagents และ MCP servers แต่ละรายการด้วย
ฉันควรใช้หน้าต่างบริบทขนาด 1 ล้านโทเค็นแทนการทำ compaction หรือไม่?
การใช้หน้าต่างบริบทที่ใหญ่ขึ้นเป็นการชะลอเวลาของปัญหามากกว่าการแก้ไขปัญหาที่ต้นเหตุ ปัจจุบันมีโมเดลหลายตัวที่รองรับหน้าต่างบริบทขนาด 1 ล้านโทเค็น รวมถึง Opus 4.8 และ Sonnet 5 ซึ่งการทำ compaction ก็ยังคงทำงานในลักษณะเดียวกัน ทุกครั้งที่มีการโต้ตอบ ระบบจะส่ง prompt ทั้งหมดซ้ำและเรียกเก็บเงินตามจริง ดังนั้นบทสนทนาขนาด 400,000 โทเค็นจึงมีค่าใช้จ่ายสูงไม่ว่ามันจะใส่ลงในหน้าต่างบริบทได้หรือไม่ก็ตาม
การแก้ไขบริบท (context editing) และการทำ compaction ใน Claude API แตกต่างกันอย่างไร?
การแก้ไขบริบทคือการเลือกลบเนื้อหาเก่าออก โดยส่วนใหญ่จะเป็นผลลัพธ์จากเครื่องมือ และทิ้งข้อความตัวแทน (placeholder) ไว้ในตำแหน่งเดิมเพื่อให้ Claude ทราบว่าเนื้อหานั้นถูกลบออกไปแล้ว ส่วนการทำ compaction คือการสร้างบทสรุปและนำมาแทนที่ประวัติการสนทนาทั้งหมด เอกสารของ Anthropic ระบุว่าการทำ compaction เป็นกลยุทธ์หลักสำหรับบทสนทนาที่ยาวนาน และวางตำแหน่งให้การแก้ไขบริบทเป็นตัวเลือกสำหรับการจัดการที่ละเอียดกว่า ทั้งสองฟีเจอร์ยังอยู่ในสถานะเบต้าและมี header เฉพาะของตนเอง อีกทั้งยังแยกส่วนจากการทำงานของ /compact ใน Claude Code