GitHub Copilot: Công cụ tự động viết code bằng trí tuệ nhân tạo
Gần đây, Github và OpenAI đã phát hành một trong những công cụ dựa trên AI được mong chờ nhất dành cho các nhà phát triển – Github Copilot. Công cụ Trí tuệ nhân tạo (AI) được quảng cáo như một trợ lý lập trình cặp (pair programming), làm được nhiều việc hơn các công cụ tự động điền code thông thường hiện có. Nhưng điều đó không có nghĩa là Copilot là một công cụ nhằm thay thế các nhà phát triển theo bất kỳ cách nào. Thay vào đó, công cụ này được sử dụng như một trợ lý có thể hỗ trợ nhiều phần “nhàm chán” và “lặp đi lặp lại” của lập trình và cho phép các lập trình viên tập trung xử lý các quy trình đòi hỏi tư duy và suy luận nhiều.
Điều quan trọng cần lưu ý là GitHub Copilot dựa trên một mô hình deep learning gần đây được OpenAI giới thiệu trong một bài báo có tên “Evaluating Large Language Models Trained on Code”. Bài báo nghiên cứu này giới thiệu Codex, một mô hình ngôn ngữ giống GPT được tinh chỉnh dựa trên mã nguồn công khai từ GitHub.
Các công cụ tạo code, như Copilot, có tiềm năng giúp hàng triệu nhà phát triển trên khắp thế giới. Nó có thể tăng tốc đáng kể quá trình phát triển bằng cách cung cấp các code soạn sẵn. Nó có thể giúp các nhà phát triển khi làm việc với các ngôn ngữ lập trình mới. Ngoài ra, còn cải thiện độ tin cậy của code bằng cách đề xuất các bài kiểm tra phù hợp với việc triển khai code và nhiều thứ khác nữa.
Tuy nhiên, vì Copilot dựa trên các mô hình ngôn ngữ lớn (LLM – large language models) được đào tạo trên kho dữ liệu rất lớn, nên nó không giống với các vấn đề mà các LLM tương tự đã chỉ ra. Trong bài này, chúng ta sẽ tìm hiểu một số đặc điểm chính của GitHub Copilot. Bắt đầu bằng cách xem xét Codex, mô hình deep learning hỗ trợ công cụ GitHub, nói về Copilot tốt như thế nào và nó được huấn luyện như thế nào. Sau đó, chúng ta sẽ thảo luận về một số mối quan tâm liên quan đến hệ thống, chẳng hạn như bản quyền. Nếu bạn đã sử dụng các công cụ tự động hoàn thành code như Tabnine, thì chắc bạn đã tưởng tượng được những gì Copilot có thể làm. Tuy nhiên, như chúng ta sẽ phân tích, và chứng mình rằng Copilot còn vượt xa hơn thế nữa.
Mô hình ngôn ngữ lớn (LLM) và Codex
Sự thành công gần đây của các mô hình ngôn ngữ lớn (LLM) như GPT và BERT dựa trên ba bước đệm:
- Những tiến bộ trong kiến trúc Mạng thần kinh (Neural Network) chẳng hạn như Transformer
- Tính khả dụng của các cơ sở dữ liệu văn bản lớn công khai như Wikipedia (chỉ riêng cơ sở dữ liệu này đã chứa 3 tỷ tokens)
- Những tiến bộ trong tính toán hiệu suất cao sử dụng phần cứng chuyên dụng như GPU.
Đây là những nền tảng cho phép mạng deep nơ-ron tạo ra cuộc cách mạng trong các ứng dụng NLP trong thập kỷ qua. Đặc biệt nhất là sự có sẵn của các cơ sở mã nguồn lớn như GitHub và GitLab cũng cho phép các phương pháp thể hiện những tiến bộ trong những ứng dụng NLP thách thức nhất – code synthesis.
Codex là một mô hình GPT chuyên biệt được huấn luyện về mã công khai và được thiết kế để tạo ra mã máy tính từ một ngữ cảnh nhất định. Một ví dụ rõ ràng là tạo một hàm Python từ một mô tả được viết bằng ngôn ngữ tự nhiên được gọi là docstring.
Để hiểu cách hoạt động của Codex, chúng ta cần tìm hiểu về Generative Pre-training Transformer (GPT), một nhóm mô hình ngôn ngữ do OpenAI phát triển.
Đầu tiên, mô hình ngôn ngữ chỉ đơn giản là một thuật toán machine learning học cách tạo văn bản bằng cách tối ưu hóa một tác vụ đơn giản được gọi là dự đoán từ tiếp theo. Ý tưởng là tìm hiểu dự đoán xác suất của một token nhất định từ ngữ cảnh của nó. Một số ví dụ bao gồm: dự đoán ký tự tiếp theo của một từ với những từ trước đó hoặc dự đoán từ tiếp theo của một câu với ngữ cảnh.
GPT là một nỗ lực để nghiên cứu cách các mô hình ngôn ngữ xác suất hoạt động trong các môi trường quy mô lớn. Để ngữ cảnh hóa, GPT-3, mô hình gần đây nhất của GPT, đã được đào tạo bằng cách sử dụng 5 trong số các bộ dữ liệu NLP lớn nhất hiện có trên internet: Common Crawl, WebText2, Books1, Books2 và Wikipedia. Về dung lượng, GPT-3 giữ kỷ lục về mô hình machine learning có tham số nhiều nhất cho đến nay. Phiên bản lớn nhất của nó chứa 175 tỷ tham số có thể học được. Để dễ hình dung con số này, thì mô hình ngôn ngữ lớn nhất trước GPT-3, là Microsoft’s Turing Natural Language Generation (T-NLG) chỉ có 17 Tỷ tham số có thể học được.
GTP-3 học các mối tương quan từ các văn bản của con người bằng cách dự đoán từ nào xuất hiện tiếp theo, với một vài từ làm đầu vào. Nó cũng tương tự như gợi ý từ trong mấy ứng dụng bàn phím trên điện thoại khi chúng ta nhắn tin.
Quan trọng nhất, những mối tương quan này tạo ra một biểu diễn văn bản nội bộ chặt chẽ cho phép GPT học các tác vụ khác nhau mà không cần phải đào tạo lại hệ thống từ đầu. Những công việc như vậy bao gồm Trả lời câu hỏi, Dịch thuật, Lập luận theo nhận thức chung, Đọc hiểu, và nhiều thứ khác nữa. Ví dụ, trong phần Trả lời câu hỏi, mô hình GPT được đánh giá dựa trên khả năng trả lời các câu hỏi về kiến thức thực tế. Bạn có thể kiểm tra ví dụ về một cặp (câu hỏi-câu trả lời) được trích xuất từ một trong các bộ dữ liệu được sử dụng để đánh giá mô hình GPT-3.
Câu hỏi: Chiến dịch Dodecanese trong Thế chiến II, một nỗ lực của lực lượng Đồng minh nhằm chiếm các đảo ở Biển Aegean là nguồn cảm hứng cho bộ phim về biệt kích nổi tiếng năm 1961 nào? Câu trả lời: Guns of Navarone
Quay lại Copilot. Để hiểu Copilot viết code tốt như thế nào, chúng ta cần hiểu cách đánh giá hiệu suất của Codex. Trong bài báo gốc, các nhà nghiên cứu OpenAI đã phát triển một giao thức đánh giá cho nhiệm vụ tạo các hàm Python từ docstrings được gọi là HumanEval: Hand-Written Evaluation Set. Các hàm này được đánh giá về tính đúng sai bằng cách sử dụng một số liệu gọi là pass@k. Ở đây, hệ thống được phép tạo ra k giải pháp cho một vấn đề cụ thể. Nếu bất kỳ giải pháp nào vượt qua bài kiểm tra của một câu hỏi cụ thể, thì vấn đề đó được coi là đã giải quyết xong.
Cơ sở dữ liệu đánh giá hoặc kiểm tra chứa 164 bài toán lập trình viết tay với các bài kiểm tra đơn vị tương ứng. Mỗi hàm chứa một chữ ký, một chuỗi tài liệu, một nội dung và trung bình là 7,7 bài kiểm tra đơn vị.
Các bài toán đánh giá HumanEval dựa trên khả năng hiểu ngôn ngữ, thuật toán và toán học đơn giản, với một số vấn đề có thể so sánh với các câu hỏi phỏng vấn phần mềm đơn giản. Trong trường hợp này, để giải quyết một bài kiểm tra cụ thể, mô hình được phép tạo ra nhiều mẫu và nếu bất kỳ mẫu nào trong số chúng vượt qua bài kiểm tra, thì bài kiểm tra đó được coi là đã giải quyết xong. Bạn có thể xem một số hàm ví dụ trong hình dưới. Để đánh giá, Codex nhận ngữ cảnh (chữ màu xanh) chứa tiêu đề hàm và chuỗi doc, và tạo ra giải pháp (màu vàng). Lưu ý rằng đối với hàm decode_cyclic (.), Codex nhận là đầu vào của hàm mã hóa.
Nếu Codex được phép tạo một chương trình giải pháp duy nhất (pass@1), thì nó có thể tạo ra các hàm chính xác cho 28,8% trong số 164 vấn đề lập trình trong HumanEval. Tuy nhiên, nếu Codex được phép tạo 100 giải pháp (vượt qua@100) cho mỗi vấn đề, nó có thể tạo ra các hàm chính xác đến 77,5%.
Giống như GPT-3, Codex cũng được đào tạo trên một tập dữ liệu rất lớn. Theo tài liệu gốc của Codex, dữ liệu đào tạo được thu thập vào tháng 5 năm 2020 từ 54 triệu kho phần mềm mã nguồn mở được lưu trữ trên GitHub. Từ các kho lưu trữ này, họ đã quản lý để trích xuất 179 GB file Python duy nhất dưới 1 MB. Các tệp này đã được chuyển qua giai đoạn lọc để loại bỏ code được tạo tự động và giới hạn độ dài dòng trung bình, dẫn đến tập dữ liệu cuối cùng có kích thước là 159 GB.
Rõ ràng là mặc dù GitHub Copilot mang lại rất nhiều sự nhiệt tình cho cộng đồng đang phát triển, nhưng nó không phải là một công cụ có thể thay thế các nhà phát triển theo bất kỳ trường hợp nào. Hơn nữa, ngay cả khi là một trợ lý lập trình cặp, việc tin tưởng quá nhiều vào code do Copilot tạo ra có thể khiến bạn đau đầu. Thật vậy, tài liệu nghiên cứu của Codex cho thấy có tồn tại một số lỗ hổng trong hệ thống. Do độ chính xác hiện tại của Copilot, nó không thể đưa ra giải pháp chính xác cho các vấn đề phức tạp hơn, do đó, tin tưởng quá nhiều vào code do Copilot tạo ra có thể không lý tưởng trong mọi tình huống.
Về khía cạnh bảo mật, sự ra mắt của GitHub Copilot đã làm dấy lên một số cuộc tranh luận rất quan trọng. Một trong những điều quan trọng nhất liên quan đến GIẤY PHÉP. Tóm lại, giấy phép mô tả cho người khác những gì họ có thể và không thể làm với code do bạn đã viết. Chúng ta đều biết rằng hầu hết các code có sẵn trên các nền tảng trực tuyến như GitHub đều có một số loại giấy phép.
Theo Github:
Bạn không có nghĩa vụ phải chọn giấy phép. Tuy nhiên, nếu không có giấy phép, luật bản quyền mặc định sẽ được áp dụng, có nghĩa là bạn giữ mọi quyền đối với mã nguồn của mình và không ai có thể sao chép, phân phối hoặc tạo ra các tác phẩm của họ từ sản phẩm của bạn
OpenAI và GitHub tuyên bố rằng hệ thống hỗ trợ Copilot đã được đào tạo trên các kho phần mềm công cộng được lưu trữ trên GitHub. Và đây là những mối quan tâm chính: làm thế nào GitHub có thể lấy tất cả mã nguồn công khai có sẵn trong nền tảng của họ và xây dựng một hệ thống sẽ được sử dụng cho mục đích thương mại?
Hơn nữa, làm sao mà tất cả các kho lưu trữ có giấy phép dựa trên GPL? Nó có thể là một vấn đề vì giấy phép GPL được coi là virus. Nói cách khác,
Bạn có thể sao chép, phân phối và sửa đổi phần mềm miễn là bạn theo dõi các thay đổi/ngày tháng trong tệp nguồn. Bất kỳ sửa đổi nào đối với hoặc phần mềm bao gồm (thông qua trình biên dịch) mã được cấp phép GPL cũng phải được cung cấp theo GPL cùng với hướng dẫn xây dựng và cài đặt – LGPL-V2.
Và
Giấy phép này chủ yếu được áp dụng cho các thư viện. Bạn có thể sao chép, phân phối và sửa đổi phần mềm miễn là các sửa đổi được mô tả và cấp phép miễn phí theo LGPL. Các tác phẩm (bao gồm các sửa đổi hoặc bất kỳ thứ gì được liên kết tĩnh với thư viện) chỉ có thể được phân phối lại theo LGPL, nhưng các ứng dụng sử dụng thư viện thì không cần – LGPL-V3.
Vì vậy, câu hỏi mà nhiều người đang đặt ra là: code được tạo ra bởi một mô hình ngôn ngữ, được đào tạo trên code được cấp phép GPL, cũng được phân phối dưới dạng GPL à? Nói cách khác, code do Copilot tạo ra có phải là sản phẩm của dữ liệu đào tạo mà nó đã sử dụng không? Đây là những câu hỏi mở có thể gây ra các tác động pháp lý.
Hơn nữa, Copilot bị báo cáo xuất thông tin cá nhân như khóa API. Đây là một mối quan tâm lớn và cũng mở ra một cuộc tranh luận liên quan đến việc các mô hình ngôn ngữ lớn này ghi nhớ dữ liệu đào tạo thay vì tạo ra nội dung mới như thế nào. Trên thực tế, GitHub đã thực hiện một nghiên cứu trong đó họ báo cáo rằng chỉ 0,1% sản phẩm do Copilot tạo ra có thể được coi là bản sao chép từ dữ liệu huấn luyện. Bạn có thể đọc thêm báo cáo tại đây để biết thêm chi tiết.
Về dữ liệu cá nhân, trang web GitHub Copilot cảnh báo người dùng về khả năng này. Thông tin cá nhân mà Copilot có thể xuất ra là hệ quả trực tiếp của dữ liệu đào tạo được sử dụng để xây dựng hệ thống. Vì Codex học từ hàng triệu code công khai, nên dễ dàng tưởng tượng rằng nhiều kho lưu trữ này không tuân theo các nguyên tắc bảo mật và cuối cùng để lại dữ liệu cá nhân như mật khẩu và khóa API không được bảo vệ.
Trên thực tế, việc huấn luyện code tổng hợp mạng nơ-ron sâu trên hàng triệu code công khai cũng cho thấy Copilot có thể viết code chất lượng cao tốt như thế nào. Mạng thần kinh là cổ máy luôn đói dữ liệu. Theo nghĩa này, nếu chúng ta giả định rằng hầu hết các kho được sử dụng để đào tạo Codex, không được viết bởi các lập trình viên có kinh nghiệm, những người quan tâm đến code chất lượng tốt và tuân theo các nguyên tắc bảo mật nghiêm ngặt, thì Copilot có thể dễ tạo ra các code kém chất lượng.
Để kết thúc, mình sẽ để lại cho các bạn chuỗi Tweeter hữu ích này mở rộng về nhiều vấn đề tiềm ẩn liên quan đến bản quyền và Copilot.
Kết luận
Tóm lại, GitHub Copilot chắc chắn là một ứng dụng đột phá của Mạng thần kinh sâu. Đây không phải là một hệ thống hoàn hảo, nhưng nó sẽ được cải thiện theo thời gian. Nhưng, lợi ích của Copilot, ngay cả trong giai đoạn BETA là không thể bàn cãi. Tuy nhiên, Copilot phụ thuộc quá nhiều vào đầu ra của nó, và mang lại một số kết quả không mong muốn. Theo một nghĩa nào đó, Copilot nhằm mục đích thay đổi bối cảnh lập trình. Với những tiến bộ của các công cụ như vậy, các lập trình viên sẽ thoải mái dành nhiều thời gian hơn cho các vấn đề đòi hỏi sự suy luận của con người trong khi quá trình phát triển đơn giản hơn sẽ được tự động hóa.
Ngoài ra, bạn cũng có thể tạo website đơn giản trong 15 phút bằng Github tại đây.