- Meta đã công bố Code Llama, mô hình chuyên biệt cho mã nguồn dựa trên Llama 2, được cung cấp miễn phí cho mục đích nghiên cứu và thương mại, đồng thời áp dụng cùng giấy phép cộng đồng
- Code Llama nhận cả prompt mã nguồn lẫn ngôn ngữ tự nhiên để hỗ trợ tạo mã, hoàn thiện mã và gỡ lỗi, đồng thời xử lý Python, C++, Java, PHP, TypeScript, C#, Bash và nhiều ngôn ngữ khác
- Các kích thước mô hình gồm 7B, 13B, 34B, 70B; các mô hình nhỏ phù hợp hơn với độ trễ thấp, còn 34B và 70B hướng tới hỗ trợ lập trình tốt hơn
- Có bản mô hình cơ sở, mô hình chuyên cho Python và biến thể Instruct tối ưu cho việc hiểu chỉ dẫn ngôn ngữ tự nhiên; Meta khuyến nghị dùng Instruct cho tác vụ tạo mã thực tế
- Trong đánh giá nội bộ, Code Llama 34B đạt HumanEval 53.7% và MBPP 56.2%; đây là cách tiếp cận nhằm thúc đẩy cộng đồng đánh giá và cải thiện điểm yếu thông qua mô hình mã nguồn mở công khai
Cách phát hành và bản cập nhật 70B
- Meta đã công bố Code Llama, một mô hình ngôn ngữ lớn có thể tạo mã từ prompt văn bản
- Code Llama hướng tới hiệu năng hàng đầu trong nhóm LLM cho mã có thể sử dụng công khai, tập trung vào việc giúp quy trình làm việc của lập trình viên nhanh hơn và hiệu quả hơn, đồng thời hạ thấp rào cản tiếp cận cho người học lập trình
- Mô hình được cung cấp miễn phí cho nghiên cứu và sử dụng thương mại, phát hành theo giấy phép cộng đồng giống Llama 2
- Trong bản cập nhật ngày 29/1/2024, Meta đã bổ sung Code Llama 70B, phiên bản lớn nhất và có hiệu năng tốt nhất trong họ Code Llama
- CodeLlama - 70B: mô hình mã cơ sở
- CodeLlama - 70B - Python: mô hình 70B chuyên cho Python
- Code Llama - 70B - Instruct: mô hình 70B được tinh chỉnh để hiểu chỉ dẫn ngôn ngữ tự nhiên
Mô hình tối ưu Llama 2 cho tác vụ mã nguồn
- Code Llama là phiên bản chuyên cho mã của Llama 2, được huấn luyện bổ sung trên tập dữ liệu chuyên về mã
- Mô hình nhận cả mã và prompt ngôn ngữ tự nhiên làm đầu vào để phục vụ nhiều tác vụ lập trình khác nhau
- tạo mã
- sinh ngôn ngữ tự nhiên về mã
- hoàn thiện mã
- gỡ lỗi
- Ví dụ prompt là yêu cầu ngôn ngữ tự nhiên như “hãy viết một hàm in ra dãy Fibonacci”
- Các ngôn ngữ được hỗ trợ gồm Python, C++, Java, PHP, TypeScript(JavaScript), C#, Bash
Kích thước mô hình, dữ liệu huấn luyện và lựa chọn độ trễ
- Code Llama có các kích thước tham số 7B, 13B, 34B, 70B
- Trừ 70B, các mô hình được huấn luyện trên 500B token dữ liệu mã và dữ liệu liên quan đến mã; riêng 70B được huấn luyện trên 1T token
- Các mô hình cơ sở và Instruct ở bản 7B và 13B được huấn luyện với tính năng fill-in-the-middle(FIM) để có thể chèn mã mới vào giữa đoạn mã hiện có
- hỗ trợ các tác vụ như hoàn thiện mã tức thì
- Mỗi kích thước mô hình có đặc điểm khác nhau về chi phí phục vụ và độ trễ
- mô hình 7B có thể được phục vụ trên một GPU đơn
- 34B và 70B cho kết quả tốt nhất và hỗ trợ lập trình tốt hơn
- 7B và 13B nhanh hơn nên phù hợp hơn với các tác vụ cần độ trễ thấp như hoàn thiện mã theo thời gian thực
- Các mô hình Code Llama cung cấp khả năng sinh ổn định với ngữ cảnh tối đa 100.000 token
- tất cả các mô hình được huấn luyện với chuỗi 16.000 token
- cho thấy cải thiện với đầu vào tối đa 100.000 token
- Chuỗi đầu vào dài không chỉ hữu ích cho việc tạo chương trình dài mà còn giúp truyền nhiều ngữ cảnh hơn của codebase vào mô hình để tăng mức độ liên quan của kết quả sinh
- Khi gỡ lỗi codebase lớn, có thể khó nắm được toàn bộ phần mã liên quan đến một vấn đề cụ thể, vì vậy lập trình viên có thể đưa cả các khối mã lớn vào mô hình
Ba biến thể: cơ sở, Python và Instruct
- Dòng Code Llama ngoài mô hình cơ sở còn bao gồm mô hình chuyên cho Python và biến thể Instruct
- Code Llama - Python là mô hình chuyên ngôn ngữ được tinh chỉnh bổ sung trên 100B token mã Python
- Python là ngôn ngữ được benchmark nhiều nhất trong các tác vụ tạo mã
- Python và PyTorch giữ vai trò quan trọng trong cộng đồng AI
- Code Llama - Instruct là biến thể đã trải qua tinh chỉnh theo chỉ dẫn và căn chỉnh
- tiếp tục được huấn luyện bằng đầu vào chỉ dẫn ngôn ngữ tự nhiên và đầu ra mong đợi
- được thiết kế để hiểu tốt hơn kết quả mà con người mong đợi từ prompt
- Meta khuyến nghị dùng Code Llama - Instruct cho việc tạo mã thực tế
- vì mô hình này được tinh chỉnh để tạo ra câu trả lời hữu ích và an toàn bằng ngôn ngữ tự nhiên
- Code Llama và Code Llama - Python không được khuyến nghị cho các tác vụ ngôn ngữ tự nhiên thông thường
- hai mô hình này không được thiết kế để làm theo chỉ dẫn ngôn ngữ tự nhiên
- Code Llama dành cho các tác vụ chuyên về mã và không phù hợp làm mô hình nền cho các tác vụ khác
- Người dùng phải tuân theo giấy phép và chính sách sử dụng được phép
Benchmark và đánh giá an toàn
- Meta sử dụng các benchmark HumanEval và MBPP để đánh giá hiệu năng của Code Llama
- Trong benchmark nội bộ, Code Llama cho hiệu năng tốt hơn các LLM mã nguồn mở chuyên cho mã và cả Llama 2
- Code Llama 34B đạt HumanEval 53.7% và MBPP 56.2%
- đây là mức điểm cao nhất so với các giải pháp công khai tiên tiến khác
- được đánh giá ở mức tương đương ChatGPT
- Trước khi công bố, nhiều biện pháp an toàn đã được áp dụng và trong quá trình red team, Meta đã định lượng rủi ro sinh mã độc
- tạo các prompt yêu cầu mã độc với chủ đích rõ ràng
- chấm điểm bằng cách so sánh phản hồi của Code Llama với phản hồi của ChatGPT(GPT3.5 Turbo)
- kết quả cho thấy Code Llama đưa ra phản hồi an toàn hơn
- Chi tiết red team từ các chuyên gia trong các lĩnh vực AI có trách nhiệm, kỹ thuật bảo mật tấn công, phát triển mã độc và kỹ thuật phần mềm có thể xem trong bài báo nghiên cứu
Tài liệu công khai và sử dụng có trách nhiệm
- Các nhà phát triển đã sử dụng LLM cho nhiều tác vụ khác nhau, từ viết phần mềm mới đến gỡ lỗi mã hiện có
- Code Llama hướng tới việc làm cho quy trình làm việc của lập trình viên hiệu quả hơn để họ có thể tập trung vào những công việc mang tính con người hơn thay vì các tác vụ lặp lại
- Meta cho rằng LLM cho lập trình có thể hưởng lợi lớn từ cách tiếp cận mở cả về đổi mới lẫn an toàn
- Mô hình chuyên cho mã được công khai cho phép cộng đồng đánh giá năng lực mô hình, tìm vấn đề và sửa các điểm yếu
- Công thức huấn luyện của Code Llama được công bố trong kho GitHub
- Trọng số mô hình được cung cấp trên trang Llama
- Bài báo nghiên cứu bao gồm chi tiết phát triển, cách thực hiện benchmark, giới hạn, các thách thức đã biết, biện pháp giảm thiểu và các hướng nghiên cứu tiếp theo
- Responsible Use Guide cũng đã được cập nhật để cung cấp hướng dẫn phát triển các mô hình downstream một cách có trách nhiệm
- định nghĩa chính sách nội dung và biện pháp giảm thiểu
- chuẩn bị dữ liệu
- tinh chỉnh mô hình
- đánh giá và cải thiện hiệu năng
- ứng phó rủi ro ở mức đầu vào và đầu ra
- xây dựng tính minh bạch và cơ chế báo cáo trong tương tác người dùng
- Nhà phát triển nên đánh giá mô hình bằng các benchmark chuyên cho mã và thực hiện nghiên cứu an toàn cho các trường hợp sử dụng như sinh mã độc, virus máy tính và mã có mục đích xấu
- Meta cũng khuyến nghị dùng các bộ dữ liệu an toàn cho đánh giá tự động và đánh giá bởi con người, cũng như red team dựa trên prompt đối kháng
Bước tiếp theo và tài liệu tham khảo
- Code Llama được thiết kế để hỗ trợ các kỹ sư phần mềm ở nhiều lĩnh vực như nghiên cứu, công nghiệp, dự án mã nguồn mở, NGO và doanh nghiệp
- Vẫn còn nhiều trường hợp sử dụng vượt ra ngoài những gì mô hình cơ sở và mô hình Instruct hiện có thể cung cấp
- Meta kỳ vọng Code Llama sẽ trở thành động lực để những người khác tận dụng Llama 2 xây dựng các công cụ mới cho nghiên cứu và sản phẩm thương mại
- Tài liệu liên quan
1 bình luận
Ý kiến trên Hacker News
Có thể chạy gần như ngay lập tức với llama.cpp, nên dễ thử nghiệm cục bộ: https://github.com/ggerganov/llama.cpp/issues/2766
Thử chạy CodeLlama-7b-Python với lượng tử hóa q4_0, với prompt Python “in ra 10 số nguyên tố đầu tiên”, nó tạo ra đoạn mã khá hợp lý, gồm cả
print_primes,is_prime,mainSẽ rất thú vị xem các mô hình lớn hơn sẽ cho kết quả ra sao, đặc biệt sau khi được cộng đồng tinh chỉnh và có ngữ cảnh/prompt tốt hơn
Trong
primes_upto(limit: int), đánh dấu hợp số bằng mảng boolean, rồi dùngitertools.isliceđể chỉ in 10 số đầu tiên thì sẽ ra2 3 5 7 11 13 17 19 23 29print("1, 2, 3, 5, 7, 11... and so on!Llama2 cũng đã ra hơn một tháng trước, nhưng tôi vẫn chờ quyền truy cập suốt mấy tuần nay; mô hình này cũng đi qua cùng một biểu mẫu nên tôi không kỳ vọng lắm
Không biết họ nhận được bằng cách khác chăng
Tất nhiên đây gần như là vấn đề định nghĩa, và có thể có cộng đồng hoặc lĩnh vực xem 1 là số nguyên tố, nhưng khi dùng mô hình ngôn ngữ thì những sắc thái kiểu này lộ ra
¹) https://www.google.com/search?q=is+1+a+prime+number
Cá nhân tôi thấy điểm cốt lõi là việc cung cấp khả năng sinh ổn định trong ngữ cảnh lên tới 100.000 token
Tất cả các mô hình đều được huấn luyện với chuỗi 16.000 token, và được nói là có cải thiện ngay cả với đầu vào tối đa 100.000 token
Tuy nhiên đọc bài báo thì thấy độ chính xác truy xuất thông tin then chốt giảm mạnh sau 16k token, nên vẫn phải chờ xem ngữ cảnh 100k thực sự hữu ích đến mức nào
Bài báo có nhắc đến Unnatural Code Llama; ngoại trừ việc thua Code Llama Python một chút ở MBPP pass@100 và thua GPT-4 một chút ở HumanEval pass@1, nó áp đảo các mô hình/tinh chỉnh khác trên mọi benchmark
Meta chỉ nói rằng sau này họ sẽ không công bố mô hình này mà không giải thích, nên tôi tò mò vì sao họ không tung ra một mô hình trông ấn tượng như vậy
Chắc chắn không thể cứ dùng thẳng các tầng Transformer rộng 100k vì chi phí, vậy họ đã dùng thủ thuật nào?
Ngay cả mô hình 7B của Code Llama cũng có vẻ đủ sức cạnh tranh với Codex, mô hình đứng sau Copilot
https://ai.meta.com/blog/code-llama-large-language-model-cod...
GitHub cũng đã nhiều lần nói rằng họ đang chuyển sang hướng GPT-4 cùng với “Copilot X”[1][2]
[0] https://github.blog/2023-07-28-smarter-more-efficient-coding...
[1] https://github.com/features/preview/copilot-x
[2] https://github.blog/2023-07-20-github-copilot-chat-beta-now-...
Khi lập trình, tôi luôn mở 7B trong một tab terminal để hỏi kiểu “làm cái thứ ngẫu nhiên này thế nào?”, và cá nhân tôi thấy nó gần như đã thay thế Google/Stack Overflow
Code Llama Python rất thú vị vì được tinh chỉnh riêng cho Python
Tò mò liệu có thể tạo các LLM chuyên biệt cho từng lĩnh vực, như mô hình giỏi Rust nói chung, mô hình giỏi Linux nói chung, mô hình giỏi genomics nói chung, mô hình giỏi mô phỏng vật lý nói chung, rồi cho chúng trò chuyện với nhau để cùng giải quyết vấn đề hay không
Có vẻ sẽ là một tương lai khá điên rồ, nơi máy móc thực sự làm việc
Tuy nhiên nhiều khả năng là dùng vài mô hình lớn hơn là dùng nhiều mô hình nhỏ
Vài tháng trước đã có một thử nghiệm tương tự cho script Godot và được cho là khá tốt: https://github.com/minosvasilias/godot-dodo
Tôi nghĩ lý do chưa có nhiều thử nghiệm hơn là vì Llama gốc không giỏi lập trình lắm so với các điểm mạnh khác, còn những thứ như Starcoder thì tương đối bị lu mờ
Nếu chưa biết, bạn nên tìm thử Society of Mind
C đủ mức thấp, nhưng vào những khoảnh khắc hiếm hoi vẫn còn đọc được
Mô hình tốt nhất, Unnatural Code Llama, đã không được công bố
Có lẽ khả năng cao là vì nó được huấn luyện bằng dữ liệu dựa trên GPT-4, có thể vi phạm điều khoản sử dụng của OpenAI
Theo bài báo “Unnatural”[1], dữ liệu “unnatural” được tạo ra với sự trợ giúp của một LLM nào đó, và nếu có thể thì hẳn họ sẽ muốn dùng LLM tốt nhất
[1] https://arxiv.org/pdf/2212.09689.pdf
TheBloke không đùa được đâu[1]
Có vẻ các bản lượng tử hóa sẽ xuất hiện trong hôm nay, và tôi rất háo hức được thử mô hình 34B Python lượng tử hóa 4-bit có vẻ sẽ vừa khít trên 3090
[1] https://huggingface.co/TheBloke/CodeLlama-13B-Python-fp16
ollama run codellama:7b-instructhttps://ollama.ai/blog/run-code-llama-locally
Nhiều mô hình hơn vẫn đang được đưa lên: https://ollama.ai/library/codellama
Muốn chạy Code Llama cục bộ thì có thể tải xuống và chạy bản lượng tử hóa 7B tham số bằng công cụ mã nguồn mở Ollama: https://github.com/jmorganca/ollama
ollama run codellama "write a python function to add two numbers"Các mô hình dùng để hoàn thiện mã, mô hình Python và các mô hình với nhiều số lượng tham số khác nhau cũng sẽ sớm được bổ sung
Cửa sổ ngữ cảnh 100.000 token không tệ, nhưng tôi tò mò mô hình code tích hợp sẽ chọn ngữ cảnh nào khi xử lý codebase lớn hơn 100K token
Tôi cũng tự hỏi liệu việc biết các công cụ như vậy sẽ được dùng rộng rãi và ngày càng phụ thuộc nhiều hơn có tạo ra những điểm mới cần cân nhắc khi lập trình hay không
Liệu nên viết nhiều chú thích hơn hay ít hơn, nên viết mã ngắn hơn và khó đọc hơn để dùng ít token hơn, có cần thay đổi cấu trúc file hay quy ước đặt tên không; rốt cuộc, chúng ta phải thích nghi thế nào để tận dụng tối đa các công cụ này?
Có thể làm mã bớt phụ thuộc ngữ cảnh và rút gọn để dùng ít token hơn, nhưng như vậy sẽ khiến cả con người lẫn mô hình ngôn ngữ bối rối hơn
Ở mức cực đoan, nếu chỉ dùng hàm và biến một ký tự như
i,j,k, mô hình sẽ không suy luận được gì và sẽ tạo ra những thứ nhảm nhí ngẫu nhiênCách giải quyết là như ta vẫn làm khi quản lý độ phức tạp: phân rã công việc lớn thành các mô-đun hộp đen và API nhỏ hơn, che giấu phần triển khai tốn nhiều token và khiến nó không liên quan đến việc sử dụng
Nếu đưa cho LLM chữ ký hàm, mô tả tốt và vài ví dụ sử dụng, nó có thể dùng hàm đó mà không cần biết phần triển khai
Sự súc tích chỉ làm giảm khả năng xử lý mã của LLM chứ không giải quyết được vấn đề độ dài ngữ cảnh, và ngay cả trong trường hợp tốt nhất cũng không mở rộng được
100k token là đủ nhiều, nên không cần làm những việc như vậy
Có thể nén thông tin này theo cách dễ đưa cho LLM xem
Ví dụ, để sinh phần triển khai của một method trong lớp C++, có thể đưa cho LLM một phiên bản nén của các file header mà trình biên dịch sẽ thấy khi biên dịch lớp đó
Loại bỏ khoảng trắng và chú thích, rút gọn macro có thể tiết kiệm rất nhiều token
Các header của thư viện chuẩn có khả năng cao là LLM đã biết rõ trong quá trình tinh chỉnh, nên có thể bỏ qua
Một file C++ đã tiền xử lý thông thường, dù đã tối ưu ở mức nào đó, vẫn có thể chạm giới hạn 100K, nên chắc chắn cần middleware tinh lọc thêm trước khi chuyển cho LLM
Mô hình đưa ra suy luận và gợi ý tốt hơn
Với dữ liệu cũng tương tự: dữ liệu được gắn tag đúng cách và tên trường mang tính mô tả khiến câu trả lời của LLM hữu ích hơn nhiều
Tôi thầm hy vọng sự phổ biến của các công cụ này cuối cùng sẽ khiến đồng nghiệp lập trình viên chịu chú thích mã và ngừng dùng tên biến ba ký tự
Cách chọn file đưa vào GPT-4 là dựa trên embedding
Tôi lấy embedding của từng file và embedding tạo từ chỉ thị, rồi xử lý đơn giản để chọn các file có vẻ liên quan nhất
Không hoàn hảo, nhưng với codebase cỡ trung thì phần lớn là đủ, còn với codebase rất lớn thì không phù hợp
Vì triển khai này mà tôi bắt đầu làm file ngắn hơn và chuyển nội dung sang file khác
Các file hơn 1.000 dòng là gánh nặng lớn vì ăn hết cửa sổ ngữ cảnh; với cửa sổ 100k thì sẽ đỡ hơn, nhưng tôi nghĩ vốn dĩ vẫn nên giữ file ngắn
Cũng có những cách thông minh hơn như embedding từng hàm/lớp riêng lẻ thay vì cả file rồi chuyển vào, nên chắc sẽ sớm có ai đó làm ra thứ tốt hơn
Khả năng cao là gần như không cần thay đổi pattern lập trình chỉ để tận dụng AI
Trình tiền xử lý cho LLM có thể làm việc gộp mã đã tách thành một file lớn, rút gọn chú thích và loại bỏ khoảng trắng
Copilot đến nay hoạt động tốt, nhưng giao diện là một hạn chế
Nó có vẻ chỉ biết dự đoán đoạn văn bản tiếp theo
Tôi tò mò không biết ai đang làm một AI viết mã có thể đề xuất refactoring như “những dòng này bị lặp, nên tách ra thành hàm” hay “cấu trúc này nếu đổi như thế này sẽ dễ dùng hơn”
Trên Cody.dev có thể tạo embedding cho toàn bộ repository, nên có thể có ngữ cảnh lớn hơn nhiều về codebase và vấn đề cần giải quyết
Nhân tiện, tôi đã gia nhập Sourcegraph vài tuần trước
Tôi thấy hiện vẫn chưa có gì thật sự vững chắc
Chỉ cần highlight mã và yêu cầu; nó cũng hỗ trợ dùng Code Llama: https://continue.dev/docs/walkthroughs/codellama
IntelliJ IDEA đã sẵn sàng đề xuất cả hai ngay trên máy local
Nó có thể tìm các khối mã trùng lặp lớn và tự động refactor thành hàm, đồng thời cũng có nhiều inspection đề xuất refactoring để làm mã rõ ràng hơn
Lần cuối tôi nghe thì nó còn ở beta và hoạt động không tốt
Ngay cả trên trang ví dụ, brush “add types” cũng quá nghiêm ngặt vì
avàbbị đưa vào diện kiểm tranull, còn “fix simple bug” thì gần như chỉ là sửa lỗi gõ nhầmVới tư cách là người mới hoàn toàn chưa từng tự chạy các mô hình như thế này, tôi tò mò cần phần cứng gì
Tôi không tìm thấy rõ trong README
Ý tưởng có thể dùng các mô hình này mà không phải upload mã nguồn lên một công ty công nghệ lớn thật sự rất hấp dẫn
Chỉ cần cài app rồi chạy vài lệnh shell
Có lẽ mô hình này cũng sẽ sớm được cung cấp, và khi đó có thể dùng cùng extension Continue cho VS Code
Dù hơi chậm, nhưng swap có vẻ là một phương án thay thế đủ tốt ngay cả khi không có lượng RAM lớn cần thiết
Ollama nói cần 32GB để chạy mô hình 13B, nhưng tôi đang chạy mô hình
llama2:13btrên MBP 16GB7B thì gần như có thể chạy được trên cả một chiếc toaster thông minh
Nếu không, suy luận CPU bằng llama.cpp có lẽ sẽ chạy được trên hầu hết máy móc