Minęły czasy, kiedy inżynierowie elektrycy mogli obyć się bez pisania choćby jednej linijki kodu. Umiejętność programowania stała się wymaganą umiejętnością, niezbędną dla inżynierów wszystkich specjalności. Chociaż inżynierowie nie muszą rozumieć, jak napisać pełną aplikację internetową, ważne jest, aby posiadali podstawowe umiejętności skryptowe. Wykonywanie analiz na dużych zbiorach danych, na przykład, wymaga pewnej wiedzy z zakresu programowania. W przypadku bardziej złożonych zadań, inżynierowie mogą znaleźć się w trudnej sytuacji, czasami spędzając godziny na szukaniu w internecie konkretnej funkcji lub rozwiązania. Z wydaniem ChatGPT świat, bez wątpienia, się zmienił, podobnie jak krajobraz automatycznego generowania kodu. Inżynierowie bez mocnego zaplecza mogą teraz pisać wysokiej jakości kod przy pomocy generatywnej sztucznej inteligencji.
W poprzednich artykułach, takich jak Używanie ChatGPT do skryptowania w Altium oraz Używanie ChatGPT do automatycznego testowania, przyjrzeliśmy się, jak wykorzystać generatywną sztuczną inteligencję, a konkretnie ChatGPT, do pisania kodu za nas. Do tej pory konkurent ChatGPT, Google Bard, pozostawał w tyle, ale nowy model, Gemini, reklamowany jest jako przewyższający swojego konkurenta na skali zrozumienia języka w wielozadaniowych zadaniach masowych (MMLU):
Rysunek 1: Metryka wydajności MMLU firmy Gemini. Źródło: https://deepmind.google/technologies/gemini/#capabilities
W tym artykule porównamy najbardziej zaawansowany silnik ChatGPT, GPT4, z Gemini Advanced (poprzednio znany jako Ultra), najbardziej zaawansowanym silnikiem AI Google, aby zobaczyć, który lepiej generuje kod.
Przeprowadzenie w pełni wyczerpującego porównania między tymi dwoma silnikami byłoby niezwykle trudne. W tym artykule przyjrzymy się, jak dobrze te dwa silniki generują kod szablonowy napisany w Pythonie (jako że jest to jeden z najbardziej wspieranych języków dla pisania kodu przez LLM). To nie jest dokładna nauka, ponieważ dobre kontra złe może być bardzo subiektywne. Zamiast tego, ocenimy każdy silnik bazując po prostu na tym, czy kod działa i jak dobrze zrozumiał nasze instrukcje.
Aby zacząć, przyjrzyjmy się bardzo prostemu zadaniu skryptowemu:
Stwórz skrypt automatyzacji Pythona, który, mając absolutną ścieżkę do folderu, pobiera metadane każdego pliku rekursywnie jako obiekt słownika. Wydrukuj każdy obiekt słownika linia po linii, uwzględniając absolutną ścieżkę.
Przeanalizujmy najpierw kod, który otrzymaliśmy od GPT4:
import os def get_file_metadata(directory): dla foldername, subfolders, filenames w os.walk(directory): dla filename w 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__))) |
Jest zwięźle, działa i spełnia swoje zadanie. Dałbym temu zielone światło. To również wyjątkowo trywialne zadanie, ale to w porządku.
Teraz spójrzmy na kod, który otrzymaliśmy od Gemini Advanced:
import os def get_file_metadata(file_path): metadata = {} spróbuj: stat = os.stat(file_path) metadata['name'] = os.path.basename(file_path) metadata['size'] = stat.st_size # Rozmiar w bajtach metadata['modified_time'] = stat.st_mtime # Ostatni czas modyfikacji metadata['accessed_time'] = stat.st_atime # Ostatni czas dostępu except OSError: print(f"Błąd dostępu do pliku: {file_path}") return metadata def retrieve_metadata_recursively(folder_path): dla root, _, files w os.walk(folder_path): dla file w files: file_path = os.path.join(root, file) metadata = get_file_metadata(file_path) jeśli metadata: print(f"Pełna ścieżka: {file_path}") # Wyświetl pełną ścieżkę print(metadata) if __name__ == '__main__': retrieve_metadata_recursively(os.path.dirname(os.path.abspath(__file__))) |
Gemini jest nieco bardziej rozwlekły, aczkolwiek dodał pewne obsługi błędów, co, jak przypuszczam, jest miłe. Jest dość długi, ale działa, więc damy mu fory.
W następnym zadaniu chciałem zobaczyć, jak dobrze oba silniki rozumieją dany język i potrafią stworzyć na jego podstawie parser. W tym przypadku będziemy budować web scraper, używając następującej wskazówki:
Napisz skrypt Pythona używając BeautifulSoup lub Scrapy, który scrapuje najważniejsze nagłówki wiadomości z 'https://news.ycombinator.com' i wypisuje je do obiektu słownika.
Oto fragment źródła strony z 'https://news.ycombinator.com'. Użyj tego, aby określić, jak parsować tagi.
Napisz skrypt Pythona używając BeautifulSoup lub Scrapy, który scrapuje najważniejsze nagłówki wiadomości z 'https://news.ycombinator.com' i wypisuje je do obiektu słownika. Oto fragment źródła strony z 'https://news.ycombinator.com'. Użyj tego, aby określić, jak parsować tagi. <html lang="pl" 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"> |
Jak zauważysz, dołączyłem trochę HTML-a do mojej wypowiedzi. Moje rzeczywiste polecenie zawiera więcej HTML-a, ale skróciłem je dla tego artykułu. Oto co wygenerował GPT4:
import requests # URL strony do scrapowania # Wyślij żądanie GET do URL # Parsuj zawartość HTML strony używając BeautifulSoup # Znajdź wszystkie nagłówki wiadomości # Słownik do przechowywania nagłówków, gdzie klucz to ranga, a wartość to tekst nagłówka # Przejście przez każdy nagłówek, ekstrakcja i zapisanie go w słowniku # Wyświetlenie słownika |
Ten kod działa dobrze i robi to, co powinien. Miałem nadzieję, że intuicyjnie będzie wiedział, że chcę link do artykułów, ale nie byłem w tym wyraźny, więc nie mogę tego uznać za minus oceny GPT4.
Oto co wygenerowało Gemini:
import requests # Wysłanie żądania HTTP GET do strony Hacker News # Przetwarzanie zawartości HTML za pomocą BeautifulSoup # Znajdź wszystkie elementy klasy 'athing', które zawierają artykuły # Utwórz pusty słownik do przechowywania nagłówków # Przejdź przez każdy artykuł i wyodrębnij nagłówek oraz URL # Znajdź element URL # Dodaj nagłówek i URL do słownika # Wydrukuj słownik nagłówków |
To również działa i jest dość podobne do wyników GPT4, ale ten kod faktycznie ekstrahuje URL. To miłe, ale znowu, nie jest to oczekiwane. W tym wyzwaniu powiedziałbym, że są praktycznie takie same. Może Gemini zdobywa dodatkowy punkt za bycie czytelnikiem myśli.
W tym zadaniu chcę stworzyć aplikację internetową, która będzie wyświetlać wykresy akcji kilku różnych spółek:
Stwórz aplikację internetową w Pythonie, która pokaże wykresy następujących akcji: RIVN, TSLA, NKLA, FSR |
To zadanie było zdecydowanie trudniejsze. Wymaga komponentu frontendowego (tj. wykresy/obrazy) oraz backendowego (tj. pobieranie danych z bazy danych akcji). Wygenerowałem niezliczone aplikacje z GPT4 i chciałem zobaczyć, jak wypada Gemini w porównaniu z nim. Oto co wygenerowało dla mnie GPT4:
from flask import Flask, render_template_string app = Flask(__name__) @app.route('/') fig = go.Figure() dla akcji w stocks: graph_html = fig.to_html(full_html=False) return render_template_string(""" |
Rysunek 2: Zrzut ekranu wygenerowanej przez GPT4 aplikacji webowej
To proste, czyste i na temat. Bez zbędnych dodatków, ale robi swoje. Oto co Gemini wygenerowało dla mnie:
import flask app = flask.Flask(__name__) # Symbole akcji # Pobieranie danych o akcjach za pomocą yfinance @app.route('/') charts = [] return render_template('index.html', charts=charts) if __name__ == '__main__': |
Wymagało to również ode mnie stworzenia nowego pliku, index.html, w nowym katalogu o nazwie templates:
<!DOCTYPE html> |
Rysunek 3: Zrzut ekranu z wygenerowanej aplikacji webowej Gemini Advanced
To było zdecydowanie bardziej wyszukane, ponieważ zawierało histogram i abstrahowało zawartość HTML do nowego pliku. Ponownie, oba były funkcjonalne, więc oba otrzymują pozytywną ocenę.
Gdy GPT4 został po raz pierwszy wprowadzony, potrzebowaliśmy czasu, aby zrozumieć, jak właściwie go „pobudzać”. Podczas używania AI generatywnej do pisania kodu, szczegóły mają znaczenie. W rezultacie wielu z nas stało się bardziej kompetentnymi „Inżynierami Pobudek” w ciągu minionego roku. Niestety, może to wprowadzić pewne uprzedzenia przy porównywaniu GPT4 z innymi silnikami, co chętnie przyznaję. Wiem, jak „działa” GPT4 bardziej niż Gemini. Sposób, w jaki formułuję pobudki dla GPT4, może różnić się od tego, czego oczekuje Gemini. Niezależnie od tego, nadal napotkałem kilka bardzo podstawowych problemów z Gemini.
Jednym z częstych problemów, które napotkałem podczas korzystania z Gemini przy interpretacji instrukcji, było generowanie testów jednostkowych. Moim początkowym celem było omówienie testów jednostkowych w artykule, ale z frustracji całkowicie zrezygnowałem z Gemini, ponieważ nigdy nie postępowało zgodnie z instrukcjami. Na przykład, prosiłem Gemini, aby napisało test jednostkowy przy użyciu Pytest i umieściło go w klasie. Zamiast tego generowało test przy użyciu UnitTest, całkowicie ignorując moją prośbę, ale umieszczało kod w klasie. Poprawiałem to, a ono przyznawało, że przypadkowo użyło UnitTest zamiast Pytest. Następnie przepisywało kod przy użyciu Pytest, ale zapominało o umieszczeniu go w klasie. Gdy prosiłem o użycie konstruktu Mock, domyślnie używało mocka z UnitTest zamiast Mocka z Pytest. To są niuanse, ale ważne przy pracy z generatywną sztuczną inteligencją.
Rysunek 4: Gemini Advanced nie postępuje zgodnie z instrukcjami
Rozwiązywanie problemów było kolejnym punktem bólu. Silnik rozumowania GPT4 okazał się dość potężny przy debugowaniu błędów w Pythonie. Gemini... już niekoniecznie. Gdy prosiłem go o naprawienie pewnych problemów, po prostu próbowało przepisać kod, dodając wcięcia lub zamieniając zmienne... zupełnie bezużyteczna odpowiedź.
Czasami Gemini po prostu nie działało. Informowało, że nie może przetworzyć mojego żądania. W innych przypadkach zaczynało komentować... nadchodzące wybory?
Rysunek 5: Gemini Advanced zdezorientowane w kwestii nadchodzących wyborów?
Podsumowując, jakość generowanego kodu szablonowego przez Gemini była całkiem konkurencyjna w porównaniu do GPT4. Doświadczenie i silnik rozumowania pozostawiały jednak wiele do życzenia. Na szczęście dla Google, te elementy są częścią implementacji LLM, a nie samego LLM. Innymi słowy, LLM Gemini wydaje się być, zasadniczo, całkiem dobry i na równi z GPT4, ale kod napisany wokół niego, który jest używany w doświadczeniu czatu, potrzebuje pewnej pomocy. Z czasem prawdopodobnie zobaczymy, jak Google iteruje nad swoim kodem i ulepsza to doświadczenie oraz silnik rozumowania.