ChatGPT의 초기 단계에서(사실 그리 오래되지 않았습니다), OpenAI는 LLM을 사용하여 외부 인터넷에 접근하는 다양한 방법을 발전시켰습니다. 코드 인터프리터를 사용하면 웹사이트를 Curl하여 그 내용을 가져올 수 있었습니다. 사용자 정의 애드온도 외부 웹사이트에 접근할 수 있게 해주었지만 OpenAI로부터 특별한 권한이 필요했습니다. OpenAI는 또한 인터넷에 접근할 수 있는 Microsoft Bing과 함께 탐색 기능을 추가했습니다. 그러나 이러한 모든 옵션은 OpenAI 시스템에 사용자와 개발자가 요구하는 성장과 수요에 지속 가능하지 않다는 것이 입증되었습니다. 따라서 OpenAI는 최근 GPT Actions라는 새로운 플랫폼을 출시했습니다. GPT Actions를 사용하면 다른 서버에 연결할 수 있는 사용자 정의 "GPT"를 생성하여 기존 웹 서비스 위에 AI 기능 엔진을 제공할 수 있습니다.
그렇다면 이 모든 것이 AI가 무엇인지 이해한다고 가정하는 하드웨어 엔지니어에게는 어떤 의미일까요? AI가 제어하는 하드웨어는 어떻습니까? 듣기에는 불길하고, 잠재적으로 위험하며, 동시에 무척 흥미롭게 들립니다! 이 글에서는 GPT Action에 연결할 웹서버를 설정하는 방법에 대해 알아보고, Raspberry Pi의 IO를 제어할 수 있게 ChatGPT를 활성화하는 방법까지 살펴볼 것입니다. 이를 통해 평균적인 엔지니어가 이전까지 접근할 수 없었던 새롭고 흥미로운 AI 주도 프로젝트의 가능성을 열어줍니다...지금까지는.
코드에 뛰어들기 전에 이것이 빠르게 변화하는 진화하는 분야이며 OpenAI에 의존하는 기술이라는 점을 주목하는 것이 중요합니다. 또한 ChatGPT의 유료 버전에 대한 구독이 필요합니다. 경쟁사들이 "GPT Actions"의 자체 버전을 출시할 것이 거의 확실하지만, 이 글을 쓰는 시점에서 GPT Actions는 (제 의견으로는) 웹 서비스에 완전히 기능하는 대규모 언어 모델(LLM)을 연결하는 가장 간단한 방법이었습니다.
GPT Action 서비스의 개념은 꽤 직관적입니다. 우리는 사용자 정의 GPT를 웹서비스에 연결하고, 입력과 출력이 무엇인지 알려주고, 실행하게 합니다. 그러나 구현은 제가 상상했던 것보다 훨씬 복잡했습니다(이 글을 쓰게 된 동기입니다). 서비스가 작동하는 방식을 보여주는 다이어그램은 다음과 같습니다:
그림 1: 서버 상호작용
보시다시피, 우리는 OpenAI에 웹서비스와 하드웨어와 상호작용하는 방법을 알려주는 인터페이스 문서(OpenAPI)를 제공합니다. 우리는 하드웨어를 포함하지 않는 매우 단순한 예제로 시작한 다음, 간단한 LED 토글 예제로 넘어갈 것입니다.
하드웨어 엔지니어들에게 있어, 임베디드 소프트웨어에 익숙한 사람들에게 이 섹션은 IT나 클라우드 인프라에서 일하는 사람들에게 그렇듯이 사소한 것이 아닐 수 있습니다. 전기 및 소프트웨어 엔지니어로서, 완전히 SSL 암호화된 서버를 설정하는 것은 저에게 조금 골치 아픈 일이었습니다 - 주로 할 수 있는 방법이 너무 많기 때문입니다. 불행히도, 이것은 OpenAI의 사전 요구 사항이므로 우리는 이를 해결해야 합니다. 이미 웹 서버를 호스팅하는 안전한 방법이 있다면 (예: 로드 밸런서에서의 TLS 종료) 이 섹션을 건너뛸 수 있습니다. 저처럼 대부분의 사람들은 자신의 홈 서버로 실험하고 싶어할 것입니다. 라우터 설정을 통해 포트 80과 443을 외부 세계로 열어야 한다는 점을 기억하세요. 라우터의 방화벽과 포트 포워딩을 구성하는 방법에 대한 지침은 이 글의 범위를 벗어나지만, 도움이 될 수 있는 온라인 자료가 많이 있습니다.
시작하려면 SSL 인증서를 요청해야 합니다. 이는 유료 서비스 (예: Cloudfare), 무료 서드파티 서비스 (예: ZeroSSL), 또는 Let’s Encrypt를 사용한 직접 메커니즘을 통해 수행될 수 있습니다. 이 튜토리얼에서는 certbot을 통해 Let’s Encrypt를 사용할 것입니다. 또한 서버의 IP 주소를 가리키는 도메인 이름이 필요합니다. 하나를 구매하거나 Cloudfare (유료) 또는 No-IP (무료)를 사용하여 동적 DNS 이름을 얻을 수 있습니다. 동적 DNS 이름을 IP로 전달하려면 URL 리디렉션이 아닌 “A” 레코드 유형이 필요하다는 점을 기억하세요.
Let’s Encrypt에서 90일 SSL 인증서를 요청하려면 Certbot을 사용해야 합니다. 모든 운영 체제에서 실행할 수 있는 실행 파일이 있습니다. 인증서를 획득하기 위해 가장 간단한 명령어를 실행할 것입니다. 인증서를 획득하기 위한 명령어는 다음과 같습니다:
sudo certbot certonly --standalone --agree-tos -v --preferred-challenges http -d your_domain.com
Windows에서는 sudo 부분을 사용하지 않습니다. your_domain.com을 구매한 도메인 이름이나 동적 DNS 서비스(예: No-IP)에서 받은 것으로 교체하세요. 인증서 파일 시리즈가 포함된 폴더가 생성됩니다. 이 시점에서 저장소 템플릿을 복제할 시간입니다: https://gitlab.com/ai-examples/gpt-actions-webserver/. 복제한 후에 certbot에서 생성된 폴더를 저장소로 이동하세요.
모든 트래픽이 암호화되도록 SSL 리디렉션이 제대로 작동하게 하려면 Nginx를 설정하고 싶을 것입니다. 저장소 내에 nginx라는 폴더를 생성하고 default.conf라는 새 파일을 만드세요. 이 템플릿을 사용하여, certbot을 사용하여 SSL 인증서를 요청할 때 사용한 도메인 이름으로 your_domain.com을 교체하세요:
server {
listen 80;
server_name your_domain.com;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl;
server_name your_domain.com;
ssl_certificate /etc/ssl/certs/fullchain.pem;
ssl_certificate_key /etc/ssl/private/privkey.pem;
location / {
proxy_pass http://web:8000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
이 시점에서 SSL 암호화가 올바르게 설정되어 준비가 되었습니다. 이제 우리는 사용자 정의 GPT와 통신할 수 있는 기본 웹 애플리케이션에 초점을 맞출 것입니다. 모든 코드는 저장소에서 찾을 수 있으므로 애플리케이션에 들어가는 세부 사항보다는 실행 방법을 강조할 것입니다.
SSL 암호화된 웹 서비스의 특성을 고려하여 실제 SSL 암호화와 웹 애플리케이션을 분리했습니다. 이를 위해 Nginx가 필요한데, 이는 트래픽을 리디렉션하고 Certbot을 통해 받은 인증서를 제공합니다. 모든 것을 깔끔한 패키지로 묶기 위해 Docker Compose로 감쌌습니다. 이는 이 예제를 실행하기 위해 Docker가 필요하다는 것을 의미합니다. 처음에 설정하는 것이 다소 번거롭고 지루할 수 있지만, 소프트웨어가 이러한 방향으로 나아가고 있기 때문에, 이러한 프로젝트는 Docker에 익숙해지기에 좋은 기회입니다. 참고로, 모든 설명과 지침은 저장소 내의 README.md 파일에 있습니다. 위의 단계를 따랐다면 docker compose up을 실행하면 모든 구성 요소(즉, Nginx와 웹 애플리케이션)가 빌드되어 실행되기 시작해야 합니다. 이 애플리케이션은 단순한 "Hello World" 유형의 예제이며 어디서나 실행할 수 있습니다.
docker compose up 명령을 실행한 후 다음과 같은 출력을 볼 수 있습니다:
그림 2: 터미널 출력
http://localhost:8000으로 이동하여 애플리케이션을 테스트해야 합니다. {"status":"OK"}라는 테스트 출력을 볼 수 있습니다. 이전 단계에서 설정한 도메인 이름인 “your_domain.com”이 있는 http://your_domain.com으로 이동하면 동일한 결과를 볼 수 있어야 합니다. 라우터와 도메인 설정이 올바른지 정말로 확인하려면 네트워크 외부(예: WiFi가 꺼진 상태에서 휴대폰으로)에서 이를 테스트해야 합니다.
기본 웹 서버가 작동하는 것을 확인했으니 이제 Custom GPT Action에 연결해야 합니다. OpenAI는 서버가 사용자의 서버와 어떻게 상호 작용해야 하는지 알려주는 OpenAPI라는 문서를 요구합니다. 이미 GPT Actions 설정에 직접 복사하여 붙여넣을 수 있는 openapi.json이 있습니다. 설정으로 가려면 왼쪽 하단에 있는 이름을 클릭한 다음 "My GPTs"를 클릭하세요:
그림 3: ChatGPT 설정
GPT 생성을 클릭한 다음 하단에 새로운 액션 생성을 클릭하세요:
그림 4: GPT 액션 구성 설정
그 후에 Schema 상자에 openapi.json의 내용을 복사하여 붙여넣을 수 있습니다:
그림 5: GPT 액션 스키마 설정
“https://your_doman.com”을 실제 도메인 주소로 바꿔야 합니다. 그러면 몇 개의 테스트 버튼이 나타납니다. 웹서버가 실행 중이라면 테스트 버튼을 클릭하여 OpenAI가 웹서버와 통신할 수 있는지 확인할 수 있습니다. 모든 것이 정상이라면 GPT를 저장/발행(오른쪽 상단에 있음)할 수 있고 이를 사용해 볼 수 있습니다. 이것이 사설 네트워크(아마도 집에서)에 연결되기 때문에 자신만을 위해 이를 발행하는 것이 중요합니다.
GPT 실행하기
위의 모든 섹션을 성공적으로 통과하고 GPT 액션을 성공적으로 테스트했다면 축하합니다! 이제 모든 것을 진짜로 테스트할 시간입니다. 저는 새로운 ChatGPT 대화를 시작했지만 이번에는 "Instrument Controller"라고 부르는 나만의 Custom GPT를 사용했습니다. 간단하게 서버의 상태를 물어보았습니다:
그림 6: GPT 액션을 사용한 서버 상태
그리고 Docker Compose를 실행한 명령 줄에서 나온 내 Nginx 로그도 트래픽을 확인합니다:
"GET / HTTP/1.1" 200 15 "-" "Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko); compatible; ChatGPT-사용자/1.0; +https://openai.com/bot" "-"
또한 서버에서 무작위 숫자를 생성하는 기능도 있습니다:
그림 7: GPT 액션을 사용하여 서버에서 무작위 숫자 얻기
그리고 Nginx에서의 트래픽도 우리 서버에서 5개의 요청을 받았음을 확인합니다.
이 시점에서 우리는 GPT를 사용하여 소프트웨어 액션을 수행하는 방법을 보여주었지만 하드웨어를 제어하는 것은 어떨까요? 이 글에서 우리는 이미 많은 것을 다루었으므로 기본적인 깜박이는 LED 예제를 살펴보겠습니다.
시작하려면 위와 같은 과정을 Raspberry Pi에서 실행하세요. 동일한 SSL 인증서와 저장소 코드를 사용할 수 있습니다(모든 장치가 같은 네트워크에 있다고 가정). 모든 것이 준비되면 다음 명령을 실행하세요:
BUILD_TYPE=rpi docker compose up --build
이 예제는 이제 26번 핀(GPIO7)에 있는 온보드 LED를 토글할 수 있는 기능을 포함하고 있습니다. app/RPiDemoApp.py에서 핀 번호를 수정할 수 있습니다. 또한 새로운 기능을 추가했으므로 저장소에 제공된 opeanapi-rpi.json 스키마로 사용자 지정 GPT의 OpenAPI 스키마도 업데이트해야 합니다.
이 시점에서 ChatGPT와 채팅 인터페이스를 사용하여 LED를 토글할 수 있어야 합니다:
그림 8: GPT 액션을 사용하여 Raspberry Pi에서 LED 토글하기
여기까지 오신 것을 축하합니다! 이것은 복잡한 튜토리얼이었고, 당연히 질문이나 도전이 있을 것입니다. ChatGPT는 이 기능에 대해 매일 변경을 가하고 있으며 초보자들이 과정을 더 쉽게 따라갈 수 있는 방법을 찾고 있습니다. 업데이트된 문서와 과정을 도와줄 수 있는 AI 보조 봇을 찾아보세요.
이 글에서 우리는 사용자 지정 GPT 액션을 만드는 방법과 그 주변에 SSL 암호화된 웹 서비스를 제공하기 위한 모든 구조를 구축하는 방법을 살펴보았습니다. 기본 웹 서비스를 구축하는 것 외에도 이 코드를 확장하여 Raspberry Pi에서 LED를 제어할 수 있었습니다. 이는 “AI in the loop”(“hardware in the loop”의 변형)를 활용하여 훨씬 더 복잡한 하드웨어를 제어하고 통신할 수 있는 가능성을 열어줍니다. 향후 글에서는 이 예제를 기반으로 이러한 주제와 개념을 탐구할 것입니다.