ข้ามไปที่เนื้อหา
cd /blog

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

[AI Agents] [Hallucination] [Retrieval] [MCP]

> เอเจนต์เขียนโค้ด 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) คำตอบที่มีหลักฐานกลับมาพร้อมเส้นทางไฟล์และหมายเลขบรรทัด เพื่อให้คุณประเมินมันเทียบกับต้นไม้ที่อยู่ตรงหน้าคุณ

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

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

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

  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.

อ่านเพิ่มเติมที่เกี่ยวข้อง

เนื้อหาอื่นๆ จากบันทึกการพัฒนา Maguyva

การให้บริบทรีโพขนาดใหญ่แก่เอเจนต์ AI โดยไม่ต้องใช้ตัวสร้างดัชนีในเครื่อง_

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

[AI Agents] [MCP] [Indexing] [Monorepos]

แผนที่ก่อน ตรวจสอบทีหลัง_

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

[Ecosystem] [Workflow] [Code Review]