# ทำไมเอเจนต์เขียนโค้ด AI ของคุณจึงหลอนเส้นทางไฟล์

Canonical source: https://maguyva.ai/th/blog/why-ai-coding-agents-hallucinate-file-paths

License: text under [CC BY 4.0](https://creativecommons.org/licenses/by/4.0/); code samples under [MIT-0](https://opensource.org/license/mit-0); the Maguyva name, logos, brand assets and other code are not covered. Details: [maguyva.ai/license](https://maguyva.ai/license).

Date: 2026-08-14 · Author: Maguyva Team

> เอเจนต์เขียนโค้ด AI ประดิษฐ์เส้นทางไฟล์เมื่อพวกมันไม่มีแผนที่จริงของรีโพ นี่คือสาเหตุที่มันเกิดขึ้น และวิธีที่แผนที่ที่มีหลักฐานนำไปสู่การเปลี่ยนแปลงที่หลอนน้อยลง

สัญญาณไม่ใช่เนื้อหาฟังก์ชันที่ผิด มันคือการเปลี่ยนแปลงที่มั่นใจในไฟล์ที่ไม่มีอยู่จริง หรือในไฟล์ที่มีอยู่จริงแต่ไม่ใช่ไฟล์ที่อิมพลีเมนต์พฤติกรรมนั้น

คุณขอให้แก้ไขการหมดอายุของเซสชัน เอเจนต์เปิด `src/auth/session.ts` เส้นทางนั้นน่าเชื่อถือ มันก็ผิดด้วย ตัวจัดการจริงอาศัยอยู่ใน `apps/api/src/middleware/expiry.ts` ซึ่งถูกเปลี่ยนชื่อสองรอบการปรับโครงสร้างที่แล้ว เอเจนต์ไม่ได้โกหกคุณ มันกำลังเติมสตริงรูปร่างเหมือนเส้นทางให้สมบูรณ์ตามอคติจากการฝึกฝนบวกกับสิ่งใดก็ตามที่มีอยู่แล้วในหน้าต่างบริบท

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

## ทำไมเอเจนต์จึงประดิษฐ์เส้นทาง

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

1. ข้อตกลงการตั้งชื่อที่มันเคยเห็นในรีโพซิทอรีอื่น `src/auth/session.ts` เป็นรูปแบบที่พบบ่อย
2. ไฟล์ที่มีอยู่ในการสนทนาแล้ว ซึ่งอาจเป็นไฟล์ที่คุณวางไว้เมื่อสัปดาห์ที่แล้ว ไม่ใช่ไฟล์ที่สำคัญตอนนี้
3. รายการไดเรกทอรีที่มันรันโดยบังเอิญ ไม่สมบูรณ์บนต้นไม้ขนาดใหญ่
4. ไฟล์คำสั่ง `CLAUDE.md` และ `AGENTS.md` บอกเอเจนต์ว่าจะประพฤติตัวอย่างไร มันไม่ใช่ดัชนีที่มีชีวิตของสัญลักษณ์ ผู้เรียก หรือเส้นทางปัจจุบัน

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

Grep ไม่ช่วยคุณที่นี่หากเอเจนต์ไม่ได้ค้นหาสตริงที่ถูกต้องตั้งแต่แรก เอเจนต์เดาเส้นทาง จากนั้นอ่านสิ่งที่เส้นทางนั้นส่งคืน จากนั้นแก้ไขมัน ก้าวแรกที่ผิดคือเส้นทาง ไม่ใช่ patch

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

## การแก้ไขไฟล์ผิดคือปัญหาการดึงข้อมูล

คิดว่าเส้นทางที่ประดิษฐ์ขึ้นเป็นข้อผิดพลาดในการดึงข้อมูล ไม่ใช่ข้อบกพร่องทางบุคลิกภาพ

หากเอเจนต์ต้องส่งคืน `path/file.ext:line` ก่อนที่จะได้รับอนุญาตให้แก้ไข สองสิ่งจะเกิดขึ้น อย่างแรก คุณสามารถเปิดการอ้างอิงและปฏิเสธงานได้ภายในสิบวินาที อย่างที่สอง เอเจนต์ต้องสอบถามบางสิ่งที่รู้จักต้นไม้นั้นจริง ๆ

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

Maguyva คือชั้นนั้นสำหรับเอเจนต์เขียนโค้ดที่เข้ากันได้กับ MCP มันไม่ใช่ตัวแก้ไขโค้ด Claude Code, Cursor, Codex CLI, VS Code, Windsurf และไคลเอนต์ MCP อื่น ๆ ยังคงอยู่ในตำแหน่งของมัน เอเจนต์สอบถามแผนที่ที่มีการจัดอันดับก่อนที่จะแตะบรรทัดใด ๆ

สิ่งที่อ้างนั้นเรียบง่ายโดยตั้งใจ: การเปลี่ยนแปลงที่หลอนน้อยลง Maguyva ไม่ได้เอาความสามารถในการเดาไปจากโมเดล มันเปลี่ยนก้าวแรกเริ่มต้นจาก 'ประดิษฐ์เส้นทางที่น่าเชื่อถือ' เป็น 'ขอตำแหน่งที่จัดอันดับและอ้างอิงได้'

## คำตอบที่มีหลักฐานมีลักษณะอย่างไร

คำตอบที่มีประโยชน์สำหรับ 'การหมดอายุของเซสชันถูกจัดการที่ไหน' ไม่ใช่ย่อหน้าเดียว มันคือรายการตำแหน่งสั้น ๆ:

- `apps/api/src/middleware/expiry.ts:48` - ตัวจัดการ
- `apps/web/src/lib/auth-client.ts:112` - ผู้เรียก
- `apps/api/tests/expiry.test.ts:20` - การทดสอบที่จะล้มเหลวหากการเปลี่ยนแปลงนั้นผิด

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

Maguyva เปิดเผยเครื่องมือ MCP ที่เน้นลูกค้า 11 ตัวครอบคลุมการค้นหา สัญลักษณ์ การวิเคราะห์การพึ่งพา การดึงไฟล์ บริบทรีโพซิทอรีและเวิร์กโฟลว์เครื่องมืออรรถประโยชน์ที่กำหนดผลลัพธ์ได้แน่นอน โหมดการดึงข้อมูลสี่แบบ (เชิงความหมาย เชิงโครงสร้าง เชิงกราฟ/การพึ่งพา และข้อความ) รวมกันเป็นผลลัพธ์ที่มีการจัดอันดับ; การค้นหาสัญลักษณ์เป็นเครื่องมือ MCP แยกต่างหาก (`find_symbol`) คำตอบที่มีหลักฐานกลับมาพร้อมเส้นทางไฟล์และหมายเลขบรรทัด เพื่อให้คุณประเมินมันเทียบกับต้นไม้ที่อยู่ตรงหน้าคุณ

[เอกสารประกอบ](/th/docs) อธิบายเส้นทางที่สั้นที่สุด: เริ่มต้นฟรี จัดทำดัชนีรีโพที่คุณรู้จักอยู่แล้ว เชื่อมต่อไคลเอนต์ จากนั้นถามคำถามหนึ่งข้อที่คุณสามารถตรวจสอบได้

## วงจรที่เปลี่ยนการเปลี่ยนแปลงแรก

คุณไม่ต้องการศาสนาเวิร์กโฟลว์ใหม่ คุณต้องการก้าวเพิ่มเติมหนึ่งก้าวก่อนการเขียนครั้งแรก

1. ถามคำถามหนึ่งข้อที่คุณสามารถประเมินได้อยู่แล้ว 'โค้ดไหนจัดการล็อกอินและการหมดอายุของเซสชัน?' ดีกว่า 'แก้ไข auth'
2. เรียกร้องการอ้างอิง เส้นทางไฟล์และหมายเลขบรรทัด ไม่ใช่บทสรุปว่า 'โมดูล auth'
3. เปิดไฟล์ที่อ้างอิง ติดตามสัญลักษณ์ ยืนยันการพึ่งพาที่คุณกำลังจะแตะต้อง
4. ปล่อยให้เอเจนต์ patch หลังจากนั้นเท่านั้น

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

ไฟล์คำสั่งยังคงสำคัญ รักษามันไว้ ใช้สำหรับข้อตกลง กฎการตรวจสอบ และสิ่งที่ไม่ควรแตะต้อง อย่าขอให้มันเป็นดัชนี `CLAUDE.md` ที่แสดงรายการสามไดเรกทอรีสำคัญจะล้าสมัยหนึ่งสัปดาห์หลังจากการแบ่งแพ็กเกจ แผนที่ที่สอบถามได้จะอัปเดตเมื่อรีโพอัปเดต

ความล้มเหลวที่เกี่ยวข้องคือไฟล์เกือบถูกต้อง: เอเจนต์เปิด `auth.ts` ในขณะที่พฤติกรรมอาศัยอยู่ใน `auth-client.ts` หรือ patch ไฟล์ที่สร้างขึ้นแทนที่จะเป็นแหล่งที่มา หรือแก้ไขสำเนาใน `packages/legacy` เพราะชื่อตรงกัน การอ้างอิงไม่ได้ทำให้ข้อผิดพลาดเหล่านี้เป็นไปไม่ได้ มันทำให้มองเห็นได้ก่อนที่ diff จะลงจอด

## สิ่งที่แผนที่จะไม่แก้ไขให้คุณ

จงซื่อสัตย์เกี่ยวกับสิ่งที่คุณได้รับ แผนที่ที่มีหลักฐานจะไม่ทำให้ทุกการเปลี่ยนแปลงถูกต้อง — เอเจนต์ของคุณยังคงสามารถเขียน patch ที่แย่บนไฟล์ที่ถูกต้องเป๊ะได้ หากโค้ดเบสของคุณพึ่งพาการเรียกเมธอดแบบไดนามิก รีเฟลกชัน หรือการแพตช์โค้ดขณะรันไทม์ การค้นหาสัญลักษณ์บางอย่างจะให้ผลลัพธ์ที่บางกว่าที่คุณต้องการ เพราะนั่นคือสิ่งที่ความไม่ชัดเจนของรันไทม์ทำกับดัชนีแบบสแตติกใด ๆ และหากคุณคาดหวังเปอร์เซ็นต์ — 'เส้นทางที่หลอนลดลง X%' — คุณจะไม่พบมันที่นี่ เพราะไม่มีใครสามารถวัดตัวเลขนั้นได้อย่างซื่อสัตย์สำหรับรีโพของคุณนอกจากคุณเอง

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

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

`// it doesn't know the file. it knows how to find it.`
