- เนื่องจาก LLM เป็นฟังก์ชันที่ไม่เก็บสถานะ
CLAUDE.md จึงทำหน้าที่เป็นเอกสารหลักที่ใช้แนะนำโค้ดเบสให้ Claude ในทุกเซสชัน
- ภายในไฟล์ควรสรุป WHAT (โครงสร้าง), WHY (จุดประสงค์) และ HOW (วิธีการทำงาน) ของโปรเจ็กต์อย่างกระชับ โดยการใส่คำสั่งที่ไม่จำเป็นมากเกินไปจะทำให้ประสิทธิภาพลดลง
- Claude อาจ เพิกเฉย ต่อเนื้อหาใน
CLAUDE.md ได้ หากตัดสินตามคำสั่งใน system message แล้วเห็นว่า ไม่เกี่ยวข้องมากพอ
- ไฟล์ที่มีประสิทธิภาพควรมีเพียง ข้อมูลสั้น ๆ ที่ใช้ได้ทั่วไป เท่านั้น และแยกคำแนะนำรายละเอียดไปไว้ในเอกสารอื่นเพื่อจัดการแบบ Progressive Disclosure
CLAUDE.md คือ จุดที่มีอิทธิพลสูงสุดของ agent harness จึงควรเขียนด้วยมืออย่างรอบคอบแทนการสร้างอัตโนมัติ
ความไร้สถานะของ LLM และบทบาทของ CLAUDE.md
- LLM ใช้ ค่าน้ำหนักที่ตรึงไว้ ณ เวลาที่ทำการอนุมาน และไม่ได้เรียนรู้หรือจดจำข้ามเซสชัน
- ดังนั้นหากต้องการให้โมเดลเข้าใจโค้ดเบส ก็ต้องป้อนข้อมูลทั้งหมดผ่าน input token
- เอเจนต์เขียนโค้ดอย่าง Claude Code จำเป็นต้องจัดการหน่วยความจำอย่างชัดเจน และ
CLAUDE.md คือ ไฟล์เดียวที่ถูกแนบให้อัตโนมัติในทุกบทสนทนา
- จึงมี 3 ข้อที่สำคัญ
- เมื่อเริ่มเซสชัน Claude ไม่รู้อะไรเกี่ยวกับโค้ดเบสมาก่อน
- จำเป็นต้องบอกข้อมูลที่ต้องใช้ใหม่ในทุกเซสชัน
- เครื่องมือมาตรฐานสำหรับสิ่งนี้คือ
CLAUDE.md
การออนบอร์ดโค้ดเบส: WHAT, WHY, HOW
CLAUDE.md ทำหน้าที่เป็น เอกสารออนบอร์ด ที่ช่วยให้ Claude เข้าใจโปรเจ็กต์
- WHAT: ให้แผนที่ของโค้ด เช่น tech stack, โครงสร้างโปรเจ็กต์, องค์ประกอบของ monorepo
- WHY: อธิบายจุดประสงค์และหน้าที่ของแต่ละองค์ประกอบ
- HOW: ระบุวิธีทำงานจริง เช่น build, test, typecheck
- อย่างไรก็ตาม การไล่รายการคำสั่งทั้งหมดเป็นวิธีที่ไม่มีประสิทธิภาพ และควรใส่เฉพาะ ข้อมูลขั้นต่ำที่จำเป็น เท่านั้น
เหตุผลที่ Claude อาจมองข้าม CLAUDE.md
หลักการเขียน CLAUDE.md ที่ดี
Less (instructions) is more
- LLM สามารถปฏิบัติตาม คำสั่งได้อย่างเสถียรราว 150~200 ข้อ
- ยิ่งเป็นโมเดลขนาดเล็ก ประสิทธิภาพจะยิ่งลดลงอย่างรวดเร็ว และไม่เหมาะกับงานหลายขั้นตอน
- system prompt ของ Claude Code มี คำสั่งอยู่แล้วประมาณ 50 ข้อ
- ดังนั้นใน
CLAUDE.md จึงควรใส่เฉพาะ คำสั่งที่ใช้ได้ทั่วไปและจำเป็นจริง ๆ เท่านั้น
- ยิ่งจำนวนคำสั่งมากขึ้น คุณภาพในการทำตามคำสั่งทั้งหมดจะลดลงอย่างสม่ำเสมอ
ความยาวไฟล์และขอบเขตการใช้งาน
- LLM ทำงานได้ดีกว่าเมื่อมี บริบทที่กระชับและเกี่ยวข้องสูง
- เนื่องจาก
CLAUDE.md ถูกแนบในทุกเซสชัน จึงควรเก็บไว้เฉพาะ ข้อมูลที่ใช้ได้ทั่วไป
- โดยทั่วไปแนะนำให้มีความยาว ไม่เกิน 300 บรรทัด และถ้าทำได้ก็ควรสั้นกว่านั้น
- ไฟล์ตัวอย่างของ HumanLayer มี น้อยกว่า 60 บรรทัด
Progressive Disclosure
- ในโปรเจ็กต์ขนาดใหญ่ เป็นเรื่องยากที่จะใส่ทุกอย่างไว้ในไฟล์เดียว จึงแนะนำแนวทาง Progressive Disclosure
- แยกคำแนะนำเชิงลึกไปไว้ในไฟล์ Markdown ต่างหากภายใต้โฟลเดอร์
agent_docs/
- เช่น
building_the_project.md, running_tests.md, code_conventions.md เป็นต้น
- ใน
CLAUDE.md ให้ใส่เพียง รายการไฟล์เหล่านี้พร้อมคำอธิบายสั้น ๆ และคำสั่งให้ Claude เปิดอ่านเมื่อจำเป็น
- ใช้ การอ้างอิงแบบ
file:line แทน code snippet เพื่อให้ข้อมูลทันสมัยอยู่เสมอ
- แนวทางนี้คล้ายกับแนวคิด Claude Skills แต่เน้นที่การจัดการคำสั่งมากกว่าการใช้เครื่องมือ
Claude ไม่ใช่ linter
- การใส่แนวทางด้าน code style ลงใน
CLAUDE.md เป็นวิธีที่ไม่มีประสิทธิภาพ
- LLM มี ต้นทุนสูง ช้า และให้ผลไม่แน่นอนมากกว่า linter
- กฎด้านสไตล์มักถูก เรียนรู้ได้เองตามธรรมชาติจากแพตเทิร์นของโค้ดที่มีอยู่ จึงไม่จำเป็นต้องสั่งแยก
- สำหรับ formatting ควรใช้ linter ที่แก้ไขอัตโนมัติได้ (เช่น Biome) แล้วส่งให้ Claude เฉพาะผลการแก้ไข
- หากจำเป็น อาจใช้ Stop Hook หรือ Slash Command เพื่อทำ formatting และ validation แบบอัตโนมัติ
ห้ามสร้างอัตโนมัติ
- ไม่แนะนำให้ใช้คำสั่ง
/init หรือฟีเจอร์สร้างอัตโนมัติเพื่อสร้าง CLAUDE.md
- เพราะไฟล์นี้คือ จุด leverage สูง ที่ส่งผลต่อทุกเซสชันและผลลัพธ์ที่ได้
- คำสั่งที่ผิดเพียงหนึ่งบรรทัดอาจสร้าง ผลกระทบเชิงลบเป็นลูกโซ่ต่อคุณภาพโค้ดทั้งหมด
- ดังนั้นจึงควร ตรวจทานทุกประโยคอย่างรอบคอบและเขียนด้วยมือ
บทสรุป
CLAUDE.md คือเอกสารสำหรับออนบอร์ด Claude เข้ากับโค้ดเบส และต้องกำหนด WHY·WHAT·HOW ให้ชัดเจน
- ควร ลดจำนวนคำสั่งให้เหลือน้อยที่สุด และใส่เฉพาะ เนื้อหาที่ใช้ได้ทั่วไปและกระชับ
- ใช้ Progressive Disclosure เพื่อค่อย ๆ ให้ข้อมูลเท่าที่จำเป็น
- อย่าใช้ Claude เป็น linter แต่ควรใช้งานร่วมกับ เครื่องมือเฉพาะทาง รวมถึง hook และคำสั่งต่าง ๆ
- แทนที่จะสร้างอัตโนมัติ ควร เขียนด้วยมืออย่างรอบคอบ เพื่อยกระดับคุณภาพของ harness โดยรวมให้สูงสุด
1 ความคิดเห็น
ความคิดเห็นจาก Hacker News
Claude มักมีแนวโน้มจะเพิกเฉยต่อคำสั่งใน CLAUDE.md อยู่บ่อย ๆ
ยิ่งในไฟล์มีข้อมูลที่ไม่เกี่ยวกับงานเฉพาะนั้นมากเท่าไร Claude ก็ยิ่งไม่ทำตามคำสั่งนั้น
มีคนรู้จักคนหนึ่งบอกให้ Claude เรียกเขาว่า “Mr Tinkleberry” และทุกครั้งที่ Claude ลืม ก็รู้ได้เลยว่ามันกำลังมองข้ามไฟล์นั้นอยู่
ฉันใช้ แนวทางแบบสารบัญ มานานแล้ว
แยกคำแนะนำตามงานไว้ในไฟล์ markdown คนละไฟล์ และใส่ไว้ใน CLAUDE.md แค่รายการกับคำอธิบายสั้น ๆ
วิธีนี้ช่วยให้ context window สะอาดและเป็นระเบียบ
ดูไฟล์ตัวอย่างของฉันได้ที่นี่
Claude แทบไม่ค่อยอ่านไฟล์เอกสารอื่น ๆ จริง ๆ
ฉันรู้สึกว่าถ้าให้ context กับ Claude มากเกินไป คุณภาพกลับลดลง
เลยเก็บโค้ดไว้สองเวอร์ชันเสมอ
ฉันให้ LLM แค่เวอร์ชันแรก
คิดว่าหัวใจสำคัญคือ อัตราส่วนระหว่าง compute ต่อข้อมูล เพราะปริมาณการประมวลผลมีจำกัด
ไม่จำเป็นต้องใส่ทุกอย่าง แต่การใส่ ข้อมูลสำคัญ ให้ ROI สูงมาก
Claude ทำงานได้ดีกับโปรเจกต์ทั่วไป แต่กับเฟรมเวิร์กหรือเครื่องมือใหม่ ๆ มักจะสับสนบ่อย
อยากถามว่าใช้สคริปต์ลบคอมเมนต์กับช่องว่างหลังแก้ไขหรือเปล่า
จริง ๆ แล้วมีวิธีแก้โดยไม่ต้องตั้งค่าอะไรซับซ้อนแบบนี้
นั่นคือทำ เอกสารประกอบ(documenting) ให้โค้ดชัดเจน
เขียนสั้น ๆ ว่าแต่ละไฟล์ทำอะไร เท่านี้มันก็ทำหน้าที่เป็นพรอมป์ต์ได้แล้ว
ใช้ README.md ให้เต็มที่ก็พอ
LLM ถูกฝึกจากข้อมูลสาธารณะที่มีอยู่แล้ว จึงไม่จำเป็นต้องประดิษฐ์อะไรใหม่
การแนะนำแค่ว่า “เขียนเอกสารโค้ดให้ดี” จึงไม่ค่อยตรงกับบริบทนี้
README นั้นดี แต่ CLAUDE.md มีจุดประสงค์ต่างออกไป
ตัวอย่างเช่น Claude/agents.md มีฟีเจอร์ที่จะแทรกเข้า context อัตโนมัติเมื่อเข้าถึงไดเรกทอรีบางแห่ง
ในโค้ดเบสที่ซับซ้อน การจัดการ context สำคัญกว่ามาก
ดังนั้นคำแนะนำอย่าง “เขียนพรอมป์ต์ให้เหมาะสม” จึงพลาดประเด็นสำคัญ
ถ้าใส่ใน README มันก็จะลงเอยด้วยการทำหน้าที่เหมือน CLAUDE.md
จุดประสงค์ของ CLAUDE.md คือการ ให้ข้อมูลสำคัญล่วงหน้า เพื่อไม่ให้ Claude ต้องกลับไปอ่านเอกสารทั้งหมดใหม่ทุกครั้ง
มนุษย์จำได้ แต่ Claude ลืมทุกครั้งเมื่อเริ่มงานใหม่ จึงต้องมีโครงสร้างที่ช่วยลดการ re-onboarding
พูดตามตรง ถ้าต้อง ตั้งค่าโครงสร้างพื้นฐาน AI กันขนาดนี้ ฉันรู้สึกว่าสู้เขียนโค้ดเองยังดีกว่า
ฉันแยกจัดการกฎร่วมกับกฎเฉพาะโปรเจกต์ออกจากกัน
การไม่ใช้ AI ก็แค่ เสียผลิตภาพ
ถ้าตั้งค่าแค่ครั้งเดียว ก็คุ้มค่าที่จะลงทุน
การบอกว่า “ขี้เกียจตั้งค่า” ก็คล้ายข้ออ้างของคนที่เลี่ยงการตั้งค่า debugger
ฉันแค่ คัดลอกโค้ดที่ต้องใช้แล้ววางลงในหน้าต่างแชต จากนั้นก็ใช้งานเหมือนคุยกัน
ทุกวันนี้โมเดลดีขึ้นมากแล้ว ต่อให้ไม่มีไฟล์ .md ก็ยังให้ผลลัพธ์ที่ค่อนข้างดี
ไฟล์พวกนี้อาจช่วยให้ดีขึ้นได้นิดหน่อย แต่ฉันไม่คิดว่ามันเป็น เวทมนตร์เพิ่มผลิตภาพ 100 เท่า
ที่กำลังคุยกันตรงนี้คือกรณีที่ Claude ลงมือทำฟีเจอร์ทั้งก้อนหรือแก้บั๊กเอง
แค่ให้ context ที่จำเป็นก็ทำงานได้ดีพอแล้ว มันดู bikeshedding นิด ๆ
ฉันให้ Claude เขียน CLAUDE.md เอง
ถ้าบอกมันว่า “README.md มีไว้สำหรับผู้ใช้ ส่วน CLAUDE.md มีไว้สำหรับเธอ”
มันก็จะอัปเดตคำสั่งอย่าง “ให้ตรวจเอกสาร API ก่อนเสมอ” ให้อัตโนมัติด้วย
ไม่จำเป็นต้องรู้พรอมป์ต์วิเศษอะไร ขอแค่ผลลัพธ์ออกมาดีก็พอ
ดูไม่มีเหตุผลชัดเจนว่าทำไม AI ถึงควรพรอมป์ต์ตัวเองได้เก่งที่สุด