เอเจนต์เขียนโค้ดของผมขออนุญาตในทุกขั้นตอนเล็กๆ
ผู้ช่วย AI ของผมมีปัญหาใหญ่ มันไม่ได้ปฏิเสธที่จะขออนุญาต แต่มันขออนุญาตบ่อยเกินไป
ผมจะมอบหมายงานง่ายๆ อย่างการอ่านไฟล์ PDF ให้มัน ผู้ช่วยจะขยับหนึ่งก้าว ขออนุมัติ รันคำสั่ง แล้วก็ขออนุญาตอีกครั้งทันทีสำหรับขั้นตอนเล็กๆ ถัดไป งานหนึ่งอย่างกลายเป็นวงจรการตอบคำถามที่วนเวียนไม่จบสิ้น
การขออนุมัติเป็นสิ่งจำเป็น คุณย่อมต้องการให้ผู้ช่วยในเครื่องหยุดก่อนที่จะรันคำสั่ง เขียนไฟล์ หรือเปิดแอปพลิเคชัน แต่การทำงานจริงต้องใช้หลายขั้นตอน การอ่าน PDF เกี่ยวข้องกับการตรวจสอบ Python, การหาตัวแปลงไฟล์, การรันตัวแปลงนั้น และการอ่านข้อความ
หากทุกขั้นตอนต้องขออนุมัติ คุณจะเลิกประเมินความเสี่ยง และเริ่มกดข้ามการขัดจังหวะเพียงเพื่อให้มันหายไป สิ่งนี้จะฝึกให้คุณละเลยระบบความปลอดภัย ซึ่งอันตรายยิ่งกว่าการไม่มีระบบความปลอดภัยเลยเสียอีก
เวิร์กโฟลว์แบบเดิมเป็นแบบนี้:
- ผู้ช่วยเลือกเครื่องมือ
- นโยบายกำหนดให้ต้องมีการยืนยัน
- ผู้ใช้กดอนุมัติ
- เครื่องมือทำงาน
- ผู้ช่วยขออนุญาตอีกครั้งสำหรับเครื่องมือถัดไป
ผู้ช่วยพลาดเจตนาของผู้ใช้ คุณไม่ได้กำลังอนุมัติการทดสอบเล็กๆ เพียงครั้งเดียว แต่คุณกำลังอนุมัติงานที่สมบูรณ์หนึ่งอย่าง
ผมได้เปลี่ยนวิธีการทำงานของ CliGate ตอนนี้ เมื่อคุณอนุมัติการกระทำแรกในแชทแล้ว ระบบจะตั้งค่า flag ไว้ สิ่งนี้ช่วยให้ขั้นตอนต่อๆ ไปดำเนินต่อไปได้โดยไม่ต้องขออนุมัติใหม่เป็นรอบๆ ผู้ช่วยยังคงได้รับผลลัพธ์จริงเพื่อให้สามารถทำงานต่อไปได้
ผมยังได้เพิ่มทางออกฉุกเฉิน: /safe คำสั่งนี้จะเปิดโหมดการยืนยันแบบชัดเจน (explicit confirmation mode) กลับมาอีกครั้ง
ผมยังได้แก้ไขบั๊กด้านภาษาด้วย เมื่อระบบทำงานต่อเนื่องในงานหนึ่ง บางครั้งมันจะเปลี่ยนภาษาของข้อความแจ้งเตือน หากคุณพูดภาษาจีน ผู้ช่วยจะเปลี่ยนเป็นภาษาอังกฤษในข้อความถัดไป ตอนนี้ ผู้ช่วยจะดูข้อความล่าสุดที่คุณส่งมาเพื่อเลือกภาษาที่ถูกต้อง
การแก้ไขไม่ใช่การปิดการขออนุมัติ แต่การแก้ไขคือการจดจำว่าทำไมผู้ใช้ถึงให้การอนุมัติ
สำหรับเครื่องมือในเครื่อง (local tools) ให้ใช้ความไว้วางใจตามขอบเขตของงาน (task-scoped trust):
- ขออนุญาตก่อนข้ามขอบเขตสำคัญ
- จดจำการอนุมัติสำหรับงานปัจจุบัน
- มีวิธีกลับเข้าสู่โหมดเข้มงวด (strict mode)
- อย่าปล่อยให้ข้อความจากระบบเปลี่ยนเจตนาของผู้ใช้
นี่คือวิธีที่ผมสร้างระบบการขออนุมัติใน CliGate มันคือ control plane ส่วนตัวในเครื่องของผมสำหรับ Claude Code, Codex CLI และ Gemini CLI
คุณจัดการกับความเหนื่อยล้าจากการต้องคอยกดอนุมัติ (approval fatigue) อย่างไร? คุณอนุมัติแยกตามการเรียกใช้เครื่องมือ (per tool call), ตามงาน (per task) หรือตามเซสชัน (per session)?
Coding Agent ของผมขออนุญาตในทุกๆ ขั้นตอนเล็กๆ น้อยๆ
ช่วงนี้ผมได้ลองเล่น AI coding agent หลายตัว และพบปัญหาที่น่ารำคาญใจอย่างหนึ่งที่เหมือนกันในเกือบทุกตัว นั่นคือ พวกมันชอบขออนุญาตผมในทุกๆ ขั้นตอนเล็กๆ น้อยๆ
สมมติว่าผมสั่งงานว่า: "สร้างไฟล์ใหม่ชื่อ utils.py และเพิ่มฟังก์ชันสำหรับคำนวณค่าเฉลี่ยลงไป"
แทนที่ agent จะลงมือทำทันที สิ่งที่ผมได้รับคือ:
"คุณต้องการให้ผมสร้างไฟล์ utils.py ใช่หรือไม่? (ใช่/ไม่)"
พอผมตอบว่า "ใช่" สิ่งที่ตามมาคือ:
"คุณต้องการให้ผมเขียนโค้ดลงในไฟล์ utils.py ใช่หรือไม่? (ใช่/ไม่)"
"คุณต้องการให้ผมรันคำสั่ง python utils.py เพื่อทดสอบใช่หรือไม่? (ใช่/ไม่)"
สิ่งนี้ทำให้ flow การทำงานของผมเสียไปอย่างสิ้นเชิง ผมไม่ได้กำลัง "ร่วมมือ" กับ AI แต่ผมกำลังทำหน้าที่เป็น "ปุ่มกด Yes" ให้กับมัน
กับดัก "Human-in-the-loop"
แนวคิด "Human-in-the-loop" (การให้มนุษย์อยู่ในกระบวนการตัดสินใจ) เป็นแนวคิดที่ดีในทางทฤษฎี เพื่อความปลอดภัยและเพื่อป้องกันไม่ให้ AI ทำอะไรที่ผิดพลาดร้ายแรง เช่น การลบฐานข้อมูลหรือการลบไฟล์สำคัญ
แต่ปัญหาคือ เมื่อเรานำแนวคิดนี้มาใช้กับงานเขียนโค้ดในระดับ Micro-management มันจะกลายเป็น "Permission Fatigue" หรือความเหนื่อยล้าจากการต้องคอยกดอนุญาต
แทนที่ผมจะได้โฟกัสกับสถาปัตยกรรมของซอฟต์แวร์หรือตรรกะที่ซับซ้อน ผมกลับต้องมาเสียเวลากับการตอบตกลงในเรื่องที่คาดเดาได้อยู่แล้ว
ทำไมถึงเป็นแบบนี้?
สาเหตุหลักๆ มีอยู่ไม่กี่อย่าง:
- ความระมัดระวังที่มากเกินไป (Over-caution): ผู้พัฒนา agent มักจะตั้งค่าให้ AI มีความระมัดระวังสูงสุด เพื่อหลีกเลี่ยงการกระทำที่อาจส่งผลเสียต่อระบบของผู้ใช้
- การขาดความเป็นอิสระ (Lack of Autonomy): Agent ถูกออกแบบมาให้ทำงานตามคำสั่งแบบทีละขั้นตอน (Step-by-step) มากกว่าที่จะเข้าใจ "เป้าหมายปลายทาง" (End goal)
- System Prompt ที่ไม่ชัดเจน: หาก System Prompt ไม่ได้ระบุขอบเขตอำนาจการตัดสินใจไว้ชัดเจน AI จะเลือกทางที่ปลอดภัยที่สุด นั่นคือการถามทุกอย่าง
วิธีแก้ไข: มอบอำนาจการตัดสินใจ (Giving Autonomy)
เพื่อให้ Coding Agent ทำงานได้จริง มันต้องเปลี่ยนจาก "เด็กฝึกงานที่ต้องถามทุกอย่าง" เป็น "คู่หูที่ไว้ใจได้" นี่คือวิธีที่ผมใช้จัดการกับปัญหานี้:
1. กำหนดขอบเขตที่ชัดเจน (Define Boundaries)
แทนที่จะปล่อยให้มันทำอะไรก็ได้ หรือไม่ให้มันทำอะไรเลย ผมจะกำหนดขอบเขตใน System Prompt เช่น:
"คุณมีอำนาจในการสร้างไฟล์, แก้ไขไฟล์ และรันคำสั่งใน terminal ที่เกี่ยวข้องกับโปรเจกต์นี้ได้โดยไม่ต้องขออนุญาต ยกเว้นการลบไฟล์ที่มีอยู่เดิม หรือการติดตั้ง package ใหม่ผ่าน npm/pip"
2. ใช้แนวคิด "Intent-based" แทน "Step-based"
แทนที่จะสั่งงานเป็นขั้นตอน ให้สั่งงานตาม "เจตจำนง" (Intent) เช่น:
"ช่วย refactor โค้ดในโฟลเดอร์ /src ให้สะอาดขึ้นตามหลัก Clean Code โดยไม่ต้องถามผมในทุกขั้นตอน แต่ถ้าคุณไม่แน่ใจในจุดที่สำคัญ ให้หยุดและถาม"
3. การจัดการกับความเสี่ยง (Risk Management)
เราสามารถยอมรับความเสี่ยงได้ในระดับหนึ่งเพื่อแลกกับความเร็ว เช่น การอนุญาตให้มันเขียน Unit Test หรือสร้างไฟล์ helper ต่างๆ ได้ทันที โดยที่เราค่อยมาตรวจสอบ (Review) ในภายหลังผ่าน Git commit แทนที่จะต้องมานั่งกด Yes ในขณะที่กำลังเขียนโค้ด
บทสรุป
เป้าหมายของการใช้ AI coding agent ไม่ใช่การมีเครื่องมือที่ทำตามคำสั่งเราอย่างซื่อสัตย์ในทุกๆ บรรทัด แต่คือการมีเครื่องมือที่ช่วยขยายขีดความสามารถของเรา (Augment our capabilities)
ถ้าเราต้องเสียเวลามานั่งกด "Yes" ทุกๆ 30 วินาที นั่นไม่ใช่การใช้ AI เพื่อเพิ่มประสิทธิภาพ แต่มันคือการเพิ่มภาระงานให้เราต่างหาก