W Jak zbudować własną akcję GPT do komunikacji z Twoim sprzętem oraz Budowanie asystenta laboratorium AI, nauczyliśmy się, jak sterować naszym sprzętem za pomocą generatywnej AI. Wykorzystując niestandardowe akcje GPT w ChatGPT, byliśmy w stanie dać ChatGPT możliwość nie tylko mrugania diodami LED na Raspberry Pi, ale także kontrolowania i pozyskiwania danych z instrumentów laboratoryjnych. Oznaczało to, że mogliśmy używać sztucznej inteligencji jako naszego asystenta laboratoryjnego, a także przetwarzać dane, które pozyskała z naszych instrumentów. W tym artykule idziemy o krok dalej, pozwalając generatywnej AI nie tylko pisać dla nas kod, ale także wykonywać go na wbudowanych celach i otrzymywać informacje zwrotne w procesie.
Używanie generatywnej AI do pisania kodu, nawet dla systemów wbudowanych, nie jest niczym nowym. Istnieje już mnóstwo narzędzi sugerujących lub całkowicie piszących kod od zera. Najpopularniejsze duże modele językowe, takie jak ChatGPT, Gemini i Claude, stały się całkiem dobre w pisaniu kodu (zobacz Gemini vs. ChatGPT: Kto pisze lepszy kod? dla porównania). Piszę o generowaniu kodu przez ChatGPT od ponad roku (zobacz Używanie ChatGPT do automatycznego testowania) i głoszę, że to jedyny sposób na rozwój w dzisiejszych czasach. Prawdziwym wyzwaniem jest wprowadzenie AI do pętli rozwoju.
Generowanie kodu to tylko początek, ale aby zweryfikować i upewnić się, że działa, wymagane jest inne podejście, jeśli chodzi o generatywną AI. Interpreter kodu z ChatGPT zapewnia zamknięte środowisko Pythona, które w pewnym stopniu może uruchamiać wygenerowany kod i weryfikować, czy działa dla Ciebie. Chciałem pójść o krok dalej i zobaczyć, czy możemy osiągnąć to samo z systemami wbudowanymi. Istnieją dwie drogi, które można obrać z ChatGPT OpenAI. Najczęstszą drogą jest stworzenie zamkniętej aplikacji, która używa API OpenAI. Spowodowałoby to pobranie kodu z dużego modelu językowego (LLM) za pomocą API, skompilowanie go, załadowanie na Arduino i użycie dodatkowego niestandardowego kodu do weryfikacji funkcjonalności wygenerowanego kodu. Zdecydowałem się na inne podejście, używając akcji GPT, aby uczynić to bardziej „doświadczeniem wspólnego kodowania”. Oto jak wygląda to doświadczenie:
Rysunek 1: Przykład akcji GPT
Chociaż przykład może być trywialny (tj. mruganie wbudowaną diodą LED), powyższa demonstracja podsumowuje wszystko. Byłem w stanie przekazać jasne instrukcje mojemu niestandardowemu GPT i wykonał je dokładnie tak, jak oczekiwałem. Mogłem również potwierdzić, że faktycznie załadowało to do mojego urządzenia i mrugało diodą LED z częstotliwością 1s. Miłą rzeczą w używaniu niestandardowego GPT w porównaniu z zamkniętym systemem jest to, że mogę dość łatwo iterować w ramach polecenia:
Rysunek 2: Iteracja nad szkicem Arduino
Teraz, gdy widziałeś kilka przykładów, spójrzmy, jak to wszystko działa.
Tak jak widzieliśmy w innych artykułach o niestandardowym GPT, konfiguracja GPT Actions dla tego projektu jest mniej więcej taka sama. Plik Dockerfile, Docker Compose, certyfikaty SSL i ogólna struktura repozytorium nie zmieniły się wiele. Oczywiście sam kod projektu oraz plik OpenAPI YAML są znacząco różne (jak można się było spodziewać).
Największą zmianą, która następuje w tym kodzie (w porównaniu z poprzednimi przykładami), jest wprowadzenie „podprocesu” w Pythonie do wywołania zewnętrznego programu, w tym przypadku środowiska Arduino IDE. Nasz plik OpenAPI YAML (openapi.yaml) dostarcza strukturę dla ChatGPT, informując, jakie informacje powinny być dostarczane i w jaki sposób. Patrząc na sekcję „components” na końcu pliku YAML, zauważysz różne części oczekiwanego obiektu zwrotnego:
components:
schemas:
CodeSnippet:
type: object
properties:
language:
type: string
code:
type: string
description:
type: string
nullable: true
required:
- language
- code
Poprosiliśmy ChatGPT, aby dostarczał nie tylko kod, ale również język i opcjonalnie opis tego kodu. Przetwarzamy te dane w app.py. Ważniejsze niż samo przetwarzanie polecenia jest to, że zwracamy również znaczące odpowiedzi HTTP, jeśli coś pójdzie nie tak w procesie. To pomaga dostarczyć kontekst i mówić tym samym „językiem”, co serwer internetowy/bot AI ChatGPT.
Implementacja, choć dość prosta, jest bardzo łatwa: zrzucamy fragment kodu do tymczasowego pliku INO, weryfikujemy i/lub przesyłamy go do Arduino, a następnie usuwamy tymczasowy plik INO. Oczywiście, jest tak wiele sposobów, przez które coś może pójść nie tak, włączając w to niezliczoną ilość ryzyk bezpieczeństwa. Jest to niezwykle ważne, jak zawsze, aby ograniczyć środowisko rozwojowe i, jeśli otwierasz je na świat zewnętrzny, zaimplementować wszystkie niezbędne środki bezpieczeństwa, aby zapewnić bezpieczeństwo twojego środowiska.
Dla zabawy zaimplementowałem również bardzo podstawowe polecenie odczytu szeregowego, które daje naszej niestandardowej akcji GPT możliwość odczytu z portu szeregowego Arduino. Pozwala nam to zweryfikować, czy port szeregowy działa, bez manualnego sprawdzania z naszego komputera. Przykładowy scenariusz może być taki, gdy prosisz ChatGPT, aby napisał i przesłał kod do twojego Arduino ze smartfona. To oczywiście może być rozszerzone do bardziej formalnej implementacji serial get/set, gdzie wysyłasz polecenia i odczytujesz odpowiedzi przez serial (jak zaimplementowano w Konfiguracja projektu sprzętu w pętli).
W tym artykule pokazaliśmy, jak AI może robić więcej niż tylko pisać kod - może również upewnić się, że kod działa, uruchamiając go na rzeczywistych urządzeniach. To jak posiadanie programisty, który nie tylko pisze projekt za ciebie, ale również testuje go, aby upewnić się, że jest poprawny. Z przykładów, które użyliśmy, możesz zobaczyć, jak to może zmienić sposób, w jaki tworzymy i testujemy nasze projekty, czyniąc rzeczy szybszymi i łatwiejszymi. Wszystkie kroki i kod, których użyliśmy, są udostępnione, więc każdy zainteresowany może to wypróbować i zobaczyć, jak AI może pomóc w ich pracy.
Odkryj więcej na temat tego pionierskiego projektu i dołącz do ewolucji na: https://gitlab.com/ai-examples/ai-arduino-code-builder.