Gemini so với ChatGPT: Ai Viết Mã Tốt Hơn?

Ari Mahpour
|  Created: Tháng Ba 1, 2024  |  Updated: Tháng Tư 2, 2024
Gemini so với ChatGPT

 

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 AltiumSử 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):

Figure 1: Gemini’s MMLU  performance metric

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.

Mã Boilerplate

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.

Nhiệm vụ 1: In Ra Thuộc Tính Tệp Đệ Quy

Để 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ó.

Nhiệm vụ 2: Web Scraper

Đố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">
        <link rel="icon" href="y18.svg">

</html>

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
from bs4 import BeautifulSoup

# URL của trang web cần thu thập dữ liệu
url = 'https://news.ycombinator.com'

# Gửi một yêu cầu GET đến URL
response = requests.get(url)

# Phân tích nội dung HTML của trang sử dụng BeautifulSoup
soup = BeautifulSoup(response.text, 'html.parser')

# Tìm tất cả các tiêu đề tin tức
headlines = soup.find_all('tr', class_='athing')

# 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 đề
news_headlines = {}

# Lặp qua từng tiêu đề, trích xuất và lưu vào từ điển
for headline in headlines:
    rank = headline.find('span', class_='rank').text.strip('.')
    title = headline.find('span', class_='titleline').text
    news_headlines[rank] = title

# Xuất từ điển
print(news_headlines)

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
from bs4 import BeautifulSoup

# Gửi một yêu cầu HTTP GET đến trang web Hacker News
response = requests.get("https://news.ycombinator.com/")

# Phân tích nội dung HTML sử dụng BeautifulSoup
soup = BeautifulSoup(response.content, "html.parser")

# Tìm tất cả các phần tử có class 'athing', chứa các bài báo
articles = soup.find_all("tr", class_="athing")

# Tạo một từ điển trống để lưu trữ các tiêu đề
headlines = {}

# Lặp qua từng bài báo và trích xuất tiêu đề và URL
for article in articles:
    # Tìm phần tử tiêu đề
    headline_element = article.find("span", class_="titleline")
    headline = headline_element.find("a").text.strip()

    # Tìm phần tử URL
    url_element = headline_element.find("a")
    url = url_element["href"]

    # Thêm tiêu đề và URL vào từ điển
    headlines[headline] = url

# In ra từ điển các tiêu đề
print(headlines)

Đ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ĩ.

Nhiệm vụ 3: Ứng dụng Web Theo dõi Cổ phiếu

Đố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
import yfinance như yf
import plotly.graph_objects như go
từ datetime import datetime

app = Flask(__name__)

@app.route('/')
def home():
    stocks = ['RIVN', 'TSLA', 'NKLA', 'FSR']
    start = datetime(2021, 1, 1)
    end = datetime.now()

    fig = go.Figure()

    for stock in stocks:
        df = yf.download(stock, start=start, end=end)
        fig.add_trace(go.Scatter(x=df.index, y=df.Close, mode='lines', name=stock))

    graph_html = fig.to_html(full_html=False)

    return render_template_string("""
        <html>
            <body>
                {{ graph_html | safe }}
            </body>
        </html>

Figure 2: Screenshot of GPT4 generated web application

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
from flask import render_template
import yfinance as yf
import plotly.graph_objects as go

app = flask.Flask(__name__)

# Các ký hiệu cổ phiếu
tickers = ['RIVN', 'TSLA', 'NKLA', 'FSR']

# Lấy dữ liệu cổ phiếu sử dụng yfinance
def get_stock_data(ticker):
    start_date = '2023-02-10'  # Điều chỉnh ngày bắt đầu theo nhu cầu
    end_date = '2024-02-10'  # Ngày hôm nay
    return yf.download(ticker, start=start_date, end=end_date)

@app.route('/')
def index():
    dữ liệu cổ phiếu = {}
    for ticker in tickers:
        dữ liệu cổ phiếu[ticker] = get_stock_data(ticker)

    charts = []
    for ticker, data in stock_data.items():
        fig = go.Figure(data=[go.Candlestick(x=data.index,
                                             open=data['Open'],
                                             high=data['High'],
                                             low=data['Low'],
                                             close=data['Close'])])
        fig.update_layout(title=ticker)
        charts.append(fig.to_html(full_html=False, include_plotlyjs='cdn'))

    return render_template('index.html', charts=charts)

nếu __name__ == '__main__':
    app.run(debug=True)

Đ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>
<html>
<head>
    <title>Biểu Đồ Cổ Phiếu</title>
    <script src="https://cdn.plot.ly/plotly-latest.min.js"></script>
</head>
<body>
    {% for chart in charts %}
        <div id="{{ loop.index0 }}"></div> 
        <script>
            Plotly.newPlot('{{ loop.index0 }}', {{ chart | safe }});
        </script>
    {% endfor %}
</body>
</html>

Figure 3: Screenshot of Gemini Advanced generated web application

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.

Thất bại và Ảo Giác

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.

Figure 4: Gemini Advanced not following directions

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?

Gemini Advanced confused about the upcoming elections?

Hình 5: Gemini Advanced bối rối về cuộc bầu cử sắp tới?

Kết luận

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 đó.

About Author

About Author

Ari is an engineer with broad experience in designing, manufacturing, testing, and integrating electrical, mechanical, and software systems. He is passionate about bringing design, verification, and test engineers together to work as a cohesive unit.

Related Resources

Tài liệu kỹ thuật liên quan

Back to Home
Thank you, you are now subscribed to updates.