Claude Code โกหกคุณต่อหน้าทุกวัน ฟังก์ชันที่สร้างขึ้นมา, การ import ที่ไม่มีอยู่จริง, "การทดสอบผ่าน" ทั้งที่ไม่ได้รันอะไรเลย วิธีแก้คือการตั้งค่า 4 ชั้นที่ทำให้การโกหกมีต้นทุนสูง
Claude บอกคุณว่า Bug ได้รับการแก้ไขแล้ว สองชั่วโมงต่อมาคุณถึงรู้ว่าฟังก์ชันที่มันเรียกนั้นไม่เคยมีอยู่จริง
นักพัฒนาส่วนใหญ่เรียนรู้ที่จะตรวจสอบทุกอย่างซ้ำสองและโทษโมเดล วิธีแก้ที่แท้จริงคือการจับทุกคำโกหกก่อนที่มันจะออกจากเครื่องของคุณ
นี่คือการตั้งค่าความซื่อสัตย์แบบเต็มรูปแบบ 👇

ทำไม Claude ถึงสร้างเรื่องขึ้นมาตั้งแต่แรก
Claude เป็นตัวทำนายข้อความ เมื่อมันไม่รู้บางอย่าง มันจะทำนายข้อความที่ดูเหมือนถูกต้อง ชื่อฟังก์ชันที่สร้างขึ้นมาดูเหมือนชื่อจริง ข้อมูลไร้สาระที่พูดอย่างมั่นใจก็อ่านได้เหมือนกับความจริงที่พูดอย่างมั่นใจ
คุณไม่สามารถแยกความแตกต่างได้จนกว่าโค้ดของคุณจะพังในอีกสองชั่วโมงต่อมาในแบบที่ต้องใช้เวลาอีกหนึ่งชั่วโมงในการดีบัก
วิธีแก้ไม่ใช่โมเดลที่ฉลาดกว่า แต่คือการทำให้เอาต์พุตของ Claude สามารถตรวจสอบได้แบบเรียลไทม์ และทำให้ "ฉันไม่รู้" มีต้นทุนถูกกว่าการเดา
4 ชั้นด้านล่าง เมื่อรวมกันแล้วจะลดการสร้างเรื่องแต่งให้เกือบเป็นศูนย์

ชั้นที่ 1: กฎความซื่อสัตย์ใน CLAUDE.md
ชั้นแรกคือชุดกฎใน CLAUDE.md ที่บอก Claude อย่างชัดเจนว่าเมื่อใดควรยอมรับความไม่แน่นอนและต้องทำอย่างไร วางสิ่งนี้ใน root ของโปรเจกต์คุณ:
1## กฎความซื่อสัตย์ (อ่านทุกเทิร์น)23ก่อนที่จะอ้างว่าฟังก์ชัน, คลาส, หรือ import มีอยู่ ให้ตรวจสอบโดยการอ่าน4ไฟล์หรือรัน grep ห้ามสร้างสัญลักษณ์ที่ไม่มีอยู่จริง56หากคุณไม่สามารถตรวจสอบบางสิ่งได้ ให้พูดว่า "ฉันยังไม่ได้ตรวจสอบสิ่งนี้" อย่างชัดเจน7ห้ามเขียนโค้ดที่ขึ้นอยู่กับการอ้างสิทธิ์ที่ยังไม่ได้ตรวจสอบ89หากงานขอให้คุณใช้ไลบรารีที่คุณไม่เคยเห็นว่ามีการอ้างอิงในโปรเจกต์นี้10ให้ถามก่อนที่จะเพิ่ม1112หากงานเกี่ยวข้องกับการทดสอบหรือการ build อย่าอ้างว่าสำเร็จเว้นแต่คุณ13ได้รันคำสั่งทดสอบหรือ build จริงในเซสชันนี้1415ห้ามสร้างข้อความแสดงข้อผิดพลาด, การตอบสนองของ API, หรือ stack traces ขึ้นมาเอง16หากคุณไม่เห็นมัน ให้พูดอย่างนั้น1718เมื่อคุณไม่รู้จริงๆ คำตอบที่ถูกต้องคือ "ฉันไม่รู้" หรือ19"ฉันต้องตรวจสอบก่อน" ทั้งสองอย่างดีกว่าการเดาอย่างมั่นใจ
กฎเหล่านี้ดูเหมือนชัดเจน
แต่มันไม่ใช่ เพราะโดยค่าเริ่มต้น Claude ถูกปรับให้เหมาะสมกับการดูมีประโยชน์ และ "ฉันไม่รู้" ฟังดูไม่มีประโยชน์เว้นแต่คุณจะให้สิทธิ์อย่างชัดเจน
บรรทัดสุดท้ายสำคัญที่สุด มันคือใบอนุญาต "ฉันไม่รู้" และคนส่วนใหญ่ไม่เคยมอบให้
ชั้นที่ 2: รูปแบบการตรวจสอบก่อนเขียน
ชั้นที่สองบังคับให้ Claude ตรวจสอบก่อนที่จะเขียน เพิ่มสิ่งนี้ใน CLAUDE.md ภายใต้กฎความซื่อสัตย์:
1## โปรโตคอลการตรวจสอบ23ก่อนที่จะเขียนหรือแก้ไขโค้ดที่ใช้สัญลักษณ์ (ฟังก์ชัน, คลาส, ชนิด,4ค่าคงที่) ให้ทำอย่างใดอย่างหนึ่งต่อไปนี้:561. อ่านไฟล์ที่กำหนดสัญลักษณ์นั้นและยืนยันลายเซ็น72. รัน `grep -r "ชื่อสัญลักษณ์" .` หรือใช้เครื่องมือ Glob เพื่อค้นหา83. ตรวจสอบ package.json, requirements.txt, Cargo.toml หรือไฟล์ที่เทียบเท่า9 สำหรับ dependency1011หากคุณข้ามการตรวจสอบ ให้ใส่คำอธิบายประกอบโค้ดด้วย:12`// UNVERIFIED: ฉันยังไม่ได้ยืนยันว่าสัญลักษณ์นี้มีอยู่`1314โหมดวางแผนแล้วดำเนินการเป็นที่ต้องการสำหรับงานใดๆ ที่เกี่ยวข้องกับมากกว่า15หนึ่งไฟล์ ใช้ Shift+Tab เพื่อเข้าสู่โหมดวางแผนก่อนเริ่มต้น
สิ่งนี้ทำให้ Claude เสียค่าใช้จ่ายในการเรียกใช้เครื่องมือเพิ่มเติมอีกเล็กน้อยต่อเซสชัน แต่มันช่วยประหยัดเวลาหลายชั่วโมงที่คุณจะต้องเสียไปกับการดีบักการเรียกใช้ฟังก์ชันปลอม
ชั้นที่ 3: ฮุคที่จับคำโกหกแบบเรียลไทม์
ชั้นที่สามคือฮุคใน settings.json ที่รัน type checker หรือ linter ทุกครั้งที่ Claude เขียนไฟล์ หาก Claude สร้าง import ขึ้นมา ตัวตรวจสอบจะล้มเหลวทันที และ Claude ต้องแก้ไขก่อนที่จะอ้างว่างานเสร็จ
1{2 "hooks": {3 "PostToolUse": [4 {5 "matcher": "Write(*.ts|*.tsx)|Edit(*.ts|*.tsx)",6 "hooks": [7 { "type": "command", "command": "npx tsc --noEmit --pretty false 2>&1 | head -20" }8 ]9 },10 {11 "matcher": "Write(*.py)|Edit(*.py)",12 "hooks": [13 { "type": "command", "command": "ruff check --quiet $file && pyright $file 2>&1 | head -20" }14 ]15 },16 {17 "matcher": "Write(*.rs)|Edit(*.rs)",18 "hooks": [19 { "type": "command", "command": "cargo check --message-format=short 2>&1 | head -20" }20 ]21 }22 ]23 }24}
เอาต์พุตของฮุคจะถูกส่งกลับไปยัง Claude เป็นบริบท หาก tsc พูดว่า "ไม่พบโมดูล 'foo'" Claude จะเห็นมันทันทีและแก้ไข import ที่สร้างขึ้นมา ไม่มีโค้ดที่ถูกสร้างขึ้นมาสามารถรอดจากการตรวจสอบ PostToolUse ได้
สำหรับงานที่เกี่ยวข้องกับการทดสอบ ให้เพิ่มฮุค Stop ที่รันชุดทดสอบก่อนที่ Claude จะประกาศว่าเซสชันเสร็จสิ้น:
1"Stop": [2 {3 "hooks": [4 { "type": "command", "command": "npm test 2>&1 | tail -30" }5 ]6 }7]
ตอนนี้ Claude ไม่สามารถพูดว่า "เสร็จแล้ว การทดสอบผ่าน" โดยไม่ได้รันมันจริงๆ ฮุคจะรันมัน
ผลลัพธ์จะถูกส่งกลับไปยัง Claude หากการทดสอบล้มเหลว Claude ต้องแก้ไขหรือยอมรับว่ามันไม่ผ่าน
ชั้นที่ 4: ตัวแทนย่อยตรวจสอบข้อเท็จจริง
ชั้นที่สี่คือตัวแทนย่อยที่มีหน้าที่เดียวคือตรวจสอบการอ้างสิทธิ์ของ Claude ก่อนที่จะส่งออก
วางสิ่งนี้ใน .claude/agents/fact-checker.md:
1---2name: fact-checker3description: ใช้ตัวแทนนี้หลังจากที่ Claude ได้อ้างสิทธิ์เกี่ยวกับสิ่งที่โค้ดทำ, การทดสอบใดที่ผ่าน, หรือสิ่งที่ไลบรารีรองรับ เรียกใช้ก่อนการ commit ใดๆ, ก่อนสรุปผลใดๆ ที่ผู้ใช้จะเห็น, และหลังจากงานใดๆ ที่เกี่ยวข้องกับ dependencies ใหม่4tools: Read, Grep, Glob, Bash5model: sonnet6---78คุณตรวจสอบข้อเท็จจริง คุณไม่ได้เขียนโค้ด910เมื่อถูกเรียกใช้ ให้ทำดังนี้:11121. ระบุข้อเท็จจริงทุกข้อในการสนทนาล่าสุด ตัวอย่าง:13 "ฟังก์ชัน X ทำ Y", "การทดสอบผ่าน", "ไลบรารี Z รองรับ W",14 "import นี้ถูกต้อง"15162. สำหรับแต่ละข้อเท็จจริง ให้ตรวจสอบอย่างอิสระ:17 - การอ้างสิทธิ์เกี่ยวกับโค้ด: อ่านไฟล์จริงและยืนยัน18 - การอ้างสิทธิ์เกี่ยวกับการทดสอบ: รันการทดสอบด้วยตัวเอง19 - การอ้างสิทธิ์เกี่ยวกับไลบรารี: ตรวจสอบแพ็คเกจจริงหรือเอกสารของมัน20 - การอ้างสิทธิ์เกี่ยวกับ import: ยืนยันว่าแพ็คเกจอยู่ในไฟล์รายการ dependency21223. สร้างรายงาน:23 - VERIFIED: ข้อเท็จจริง, หลักฐาน (ไฟล์:บรรทัด หรือเอาต์พุตคำสั่ง)24 - WRONG: ข้อเท็จจริง, สิ่งที่เป็นจริง25 - UNVERIFIABLE: ข้อเท็จจริง, เหตุผลที่คุณไม่สามารถตรวจสอบได้2627ห้ามยอมรับการอ้างสิทธิ์แบบ "เชื่อฉัน" ห้ามอ้างสิทธิ์ด้วยตัวเอง หากคุณ28ไม่สามารถตรวจสอบได้ เอาต์พุตที่ถูกต้องคือ UNVERIFIABLE
เรียกใช้ตัวแทนนี้ก่อนการ commit หรือก่อนแชร์ผลลัพธ์กับทีมของคุณ มันจะจับคำโกหกที่อีก 3 ชั้นที่เหลือพลาดไป

ใบอนุญาต "ฉันไม่รู้"
Claude ถูกฝึกให้มีประโยชน์ และการยอมรับความไม่รู้ฟังดูไม่มีประโยชน์ ดังนั้นมันจึงเดา และการเดาก็ดูเหมือนถูกต้อง
วิธีแก้คือการอนุญาตให้ไม่รู้ CLAUDE.md เป็นครึ่งหนึ่งของมัน ปฏิกิริยาของคุณเป็นอีกครึ่งหนึ่ง ให้รางวัลกับ "ฉันยังไม่ได้ตรวจสอบสิ่งนี้" ด้วยความอดทน แล้วคุณจะได้ Claude ที่ซื่อสัตย์ทุกเซสชัน ลงโทษมันด้วยความหงุดหงิด แล้ว Claude จะกลับไปเดาอีกครั้ง
ไม่ใช่การตั้งค่า แต่เป็นนิสัย การแก้ไขที่ถูกประเมินค่าต่ำที่สุดในสแต็ก
วิธีบอกว่ามันใช้งานได้จริง
สามสัญญาณในเซสชันประจำวันของคุณ
Claude ถามก่อนที่จะเพิ่ม dependencies "ควรเพิ่ม X หรือใช้ stdlib?" แทนที่จะ npm install อย่างเงียบๆ
Claude อ้างอิงไฟล์:บรรทัดเมื่อมันพูดถึงโค้ดที่มีอยู่ "validateToken ใน src/auth/middleware.ts:47 ทำ Y" แทนที่จะเป็น "ฟังก์ชัน validateToken ทำ Y"
tsc และ linter ของคุณหยุดร้อง ฮุคจับการสร้างเรื่องแต่งที่เกิดขึ้นได้ยากทันที และ Claude แก้ไขตัวเอง ดังนั้นเมื่อถึงเวลาที่คุณดู คำโกหกก็หายไปแล้ว
ไม่เห็นสิ่งเหล่านี้หลังจากหนึ่งหรือสองวัน? ชั้นใดชั้นหนึ่งไม่ได้ถูกโหลด โดยปกติคือ CLAUDE.md ตำแหน่งผิดหรือชื่อผิด

ข้อผิดพลาดทั่วไปที่ทำให้ Claude โกหกต่อไป
CLAUDE.md ยาวเกินไป Claude อ่านส่วนแรกและข้ามส่วนที่เหลือ กฎความซื่อสัตย์ใน 50 บรรทัดแรก
ฮุคบันทึกอย่างเงียบๆ หากเอาต์พุตไม่ถึง stdout Claude จะไม่รู้ว่ามันโกหก ตรวจสอบให้แน่ใจว่าเอาต์พุตของฮุคถูกส่งกลับไปยังเซสชัน
คุณข้ามโหมดวางแผน นั่นคือจุดที่ Claude เปิดเผยสมมติฐานที่ผิดก่อนที่จะเขียน ข้ามมันไปแล้วคุณจะพลาดช่วงเวลาที่ถูกที่สุดในการจับคำโกหก
คุณไม่เรียกใช้ตัวตรวจสอบข้อเท็จจริง ตัวแทนย่อยจะทำงานก็ต่อเมื่อคุณเรียกใช้มันจริงๆ ทำให้ @fact-checker เป็นส่วนหนึ่งของขั้นตอนการ commit ของคุณ
คุณมีปฏิกิริยาไม่ดีต่อ "ฉันไม่รู้" ลงโทษความซื่อสัตย์เพียงครั้งเดียว แล้ว Claude จะกลับไปเดา อีก 3 ชั้นที่เหลือจะไม่ยั่งยืนหากไม่มีชั้นนี้

การตรวจสอบความซื่อสัตย์ใน 5 นาที
1 นาที: คัดลอกกฎความซื่อสัตย์และโปรโตคอลการตรวจสอบของ CLAUDE.md ไปยัง root ของโปรเจกต์คุณ
1 นาที: คัดลอกบล็อกฮุคไปยัง ~/.claude/settings.json หรือ .claude/settings.json
2 นาที: สร้าง .claude/agents/fact-checker.md ด้วยเทมเพลตด้านบน
1 นาที: รันงานที่คุณปกติจะตรวจสอบซ้ำ ดูว่าเอาต์พุต tsc กลับมาที่ Claude หรือไม่ ยืนยันว่า Claude พูดว่า "verified" หรือ "ฉันยังไม่ได้ตรวจสอบสิ่งนี้" อย่างชัดเจน
เสร็จแล้ว การสร้างเรื่องแต่งลดลงจาก "ทุกๆ เซสชันอื่น" เป็น "เกิดขึ้นได้ยากและถูกจับได้ทันที" โมเดลไม่ได้ฉลาดขึ้น แต่การตั้งค่าของคุณต่างหาก
ขอบคุณที่อ่าน!






