Bỏ qua tới nội dung chính
Quay lại tin tức

Mã do AI viết có nhiều lỗi hơn mã do con người viết không?

Hacker News AI· raghavchamadiya· 9/6/2026general

URL bài viết: https://www.repowise.dev/blog/engineering/is-ai-written-code-buggier-than-human-code URL bình luận: https://news.ycombinator.com/item?id=48459397 Điểm: 2 Bình luận: 0

Blog/kỹ thuật Mã do AI viết có nhiều lỗi hơn mã do con người viết không? Chúng tôi đã phân tích 112.000 lượt commit để tìm hiểu Raghav Chamadiya · ngày 9/6/2026 · 11 phút đọc Chất lượng mã do AI viết, mã AI có nhiều lỗi hơn không, lỗi mã AI, lỗi mã tác nhân, dự đoán lỗi SZZ, chất lượng mã Claude Code Hãy hỏi mười kỹ sư xem mã do AI viết có nhiều lỗi hơn mã họ tự viết hay không, bạn sẽ nhận được mười câu trả lời tự tin, khoảng một nửa theo mỗi hướng, và không có câu trả lời nào được hỗ trợ bằng số liệu. Đây là một trong những câu hỏi mà mọi người đều có quan điểm riêng nhưng không ai có dữ liệu. Các ý kiến thường rất mạnh mẽ, nhưng các phép đo thì khan hiếm, và một vài phép đo hiện có thường là khảo sát về cảm nhận của mọi người về mã AI hơn là về những gì mã thực sự làm sau khi được hợp nhất. Vì vậy, chúng tôi đã đo lường theo cách mà lĩnh vực dự đoán lỗi đo lường mọi thứ khác: bằng cách quay lại lịch sử git của các dự án thực và gán trách nhiệm cho mỗi bản sửa lỗi cho lượt commit đã gây ra lỗi. Chúng tôi đã thực hiện điều này trên 28 kho lưu trữ công khai và 112.382 lượt commit trong năm đầu tiên các tác nhân mã hóa hợp nhất các yêu cầu kéo (pull request) thực tế, sau đó chúng tôi đặt một câu hỏi đơn giản cho dữ liệu. Khi một tác nhân viết lượt commit, liệu nó có khả năng gây ra lỗi hơn một lượt commit của con người trong cùng một cơ sở mã không? Phiên bản ngắn gọn: không. Thậm chí ngược lại. Và các dòng mã do tác nhân viết đã tồn tại lâu hơn các dòng mã do con người viết. Phiên bản dài hơn, với những cảnh báo khiến tôi thực sự tin vào điều đó, là phần còn lại của bài đăng này. "Mã tác nhân" thực sự có nghĩa là gì Vấn đề đầu tiên với câu hỏi này là "AI đã viết nó" không phải là một khái niệm duy nhất. Một kỹ sư cấp cao điều khiển Claude Code thông qua một quá trình tái cấu trúc cẩn thận và một bot tự động mở các yêu cầu kéo (PR) theo lịch trình đều là "mã AI", và việc gộp chúng lại sẽ che giấu bất kỳ tín hiệu nào tồn tại. Vì vậy, trước khi đo lường bất cứ điều gì, chúng tôi đã xây dựng một công cụ phát hiện nguồn gốc theo từng lượt commit, đọc tám tín hiệu khác nhau: danh tính tài khoản bot, địa chỉ email dịch vụ, phần chân trang tin nhắn commit, phần cuối của đồng tác giả và bằng chứng PR đã hợp nhất như tiền tố nhánh tác nhân và các dấu hiệu trong nội dung PR. Sau đó, chúng tôi đã xác thực mù, giao 124 lượt commit cho sáu người đánh giá độc lập, và kết quả đạt độ chính xác 96,2%, với sáu trong số tám kênh phát hiện hoàn hảo. Chế độ lỗi thực sự duy nhất, một người đẩy một lượt commit tiếp theo bên trong PR của tác nhân, sẽ bị giảm độ tin cậy để chúng tôi có thể lọc nó. Với nguồn gốc trong tay, chúng tôi đã chia các lượt commit của tác nhân thành ba cấp độ và, quan trọng là, không bao giờ gộp chúng lại: T1, tác nhân bot. Gần như tự động, không có sự can thiệp trực tiếp của con người. Ví dụ: Devin, tác nhân mã hóa Copilot, các tác nhân đám mây của Cursor. T2, tác nhân do con người điều khiển. Claude Code, Codex và các công cụ tương tự, nơi nhà phát triển đang điều khiển và xem xét trong quá trình thực hiện. Đây là phần lớn các lượt commit của tác nhân trong thực tế. T3, có sự hỗ trợ của AI. Một phần cuối của đồng tác giả và không nhiều hơn thế, sự can thiệp nhẹ nhất. Việc phân cấp đó hóa ra lại quan trọng, bởi vì các cấp độ hoạt động khác nhau, và bất kỳ phiên bản trung thực nào của câu chuyện này đều phải giữ chúng tách biệt. Cách bạn đo lường "lượt commit này gây ra lỗi" Công cụ tiêu chuẩn ở đây là SZZ, được đặt tên theo Śliwerski, Zimmermann và Zeller. Ý tưởng là cơ học: tìm các lượt commit sửa lỗi, sau đó sử dụng git blame để tìm lượt commit cuối cùng đã chạm vào các dòng đó, và gọi lượt commit trước đó là lượt commit đã gây ra lỗi. Thực hiện điều này trên toàn bộ kho lưu trữ và bạn sẽ có một tập dữ liệu được gắn nhãn gồm các lượt commit gây lỗi và không gây lỗi. Chúng tôi đã chạy SZZ trong từng kho lưu trữ, so sánh các cam kết của tác nhân (agent commits) với các cam kết của con người (human commits) trong cùng một cơ sở mã, nhằm kiểm soát yếu tố gây nhiễu rõ ràng là một số dự án có nhiều lỗi hơn các dự án khác. Sau đó, chúng tôi đã xây dựng một mô hình logistic với các dòng được thêm vào, các dòng bị xóa và các tệp bị ảnh hưởng làm biến kiểm soát, cộng với hiệu ứng cố định của kho lưu trữ. Do đó, mọi kết quả đều được hiểu là "rủi ro lỗi vượt quá những gì kích thước thay đổi đã giải thích". Việc kiểm soát kích thước này là bắt buộc. Yếu tố dự đoán mạnh nhất về việc một cam kết có gây ra lỗi hay không là kích thước của cam kết đó. Nếu bỏ qua yếu tố kiểm soát này, chúng ta chủ yếu sẽ đo lường liệu các tác nhân viết các bản vá lỗi lớn hơn hay nhỏ hơn so với con người. Có một yếu tố kỷ luật nữa đã tạo nên sự khác biệt giữa một kết quả đáng tin cậy và một kết quả mang tính tâng bốc. SZZ đơn giản có một sự thiên vị cố hữu ủng hộ các tác nhân ở đây. Nó loại trừ các cam kết sửa lỗi khỏi việc được tính là nguyên nhân gây lỗi, và các tác nhân thực hiện một lượng sửa lỗi không cân xứng, do đó phương pháp đơn giản này đã âm thầm bảo vệ chúng. Để phát hiện điều đó, chúng tôi đã chạy một biến thể nghiêm ngặt hơn (B-SZZ) như một kiểm tra độ nhạy bắt buộc trên mọi kết quả. Nếu một phát hiện chỉ xuất hiện dưới biến thể thân thiện và biến mất dưới biến thể nghiêm ngặt, thì nó không có thật. Tôi sẽ cho bạn biết chính xác ranh giới đó nằm ở đâu dưới đây. Tiêu đề: Các cam kết của tác nhân không gây ra nhiều lỗi hơn. Đây là kết quả cốt lõi, tỷ lệ cược đã điều chỉnh của một cam kết gây ra lỗi, theo cấp độ tác giả, so với các cam kết của con người trong cùng một kho lưu trữ. Dưới 1,0 có nghĩa là ít lỗi hơn so với mức cơ bản của con người. Tỷ lệ cược đã điều chỉnh của việc gây ra lỗi theo cấp độ tác giả, được kiểm soát theo kích thước thay đổi và sự thay đổi. Mọi cấp độ đều nằm ở hoặc dưới mức của con người. Các tác nhân do con người điều khiển (T2) có tỷ lệ cược là 0,57, với khoảng tin cậy 95% từ 0,42 đến 0,76, do đó toàn bộ khoảng này nằm dưới 1,0. Các tác nhân bot (T1) ở mức 0,75 [0,43, 0,95]. Cấp độ hỗ trợ ít can thiệp nhất (T3) ở mức 0,96 [0,69, 1,08], gần như không thể phân biệt được với con người, chính xác là điều bạn mong đợi từ các cam kết chủ yếu do con người tạo ra. Bây giờ là phần trung thực. Theo biến thể B-SZZ nghiêm ngặt, hiệu ứng T2 giảm dần về mức không: nó chuyển sang 0,79 với khoảng [0,68, 1,01] chỉ chạm mức 1,0. Vì vậy, tôi sẽ không ủng hộ tuyên bố mạnh mẽ rằng các tác nhân "ít gây lỗi hơn 43%". Điều tôi sẽ ủng hộ, bởi vì nó đúng với mọi biến thể và mọi cấp độ chúng tôi đã thử nghiệm, là tuyên bố yếu hơn và bền vững hơn: không có bằng chứng nào cho thấy các cam kết của tác nhân gây ra nhiều lỗi hơn các cam kết của con người trong cùng một kho lưu trữ, và các ước tính điểm luôn mang tính bảo vệ, không bao giờ tệ hơn.

Nguồn tin: Hacker News AI — Tác giả: raghavchamadiya. Bản dịch tiếng Việt do AI thực hiện, có thể có sai sót.