วิธีแก้ปัญหา Claude Code มโนคำตอบเมื่อไม่รู้คำตอบ (พร้อมการตั้งค่าแบบละเอียด)

@0x_rody
อังกฤษ1 เดือนที่ผ่านมา · 06 มิ.ย. 2569
346K
256
29
8
1.2K

TL;DR

คู่มือนี้มอบกรอบการทำงาน 4 ชั้นที่ครอบคลุมเพื่อป้องกันไม่ให้ Claude Code สร้างฟังก์ชันหรือทดสอบแบบมโนขึ้นมาเอง โดยการใช้กฎความซื่อสัตย์ที่เข้มงวด โปรโตคอลการตรวจสอบ และการใช้ linter hooks แบบอัตโนมัติ

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

Claude บอกคุณว่า Bug ได้รับการแก้ไขแล้ว สองชั่วโมงต่อมาคุณถึงรู้ว่าฟังก์ชันที่มันเรียกนั้นไม่เคยมีอยู่จริง

นักพัฒนาส่วนใหญ่เรียนรู้ที่จะตรวจสอบทุกอย่างซ้ำสองและโทษโมเดล วิธีแก้ที่แท้จริงคือการจับทุกคำโกหกก่อนที่มันจะออกจากเครื่องของคุณ

นี่คือการตั้งค่าความซื่อสัตย์แบบเต็มรูปแบบ 👇

rody - inline image

ทำไม Claude ถึงสร้างเรื่องขึ้นมาตั้งแต่แรก

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

คุณไม่สามารถแยกความแตกต่างได้จนกว่าโค้ดของคุณจะพังในอีกสองชั่วโมงต่อมาในแบบที่ต้องใช้เวลาอีกหนึ่งชั่วโมงในการดีบัก

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

4 ชั้นด้านล่าง เมื่อรวมกันแล้วจะลดการสร้างเรื่องแต่งให้เกือบเป็นศูนย์

rody - inline image

ชั้นที่ 1: กฎความซื่อสัตย์ใน CLAUDE.md

ชั้นแรกคือชุดกฎใน CLAUDE.md ที่บอก Claude อย่างชัดเจนว่าเมื่อใดควรยอมรับความไม่แน่นอนและต้องทำอย่างไร วางสิ่งนี้ใน root ของโปรเจกต์คุณ:

markdown
1## กฎความซื่อสัตย์ (อ่านทุกเทิร์น)
2
3ก่อนที่จะอ้างว่าฟังก์ชัน, คลาส, หรือ import มีอยู่ ให้ตรวจสอบโดยการอ่าน
4ไฟล์หรือรัน grep ห้ามสร้างสัญลักษณ์ที่ไม่มีอยู่จริง
5
6หากคุณไม่สามารถตรวจสอบบางสิ่งได้ ให้พูดว่า "ฉันยังไม่ได้ตรวจสอบสิ่งนี้" อย่างชัดเจน
7ห้ามเขียนโค้ดที่ขึ้นอยู่กับการอ้างสิทธิ์ที่ยังไม่ได้ตรวจสอบ
8
9หากงานขอให้คุณใช้ไลบรารีที่คุณไม่เคยเห็นว่ามีการอ้างอิงในโปรเจกต์นี้
10ให้ถามก่อนที่จะเพิ่ม
11
12หากงานเกี่ยวข้องกับการทดสอบหรือการ build อย่าอ้างว่าสำเร็จเว้นแต่คุณ
13ได้รันคำสั่งทดสอบหรือ build จริงในเซสชันนี้
14
15ห้ามสร้างข้อความแสดงข้อผิดพลาด, การตอบสนองของ API, หรือ stack traces ขึ้นมาเอง
16หากคุณไม่เห็นมัน ให้พูดอย่างนั้น
17
18เมื่อคุณไม่รู้จริงๆ คำตอบที่ถูกต้องคือ "ฉันไม่รู้" หรือ
19"ฉันต้องตรวจสอบก่อน" ทั้งสองอย่างดีกว่าการเดาอย่างมั่นใจ

กฎเหล่านี้ดูเหมือนชัดเจน

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

บรรทัดสุดท้ายสำคัญที่สุด มันคือใบอนุญาต "ฉันไม่รู้" และคนส่วนใหญ่ไม่เคยมอบให้

ชั้นที่ 2: รูปแบบการตรวจสอบก่อนเขียน

ชั้นที่สองบังคับให้ Claude ตรวจสอบก่อนที่จะเขียน เพิ่มสิ่งนี้ใน CLAUDE.md ภายใต้กฎความซื่อสัตย์:

markdown
1## โปรโตคอลการตรวจสอบ
2
3ก่อนที่จะเขียนหรือแก้ไขโค้ดที่ใช้สัญลักษณ์ (ฟังก์ชัน, คลาส, ชนิด,
4ค่าคงที่) ให้ทำอย่างใดอย่างหนึ่งต่อไปนี้:
5
61. อ่านไฟล์ที่กำหนดสัญลักษณ์นั้นและยืนยันลายเซ็น
72. รัน `grep -r "ชื่อสัญลักษณ์" .` หรือใช้เครื่องมือ Glob เพื่อค้นหา
83. ตรวจสอบ package.json, requirements.txt, Cargo.toml หรือไฟล์ที่เทียบเท่า
9 สำหรับ dependency
10
11หากคุณข้ามการตรวจสอบ ให้ใส่คำอธิบายประกอบโค้ดด้วย:
12`// UNVERIFIED: ฉันยังไม่ได้ยืนยันว่าสัญลักษณ์นี้มีอยู่`
13
14โหมดวางแผนแล้วดำเนินการเป็นที่ต้องการสำหรับงานใดๆ ที่เกี่ยวข้องกับมากกว่า
15หนึ่งไฟล์ ใช้ Shift+Tab เพื่อเข้าสู่โหมดวางแผนก่อนเริ่มต้น

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

ชั้นที่ 3: ฮุคที่จับคำโกหกแบบเรียลไทม์

ชั้นที่สามคือฮุคใน settings.json ที่รัน type checker หรือ linter ทุกครั้งที่ Claude เขียนไฟล์ หาก Claude สร้าง import ขึ้นมา ตัวตรวจสอบจะล้มเหลวทันที และ Claude ต้องแก้ไขก่อนที่จะอ้างว่างานเสร็จ

json
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 จะประกาศว่าเซสชันเสร็จสิ้น:

json
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:

yaml
1---
2name: fact-checker
3description: ใช้ตัวแทนนี้หลังจากที่ Claude ได้อ้างสิทธิ์เกี่ยวกับสิ่งที่โค้ดทำ, การทดสอบใดที่ผ่าน, หรือสิ่งที่ไลบรารีรองรับ เรียกใช้ก่อนการ commit ใดๆ, ก่อนสรุปผลใดๆ ที่ผู้ใช้จะเห็น, และหลังจากงานใดๆ ที่เกี่ยวข้องกับ dependencies ใหม่
4tools: Read, Grep, Glob, Bash
5model: sonnet
6---
7
8คุณตรวจสอบข้อเท็จจริง คุณไม่ได้เขียนโค้ด
9
10เมื่อถูกเรียกใช้ ให้ทำดังนี้:
11
121. ระบุข้อเท็จจริงทุกข้อในการสนทนาล่าสุด ตัวอย่าง:
13 "ฟังก์ชัน X ทำ Y", "การทดสอบผ่าน", "ไลบรารี Z รองรับ W",
14 "import นี้ถูกต้อง"
15
162. สำหรับแต่ละข้อเท็จจริง ให้ตรวจสอบอย่างอิสระ:
17 - การอ้างสิทธิ์เกี่ยวกับโค้ด: อ่านไฟล์จริงและยืนยัน
18 - การอ้างสิทธิ์เกี่ยวกับการทดสอบ: รันการทดสอบด้วยตัวเอง
19 - การอ้างสิทธิ์เกี่ยวกับไลบรารี: ตรวจสอบแพ็คเกจจริงหรือเอกสารของมัน
20 - การอ้างสิทธิ์เกี่ยวกับ import: ยืนยันว่าแพ็คเกจอยู่ในไฟล์รายการ dependency
21
223. สร้างรายงาน:
23 - VERIFIED: ข้อเท็จจริง, หลักฐาน (ไฟล์:บรรทัด หรือเอาต์พุตคำสั่ง)
24 - WRONG: ข้อเท็จจริง, สิ่งที่เป็นจริง
25 - UNVERIFIABLE: ข้อเท็จจริง, เหตุผลที่คุณไม่สามารถตรวจสอบได้
26
27ห้ามยอมรับการอ้างสิทธิ์แบบ "เชื่อฉัน" ห้ามอ้างสิทธิ์ด้วยตัวเอง หากคุณ
28ไม่สามารถตรวจสอบได้ เอาต์พุตที่ถูกต้องคือ UNVERIFIABLE

เรียกใช้ตัวแทนนี้ก่อนการ commit หรือก่อนแชร์ผลลัพธ์กับทีมของคุณ มันจะจับคำโกหกที่อีก 3 ชั้นที่เหลือพลาดไป

rody - inline image

ใบอนุญาต "ฉันไม่รู้"

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 ตำแหน่งผิดหรือชื่อผิด

rody - inline image

ข้อผิดพลาดทั่วไปที่ทำให้ Claude โกหกต่อไป

CLAUDE.md ยาวเกินไป Claude อ่านส่วนแรกและข้ามส่วนที่เหลือ กฎความซื่อสัตย์ใน 50 บรรทัดแรก

ฮุคบันทึกอย่างเงียบๆ หากเอาต์พุตไม่ถึง stdout Claude จะไม่รู้ว่ามันโกหก ตรวจสอบให้แน่ใจว่าเอาต์พุตของฮุคถูกส่งกลับไปยังเซสชัน

คุณข้ามโหมดวางแผน นั่นคือจุดที่ Claude เปิดเผยสมมติฐานที่ผิดก่อนที่จะเขียน ข้ามมันไปแล้วคุณจะพลาดช่วงเวลาที่ถูกที่สุดในการจับคำโกหก

คุณไม่เรียกใช้ตัวตรวจสอบข้อเท็จจริง ตัวแทนย่อยจะทำงานก็ต่อเมื่อคุณเรียกใช้มันจริงๆ ทำให้ @fact-checker เป็นส่วนหนึ่งของขั้นตอนการ commit ของคุณ

คุณมีปฏิกิริยาไม่ดีต่อ "ฉันไม่รู้" ลงโทษความซื่อสัตย์เพียงครั้งเดียว แล้ว Claude จะกลับไปเดา อีก 3 ชั้นที่เหลือจะไม่ยั่งยืนหากไม่มีชั้นนี้

rody - inline image

การตรวจสอบความซื่อสัตย์ใน 5 นาที

1 นาที: คัดลอกกฎความซื่อสัตย์และโปรโตคอลการตรวจสอบของ CLAUDE.md ไปยัง root ของโปรเจกต์คุณ

1 นาที: คัดลอกบล็อกฮุคไปยัง ~/.claude/settings.json หรือ .claude/settings.json

2 นาที: สร้าง .claude/agents/fact-checker.md ด้วยเทมเพลตด้านบน

1 นาที: รันงานที่คุณปกติจะตรวจสอบซ้ำ ดูว่าเอาต์พุต tsc กลับมาที่ Claude หรือไม่ ยืนยันว่า Claude พูดว่า "verified" หรือ "ฉันยังไม่ได้ตรวจสอบสิ่งนี้" อย่างชัดเจน

เสร็จแล้ว การสร้างเรื่องแต่งลดลงจาก "ทุกๆ เซสชันอื่น" เป็น "เกิดขึ้นได้ยากและถูกจับได้ทันที" โมเดลไม่ได้ฉลาดขึ้น แต่การตั้งค่าของคุณต่างหาก

ขอบคุณที่อ่าน!

rody - inline image
บันทึกในคลิกเดียว

อ่านบทความไวรัลเชิงลึกด้วย AI ใน YouMind

บันทึกแหล่งที่มา ถามคำถามที่ตรงประเด็น สรุปข้อโต้แย้ง และเปลี่ยนบทความไวรัลให้เป็นโน้ตที่นำกลับมาใช้ได้ใน AI เวิร์กสเปซเดียว

สำรวจ YouMind
สำหรับครีเอเตอร์

เปลี่ยน Markdown ของคุณให้เป็นบทความ 𝕏 ที่สะอาดตา

เวลาคุณเผยแพร่งานเขียนยาวของตัวเอง การจัดรูปแบบรูปภาพ ตาราง และบล็อกโค้ดให้เข้ากับ 𝕏 นั้นน่าปวดหัว YouMind เปลี่ยนร่าง Markdown ทั้งฉบับให้เป็นบทความ 𝕏 ที่สะอาดตาและพร้อมโพสต์ทันที

ลอง Markdown เป็น 𝕏

แพตเทิร์นให้ถอดรหัสเพิ่มเติม

บทความไวรัลล่าสุด

สำรวจบทความไวรัลเพิ่มเติม