Claude Code สลับโมเดลโดยไม่แสดงบนหน้าจอ — บรรทัดตั้งค่าเพียงบรรทัดเดียวที่ทำลาย "การตรวจสอบต้องอยู่บนโมเดลสูงสุด" ค้นพบจากการอ่านสเปกครบทั้ง 789 บรรทัด

AI Claude Code モデル運用 検証

บทนำ

ในฐานะนโยบายการทำงานของผู้ช่วย AI เขียนโค้ด ฉันได้กำหนดไว้ว่า “ใช้โมเดลสูงสุดได้อย่างเต็มที่สำหรับการตัดสินเชิงออกแบบและงานตรวจสอบ อย่าลดระดับลงด้วยเหตุผลเรื่องต้นทุน” นโยบายนั้นกับบรรทัดเดียวที่ค้างอยู่ในไฟล์คอนฟิกมานาน — การตั้งค่าที่ระบุว่าจะไปไหนเมื่อโมเดลไม่ว่าง — แท้จริงแล้วขัดแย้งกันโดยตรง และฉันไม่รู้ตัวจนกระทั่งได้อ่านสเปกทางการเรื่องการสลับโมเดลจนจบ

ครั้งแรกที่ฉันเปิดเอกสารนั้น ฉันอ่านผ่าน ๆ เฉพาะส่วนที่ดูจำเป็นแล้วก็หยุด ครั้งนี้ฉันอ่านทั้งหมดราว 789 บรรทัดจนจบ และตรวจดูว่าในส่วนที่ฉันเคยหยุดไว้นั้นเขียนอะไรไว้บ้าง

ขอบเขตที่ฉันหยุดไว้ตอนอ่านแค่บางส่วน

รอบแรกฉันยืนยันเพียงความลึกของการคิดตั้งต้นของแต่ละโมเดล (effort) และการจัดการหน้าต่างบริบท แล้วก็จบตรงนั้น

The default effort is high on every model that supports effort, except Opus 4.7, which defaults to xhigh.

On the Anthropic API, [the supported model set] always run with the 1M window.

ฉันอ่านไปได้แค่นั้น แต่พักบทที่ว่าด้วย รายการโมเดลที่องค์กรอนุญาตและกลไก fallback chain และเรื่อง ตัวแปรสภาพแวดล้อมกับการตั้งค่าแคชพรอมป์ต เอาไว้ ฉันรู้ตัวว่ามีขอบเขตที่ยังไม่ได้อ่าน จึงทำเครื่องหมายไว้ชัดเจนว่ายังไม่อ่าน แล้วย้ายไปทำงานชิ้นถัดไป

การอ่านส่วนที่เหลือทำให้เจอเส้นทางการสลับที่มองไม่เห็น

หลายวันต่อมาฉันอ่านขอบเขตที่เหลือจนจบ สิ่งที่สะดุดตาก่อนคือประโยคที่บอกว่ากลไกการสลับโมเดลอัตโนมัติ ไม่ปรากฏบนหน้าจอ

Claude Code doesn’t confirm the chain at startup and /status doesn’t display it. The notice shown when a switch happens is the first visible sign that a fallback is configured.

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

The switch lasts for the current turn only, so your next message tries the primary model first again.

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

เส้นทางการสลับอีกเส้น — มันทำงานได้จากเนื้อหาของบทสนทนาเพียงอย่างเดียว

การอ่านต่อไปแสดงให้เห็นว่าโมเดลสลับได้ผ่านการตัดสินความปลอดภัยอัตโนมัติด้วย

When a classifier flags a request and the flagged category has a fallback model, Claude Code re-runs the request on that model and shows a notice in the transcript.

Fallback can trigger on the first request of a session, before you send anything unusual, because the first request carries workspace context such as your CLAUDE.md content and git status. A repository that contains security or biology material can trip the classifier on that context alone.

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

After a fallback, the session continues on the fallback model. To return to your original model, run /model.

การตั้งค่าเพื่อหยุดการสลับอัตโนมัตินั้นและเปลี่ยนเป็น “ให้ฉันเลือกเองทุกครั้ง” อยู่ในสเปกฉบับเดียวกัน

To decide what happens each time a request is flagged, rather than switching automatically, run /config and turn off Switch models when a message is flagged, or set switchModelsOnFlag to false.

วัดการตั้งค่าของตัวเอง

แทนที่จะพอใจกับการสันนิษฐาน ฉันตรวจส่วนที่เกี่ยวข้องของไฟล์คอนฟิกจริง (วัดเมื่อ 2026-08-24 ค่าที่เจาะจงกับการอิมพลีเมนต์ถูกตัดออกเพราะไม่เกี่ยวข้องในที่นี้)

{
  "fallbackModel": ["sonnet", "haiku"],
  "switchModelsOnFlag": false,
  "autoCompactWindow": 200000
}

fallbackModel ตั้งโมเดลสำรองไว้ลึกสองชั้น ก่อนอ่านสเปก ฉันอธิบายไม่ได้เลยว่าการตั้งค่านั้นถูกใส่เข้ามาเมื่อไหร่หรือด้วยการตัดสินของใคร ข้าง ๆ นโยบายที่ประกาศไว้ว่า “ไม่เสียดายค่าใช้จ่ายกับโมเดลสูงสุดสำหรับการตรวจสอบและการตัดสินเชิงออกแบบ” กลับมีการตั้งค่าที่สลับไปโมเดลต่ำกว่าอย่างเงียบ ๆ เมื่อระบบไม่ว่าง การวัดยังยืนยันด้วยว่า switchModelsOnFlag ถูกตั้งเป็น false อยู่แล้ว (ฝั่งที่ถามทุกครั้งแทนการสลับอัตโนมัติ)

แผนภาพ — สลับที่ไหน ด้วยอะไร และไปโมเดลใด

กำลังสนทนาอยู่บนโมเดลหลัก

      ├─▶ เส้นทางที่ ①: โมเดลหลักไม่ว่างหรือใช้งานไม่ได้
      │       └─ สลับไป fallback chain (โมเดลสำรองที่ตั้งไว้) เฉพาะบทสนทนานั้น
      │             └─ ไม่ถูกแสดงทั้งตอนเริ่มต้นและด้วยคำสั่งตรวจสถานะ (ทางการ)
      │                   └─ หนทางเดียวที่มองเห็นคือ "การแจ้งเตือน ณ วินาทีที่สลับ"
      │                         └─(เส้นย้อนกลับ)→ บทสนทนาถัดไปย้อนกลับไปโมเดลหลักอัตโนมัติ

      └─▶ เส้นทางที่ ②: การตัดสินความปลอดภัยอัตโนมัติตอบสนองต่อเนื้อหาของบทสนทนา
              └─ ทำงานได้จากบทสนทนาแรกของเซสชันเพียงอย่างเดียว (ซึ่งพาข้อมูลไดเรกทอรีทำงานไปด้วย)
                    └─ เมื่อทำงานแล้ว เซสชันจะรันบนโมเดลสำรองนั้นต่อจนกว่าจะย้อนกลับเอง
                          └─ จะสลับอัตโนมัติหรือถามทุกครั้ง ตั้งค่าได้ (ทางการ)
                                └─ วัดแล้ว: ตั้งไว้ที่ฝั่งถามทุกครั้ง

การไหลแนวตั้งคือ “จากบทสนทนาบนโมเดลหลัก ผ่านการสลับ แล้วย้อนกลับ” กิ่งแนวนอนคือเงื่อนไขการทำงาน 2 ข้อ “ไม่ว่าง หรือการตัดสินความปลอดภัย” และการซ้อนที่ด้านล่างคือวงวนของการเลือกควบคุมแบบอัตโนมัติหรือแบบมือ ที่ตรวจสอบไขว้กับการตั้งค่าจริงของฉัน

อะไรที่ชัดเจนแล้ว และอะไรที่ยังไม่

การอ่านครบทั้ง 789 บรรทัดทำให้ยุติได้ 3 ประเด็น

สิ่งที่ตรวจผล
การไม่มีการแจ้งเตือนบนหน้าจอเรื่องการสลับโมเดล เป็นความล้มเหลวของการสังเกตหรือเป็นไปตามสเปกเป็นไปตามสเปก โดยการออกแบบแล้ว การแจ้งเตือนปรากฏเฉพาะ ณ วินาทีที่สลับ
การสลับโมเดลจากการตัดสินความปลอดภัย ทำงานได้จากเนื้อหาของบทสนทนาเพียงอย่างเดียวหรือไม่ทำงานได้ (ระบุอย่างเป็นทางการ) แต่ยังไม่ได้ยืนยันกรณีที่มันทำงานจริง
สภาพแวดล้อมของฉันตั้งไว้ที่การสลับอัตโนมัติหรือการถามทุกครั้งตั้งไว้ที่ฝั่งถามทุกครั้ง (ยืนยันด้วยการวัด)

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

ทำไมฉันจึงเลิกใช้ orchestrator subagent ใน Claude Code — ข้อจำกัดเชิงโครงสร้าง 3 ข้อจากสเปกฮาร์เนสทางการ

สไตล์เอาต์พุตของ Claude Code ไม่ถูกสืบทอดไปยัง subagent — สเปกทางการ และการตรวจสอบด้วยการใช้งานจริง

สิ่งที่ใหญ่กว่าสิ่งที่การอ่านจนจบทำให้ชัดเจน คือ การที่มันขีดเส้นให้เห็นชัดว่าการอ่านจนจบนั้นไม่ได้ทำให้อะไรชัดเจนบ้าง สเปกบอกคุณได้แค่ว่าอะไรเกิดขึ้นได้ ส่วนมันเกิดขึ้นจริงกี่ครั้งในสภาพแวดล้อมของคุณ ไม่ได้อยู่ในสเปก แต่อยู่ฝั่งล็อกการแจ้งเตือน

ส่งข้อความได้ตามสบาย

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