0

Series Prompt Engineering Thực chiến #3: Thuần hóa "Quái vật" Legacy Code – Kỹ thuật Phân mảnh và Đóng gói ngữ cảnh (XML Tags)

Chào bạn và anh em!

Giữ đúng lời hứa ở cuối Bài 2, hôm nay chúng ta sẽ giải quyết một trong những bài toán "đổ mồ hôi hột" nhất của dân làm Backend: Bảo trì và Refactor mã nguồn cũ (Legacy Code).

Hãy tưởng tượng bạn mới nhận việc, Leader vứt cho bạn một file PaymentController.php dài 5.000 dòng, được viết từ 6 năm trước bởi 4 đời coder khác nhau. Logic nạp tiền, trừ tiền, gửi email, ghi log... tất cả cuộn vào nhau thành một đống bùng nhùng (Spaghetti code).

Nếu bạn bấm Ctrl+A, copy toàn bộ 5.000 dòng đó ném vào AI và bảo: "Refactor đoạn code này cho tôi", kết quả bạn nhận được thường là một mớ code hỏng, thiếu logic, hoặc AI sẽ... bịa ra các hàm không hề tồn tại.

Tại sao lại như vậy? Và làm thế nào để "ép" AI nhai gọn đống code này?

1. Hiệu ứng "Lạc trôi giữa dòng" (Lost in the Middle)

Các nhà nghiên cứu AI đã phát hiện ra một đặc điểm rất thú vị của các Mô hình ngôn ngữ lớn (LLM): Chúng có trí nhớ hình chữ U.

Nghĩa là, nếu bạn đưa cho AI một văn bản quá dài, nó sẽ ghi nhớ rất tốt đoạn đầu (Đỉnh U bên trái) và đoạn cuối (Đỉnh U bên phải), nhưng nó sẽ quên sạch hoặc bỏ qua những chi tiết nằm ở đoạn giữa (Đáy U).

Khi bạn ném 5.000 dòng code vào, AI sẽ đọc rất kỹ các import thư viện ở trên cùng, và nhớ đoạn return response() ở dưới cùng, nhưng lại "ngó lơ" cái vòng lặp tính toán doanh thu cực kỳ quan trọng nằm ở dòng số 2.500.

2. Kỹ thuật Đóng gói ngữ cảnh (Sử dụng Thẻ XML)

Để trị căn bệnh "Lạc trôi", giới kỹ sư Prompting sử dụng một tuyệt kỹ gọi là XML Tagging (Đánh dấu bằng thẻ XML). Thay vì ném một đống chữ lộn xộn, bạn "đóng gói" từng phần thông tin vào các hộp riêng biệt. AI đặc biệt nhạy bén với cấu trúc thẻ này.

Prompt "Tay mơ":

Dưới đây là code cũ của tôi: [Paste 5.000 dòng code]. Hãy refactor nó, nhớ là không được đổi tên biến đầu vào và phải dùng Repository pattern nhé.

Prompt "Senior":

Hãy đóng vai một chuyên gia Refactor code.

<legacy_code>

[Paste 5.000 dòng code vào đây]
</legacy_code>

<business_rules>

  • Logic tính phí giao dịch (fee) tuyệt đối không được thay đổi.
  • Bắt buộc phải giữ nguyên tên các biến request đầu vào. </business_rules>

<instructions> Hãy đọc kỹ đoạn code trong thẻ <legacy_code>. Sau đó thực hiện:

  1. Tách các câu truy vấn Database ra một lớp Repository riêng.
  2. Đảm bảo tuân thủ các quy tắc trong thẻ <business_rules>. </instructions>

Sự khác biệt: Khi thấy các thẻ <...>, AI sẽ tự động phân bổ sự chú ý (Attention mechanism). Nó hiểu đâu là "dữ liệu thô", đâu là "luật lệ", và đâu là "mệnh lệnh". Sự nhầm lẫn giảm đi 90%.

3. Chiến thuật "Chia để trị" (Divide and Conquer)

Ngay cả khi dùng XML Tags, việc nhét quá nhiều thứ bắt AI xử lý trong một lần (One-shot) vẫn là quá sức. Nguyên tắc khi làm việc với Legacy Code là: Đừng bắt AI code ngay, hãy bắt nó phân tích trước.

Đây là quy trình Prompting theo chuỗi (Prompt Chaining) cực kỳ hiệu quả:

Bước 1: Chụp X-Quang (Mapping the Architecture)

"Dưới đây là file PaymentController.php. Đừng viết code vội. Hãy đọc và tóm tắt lại cho tôi toàn bộ luồng logic hiện tại dưới dạng danh sách (Bullet points). Liệt kê tất cả các External API (gọi ra ngoài) và Database Tables mà file này đang chạm vào."

Lợi ích: Bạn ép AI đọc qua một lượt và tự xác nhận lại logic với bạn. Nếu nó tóm tắt sai, bạn biết ngay là không nên cho nó đi tiếp.

Bước 2: Lên phương án (Planning)

"Dựa trên luồng logic bạn vừa phân tích, hãy đề xuất cho tôi một kiến trúc mới để tách file này ra thành 3 phần: Controller, Service, và Repository. Chỉ cần viết cấu trúc thư mục và tên hàm, chưa cần viết logic bên trong."

Bước 3: Thực thi từng phần (Execution)

"Bây giờ, hãy viết chi tiết mã nguồn cho class PaymentRepository trước. Nhớ áp dụng các quy tắc bảo mật chống SQL Injection."

Bằng cách bẻ gãy vấn đề, bạn hoàn toàn kiểm soát được chất lượng code sinh ra và giúp AI không bao giờ bị tràn bộ nhớ ngữ cảnh.

Tổng kết Bài 3

Để thuần hóa "quái vật" Legacy Code, bạn không thể dùng sức mạnh cơ bắp (nhồi nhét hết vào prompt). Bạn phải dùng chiến thuật:

  1. Tránh hiệu ứng Lost in the Middle bằng cách đưa lệnh quan trọng xuống cuối cùng.
  2. Sắp xếp thông tin rành mạch bằng Thẻ XML (<code_cu>, <luat>).
  3. Dẫn dắt AI qua 3 bước: Phân tích ➔ Lên khung kiến trúc ➔ Viết code từng phần.

Tới đây, bạn đã biết cách giao tiếp chuẩn mực, ép AI tư duy chậm, và xử lý được cả những khối dữ liệu khổng lồ.

Ở Bài 4, chúng ta sẽ đi vào một kỹ năng "hack" độ sáng tạo và độ sâu của AI: Kỹ thuật Cấy ghép Nhân cách (Persona Adoption) và System Prompt. Thay vì bắt AI làm một coder bình thường, bạn muốn nó hóa thân thành một Hacker Mũ Trắng chuyên đi tìm lỗ hổng bảo mật, hay một ông Giáo sư khoa học máy tính cực kỳ khó tính chuyên review code để dạy cho mình bài học?


All Rights Reserved

Viblo
Let's register a Viblo Account to get more interesting posts.