Chúng ta đều đã nghe tới ChatGPT rất nhiều trong thời gian gần đây. ChatGPT gây ấn tượng về sự mới mẻ, hấp dẫn với nhiều người. Xuất hiện nhiều suy nghĩ về những tiềm năng của ChatGPT, liệu nó có thể thay thế những công việc truyền thống, và thậm chí là thay thế cho cả “lập trình viên”.
Trước khi trả lời cho câu hỏi trên, chúng ta sẽ tìm hiểu một chút về ChatGPT là gì? ChatGPT Hoạt động như thế nào?
ChatGPT là một AI Chatbot được phát triển bởi OpenAI. Tuy nhiên những kỹ thuật được sử dụng không phải là mới (LeCun). Phần lớn các kỹ thuật đó đã được phát triển và sử dụng từ lâu bởi nhiều nhóm lab khác nhau. Điểm hay ở đây là chúng được kết hợp với nhau một cách rất tốt.
Cách thiết kế của ChatGPT khiến chúng ta ấn tượng khi nó đưa ra những câu trả lời thoạt nhìn rất hấp dẫn và thú vị. Nó có thể làm thơ, viết một đoạn văn marketing, đưa ra code prototype, thậm chí ngồi debug cùng bạn. Nhìn qua sẽ rất ấn tượng, nhưng nếu đi sâu vào chi tiết, có thể tìm thấy một số lỗi. OpenAI đã cảnh báo rằng “ChatGPT có thể tạo ra thông tin không chính xác” và “có hiểu biết hạn chế về thế giới và các sự kiện sau 2021”.
Nếu các bạn vẫn chưa rõ hay chưa có cơ hội trải nghiệm thì có thể đọc qua bài viết này từ StackOverflow. Việc sử dụng ChatGPT để trả lời các câu hỏi trên StackOverflow bị cấm hoàn toàn trên nền tảng này. Lý do được đưa ra là vì “Độ chính xác trong các câu trả lời của ChatGPT rất thấp, qua đó gây ảnh hưởng nghiêm trọng đến nội dung của StackOverflow. Các câu trả lời này thoạt nhìn có vẻ rất tốt, rất dễ tạo ra nhưng lại kém chính xác. Những người đăng thì lại thường không kiểm tra lại tính chính xác của câu trả lời”.
Tới đây ta đặt ra một câu hỏi: Nếu như ngay cả những câu hỏi trên StackOverflow (vốn đã được đơn giản hóa chi tiết) mà ChatGPT còn trả lời kém chính xác thì lấy gì để thay thế được công việc hàng ngày của môt lập trình viên?
OpenAI đã thuê hơn 1000 người để đánh nhãn data, trong đó có 40% là lập trình viên, chuyên tạo dữ liệu cho các model traning để học về các công việc của software engineer. OpenAI cũng có một sản phẩm gọi là Codex, dùng để chuyển đổi ngôn ngữ tự nhiên qua “code”.
Tuy nhiên đối với một lập trình viên, code là phần việc chỉ chiếm 1 tỉ trọng nhỏ trong 8h làm việc mỗi ngày. Chúng ta phải họp để thảo luận về business, lên plan cho sprint, cần trao đổi với Product Owner để clear về requirement, deal với sếp về deadline, viết tài liệu, thiết kế chương trình, đôi khi còn phải trả lời khách hàng. Những senior/staff engineer còn cần đối mặt với những vấn đề về con người hay thậm chí là politic. Đôi khi một dòng requirement không rõ ràng cũng đủ gây ra tranh cãi.
Ngoài ra, ChatGPT cũng có thể đưa ra những thông tin định kiến và sai lệch. Piantadosi, một giáo sư tại đại học Berkeley yêu cầu ChatGPT đưa ra một đoạn code để phân loại những nhà khoa học xuất sắc, ChatGPT đưa ra kết quả là một người đàn ông da trắng (source: twitter)! ChatGPT tiềm ẩn rất nhiều những thông tin như thế, do đó chúng ta phải luôn kiểm tra lại tính chính xác và độ tin cậy.
Khi thử nghiệm thì cho thấy ChatGPT sẽ đạt hiệu quả cao nhất khi nội dung câu hỏi được mô tả một cách rõ ràng và không quá phức tạp. Mặc dù kết quả có thể không chính xác, tuy nhiên ChatGPT cũng sẽ cung cấp những keyword quan trọng có liên quan tới chủ đề. Tuy nhiên cũng cần chú ý khi cung cấp thông tin cho ChatGPT. Mới nhất Amazon đã cảnh báo nhân viên của mình không được chia sẻ các thông tin mật cho ChatGPT khi họ nhận thấy có những câu trả lời mà nội dung khá sát với tài liệu nội bộ của công ty. Việc dùng ChatGPT để review code cũng sẽ leak những đoạn mã nguồn của công ty ra ngoài.
Nhìn chung thì ChatGPT sẽ là một công cụ hữu ích cho bất kỳ ai. Nhưng để có thể thay thế được công việc của một lập trình viên trong tương lai gần thì có lẽ là không. Nhưng trong thời đại mới, chúng ta cần liên tục trao dồi kỹ năng của mình, để sử dụng những công cụ này một cách hiệu quả mang lại lợi ích cao nhất.
Còn bạn nghĩ sao về ChatGPT, hãy để lại suy nghĩ của bạn ở phần comment ngay phía dưới nhé.
(by lpv)
📻News
Google triển khai Bard, cạnh tranh với ChatGPT
Google cũng đang thử nghiệm một chatbot có tên là “Apprentice Bard”, một ứng dụng nơi bạn có thể đặt câu hỏi và nhận về câu trả lời tương tự như ChatGPT.
The technology behind GitHub’s new code search
Cùng tìm hiểu cách xây dựng search index tại GitHub.
📰Những bài viết hay
GPT Architecture
(by ChatGPT 100%)
Bài viết này trình bày về kiến trúc của GPT, một mô hình ngôn ngữ được huấn luyện bằng dữ liệu lớn bởi OpenAI. Nội dung bài viết mô tả các chi tiết về cấu trúc của GPT, bao gồm các tầng mạng neural, cách sử dụng các tầng attention và cách tính toán các đầu ra. Bài viết còn trình bày về cách GPT học từ dữ liệu và cách sử dụng dữ liệu để tạo ra các trả lời về nhiều chủ đề khác nhau. Nó còn giải thích các ưu điểm và nhược điểm của kiến trúc GPT và cách nó so sánh với các mô hình ngôn ngữ khác. Mời các bạn cùng đọc tại đây.
Improving Firefox stability with this one weird trick
(by nhij)
Một trong những nguyên nhân phổ biến khiến Firefox trên Windows của người dùng bị crash là tình trạng hết bộ nhớ. Tình trạng này phổ biến hơn trên Windows so với các hệ điều hành khác do Windows có cách cấp phát vùng nhớ khác với các hệ điều hành khác. Vấn đề này khó để giải quyết triệt để nhưng các kỹ sư tại Firefox đã tận dụng một cơ chế của Windows để cải thiện vấn đề này. Khi một ứng dụng yêu cầu cấp phát bộ nhớ trong tình trạng hết bộ nhớ, thay vì buộc thoát ứng dụng, Windows thông báo cho ứng dụng việc cấp phát không thành công và để ứng dụng quyết định cách xử lý. Do đó, thay vì thoát ngay Firefox khi không thể cấp phát bộ nhớ, họ đã điều chỉnh để ứng dụng thử cấp phát lại bộ nhớ trước khi buộc phải thoát ứng dụng. Cải thiện này đã giúp Firefox trên Windows giảm tới hơn 70% tỉ lệ crash, tốt hơn nhiều so với họ dự tính, và đánh đổi với việc tăng tình trạng tab crashes. Mời các bạn cùng đọc tại đây.
Optimized Reads and Optimized Writes Improve Amazon RDS Performances for MySQL Compatible Engines
(by quangle)
AWS vừa giới thiệu những tính năng giúp cải thiện hiệu suất truy vấn, đáp ứng khả năng write high-throughput cho các database như MySQL, MariaDB, v.v chạy trên RDS.
RDS Optimized Reads: tính năng giúp xử lý truy vấn nhanh hơn, di chuyển các bảng tạm của MySQL sang vùng lưu trữ cục bộ NVMe-based SSD, giúp các truy vấn như sort, hash aggregations, high-load joins, CTE, v.v có thể thực thi nhanh hơn tới 50%. Tính năng mới đã được công bố trong sự kiện re:Invent hỗ trợ RDS cho MySQL phiên bản 8.0.28 trở lên và hiện cũng có sẵn đối với RDS cho MariaDB.
RDS Optimized Writes: tính năng giúp cải thiện thông lượng cao của việc ghi (write high-throughput) mà không tính thêm phí với cùng mức IOPS được cung cấp, hỗ trợ xử lý được nhiều transaction concurrency điển hình như các hệ thống: digital payments, financial trading, v.v. Tính năng này hiện chỉ khả dụng trên các phiên bản M5d, R5d, M6gd và R6gd, hỗ trợ RDS cho MySQL 8.0.30 trở lên.
Để tìm hiểu chi tiết về các tính năng mới này, mời bạn đọc cùng tham khảo bài viết sau đây: https://www.infoq.com/news/2023/01/aws-rds-optimized-reads-writes/.
👨💻Góc lập trình
(by ndaadn and phucnh)
Đề ra tuần này: Minimum Add to Make Parentheses Valid
Ta định nghĩa một chuỗi dấu ngoặc đơn là hợp lệ khi và chỉ khi:
Chuỗi là rỗng.
Chuỗi gồm các hoặc đơn nối tiếp nhau như "()()", hoặc lồng nhau như "(())".
Cho một chuỗi dấu ngoặc đơn, tại mỗi thời điểm, bạn được thêm một dấu mở hoặc đóng ngoặc vào bất kỳ vị trị nào trong chuỗi.
Hãy tìm số lần thêm nhỏ nhất để tạo thành chuỗi ngoặc đơn hợp lệ.
Ví dụ:
Inputs = "())"
Output = 1
Ta cần thêm ít nhất 1 dấu "(" để tạo thành chuỗi hợp lệ "(())", hoặc "()()".
Lời giải tuần trước: Find Unique Binary String
Để tìm chuỗi nhị phân không xuất hiện trong mảng đầu vào nums, ta có thể duyệt toàn bộ những số nhị phân trong khoảng 0 <= num < 2^n. Nếu số đang duyệt không xuất hiện trong mảng nums, ta trả lại kết quả. Thuật toán được thực hiện như sau:
class Solution {
public String findDifferentBinaryString(String[] nums) {
Set<Integer> seen = new HashSet<>();
int n = nums.length;
for (int i = 0; i < n; i++) {
int num = Integer.parseInt(nums[i], 2);
seen.add(num);
}
int limit = (int) Math.pow(2, n);
for (int num = 0; num < limit; num++) {
if (!seen.contains(num)) {
return paddingZeros(Integer.toBinaryString(num), n);
}
}
return "";
}
String paddingZeros(String str, int n) {
StringBuilder sb = new StringBuilder(str);
while (sb.length() < n) {
sb.insert(0, "0");
}
return sb.toString();
}
}
Độ phức tạp về thời gian có vẻ là O(2^n) với n là độ dài của chuỗi nhị phân. Tuy nhiên, với điều kiện đề bài: chuỗi nhị phân có độ dài n, mảng nums chỉ chứa n phần tử, và 1 <= n <= 16, ta có thể nhanh chóng tìm ra kết quả.
Với số n khá nhỏ, ta cũng có thể sinh ra một số bất kỳ trong khoảng 0 <= num < 2^n. Với n = 16, tỉ lệ chọn phải số nằm trong mảng nums chỉ là 16 / 2^16 * 100 = 0.025%.
Một cách tiếp cận thú vị khác để giải bài này là sử dụng đường chéo Cantor. Ta nhận thấy mảng nums tạo thành một ma trận vuông, vì vậy, để tìm chuỗi có độ dài n không thuộc mảng nums, ta chỉ cần chọn số thứ i khác với số tương ứng trên đường chéo.
Ví dụ, cho mảng nums = ["001", "110", "111"], ta có ma trận:
0, 0, 1
1, 1, 0
1, 1, 1
Áp dụng hướng tiếp cận đường chéo Cantor, ta có số cần tìm là "100". Cách thực hiện của giải thuật như sau:
class Solution {
public String findDifferentBinaryString(String[] nums) {
StringBuilder ans = new StringBuilder();
for (int i = 0; i < nums.length; i++) {
ans.append(nums[i].charAt(i) == '0' ? '1' : '0');
}
return ans.toString();
}
}
🛠️Code & Tools
Ontrack: A simple self-hosted budgeting app.
GUN: GUN is an ecosystem of tools that let you build community run and encrypted applications - like an Open Source Firebase or a Decentralized Dropbox.
Quotes
Fear keeps us focused on the past or worried about the future. If we can acknowledge our fear, we can realize that right now we are okay. Right now, today, we are still alive, and our bodies are working marvelously. Our eyes can still see the beautiful sky. Our ears can still hear the voices of our loved ones.
Thich Nhat Hanh
Hello :)
Abc