제미니 vs. 챗GPT: 누가 더 나은 코드를 작성하나?

Ari Mahpour
|  작성 날짜: 삼월 1, 2024  |  업데이트 날짜: 사월 2, 2024
제미니 대 챗지피티

 

전기 엔지니어가 단 한 줄의 코드도 작성하지 않고 지낼 수 있던 시절은 지났습니다. 코딩하는 방법을 아는 것은 모든 종류의 엔지니어에게 필요한 기술이 되었습니다. 엔지니어가 전체 스택 웹 애플리케이션을 작성하는 방법을 이해할 필요는 없지만, 기본적인 스크립팅 기술을 갖추는 것이 중요합니다. 예를 들어, 대규모 데이터 세트에 대한 분석을 수행하려면 프로그래밍에 대한 일부 지식이 필요합니다. 더 복잡한 작업의 경우, 엔지니어는 때때로 특정 함수나 해결책을 온라인에서 몇 시간 동안 검색하며 난관에 빠질 수 있습니다. ChatGPT의 출시로 세상은 의심할 여지 없이 변했고, 자동 코드 생성을 위한 환경도 변화했습니다. 강력한 배경 지식이 없는 엔지니어도 이제 Generative AI의 도움으로 고품질의 코드를 작성할 수 있습니다.

이전 기사들에서 Altium 스크립팅을 위한 ChatGPT 사용하기자동화된 테스팅을 위한 ChatGPT 사용하기와 같이 Generative AI, 특히 ChatGPT를 활용하여 코드를 작성하는 방법을 살펴보았습니다. 지금까지 Google Bard(ChatGPT의 경쟁자)는 뒤처져 있었지만, 새로운 모델인 Gemini가 Massive Multitask Language Understanding (MMLU) 척도에서 경쟁자를 능가한다고 광고하고 있습니다:

Figure 1: Gemini’s MMLU  performance metric

그림 1: 제미니의 MMLU 성능 지표. 출처: https://deepmind.google/technologies/gemini/#capabilities

이 글에서는 ChatGPT의 가장 정교한 엔진인 GPT4와 구글의 가장 발전된 AI 엔진인 제미니 어드밴스드(이전 명칭: 울트라)를 비교해보며, 코드 생성 능력이 더 뛰어난 쪽이 누구인지 알아볼 것입니다.

보일러플레이트 코드

두 엔진 간의 완전히 철저한 비교를 수행하는 것은 매우 도전적일 것입니다. 이 글에서는 이 두 엔진이 파이썬(코드 작성 LLMs에 가장 많이 지원되는 언어 중 하나)으로 작성된 보일러플레이트 코드를 얼마나 잘 생성하는지 살펴볼 것입니다. 이것은 정확한 과학이 아니며 좋음과 나쁨은 매우 주관적일 수 있습니다. 대신, 우리는 코드가 실행되는지와 우리의 지시를 얼마나 잘 이해했는지에 기반하여 각 엔진을 평가할 것입니다.

작업 1: 재귀적 파일 속성 출력

시작하기 위해 매우 간단한 스크립팅 작업을 살펴봅시다:

주어진 폴더의 절대 경로에 대해, 각 파일의 메타데이터를 딕셔너리 객체로 재귀적으로 검색하는 파이썬 자동화 스크립트를 개발합니다. 각 딕셔너리 객체를 줄 단위로 출력하고 절대 경로를 포함시킵니다.

먼저 GPT4에서 돌아온 코드를 분석해 보겠습니다:

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__)))

간결하고, 작동하며, 일을 끝냅니다. 이 코드는 합격입니다. 또한 매우 단순한 작업이지만 괜찮습니다.

이제 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  # 바이트 단위 크기

        metadata['modified_time'] = stat.st_mtime  # 마지막 수정 시간

        metadata['accessed_time'] = stat.st_atime  # 마지막 접근 시간

    except OSError:

        print(f"파일 접근 오류: {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"절대 경로: {file_path}")  # 절대 경로 출력

                print(metadata)

 

if __name__ == '__main__':

    retrieve_metadata_recursively(os.path.dirname(os.path.abspath(__file__)))

젬마이니는 조금 더 장황하지만, 몇 가지 오류 처리를 추가했으니, 그것이 좋은 점이라고 생각합니다. 다소 길지만 작동하므로 통과시켜 줄게요.

작업 2: 웹 스크래퍼

다음 작업에서는 두 엔진이 주어진 언어를 얼마나 잘 이해하고 해당 언어를 기반으로 파서를 만들 수 있는지 보고 싶었습니다. 이 경우, 다음 프롬프트를 사용하여 웹 스크래퍼를 구축할 것입니다.
'https://news.ycombinator.com'에서 상위 뉴스 헤드라인을 스크래핑하여 사전 객체로 출력하는 BeautifulSoup 또는 Scrapy를 사용한 Python 스크립트를 작성하십시오.

다음은 'https://news.ycombinator.com'의 페이지 소스 스니펫입니다. 이를 사용하여 태그를 파싱하는 방법을 결정하십시오.

'https://news.ycombinator.com'에서 상위 뉴스 헤드라인을 스크래핑하여 사전 객체로 출력하는 BeautifulSoup 또는 Scrapy를 사용한 Python 스크립트를 작성하십시오.

다음은 'https://news.ycombinator.com'의 페이지 소스 스니펫입니다. 이를 사용하여 태그를 파싱하는 방법을 결정하십시오.

<html lang="ko" 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>

제가 제시한 내용에 HTML을 포함시켰다는 것을 알 수 있습니다. 실제로 더 많은 HTML 내용이 있지만 이 글에서는 줄였습니다. 여기 GPT4가 생성한 내용입니다:

import requests
from bs4 import BeautifulSoup

# 스크랩할 사이트의 URL
url = 'https://news.ycombinator.com'

# URL로 GET 요청을 보냅니다
response = requests.get(url)

# BeautifulSoup을 사용하여 페이지의 HTML 내용을 파싱합니다
soup = BeautifulSoup(response.text, 'html.parser')

# 모든 뉴스 헤드라인 찾기
headlines = soup.find_all('tr', class_='athing')

# 헤드라인을 저장할 딕셔너리, 키는 순위이고 값은 헤드라인 텍스트
news_headlines = {}

# 각 헤드라인을 순회하며 추출 후 딕셔너리에 저장
for headline in headlines:
    rank = headline.find('span', class_='rank').text.strip('.')
    title = headline.find('span', class_='titleline').text
    news_headlines[rank] = title

# 딕셔너리 출력
print(news_headlines)

이 코드는 잘 작동하며 의도한 대로 기능합니다. 기사 링크를 자동으로 알아내길 바랐지만 명시적으로 요청하지 않았으므로 GPT4의 평가에 이를 반영할 수는 없습니다.

Gemini가 생성한 코드는 다음과 같습니다:

import requests
from bs4 import BeautifulSoup

# Hacker News 웹사이트에 HTTP GET 요청 보내기
response = requests.get("https://news.ycombinator.com/")

# BeautifulSoup를 사용하여 HTML 내용 분석하기
soup = BeautifulSoup(response.content, "html.parser")

# 뉴스 기사를 포함하는 'athing' 클래스 요소를 모두 찾기
articles = soup.find_all("tr", class_="athing")

# 헤드라인을 저장할 빈 사전 생성하기
headlines = {}

# 각 기사를 순회하며 헤드라인과 URL 추출하기
for article in articles:
    # 헤드라인 요소 찾기
    headline_element = article.find("span", class_="titleline")
    headline = headline_element.find("a").text.strip()

    # URL 요소 찾기
    url_element = headline_element.find("a")
    url = url_element["href"]

    # 사전에 헤드라인과 URL 추가하기
    headlines[headline] = url

# 헤드라인의 사전 출력하기
print(headlines)

이것도 작동하며 GPT4의 출력과 매우 유사하지만, 이 코드는 실제로 URL을 추출합니다. 그것도 좋지만, 다시 말하지만 기대하는 바는 아닙니다. 이 도전에서는 거의 같다고 말할 수 있습니다. 아마도 Gemini가 마음을 읽는 능력으로 추가 점수를 얻을 수 있겠네요.

작업 3: 주식 웹 애플리케이션

이 작업에서는 몇 가지 다른 티커의 주식 차트를 그리는 웹 애플리케이션을 만들고 싶습니다:

다음 주식의 차트를 보여주는 Python으로 웹 애플리케이션을 만드세요: RIVN, TSLA, NKLA, FSR

이 작업은 확실히 더 까다로웠습니다. 프론트엔드(즉, 그래프/사진)와 백엔드 구성 요소(즉, 주식 데이터베이스에서 데이터 검색)가 필요합니다. GPT4로 수없이 많은 애플리케이션을 생성해 보았고, Gemini가 어떻게 비교되는지 보고 싶었습니다. GPT4가 제게 생성해 준 것은 다음과 같습니다:

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

그림 2: GPT4가 생성한 웹 애플리케이션의 스크린샷

간단하고 깔끔하며 요점을 잘 전달합니다. 별다른 장식은 없지만 필요한 기능을 수행합니다. 여기 제미니가 제게 생성해준 것입니다:

import flask
from flask import render_template
import yfinance as yf
import plotly.graph_objects as go

app = flask.Flask(__name__)

# 주식 심볼
tickers = ['RIVN', 'TSLA', 'NKLA', 'FSR']

# yfinance를 사용하여 주식 데이터 가져오기
def get_stock_data(ticker):
    start_date = '2023-02-10'  # 시작 날짜 조정 필요
    end_date = '2024-02-10'  # 오늘 날짜
    return yf.download(ticker, start=start_date, end=end_date)

@app.route('/')
def index():
    stock_data = {}
    for ticker in tickers:
        stock_data[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)

if __name__ == '__main__':
    app.run(debug=True)

또한 이 작업은 templates라는 새 디렉토리에 index.html이라는 새 파일을 생성하도록 요구했습니다:

<!DOCTYPE html>
<html>
<head>
    <title>주식 차트</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

그림 3: Gemini Advanced가 생성한 웹 애플리케이션의 스크린샷

이것은 확실히 더 화려했으며, 히스토그램을 포함하고 HTML 내용을 새 파일로 추상화했습니다. 다시 말하지만, 둘 다 기능적이었으므로, 둘 다 합격점을 받습니다.

실패와 환상

GPT4가 처음 출시되었을 때, 이를 제대로 "프롬프트"하는 방법을 이해하는 데 시간이 걸렸습니다. 코드를 작성하기 위해 생성 AI를 사용할 때, 세부 사항이 중요합니다. 결과적으로, 우리 중 많은 사람들이 지난 한 해 동안 더 능숙한 "프롬프트 엔지니어"가 되었습니다. 불행히도, 이것은 GPT4를 다른 엔진과 비교할 때 일부 편향을 도입할 수 있으며, 저는 그것을 자백하고 있습니다. 저는 GPT4가 어떻게 "작동"하는지 Gemini가 작동하는 방식보다 더 잘 알고 있습니다. 저는 GPT4에 대한 프롬프트를 구성하는 방식이 Gemini가 기대하는 것과 다를 수 있습니다. 그럼에도 불구하고, 저는 Gemini와 관련하여 몇 가지 매우 근본적인 문제에 부딪혔습니다.

저는 Gemini가 지시사항을 해석하는 데 있어 흔히 발생하는 문제를 발견했는데, 그 중 하나는 단위 테스트를 생성하는 것이었습니다. 처음에는 기사에서 단위 테스트를 다루려고 했지만, Gemini가 지시사항을 전혀 따르지 않아서 좌절감을 느끼고 완전히 포기했습니다. 예를 들어, 저는 Gemini에게 Pytest를 사용하여 단위 테스트를 작성하고 클래스에 포함시키라고 요청했습니다. 그러나 Gemini는 내 요청을 완전히 무시하고 UnitTest를 사용하여 테스트를 생성했지만, 코드를 클래스 내에 포함시켰습니다. 저는 이를 수정하고 Gemini가 실수로 UnitTest 대신 Pytest를 사용했다고 인정하게 했습니다. 그러면 Gemini는 Pytest를 사용하여 코드를 다시 작성하지만, 클래스에 넣는 것을 잊어버렸습니다. Mock 구조체를 사용하라고 요청하면 Pytest의 Mock 대신 UnitTest의 mock을 기본값으로 사용합니다. 이러한 미묘한 차이들은 Generative AI를 다룰 때 중요합니다.

Figure 4: Gemini Advanced not following directions

그림 4: Gemini가 지시사항을 따르지 않음

문제 해결 실패는 또 다른 고통스러운 점이었습니다. GPT4의 추론 엔진은 Python에서 오류를 디버깅할 때 상당히 강력함을 입증했습니다. Gemini는... 그렇지 못했습니다. 특정 문제를 수정하라고 요청했을 때, 그저 들여쓰기를 추가하거나 변수를 교체하는 식으로 코드를 다시 작성하려고만 했는데, 이는 전혀 쓸모없는 반응이었습니다.

가끔씩 Gemini가 작동하지 않을 때가 있었습니다. 내 요청을 처리할 수 없다고 했습니다. 다른 경우에는...다가오는 선거에 대해 논평하기 시작했습니다?

Gemini Advanced confused about the upcoming elections?

그림 5: 다가오는 선거에 혼란스러운 Gemini Advanced?

결론

전반적으로, Gemini에서 생성된 보일러플레이트 코드의 품질은 GPT4와 상당히 경쟁력이 있었습니다. 그러나 경험과 그 이유 제공 엔진은 많이 부족했습니다. 다행히도 Google에게는, 이러한 부분들이 LLM의 구현 부분이지 LLM 자체는 아니라는 점입니다. 다시 말해, Gemini LLM은 근본적으로는 상당히 좋고 GPT4와 동등한 수준으로 보이지만, 채팅 경험에서 사용되는 코드 주변에는 다소 도움이 필요합니다. 시간이 지나면, Google이 코드를 반복하고 그 경험과 이유 제공 엔진을 향상시킬 것으로 보입니다.

작성자 정보

작성자 정보

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.

관련 자료

관련 기술 문서

홈으로 돌아가기
Thank you, you are now subscribed to updates.