Quá khứ, khi các Kỹ sư Điện có thể không cần viết một dòng mã nào đã qua. Việc biết cách lập trình đã trở thành một kỹ năng bắt buộc, cần thiết cho mọi loại kỹ sư. Mặc dù các kỹ sư không cần phải hiểu cách viết một ứng dụng web đầy đủ, nhưng việc họ có kỹ năng lập trình cơ bản là quan trọng. Việc thực hiện phân tích trên các bộ dữ liệu lớn, ví dụ, đòi hỏi một số kiến thức về lập trình. Đối với những nhiệm vụ phức tạp hơn, các kỹ sư có thể tự mình gặp khó khăn, đôi khi mất hàng giờ tìm kiếm trực tuyến cho một chức năng hoặc giải pháp cụ thể. Với sự ra đời của ChatGPT, thế giới, không nghi ngờ gì, đã thay đổi và cảnh quan cho việc tạo mã tự động cũng vậy. Các kỹ sư không có nền tảng vững chắc giờ đây có thể viết mã chất lượng cao với sự giúp đỡ của Trí tuệ AI Sinh sản.
Trong các bài viết trước như Sử dụng ChatGPT cho Lập trình Altium và Sử dụng ChatGPT cho Kiểm thử Tự động, chúng tôi đã xem xét cách tận dụng Trí tuệ AI Sinh sản, cụ thể là ChatGPT, để viết mã cho chúng tôi. Cho đến nay, Google Bard (đối thủ của ChatGPT) đã tụt hậu nhưng một mô hình mới, Gemini, đã quảng cáo rằng nó vượt trội so với đối thủ của mình trên thang đo Hiểu biết Ngôn ngữ Đa nhiệm Khổng lồ (MMLU):
Hình 1: Chỉ số hiệu suất MMLU của Gemini. Nguồn: https://deepmind.google/technologies/gemini/#capabilities
Trong bài viết này, chúng ta sẽ so sánh động cơ thông minh nhất của ChatGPT, GPT4, với Gemini Advanced (trước đây được biết đến với tên Ultra), động cơ AI tiên tiến nhất của Google, để xem động cơ nào tốt hơn trong việc tạo mã lệnh.
Việc thực hiện một so sánh toàn diện giữa hai động cơ sẽ rất thách thức. Trong bài viết này, chúng ta sẽ xem xét hai động cơ này tạo mã boilerplate bằng Python như thế nào (vì đây là một trong những ngôn ngữ được hỗ trợ nhiều nhất cho việc viết mã LLMs). Điều này không phải là một khoa học chính xác vì tốt so với xấu có thể rất chủ quan. Thay vào đó, chúng ta sẽ đánh giá mỗi động cơ dựa trên việc mã có chạy được không và hiểu chỉ dẫn của chúng ta như thế nào.
Để bắt đầu, hãy xem xét một nhiệm vụ kịch bản rất đơn giản:
Phát triển một kịch bản tự động hóa Python, khi được cung cấp đường dẫn tuyệt đối đến một thư mục, truy xuất siêu dữ liệu của từng tệp một cách đệ quy dưới dạng một đối tượng từ điển. In từng đối tượng từ điển từng dòng một và bao gồm đường dẫn tuyệt đối.Hãy phân tích đoạn mã trả về từ GPT4 trước:
import os def get_file_metadata(directory): for foldername, subfolders, filenames in os.walk(directory): for filename in filenames: filepath = os.path.join(foldername, filename) metadata = { 'filename': filename, 'path': filepath, 'size': os.path.getsize(filepath), 'last_modified': os.path.getmtime(filepath) } print(metadata) get_file_metadata(os.path.dirname(os.path.abspath(__file__))) |
Đoạn mã này ngắn gọn, hoạt động tốt và hoàn thành nhiệm vụ. Tôi sẽ chấp nhận nó. Đây cũng là một nhiệm vụ cực kỳ đơn giản nhưng không sao cả.
Giờ hãy xem đoạn mã trả về từ Gemini Advanced:
import os def get_file_metadata(file_path): metadata = {} try: stat = os.stat(file_path) metadata['name'] = os.path.basename(file_path) metadata['size'] = stat.st_size # Kích thước tính bằng byte metadata['modified_time'] = stat.st_mtime # Thời gian chỉnh sửa cuối cùng metadata['accessed_time'] = stat.st_atime # Thời gian truy cập cuối cùng except OSError: print(f"Lỗi khi truy cập tệp: {file_path}") return metadata def retrieve_metadata_recursively(folder_path): for root, _, files in os.walk(folder_path): for file in files: file_path = os.path.join(root, file) metadata = get_file_metadata(file_path) if metadata: print(f"Đường dẫn tuyệt đối: {file_path}") # In đường dẫn tuyệt đối print(metadata) if __name__ == '__main__': retrieve_metadata_recursively(os.path.dirname(os.path.abspath(__file__))) |
Gemini có phần dài dòng hơn một chút, tuy nhiên, nó đã thêm một số xử lý lỗi mà, tôi nghĩ, là khá tốt. Nó hơi dài nhưng nó hoạt động nên chúng ta sẽ chấp nhận nó.
Đối với nhiệm vụ tiếp theo, tôi muốn xem cả hai engine hiểu ngôn ngữ đã cho như thế nào và tạo ra một parser dựa trên ngôn ngữ đó. Trong trường hợp này, chúng ta sẽ xây dựng một web scraper sử dụng yêu cầu sau:
Viết một script Python sử dụng BeautifulSoup hoặc Scrapy để lấy các tiêu đề tin tức hàng đầu từ 'https://news.ycombinator.com' và xuất chúng ra một đối tượng dictionary.
Đây là một đoạn mã nguồn trang từ 'https://news.ycombinator.com'. Sử dụng nó để xác định cách phân tích các thẻ.
Viết một script Python sử dụng BeautifulSoup hoặc Scrapy để lấy các tiêu đề tin tức hàng đầu từ 'https://news.ycombinator.com' và xuất chúng ra một đối tượng dictionary. Đây là một đoạn mã nguồn trang từ 'https://news.ycombinator.com'. Sử dụng nó để xác định cách phân tích các thẻ. <html lang="vi" op="news"><head><meta name="referrer" content="origin"><meta name="viewport" content="width=device-width, initial-scale=1.0"><link rel="stylesheet" type="text/css" href="news.css?J16btoAd8hqdkSoIdLSk"> |
Như bạn có thể thấy, tôi đã bao gồm một số HTML trong lời nhắc của mình. Lời nhắc thực tế của tôi bao gồm nhiều HTML hơn nhưng tôi đã cắt bớt nó cho bài viết này. Dưới đây là những gì GPT4 đã tạo ra:
import requests # URL của trang web cần thu thập dữ liệu # Gửi một yêu cầu GET đến URL # Phân tích nội dung HTML của trang sử dụng BeautifulSoup # Tìm tất cả các tiêu đề tin tức # Tạo từ điển để lưu trữ các tiêu đề, trong đó khóa là thứ tự và giá trị là nội dung tiêu đề # Lặp qua từng tiêu đề, trích xuất và lưu vào từ điển # Xuất từ điển |
Mã này hoạt động tốt và thực hiện đúng như mong đợi. Tôi hy vọng nó sẽ biết, một cách trực giác, rằng tôi muốn liên kết đến các bài viết nhưng tôi không nói rõ ràng nên tôi không thể dùng điều đó để đánh giá GPT4.
Đây là kết quả mà Gemini tạo ra:
import requests # Gửi một yêu cầu HTTP GET đến trang web Hacker News # Phân tích nội dung HTML sử dụng BeautifulSoup # Tìm tất cả các phần tử có class 'athing', chứa các bài báo # Tạo một từ điển trống để lưu trữ các tiêu đề # Lặp qua từng bài báo và trích xuất tiêu đề và URL # Tìm phần tử URL # Thêm tiêu đề và URL vào từ điển # In ra từ điển các tiêu đề |
Điều này cũng hoạt động và khá giống với kết quả của GPT4, nhưng đoạn mã này thực sự trích xuất URL. Điều đó tốt nhưng, lại một lần nữa, không phải là kỳ vọng. Trong thử thách này, tôi sẽ nói rằng chúng, cơ bản, giống nhau. Có lẽ Gemini nhận thêm một điểm vì khả năng đọc suy nghĩ.
Đối với nhiệm vụ này, tôi muốn tạo một ứng dụng web hiển thị biểu đồ cổ phiếu của một số mã khác nhau:
Tạo một ứng dụng web bằng Python hiển thị biểu đồ của các cổ phiếu sau: RIVN, TSLA, NKLA, FSR |
Nhiệm vụ này chắc chắn khó khăn hơn. Nó đòi hỏi một thành phần giao diện người dùng (tức là biểu đồ/hình ảnh) và thành phần phía sau (tức là truy xuất dữ liệu từ cơ sở dữ liệu cổ phiếu). Tôi đã tạo ra vô số ứng dụng với GPT4 và muốn xem Gemini đối đầu với nó như thế nào. Đây là những gì GPT4 đã tạo ra cho tôi:
từ flask import Flask, render_template_string app = Flask(__name__) @app.route('/') fig = go.Figure() for stock in stocks: graph_html = fig.to_html(full_html=False) return render_template_string(""" |
Hình 2: Ảnh chụp màn hình ứng dụng web được tạo bởi GPT4
Đơn giản, sạch sẽ và đi thẳng vào vấn đề. Không cầu kỳ nhưng hoàn thành tốt nhiệm vụ. Đây là những gì Gemini đã tạo ra cho tôi:
import flask app = flask.Flask(__name__) # Các ký hiệu cổ phiếu # Lấy dữ liệu cổ phiếu sử dụng yfinance @app.route('/') charts = [] return render_template('index.html', charts=charts) nếu __name__ == '__main__': |
Điều này cũng yêu cầu tôi tạo một tệp mới, index.html, trong một thư mục mới gọi là templates:
<!DOCTYPE html> |
Hình 3: Ảnh chụp màn hình của ứng dụng web được tạo bởi Gemini Advanced
Điều này quả thật tinh tế hơn, khi mà nó bao gồm một biểu đồ histogram và đã tách nội dung HTML ra thành một tệp mới. Một lần nữa, cả hai đều hoạt động, do đó, cả hai đều được đánh giá đạt.
Khi GPT4 mới ra mắt, mất một thời gian để hiểu cách “nhập liệu” cho nó một cách đúng đắn. Khi sử dụng Trí tuệ Nhân tạo Sinh sản để viết mã, các chi tiết rất quan trọng. Kết quả là, nhiều người trong chúng ta đã trở nên giỏi hơn trong việc trở thành “Kỹ sư Nhập liệu” trong năm qua. Thật không may, điều này có thể giới thiệu một số thiên vị khi so sánh GPT4 với các động cơ khác và tôi chấp nhận điều đó một cách tự nguyện. Tôi biết cách GPT4 “hoạt động” nhiều hơn là cách Gemini hoạt động. Cách tôi tạo ra các lệnh nhập liệu cho GPT4 có thể khác với những gì Gemini mong đợi. Dù vậy, tôi vẫn gặp phải một số vấn đề cơ bản với Gemini.
Một vấn đề phổ biến mà tôi gặp phải khi sử dụng Gemini để hiểu các hướng dẫn là trong việc tạo các bài kiểm thử đơn vị. Mục tiêu ban đầu của tôi là bao gồm việc kiểm thử đơn vị trong bài viết nhưng, vì cảm thấy quá thất vọng, tôi đã hoàn toàn từ bỏ Gemini vì nó không bao giờ tuân theo hướng dẫn. Ví dụ, tôi sẽ yêu cầu Gemini viết một bài kiểm thử đơn vị sử dụng Pytest và đóng gói nó trong một lớp. Thay vào đó, nó lại tạo ra bài kiểm thử sử dụng UnitTest, hoàn toàn bỏ qua yêu cầu của tôi, nhưng lại đóng gói mã trong một lớp. Tôi sẽ sửa lại và nó sẽ thừa nhận rằng nó đã vô tình sử dụng UnitTest thay vì Pytest. Sau đó, nó sẽ viết lại mã sử dụng Pytest nhưng quên mất việc đưa nó vào một lớp. Khi tôi yêu cầu nó sử dụng cấu trúc Mock, nó mặc định sử dụng mock của UnitTest thay vì Mock của Pytest. Đây là những điểm tinh tế nhưng quan trọng khi tương tác với Trí tuệ AI Sinh sản.
Hình 4: Gemini Advanced không tuân theo hướng dẫn
Việc khắc phục sự cố là một điểm đau khác. Động cơ suy luận của GPT4 đã chứng minh là khá mạnh mẽ khi gỡ lỗi các lỗi trong Python. Gemini... không mấy hiệu quả. Khi tôi yêu cầu nó sửa một số vấn đề, nó chỉ đơn giản cố gắng viết lại mã với việc thêm thụt lề hoặc đổi chỗ các biến... một phản hồi hoàn toàn vô dụng.
Đôi khi Gemini chỉ đơn giản là không hoạt động. Nó báo rằng không thể xử lý yêu cầu của tôi. Trong những trường hợp khác, nó bắt đầu bình luận về... cuộc bầu cử sắp tới?
Hình 5: Gemini Advanced bối rối về cuộc bầu cử sắp tới?
Nhìn chung, chất lượng của mã boilerplate được tạo ra từ Gemini khá cạnh tranh so với GPT4. Tuy nhiên, trải nghiệm và động cơ suy luận của nó còn nhiều điều cần mong đợi. May mắn cho Google, những phần đó là một phần của việc triển khai LLM chứ không phải chính LLM. Nói cách khác, LLM Gemini dường như, cơ bản, khá tốt và ngang hàng với GPT4 nhưng mã được viết xung quanh nó, được sử dụng trong trải nghiệm chat, cần được cải thiện. Theo thời gian, chúng ta có thể sẽ thấy Google lặp lại mã của họ và nâng cao trải nghiệm và động cơ suy luận đó.