Claude Code Harness Foundations
Model vs harness
แยกแยะงานของโมเดลออกจากงานของ harness เพื่อวินิจฉัยได้ว่าผลลัพธ์ที่ผิดพลาดควรแก้ที่ชั้นไหน และทำนายได้ว่าการสลับรุ่นโมเดลเปลี่ยนอะไรกับไม่เปลี่ยนอะไร
1) จุดสับสน: ผลลัพธ์ผิด ควรโทษชั้นไหน
ในโปรเจกต์ shop-api คุณขอให้ Claude Code เพิ่มการตรวจสอบข้อมูลก่อนบันทึก order แล้วเจอสองอาการที่ดูคล้ายกัน: - ครั้งหนึ่ง มันเสนอโค้ดที่ใช้ `any` ขัดกับ type ที่ทั้งโปรเจกต์ประกาศไว้ใน `src/domain/` - อีกครั้ง มันแก้ไฟล์ถูก แต่สรุปว่าเสร็จโดยไม่มีหลักฐานว่าเทสต์ผ่าน ทั้งสองครั้งคุณตอบสนองเหมือนกัน: "โมเดลไม่เก่งพอ" แล้วลองสลับไปใช้รุ่นที่ใหม่กว่า — อาการเดิมก็ยังเกิด คำถามของบทนี้จึงไม่ใช่ "โมเดลรุ่นไหนเก่งกว่า" แต่คือ "เมื่อผลลัพธ์ผิด เราจะรู้ได้อย่างไรว่าควรแก้ที่สิ่งที่โมเดลเลือก หรือที่ชั้นซึ่งห่อโมเดลอยู่ทำหรือไม่ทำ" การตอบคำถามนี้ต้องเริ่มจากกลไกของทั้งสองชั้นก่อน แล้วจึงเรียกชื่อมันอย่างแม่นยำ
2) Mental model: สองชั้นที่หน้าที่ไม่ทับกัน
โมเดลภาษาทำได้อย่างเดียว: รับข้อความที่อยู่ในสายตาของมัน แล้วสร้างข้อความถัดไป มันไม่มีมือไว้แตะไฟล์ ไม่มีความจำที่ติดตัวข้ามการเรียกแต่ละครั้ง และไม่มีอำนาจบังคับกฎใด ๆ ดังนั้นงานสามประเภทนี้จึงเป็นไปไม่ได้เลยในตัวโมเดล และต้องมีชั้นที่ห่อมันไว้ทำแทน: - **ลงมือ** — เปิดไฟล์ แก้ไฟล์ รันคำสั่ง แล้วเก็บผลลัพธ์จริงที่เกิดขึ้น - **ตัดสินว่าอะไรอยู่ในสายตา** — ประกอบ context ที่โมเดลจะเห็นในแต่ละรอบ - **บังคับกฎ** — ตรวจสิทธิ์ก่อนการกระทำ และปฏิเสธเมื่อกฎห้าม ชั้นที่ห่อโมเดลไว้และทำสามอย่างนี้คือ **harness** ส่วนโมเดลคือเครื่องยนต์ให้เหตุผลที่อยู่ข้างใน ชื่อ "Claude Code" หมายถึงทั้งสองชั้นรวมกัน การแยกสองชั้นนี้ไม่ใช่รายละเอียดปลีกย่อย แต่เป็นเหตุผลว่าทำไมงานเดียวกันจึงได้ผลต่างกันในสองวัน: โมเดลตัดสินใจจากสิ่งที่มันเห็นเท่านั้น ถ้า harness ไม่ได้ป้อน pattern ของโปรเจกต์เข้ามา โมเดลก็ไม่มีทางรู้ว่ามันมีอยู่
แยกให้ชัด: ใครตัดสิน ใครลงมือ
โมเดล (model)
ตัดสินใจว่าควรทำอะไรจากสิ่งที่อยู่ใน context ของมัน แล้วสร้างข้อความหรือคำขอเรียกเครื่องมือออกมาเท่านั้น — แตะไฟล์หรือรันคำสั่งเองไม่ได้
harness
ประกอบ context ให้โมเดลเห็น ตรวจสิทธิ์ก่อนการกระทำทุกครั้ง รันเครื่องมือจริง และป้อนผลลัพธ์จริงกลับเข้า context ของรอบถัดไป
เส้นแบ่งที่ใช้วินิจฉัยบ่อยที่สุด
ถ้าปัญหาคือ "โมเดลไม่เห็นข้อมูลหรือทำอะไรไม่ได้" ให้แก้ที่ harness; ถ้าปัญหาคือ "โมเดลเลือกทางที่ไม่ดี" ทั้งที่ข้อมูลครบแล้ว ให้แก้ที่โจทย์หรือสิ่งที่ป้อนให้โมเดล
3) กลไก: หนึ่งเทิร์นเดินทางผ่านสองชั้นอย่างไร
ทุกครั้งที่โมเดล "ตอบ" ใน Claude Code ข้อความนั้นเดินผ่านสองชั้นเป็นลำดับ: 1. **harness ประกอบ context** — คำสั่งของคุณ + ไฟล์ instruction ของโปรเจกต์ + ประวัติของ session นี้ + ผลลัพธ์จริงจากเครื่องมือรอบก่อน 2. **โมเดลตัดสินใจจากสิ่งที่เห็น** — เลือกว่าจะตอบเป็นข้อความ หรือขอเรียกเครื่องมือหนึ่งอย่าง เช่น อ่านไฟล์ที่มันยังไม่เคยเห็น 3. **harness ตรวจสิทธิ์และลงมือ** — ถ้ากฎอนุญาตก็รันเครื่องมือจริง ถ้ากฎห้ามก็ปฏิเสธแล้วบอกโมเดล 4. **ผลจริงกลับเข้า context** — output ของเครื่องมือกลายเป็นวัตถุดิบของรอบถัดไป ไม่ใช่ความคาดเดาของโมเดล เพราะทุกเทิร์นไหลผ่านลำดับนี้ อาการที่เห็นจึงชี้ได้ว่าปัญหาอยู่ที่ชั้นใด
| อาการที่คุณเห็น | ชั้นที่เป็นเจ้าของ | สิ่งที่ควรแก้ |
|---|---|---|
| โมเดลเสนอวิธีที่ขัดกับ pattern ของโปรเจกต์ ทั้งที่คุณคาดว่ามันน่าจะรู้ | harness (การประกอบ context) | ให้ข้อมูลนั้นเข้าถึงได้ เช่น วางข้อตกลงถาวรของโปรเจกต์ไว้ในไฟล์ instruction |
| โมเดลเลือกแนวทางที่แย่ แม้ไฟล์และข้อกำหนดที่เกี่ยวข้องอยู่ใน context ครบแล้ว | โมเดล (การให้เหตุผล) | ปรับโจทย์ให้เป้าหมายชัดขึ้น หรือแบ่งงานให้เล็กลงก่อนขอให้ตัดสินใจ |
| การแก้ไฟล์ถูกหยุดถามก่อนลงมือ | harness (การตรวจสิทธิ์) | อนุมัติให้ทำต่อ หรือปรับกฎให้ตรงกับงานที่อนุญาตเป็นประจำ |
| ผลลัพธ์จากเครื่องมือถูกตัดจนโมเดลมองไม่เห็น error ท้าย output | harness (การประกอบ context) | ให้รันคำสั่งที่แคบลง เพื่อให้ output ที่จำเป็นพอดีกับสิ่งที่โมเดลเห็น |
การแยกชั้นแบบนี้ทำให้สองสิ่งเป็นจริง: - **สลับรุ่นโมเดลได้โดยไม่ต้องเปลี่ยนวิธีทำงาน** — เครื่องมือ การประกอบ context และการบังคับกฎเป็นของ harness จึงเหมือนเดิมเมื่อเปลี่ยนเครื่องยนต์ข้างใน สิ่งที่เปลี่ยนคือคุณภาพของการตัดสินใจ - **การให้เหตุผลยังเป็นงานของโมเดล** — harness จัดหาเครื่องมือ ประกอบ context และบังคับกฎ แต่ไม่ได้ให้เหตุผลแทนโมเดล; การเลือกทางแก้ยังมาจากสิ่งที่โมเดลเห็นและตัดสินใจเอง
4) Contrast: โมเดลเดียวกัน กับสองชั้นแวดล้อม
ลองเทียบโมเดลตัวเดียวกันตอนอยู่ในหน้าต่างแชท กับตอนอยู่ใน harness ที่ทำงานกับ shop-api ความต่างทั้งหมดอยู่ที่ชั้นที่ห่อมันไว้ ไม่ใช่ที่ตัวโมเดล
โมเดลเดียวกัน ในสองสภาพแวดล้อม
ฝั่งซ้ายไม่มีชั้นที่ลงมือและป้อนผลจริง ฝั่งขวามี harness ครบทั้งการอ่านไฟล์ การแก้ และการรันเทสต์
ข้อความอาจดูสมเหตุสมผล แต่ถูกสร้างจากสมมติฐาน เพราะไม่มีการลงมือและไม่มีผลจริงป้อนกลับ
โมเดลเดียวกัน แต่ harness ให้เครื่องมือ ตรวจสิทธิ์ และป้อนผลจริง ทำให้ข้อความกลายเป็นการเปลี่ยนแปลงที่ตรวจสอบได้
5) ตรวจความเข้าใจและก้าวต่อไป
ทดสอบความเข้าใจ: แยกชั้นโมเดลกับ harness
ตอบคำถามต่อไปนี้เพื่อยืนยันว่าคุณชี้ได้ว่าอาการใดเป็นของชั้นไหน ก่อนไปบทถัดไป
ข้อใดเป็นงานของโมเดล ไม่ใช่งานของ harness?
Claude เสนอโค้ดที่ขัดกับ pattern ของโปรเจกต์ เพราะไฟล์ที่กำหนด pattern ไม่เคยเข้า context ควรแก้ที่ชั้นใดเป็นหลัก?
เมื่อโมเดลขอเรียกเครื่องมือ ชั้นที่ตรวจสิทธิ์และลงมือรันจริงคือ ______
ตอบเป็นภาษาอังกฤษคำเดียว
ข้อใดอธิบายได้ว่าทำไมสลับรุ่นโมเดลแล้วกลไกการทำงานจึงยังเหมือนเดิม?
- โมเดลตัดสินใจจาก context ที่เห็น; harness ประกอบ context ลงมือ ตรวจสิทธิ์ และป้อนผลจริงกลับ
- การวินิจฉัยเริ่มจากคำถามเดียว: โมเดลเห็นข้อมูลที่จำเป็นครบหรือยัง ถ้ายัง ปัญหาอยู่ที่ harness
- สลับรุ่นโมเดลได้โดยกลไกไม่เปลี่ยน เพราะเครื่องมือ กฎ และ context ไม่ได้อยู่ในตัวโมเดล
- ก้าวต่อไป: บทถัดไปคือ The agentic loop ซึ่งจะพาไปดูว่าสองชั้นนี้ประสานกันเป็นลูป gather → act → verify ที่คุณขัดจังหวะได้อย่างไร