하드웨어와 대화하는 맞춤형 GPT 액션 구축 방법과 AI 실험실 조수 구축에서 우리는 생성형 AI를 사용하여 하드웨어를 제어하는 방법을 배웠습니다. ChatGPT 내에서 맞춤형 GPT 액션을 활용함으로써 ChatGPT에게 라즈베리 파이에서 LED를 깜박이는 것뿐만 아니라 실험실 기기를 제어하고 데이터를 수집하는 능력을 부여할 수 있었습니다. 이는 우리가 인공지능을 실험실 조수로 사용하고 그것이 우리 기기에서 수집한 데이터를 우리를 위해 처리할 수 있음을 의미했습니다. 이번 기사에서는 생성형 AI가 우리를 위해 코드를 작성하는 것뿐만 아니라 임베디드 대상에서 코드를 실행하고 그 과정에서 피드백을 받을 수 있도록 한 단계 더 나아가고 있습니다.
임베디드 시스템을 위한 코드를 작성하는 것에 대해 생성형 AI를 사용하는 것은 새로운 것이 아닙니다. 이미 코드를 제안하거나 처음부터 완전히 작성하는 다양한 도구들이 있습니다. ChatGPT, Gemini, Claude와 같은 대부분의 인기 있는 대규모 언어 모델들은 모두 코드 작성에 상당히 능숙해졌습니다(Gemini vs. ChatGPT: 누가 더 나은 코드를 작성하나?에서 비교 참조). 저는 1년 이상 동안 ChatGPT가 코드를 생성하는 것에 대해 글을 써왔고(참조: 자동화된 테스팅을 위한 ChatGPT 사용), 이것이 요즘 개발하는 유일한 방법이라고 주장해왔습니다. 진짜 도전은 개발의 루프에 AI를 가져오는 것입니다.
코드 생성만으로는 충분하지 않으며 생성형 AI를 사용할 때 작동하는지 확인하고 검증하는 것은 다른 접근 방식을 요구합니다. ChatGPT와 함께하는 코드 인터프리터는 생성된 코드를 어느 정도 실행하고 그것이 당신을 위해 작동하는지 검증할 수 있는 캡슐화된 파이썬 환경을 제공합니다. 저는 한 단계 더 나아가 임베디드 시스템에서도 같은 것을 달성할 수 있는지 보고 싶었습니다. OpenAI의 ChatGPT와 함께 갈 수 있는 두 가지 경로가 있습니다. 가장 일반적인 경로는 OpenAI API를 사용하는 폐쇄 루프 애플리케이션을 생성하는 것입니다. 이것은 API를 사용하여 대규모 언어 모델(LLM)에서 코드를 프롬프트하고 가져오고, 그것을 컴파일하고, 아두이노에 로드하고, 생성된 코드의 기능을 검증하기 위해 추가적인 맞춤 코드를 사용할 것입니다. 저는 GPT 액션을 사용하여 더 "코드 페어링 경험"으로 만들기 위해 다른 접근 방식을 선택했습니다. 이 경험이 어떤 것인지 다음과 같습니다:
그림 1: GPT 액션의 예
예시가 사소할 수 있지만(즉, 온보드 LED를 깜박이는 것) 위의 시연은 모든 것을 요약합니다. 나는 내 맞춤형 GPT에게 명확한 지시를 할 수 있었고, 그것은 내가 예상한 대로 정확히 지시를 따랐습니다. 또한, 실제로 내 장치에 업로드되어 LED가 1초마다 깜박이는 것을 확인할 수 있었습니다. 맞춤형 GPT를 사용하는 것이 폐쇄 루프 시스템을 사용하는 것보다 좋은 점은 프롬프트 내에서 쉽게 반복할 수 있다는 것입니다:
그림 2: 아두이노 스케치 반복 작업
이제 몇 가지 예를 보았으니, 이 모든 것이 어떻게 작동하는지 살펴보겠습니다.
다른 맞춤형 GPT 기사에서 본 것처럼, 이 프로젝트를 위한 GPT Actions 설정은 대체로 같습니다. Dockerfile, Docker Compose, SSL 인증서 및 저장소의 일반 구조는 크게 변하지 않았습니다. 물론 디자인 코드 자체와 OpenAPI YAML 파일은 상당히 다릅니다(예상대로).
이 코드에서 발생하는 가장 큰 변화(이전 예제와 비교할 때)는 외부 프로그램, 이 경우 아두이노 IDE를 호출하기 위해 Python에서 "서브프로세스"를 도입하는 것입니다. 우리의 OpenAPI YAML 파일(openapi.yaml)은 ChatGPT에게 어떤 정보가 전달되어야 하고 어떻게 전달되어야 하는지 구조를 제공합니다. YAML 파일 끝에 있는 "components" 섹션을 보면 우리가 기대하는 반환 객체의 다른 부분을 알 수 있습니다:
components:
schemas:
CodeSnippet:
type: object
properties:
language:
type: string
code:
type: string
description:
type: string
nullable: true
required:
- language
- code
ChatGPT에게 코드뿐만 아니라 해당 코드의 언어와 선택적으로 설명까지 제공하도록 요청했습니다. 이 데이터는 app.py에서 처리됩니다. 명령어를 처리하는 것만큼 중요한 것은, 과정에서 무언가 문제가 발생하면 의미 있는 HTTP 응답을 반환하는 것입니다. 이는 맥락을 제공하고 ChatGPT의 웹 서버/AI 봇과 같은 "언어"로 소통하는 데 도움이 됩니다.
구현은 다소 원시적이지만 매우 간단합니다: 코드 스니펫을 임시 INO 파일에 덤프하고, 아두이노에 검증 및/또는 업로드한 다음, 임시 INO 파일을 삭제합니다. 물론, 이 과정에서 잘못될 수 있는 방법은 무수히 많으며, 해결할 수 없는 수많은 보안 위험도 포함됩니다. 항상 중요한 것은, 개발 환경을 제한하고, 외부 세계에 개방하는 경우, 환경이 안전한지 확인하기 위해 필요한 모든 보안 조치를 구현하는 것입니다.
재미로, 아두이노 시리얼 포트에서 읽을 수 있는 매우 기본적인 시리얼 읽기 명령도 구현했습니다. 이를 통해 우리의 커스텀 GPT 액션이 시리얼 포트가 작동하는지를 우리의 기계에서 수동으로 확인하지 않고도 검증할 수 있습니다. 예를 들어, 스마트폰에서 ChatGPT에게 코드를 작성하여 아두이노에 업로드하도록 요청하는 경우가 이에 해당할 수 있습니다. 물론, 이는 명령을 보내고 시리얼을 통해 응답을 읽어오는 보다 공식적인 get/set 유형의 시리얼 구현으로 확장될 수 있습니다(하드웨어 인 더 루프 프로젝트 구성에서 구현된 것처럼).
이 글에서는 AI가 코드를 작성하는 것 이상의 일을 할 수 있음을 보여주었습니다 - 실제 장치에서 코드를 실행하여 코드가 작동하는지 확인할 수도 있습니다. 이것은 프로젝트를 대신 작성할 뿐만 아니라 올바른지 확인하기 위해 테스트하는 개발자를 가지는 것과 같습니다. 우리가 사용한 예제들을 통해, 이것이 우리가 프로젝트를 생성하고 테스트하는 방식을 어떻게 변화시킬 수 있는지 볼 수 있습니다. 모든 것이 더 빠르고 쉬워집니다. 우리가 사용한 모든 단계와 코드는 공유되므로, 관심 있는 누구나 시도해보고 AI가 그들의 작업에 어떻게 도움이 될 수 있는지 확인할 수 있습니다.
이 선구적인 프로젝트에 대해 더 알아보고 진화에 참여하십시오: https://gitlab.com/ai-examples/ai-arduino-code-builder.