Tool: edit — แก้ไฟล์แบบ find-and-replace พร้อม fallback กันช่องว่างไม่ตรงกัน

edit แก้เฉพาะส่วนของไฟล์ที่มีอยู่ โดยอาศัยข้อความเดิมเป็นจุดอ้างอิง จึงเหมาะกับการปรับโค้ดหรือเอกสารแบบจำกัดขอบเขตโดยไม่เขียนทั้งไฟล์ทับใหม่
Tool นี้คืออะไร
แก้ไฟล์ที่มีอยู่แล้วด้วยการแทนที่ข้อความเดิม (old_string) ด้วยข้อความใหม่ (new_string) — เป็น tool ที่ไม่มีคู่เทียบใน AGENT LITE เลย (LITE มีแค่ write_file ที่เขียนทับทั้งไฟล์) เพราะ LOCAL AGENT TH ไว้ใจให้โมเดล 35B ทำการแก้ไฟล์แบบละเอียดได้อย่างน่าเชื่อถือกว่า
กฎสำคัญ: old_string ต้องไม่กำกวม
old_string ต้องเป็น substring ที่ปรากฏในไฟล์แค่ครั้งเดียวเท่านั้น ถ้าพบมากกว่า 1 ครั้งและไม่ได้ตั้ง replace_all=true ระบบจะปฏิเสธพร้อมบอกจำนวนครั้งที่เจอ — บังคับให้โมเดลระบุ context ที่แคบพอจะไม่กำกวม (เช่นใส่บรรทัดก่อนหน้า/หลังเพิ่มเข้าไปด้วย) แทนที่จะเสี่ยงแก้ผิดจุดโดยไม่รู้ตัว การออกแบบแบบนี้เลือกปฏิเสธเมื่อไม่แน่ใจ (fail-safe) แทนการเดาว่าควรแก้ตำแหน่งไหน
Fallback: normalize whitespace ก่อนยอมแพ้
จุดที่น่าสนใจที่สุดของ tool นี้คือกลไกกู้คืนเมื่อ old_string หาไม่เจอในครั้งแรก — สาเหตุที่พบบ่อยคือ trailing whitespace ไม่ตรงกัน (โมเดลพิมพ์ข้อความที่ไม่มีช่องว่างท้ายบรรทัด แต่ไฟล์จริงมี หรือกลับกัน) แทนที่จะรายงาน error ทันที ระบบลองอีกครั้ง:
- Normalize ทั้งเนื้อหาไฟล์และ
old_stringด้วยการตัด trailing whitespace ทุกบรรทัด (rstrip()) - ถ้าเจอ match ในเวอร์ชัน normalize แล้ว → map ตำแหน่งกลับไปหาบรรทัดต้นฉบับจริง (นับจากจำนวนบรรทัดก่อนหน้าตำแหน่งที่ match) แล้วดึง chunk จากเนื้อหาไฟล์ดิบที่ตำแหน่งนั้นมาใช้แทน
- ถ้า chunk ดิบที่ดึงมาปรากฏในไฟล์จริง (ยืนยันว่า mapping ถูกต้อง) → ใช้ค่านั้นแทน
old_stringเดิม แล้วทำ replace ตามปกติ
ขั้นตอนนี้ทำให้การแก้ไขที่พลาดแค่เรื่อง whitespace เล็กน้อยไม่ต้องล้มเหลวทั้งหมด โดยยังคงความปลอดภัยไว้ — เพราะสุดท้ายแล้วสิ่งที่ replace จริงคือเนื้อหาต้นฉบับ ไม่ใช่เวอร์ชัน normalize (ป้องกันไม่ให้เขียนไฟล์ด้วยเนื้อหาที่ถูก normalize โดยไม่ตั้งใจ ซึ่งอาจไปเปลี่ยน whitespace ในส่วนอื่นของไฟล์ที่ไม่เกี่ยวข้อง)
Error message สอนวิธีแก้ตัวเอง
ถ้าหา old_string ไม่เจอแม้ลอง normalize แล้ว error message จะแนบเนื้อหาไฟล์ 600 ตัวอักษรแรกมาด้วย พร้อมคำแนะนำตรงๆ ว่า “Copy old_string exactly from the content above” — ให้โมเดลเห็นเนื้อหาจริงและคัดลอกให้ตรงในรอบถัดไป แทนที่จะเดาใหม่แบบไม่มีข้อมูลอ้างอิง
เขียนแบบ atomic เหมือน write_file
ใช้กลไกเดียวกัน: เขียนลง .tmp ก่อนแล้ว os.replace ทีเดียว — ป้องกันไฟล์เสียหายครึ่งๆ กลางๆ ถ้าเกิดปัญหาระหว่างเขียน และมี hint แนะนำให้ตรวจสอบด้วย python3 <path> เมื่อแก้ไฟล์ .py เหมือนกับ write_file
ทำไมเรื่องนี้ถึงสำคัญ
edit แสดงการแก้ปัญหาจริงที่พบบ่อยเวลาให้ AI แก้ไฟล์ด้วยวิธี find-and-replace: whitespace mismatch เล็กน้อยที่ไม่ควรทำให้การแก้ไขทั้งหมดล้มเหลว — แทนที่จะบังคับให้โมเดล copy ตัวอักษรทุกตัวรวมช่องว่างให้ตรงเป๊ะ (ยากและเปราะบาง) หรือผ่อนปรนจนกำกวม (เสี่ยงแก้ผิดจุด) ระบบเลือกทางกลาง: ลองแบบเข้มงวดก่อน ถ้าพลาดเพราะ whitespace ให้ลอง normalize แล้วยัง map กลับไปแก้เนื้อหาต้นฉบับจริงเสมอ
ความคิดเห็น
กำลังโหลดความคิดเห็น...