Claude Code Harness Foundations
The context window
อธิบายว่าทำไม session จึงจำรายละเอียดต้นเรื่องไม่ได้ตลอด โดยแยกหน้าต่างที่จำกัดออกจากความจำ และดูว่า harness ทำอะไรเมื่อหน้าต่างใกล้เต็ม
1) จุดสับสน: ข้อตกลงที่เพิ่งคุยกัน กลับเหมือนไม่เคยมี
คุณเริ่ม session ใน shop-api และตกลงกับ Claude ว่าทุก error response ต้องมี field `code` คงที่ จากนั้นงานดำเนินไปครึ่งชั่วโมงที่ไล่แก้เทสต์กับอ่านไฟล์ไปเรื่อย ๆ แล้วอยู่ ๆ คำตอบถัดไปก็เสนอ error ที่ไม่มี `code` เลย คุณไม่ได้เปิด session ใหม่ ไม่ได้สั่งลบอะไร และข้อตกลงนั้นก็ถูกพิมพ์ไว้ชัดเจนในแชท อีกครั้งหนึ่งคุณวาง log ยาว ๆ เพื่อให้ช่วยวิเคราะห์ แล้วมันตอบว่า "เริ่มเรื่องต้นทางไม่เห็นแล้ว" ทั้งที่ทุกข้อความยังอยู่ในหน้าจอที่คุณเลื่อนกลับไปอ่านได้ สองอาการนี้ชี้ไปที่กลไกเดียวกัน: สิ่งที่โมเดล "เห็น" ในการตัดสินใจแต่ละครั้งถูกจำกัดอยู่ในพื้นที่หนึ่ง และพื้นที่นั้นเต็มได้ บทนี้จะอธิบายหน้าต่างนั้นก่อน แล้วบทถัดไปจะพาไปดูว่าไฟล์ใดถูกโหลดเข้าไปบ้าง
2) Mental model: หน้าต่างที่จำกัด ไม่ใช่ความจำ
ลองนึกถึงสิ่งที่โมเดลทำได้จริง ๆ: ในการตัดสินใจหนึ่งครั้ง มันอ่านข้อความทั้งหมดที่อยู่ในสายตาของมัน แล้วสร้างข้อความถัดไป สิ่งที่อยู่นอกสายตาคือสิ่งที่มันไม่เห็น — ไม่ใช่สิ่งที่มันลืม พื้นที่ที่ข้อความเหล่านั้นต้องอยู่คือ **context window** พื้นที่ทำงานจำกัดของ session ในการเรียกโมเดลหนึ่งครั้ง ข้างในต้องมีทั้งคำสั่งของคุณ instruction ของโปรเจกต์ ประวัติสนทนาที่ผ่านมา และผลลัพธ์จริงของทุกเครื่องมือ ความเข้าใจผิดที่พบบ่อยคือคิดว่ามันเป็น "ความจำ" ของโมเดล ความจริงคือไม่มีที่เก็บถาวรอยู่ในตัวโมเดลเลย สิ่งที่ดูเหมือนความจำเกิดจาก harness ประกอบหน้าต่างขึ้นใหม่ทุก session จากสิ่งที่มันโหลดได้ บทนี้จึงพูดถึง "หน้าต่าง" ที่เต็มได้ ไม่ใช่ "ความจำ" ที่เสีย
เมื่อหน้าต่างมีเพดาน พฤติกรรมหลายอย่างที่ดูเหมือนอารมณ์ของโมเดลก็อธิบายได้: session ที่ยาวขึ้นจะตอบคำถามปลายทางได้ดีกว่าต้นทาง เพราะรายละเอียดต้นทางถูกเบียดออกไปก่อน; การวาง log ยาว ๆ ทำให้มันเหมือน "ลืม" โจทย์ เพราะพื้นที่ส่วนใหญ่ถูกใช้ไปกับข้อมูลที่เพิ่งวาง; และหน้าต่างที่เต็มไม่ได้ทำให้ session จบ — harness จัดการให้เดินต่อได้ แต่สิ่งที่ถูกตัดออกไปนั้นหายจริงถ้าไม่มีทางโหลดกลับ
แยกคำที่มักสับสนก่อนใช้
หน้าต่าง (context window)
พื้นที่จำกัดที่ถูกประกอบขึ้นใหม่ทุกครั้งที่เรียกโมเดล สิ่งที่อยู่นอกหน้าต่างคือสิ่งที่โมเดลไม่เห็นในรอบนั้น ไม่ว่าเราจะเพิ่งพิมพ์ไปเมื่อไร
ความจำที่ดูเหมือนมี
เกิดจาก harness โหลดไฟล์เดิมกลับเข้าหน้าต่างทุก session จึงดูเหมือนโมเดลจำได้ แต่ไม่มีอะไรถูกเก็บไว้ในตัวโมเดลข้าม session เลย
ความยาวของ session
session ที่ยาวขึ้นไม่ได้ทำให้เพดานสูงขึ้น มีแต่ข้อความสะสมในหน้าต่างมากขึ้น จนถึงจุดที่ต้องมีการตัดหรือสรุป
3) กลไก: หน้าต่างเต็มขึ้นอย่างไร และ harness ทำอะไรเมื่อมันใกล้เต็ม
หน้าต่างไม่ได้เติมด้วยอัตราคงที่ ทุกเทิร์นถูกเพิ่มเข้าไปทั้งนั้น — คำสั่งของคุณ คำตอบของโมเดล และผลลัพธ์ของทุกเครื่องมือ — แต่ตัวแปรที่กินพื้นที่มากและคาดเดายากที่สุดคือผลลัพธ์ของเครื่องมือ: การอ่านไฟล์ทั้งไฟล์ การค้นหากว้าง ๆ หรือ output ของคำสั่งที่ยาว สามารถกินพื้นที่มากกว่าบทสนทนายาว ๆ ทั้งบท เมื่อพื้นที่จะหมด harness ไม่ได้ปิด session แต่จะจัดการตามลำดับนี้
วงจรชีวิตของหน้าต่างในหนึ่ง session
พื้นที่ถูกเติมจนใกล้เต็ม แล้ว harness จัดการให้ session เดินต่อได้ — แต่การจัดการนั้นไม่ฟรี รายละเอียดบางอย่างหายไปตลอด
- 1
เริ่ม: ประกอบหน้าต่าง
เริ่มharness ประกอบหน้าต่างจาก instruction ที่โหลดได้และคำสั่งแรกของคุณ ก่อนที่โมเดลจะตอบอะไร
- 2
เติม: ทุกอย่างใน session ถูกเพิ่มเข้าไป
สะสมทุกคำตอบ ทุกคำขอเครื่องมือ และผลลัพธ์จริงของมันถูกเพิ่มเข้าหน้าต่าง ผลลัพธ์ขนาดใหญ่คือตัวกินพื้นที่ตัวจริง
- 3
ใกล้เต็ม: ทิ้งรายละเอียดเก่า
ตัดharness ทยอยตัดของที่เก่าและไม่จำเป็นก่อน เช่น ผลลัพธ์เครื่องมือที่ผ่านไปนานแล้ว เพื่อให้พื้นที่เหลือพอทำงานต่อ
- 4
บีบอัด: สรุปประวัติเป็นบทสรุป
บีบอัดถ้ายังไม่พอ harness สรุปประวัติสนทนาทั้งหมดเป็นบทสรุป แล้ว session ทำงานต่อจากบทสรุปนั้น — รายละเอียดที่ไม่ได้อยู่ในบทสรุปหายจากหน้าต่างทันที
- 5
หลังบีบอัด: ประกอบใหม่จากสิ่งที่หาได้
ฟื้นinstruction ที่รากโปรเจกต์และ rule ที่ไม่ผูกกับ path ถูกอ่านกลับจากดิสก์ ส่วน instruction ที่ผูกกับ path หรืออยู่ในโฟลเดอร์ย่อยเป็นเนื้อหาของประวัติสนทนา จึงถูกสรุปกลืนหายได้เหมือนข้อความอื่น
จุดที่ต้องจำ: การบีบอัดเป็นการสรุปแบบสูญเสียรายละเอียด ไม่ใช่การเก็บสำรอง ข้อตกลงที่คุณพิมพ์ไว้ในแชทมีอายุเท่ากับสถานะของหน้าต่างในขณะนั้น ต่างจาก instruction ที่รากโปรเจกต์และ rule ที่ไม่ผูกกับ path ซึ่งถูกอ่านกลับจากดิสก์หลังการบีบอัด ส่วน instruction ที่ผูกกับ path หรืออยู่ในโฟลเดอร์ย่อยจะถูกสรุปกลืนไปกับประวัติเหมือนเนื้อหาอื่น — ความต่างนี้คือเหตุผลเชิงกลไกว่าทำไมกฎที่ต้องมีผลทั้ง session จึงควรอยู่ที่รากของโปรเจกต์ ไม่ใช่ซ่อนไว้ในโฟลเดอร์ย่อย (กลไกของแต่ละไฟล์เป็นเรื่องของบทถัดไป) รายละเอียดที่เปลี่ยนได้ของเรื่องนี้ — เพดานของหน้าต่าง และคำสั่งที่ใช้ดูหรือจัดการ — รวมไว้ที่ตารางเดียวด้านล่าง พร้อมวันที่ตรวจสอบและหน้าอ้างอิง โปรดเปิดหน้าอ้างอิงก่อนเชื่อตัวเลขหรือชื่อคำสั่งใด
| ข้อเท็จจริงที่เปลี่ยนได้ | สิ่งที่ตรวจสอบล่าสุด | เอกสารเจ้าของ |
|---|---|---|
| เพดานของหน้าต่าง | ขึ้นกับรุ่นโมเดล; บางรุ่นเปิดใช้หน้าต่างขยายได้ถึง 1 ล้าน token | https://code.claude.com/docs/en/context-window |
| การบีบอัดอัตโนมัติ | harness บีบอัดให้เองเมื่อใกล้เต็ม โดยเก็บคำขอและโค้ดสำคัญไว้ในบทสรุป | https://code.claude.com/docs/en/context-window |
| ดูว่าอะไรกำลังกินพื้นที่ | ใช้คำสั่ง `/context` เพื่อดูสัดส่วนการใช้พื้นที่จริงของ session | https://code.claude.com/docs/en/context-window |
| บีบอัดเองแบบกำหนดโฟกัส | ใช้คำสั่ง `/compact` พร้อมคำอธิบายสิ่งที่ต้องเก็บ เช่น `/compact focus on the auth bug fix` | https://code.claude.com/docs/en/context-window |
| เริ่มหน้าต่างใหม่เมื่อเปลี่ยนงาน | ใช้คำสั่ง `/clear` เมื่อเริ่มงานใหม่ที่ไม่เกี่ยวข้อง เพื่อไม่ให้ประวัติเก่าเบียดพื้นที่ | https://code.claude.com/docs/en/context-window |
| ตรวจสอบล่าสุด: 2026-09-23 · https://code.claude.com/docs/en/context-window |
4) Contrast: เก็บข้อตกลงไว้ในแชท กับเก็บไว้ในไฟล์ที่โหลดซ้ำ
ทั้งสองแบบเริ่มจากข้อตกลงเดียวกัน ความต่างคือข้อตกลงนั้นอาศัยอะไรอยู่ — สถานะของหน้าต่างซึ่งถูกสรุปใหม่ได้ หรือ instruction ระดับรากที่ harness อ่านกลับจากดิสก์
ข้อตกลงเดียวกัน หลังหน้าต่างถูกบีบอัด
ฝั่งซ้ายพึ่งประวัติแชทซึ่งผ่านการสรุปแบบสูญเสียรายละเอียด ฝั่งขวาพึ่ง instruction ระดับรากที่ถูกอ่านกลับจากดิสก์
ข้อตกลงเคยอยู่ในหน้าต่างเท่านั้น พอหน้าต่างถูกสรุปใหม่ เจตนาของมันจึงไม่ถึงรอบถัดไป
ข้อตกลงเดียวกันแต่ฝากไว้กับ instruction ระดับราก ไม่ได้ฝากไว้กับความจำของโมเดล จึงถูกอ่านกลับจากดิสก์ได้หลังการบีบอัด
5) ตรวจความเข้าใจและก้าวต่อไป
ทดสอบความเข้าใจ: หน้าต่างที่จำกัดและสิ่งที่เกิดขึ้นเมื่อมันเต็ม
ตอบคำถามต่อไปนี้เพื่อยืนยันว่าคุณแยกหน้าต่างออกจากความจำ และรู้ว่า harness จัดการอะไรเมื่อพื้นที่ใกล้หมด
เมื่อ Claude จำรายละเอียดต้น session ไม่ได้อีก สาเหตุเชิงกลไกคือข้อใด
หลังการบีบอัด ข้อใดมีโอกาสกลับเข้าหน้าต่างได้อีกมากที่สุด
ข้อใดคือสิ่งที่ harness ทำเมื่อหน้าต่างใกล้เต็ม
พื้นที่ทำงานจำกัดที่โมเดลมองเห็นในการตัดสินใจหนึ่งครั้งเรียกว่า context ______
ตอบเป็นคำภาษาอังกฤษคำเดียว
- context window คือพื้นที่จำกัดของ session หนึ่ง ๆ ไม่ใช่ความจำถาวรในตัวโมเดล
- ผลลัพธ์ของเครื่องมือคือตัวแปรที่กินพื้นที่หน้าต่างมากที่สุดและคาดเดายากที่สุด
- เมื่อใกล้เต็ม harness จะตัดรายละเอียดเก่าและสรุปประวัติ — รายละเอียดในแชทอาจหาย ส่วน instruction ระดับรากถูกอ่านกลับจากดิสก์ กฎที่ต้องมีผลทั้ง session จึงควรอยู่ที่ราก
- ก้าวต่อไป: บทถัดไปคือ What loads into context ซึ่งจะพาไปรู้ว่า harness โหลดอะไรเข้า context บ้างตอนเปิด session โหลดเมื่อไร และไฟล์ใดไม่เคยเข้าเลย