How I Made AI Stop Hallucinating on Our Codebase
Các công cụ lập trình AI thường thất bại trong các dự án thực tế (production). Chúng hoạt động tốt với mã nguồn mới, nhưng lại trở nên hỗn loạn với những mã nguồn cũ đã có lịch sử phát triển.
Dự án fintech của chúng tôi đã có ba năm lịch sử. Nó bao gồm hai frontend React, một bảng điều khiển admin và một backend FastAPI. Cơ sở dữ liệu rất phức tạp với nhiều bảng và các phép join nặng.
Chúng tôi đã cố gắng sử dụng AI để đẩy nhanh tiến độ. Nhưng thất bại.
Tôi yêu cầu AI tạo một bảng contacts. Nó đã tạo ra các cột mới cho tên và email. Nó không nhận ra rằng chúng tôi đã có sẵn những thông tin này trong bảng users. Nó đã nhân bản dữ liệu thay vì sử dụng khóa ngoại (foreign key).
AI không hề ngốc. Nó chỉ là không có ngữ cảnh. Nó đã đưa ra quyết định dựa trên thông tin không đầy đủ.
Tôi ngừng hỏi làm thế nào để có mã nguồn tốt hơn. Thay vào đó, tôi bắt đầu hỏi xem AI cần ngữ cảnh gì để đưa ra những quyết định đúng đắn.
Chúng tôi đã xây dựng một quy trình làm việc có cấu trúc. AI chỉ tốt khi ngữ cảnh bạn cung cấp cho nó đủ tốt. Chúng tôi đã làm cho ngữ cảnh đó trở nên rõ ràng.
Đây là thiết lập của chúng tôi:
- Thư mục ADR: Chúng tôi tạo một thư mục cho các Bản ghi Quyết định Kiến trúc (Architecture Decision Records). Các tệp này giải thích lý do tại sao chúng tôi đưa ra các lựa chọn cụ thể. Một tệp hướng dẫn AI phải kiểm tra các bảng hiện có trước khi tạo bảng mới, đồng thời cấm việc nhân bản dữ liệu người dùng.
- context.md: Tệp này giải thích các thuật ngữ cụ thể của chúng tôi. Nó cho AI biết các từ ngữ đặc thù của chúng tôi liên quan đến nhau như thế nào.
- plot.md: Tệp này cung cấp một bản đồ tổng quan về dự án và cách các thành phần kết nối với nhau.
- Kiểm thử bắt buộc (Mandatory Tests): Mọi route API mới đều yêu cầu các trường hợp kiểm thử (test cases).
Điều này đã thay đổi mọi thứ. Có một lần, AI đã thay đổi một hàm tiện ích (utility function) dùng chung. Thay đổi đó đã làm hỏng tám phần khác của hệ thống. Bộ kiểm thử (test suite) đã phát hiện ra ngay lập tức. AI nhận thấy lỗi và tự sửa sai bằng cách tạo ra một phiên bản có thể xử lý cả yêu cầu cũ và mới.
Nếu không có kiểm thử, lỗi đó đã lọt vào môi trường production.
Hãy đối xử với AI như một lập trình viên mới. Bạn không thể trách một nhân viên mới vì họ không biết codebase của bạn. Bạn cần cung cấp tài liệu và quy trình hướng dẫn (onboarding). Chúng tôi cũng làm điều tương tự với AI.
Cấu trúc của chúng tôi:
- docs/context.md: Các thuật ngữ và mối liên kết trong dự án.
- docs/plot.md: Bản đồ tổng quan của codebase.
- docs/adr/: Các quy tắc cụ thể như tạo bảng và cấu trúc API.
Ba quy tắc dành cho đội ngũ của bạn:
- Hãy cụ thể trong các ADR. Sử dụng các chỉ dẫn rõ ràng thay vì những lời khuyên mơ hồ.
- Hãy biến tài liệu thành nguồn chuẩn mực. Hãy nói với AI rằng những quy tắc này phải được ưu tiên hàng đầu.
- Biến sai lầm thành quy tắc. Mỗi khi AI thất bại, hãy viết một ADR mới.
Hệ thống này không làm cho AI trở nên hoàn hảo. Nó làm cho AI trở nên có thể dự đoán được. Chúng tôi muốn một codebase mà ở đó AI hoạt động nhất quán để đội ngũ có thể tiến triển nhanh hơn.
