# Tại sao coding agent AI của bạn bị ảo giác đường dẫn file

Canonical source: https://maguyva.ai/vi/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

> Các coding agent AI bịa ra đường dẫn file khi chúng không có bản đồ thực sự của repo. Đây là lý do tại sao điều đó xảy ra, và cách đặt nền tảng dẫn đến ít thay đổi bị ảo giác hơn.

Dấu hiệu không phải là một phần thân function sai. Đó là một thay đổi tự tin vào một file không tồn tại, hoặc vào một file tồn tại nhưng không phải là file triển khai hành vi.

Bạn đã yêu cầu sửa việc hết hạn phiên. Agent đã mở `src/auth/session.ts`. Đường dẫn đó hợp lý. Nó cũng sai. Handler thực sự sống trong `apps/api/src/middleware/expiry.ts`, được đổi tên hai lần tái cấu trúc trước. Agent không nói dối bạn. Nó đã hoàn thành một chuỗi có hình dạng đường dẫn dựa trên các tiền đề huấn luyện cộng với bất cứ thứ gì đã có sẵn trong cửa sổ ngữ cảnh.

Đây là mô hình thất bại phổ biến trên một repository thực sự. Model biết viết code. Sai lầm là ở việc chọn sai nơi để viết nó.

## Tại sao agent bịa ra đường dẫn

Một coding agent là một model dự đoán token tiếp theo có công cụ. Khi bạn nói 'sửa việc hết hạn phiên', nó phải đặt tên một file trước khi có thể đọc hoặc vá bất cứ thứ gì. Nếu nó chưa có một bản đồ có căn cứ, nó xây dựng một đường dẫn từ:

1. Các quy ước đặt tên mà nó đã thấy trong các repository khác. `src/auth/session.ts` là một hình dạng phổ biến.
2. Các file đã có trong cuộc hội thoại, có thể là những file bạn đã dán tuần trước, không phải những file quan trọng bây giờ.
3. Các danh sách thư mục mà nó tình cờ chạy, không đầy đủ trên một cây lớn.
4. Các file hướng dẫn. `CLAUDE.md` và `AGENTS.md` cho agent biết cách hành xử. Chúng không phải là một chỉ mục sống của các symbol, người gọi, hoặc các đường dẫn hiện tại.

Không nguồn nào trong số này là một bản đồ của repo này, hôm nay. Model lấp đầy khoảng trống theo cùng cách nó lấp đầy bất kỳ khoảng trống nào: bằng một sự tiếp nối có xác suất cao. Sự tiếp nối đó thường trông giống như một đường dẫn thật. Đôi khi file tồn tại và nằm cạnh file đúng. Đôi khi nó tồn tại trên một branch đã được merge tháng trước. Đôi khi nó chưa bao giờ tồn tại.

Grep không cứu bạn ở đây nếu agent không bao giờ tìm kiếm đúng chuỗi. Agent đã đoán một đường dẫn, sau đó đọc những gì đường dẫn đó trả về, sau đó chỉnh sửa nó. Bước sai đầu tiên là đường dẫn, không phải bản vá.

Đọc file cũng không giống với việc tìm đúng file. Claude Code, Cursor, Codex, và các công cụ tương tự có thể mở bất cứ thứ gì bạn chỉ chúng vào. Câu hỏi là liệu chúng có tìm thấy một cách đáng tin cậy các file đúng, các symbol quan trọng, các phụ thuộc, các test, và phạm vi ảnh hưởng trước khi chỉnh sửa hay không. Việc truy cập file mà không có bản đồ vẫn bắt đầu bằng một sự đoán mò.

## Chỉnh sửa sai file là một vấn đề truy xuất

Hãy coi đường dẫn bịa ra như một sai sót truy xuất, không phải là một khiếm khuyết về tính cách.

Nếu agent phải trả về `path/file.ext:line` trước khi được phép chỉnh sửa, hai điều sẽ xảy ra. Thứ nhất, bạn có thể mở trích dẫn và từ chối công việc đó trong mười giây. Thứ hai, agent sẽ phải truy vấn thứ gì đó thực sự biết cây.

Đó là công việc của một lớp ngữ cảnh codebase. Chỉ tìm kiếm ngữ nghĩa thôi là không đủ. Một đoạn 'nghe giống việc hết hạn phiên' vẫn có thể hạ cánh trong một package đã lỗi thời. Bạn cũng cần văn bản chính xác khi bạn biết chuỗi, tìm kiếm symbol khi bạn biết tên, tìm kiếm cấu trúc khi bạn biết hình dạng, và một đồ thị phụ thuộc khi bạn cần người gọi và phạm vi ảnh hưởng.

Maguyva là lớp đó cho các coding agent tương thích MCP. Đó không phải là một editor. Claude Code, Cursor, Codex CLI, VS Code, Windsurf, và các client MCP khác vẫn ở nguyên vị trí của chúng. Agent truy vấn một bản đồ được xếp hạng trước khi chạm vào một dòng.

Tuyên bố này cố ý khiêm tốn: ít thay đổi bị ảo giác hơn. Maguyva không lấy đi khả năng đoán của model. Nó thay đổi bước đầu tiên mặc định từ 'bịa ra một đường dẫn hợp lý' thành 'yêu cầu các vị trí được xếp hạng, được trích dẫn'.

## Một câu trả lời có căn cứ trông như thế nào

Một câu trả lời hữu ích cho câu hỏi 'việc hết hạn phiên được xử lý ở đâu' không phải là một đoạn văn. Đó là một danh sách ngắn các vị trí:

- `apps/api/src/middleware/expiry.ts:48` - handler
- `apps/web/src/lib/auth-client.ts:112` - người gọi
- `apps/api/tests/expiry.test.ts:20` - test sẽ thất bại nếu thay đổi sai

Bạn có thể mở những dòng này. Nếu chúng sai, bạn dừng lại. Nếu chúng đúng, agent có thể chỉnh sửa. Việc xác minh mới là điều quan trọng, không phải một khẩu hiệu.

Maguyva cung cấp 11 công cụ MCP hướng tới khách hàng trên khắp tìm kiếm, symbol, phân tích phụ thuộc, truy xuất file, ngữ cảnh repository, và các quy trình công cụ tiện ích tất định. Bốn chế độ truy xuất (ngữ nghĩa, cấu trúc, đồ thị/phụ thuộc, và văn bản) được hợp nhất thành kết quả được xếp hạng; tìm kiếm symbol là một công cụ MCP riêng biệt (`find_symbol`). Các câu trả lời có căn cứ trở về kèm đường dẫn file và số dòng, để bạn có thể đánh giá chúng so với cây trước mặt bạn.

[Tài liệu](/vi/docs) mô tả con đường ngắn nhất: bắt đầu miễn phí, lập chỉ mục một repo mà bạn đã biết, kết nối client, sau đó đặt một câu hỏi bạn có thể xác minh.

## Một vòng lặp thay đổi lần chỉnh sửa đầu tiên

Bạn không cần một tôn giáo quy trình làm việc mới. Bạn cần thêm một bước trước lần viết đầu tiên.

1. Đặt một câu hỏi bạn đã có thể đánh giá. 'Code nào xử lý đăng nhập và hết hạn phiên?' tốt hơn 'sửa auth'.
2. Yêu cầu trích dẫn. Đường dẫn file và số dòng, không phải một bản tóm tắt của 'module auth'.
3. Mở các file được trích dẫn. Theo dõi symbol. Xác nhận phụ thuộc mà bạn sắp chạm vào.
4. Chỉ khi đó mới để agent vá lỗi.

Nếu bước 2 không trả về bất cứ điều gì hữu ích, agent không có quyền tự ứng biến một đường dẫn. Nó tìm kiếm lại, hoặc bạn chỉ cho nó. Chính cánh cổng duy nhất đó tạo ra ít thay đổi bị ảo giác hơn. Model vẫn là model đó. Bản đồ là thứ đã thay đổi.

Các file hướng dẫn vẫn quan trọng. Giữ chúng. Sử dụng chúng cho các quy ước, quy tắc xem xét, và những gì không nên chạm vào. Đừng yêu cầu chúng trở thành chỉ mục. Một `CLAUDE.md` liệt kê ba thư mục quan trọng sẽ lỗi thời một tuần sau khi tách package. Một bản đồ có thể truy vấn được cập nhật khi repo được cập nhật.

Một thất bại liên quan là file gần đúng: agent mở `auth.ts` trong khi hành vi sống trong `auth-client.ts`, hoặc vá một file được tạo ra thay vì nguồn, hoặc chỉnh sửa bản sao trong `packages/legacy` vì tên khớp. Trích dẫn không làm cho những lỗi này trở nên bất khả thi. Chúng làm cho những lỗi này trở nên rõ ràng trước khi diff hạ cánh.

## Những gì một bản đồ sẽ không sửa cho bạn

Hãy tỉnh táo về những gì bạn đang nhận được. Một bản đồ có căn cứ sẽ không làm cho mọi thay đổi đều đúng — agent của bạn vẫn có thể viết một bản vá tồi ngay trong file hoàn toàn đúng. Nếu codebase của bạn dựa vào dispatch động, reflection, hoặc monkey-patching, một số tìm kiếm symbol sẽ trả về kết quả mỏng hơn bạn mong muốn, vì đó là điều mà tính gián tiếp thời gian chạy làm với bất kỳ chỉ mục tĩnh nào. Và nếu bạn hy vọng vào một tỷ lệ phần trăm — 'đường dẫn bị ảo giác giảm X%' — bạn sẽ không tìm thấy nó ở đây, vì không ai có thể đo lường trung thực con số đó cho repo của bạn ngoài chính bạn.

Những gì bạn có thể mong đợi hẹp hơn và hữu ích hơn: agent ngừng bắt đầu các thay đổi của nó bằng một đường dẫn được đoán. Bước đầu tiên đó trở nên có căn cứ trong một bản đồ thực sự, và đó là nơi ít thay đổi bị ảo giác hơn đến từ. Mọi thứ sau trích dẫn — đọc diff, đánh giá bản vá — vẫn là công việc của bạn, giống như nó luôn từng như vậy.

Bài kiểm tra này gần như không tốn kém gì của bạn: lập chỉ mục một repo mà bạn đã biết và đặt một câu hỏi bạn có thể xác minh. Bắt đầu với một đường dẫn mà bạn đã từng bị 'bỏng'. Nếu các trích dẫn sai, bạn sẽ thấy ngay lập tức. Nếu chúng đúng, thay đổi tiếp theo của agent bạn có một nơi tốt hơn để hạ cánh.

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