라즈베리파이 5의 활용도가 꽤 다양하겠지만 이중 웹서비스 환경에는 꽤나 쓸만한 성능이라는 게 느껴진다.
라즈베리파이 5와 함께 한지 벌써 한 달 정도 되어간다.
현재 이 글을 올리는 서버가 우분투 리눅스이고, 라즈베리파이 5에 설치된 OS 역시 데비안 계열의 ‘Raspberry Pi OS’이다 보니 이질감은 느껴지지 않았다.
오히려 우분투 서버는 평상시 즐겨 사용하는 AnyDesk 설정하느라 은근히 고생했었다.
라즈베리파이 5에서는 별도의 설정이나 HDMI Dummy 없이도 원격 접속이 아주 잘 되고, 베타 서비스이지만 ‘Raspberry Pi Connect’라는 Peer to Peer 서비스를 함께 이용하면 어지간한 환경에서도 원격 접속이 원활하게 되어 원격 접속에 대한 스트레스를 거의 느끼지 못했다.
이번 프로젝트는 라즈베리파이 5에 얼마 전 새로 나온 GPT 4o mini API를 사용하여 나만의 Chat GPT 웹 서비스를 만들어보고자 했다.
API를 사용하려면 openai사이트에서 아래와 같이 API Key를 생성하고 이 키를 이용하여 서비스를 이용하는 개념이다.
기존 GPT-3.5 터보보다 60% 이상 저렴하며, 입력 토큰 100만 개당 15센트, 출력 토큰 100만 개당 60센트의 비용은 든다고 한다. 표준 책의 약 2,500 페이지 분량에 해당한다고 하는데 실제 해당 웹 서비스를 개발하며 꽤 많은 질문과 답변을 받으며 얼마 충전한 금액이 얼마 차감 되지 않음이 체감이 될 정도였다.
오히려 기존에 GPT-4로 구동되는 타로 프로그램이 그동안 꽤나 소비했다는 게 느껴졌다.
어쩌다 보니 주력이 Python이 되다 보니 Django와 Flask가 상당히 친숙하게 되었다. 개발에 손 놓기 전인 10여 년 전만 해도 Apache, PHP, MySQL을 꽤 많이 사용했었는데 강산이 변하여 키보드를 잡으니 React 같은 건 상상도 못 했다.
아무튼!
이런 단순한 구조의 프로젝트에는 Flask가 적절하다고 느꼈다. FastAPI는 거의 사용해보지 않아 잘 모르겠고, Django로 운영하기에는 너무 헤비 하다고 느꼈다.
불편한 점이라면 테스트할 때 까진 아주 편하지만 이를 웹서버와 연동하고 서비스하는 과정이 귀찮긴 하다.
php 같은 경우는 그냥 소스코드 만들면 끝이지만, flask로 만든 사이트는 웹 서버가 이를 인식하게 손을 좀 봐줘야 한다.
데비안 계열의 리눅스를 사용하며, 웹서버는 Nginx를 사용하고 있다. 예전에는 앞뒤 안 보고 Apache를 사용했지만 새로운 걸 맛보고 새로운 느낌으로 시작하고 싶어 Nginx와 함께 하며 이제는 아파치가 어색 졌다.
파이썬으로 웹 프로그래밍을 하게 되면 위와 같이 WSGI 서버를 통해 웹서버와 연결해야 한다.
이런 Python으로 만든 웹 프로그램을 Nginx와 연동해주는 WSGI 서버에는 아래와 같은 프로그램들이 있다.
- Gunicorn : 간단하고 사용하기 쉬운 고성능 WSGI HTTP 서버. nginx와 함께 사용되어 확장성과 성능 제공.
- uWSGI : 고성능과 유연성을 제공하는 WSGI 서버로, 다양한 설정 옵션과 기능 제공. nginx와의 통합 용이.
- Waitress : 단순하고 사용하기 쉬운 WSGI 서버. Pyramid 프레임워크와 잘 맞으며, nginx와 함께 사용 가능.
- mod_wsgi : Apache HTTP Server 모듈로 Apache와 통합되어 Python 애플리케이션을 호스팅 할 수 있음.
파이썬으로 웹 프로그래밍을 하게 되면 위와 같이 WSGI 서버를 통해 웹서버와 연결해야 한다.
이런 Python으로 만든 웹 프로그램을 Nginx와 연동해 주는 WSGI 서버에는 아래와 같은 프로그램들이 있다.
[Unit]
Description=Gunicorn instance to serve raspmini
After=network.target
[Service]
User=voka
Group=www-data
WorkingDirectory=/var/www/html/rasmini
Environment=”PATH=/var/www/html/rasmini/resmini/bin”
ExecStart=/var/www/html/rasmini/resmini/bin/gunicorn –workers 3 –bind unix:/var/www/html/rasmini/raspmini.sock -m 007 wsgi:app
[Install]
WantedBy=multi-user.target
심플하게 만들자
별다른 기능은 없다. 이미 오픈 소스로 많은 채팅 소스들이 있는 걸 보았지만 역시 내 입맛에 맞지 않는다. Chat GTP의 경우 아카이브 기능으로 보관을 한다고 하는데 검색도 용이하지 않고 여러모로 질문이 반복되는 느낌이다.
이런 불편함을 차후 개선을 통해 검색도 기존 대화도 검색 가능하게 인터페이스를 추가하려 한다.
인터페이서는 대화 창의 타이틀을 클릭하면 바로 제목을 변경할 수 있게 만들었다.
좌측 메뉴는 마우스 오버랩 시 ‘삭제’ 버튼이 보이며 대화도 삭제할 수 있게 했다. Chat GTP나 Claude를 사용하며, 해당 대화가 대략적인 지난 일수만 보이기에 이 부분도 꽤 불편하다고 느꼈다.
이에 모든 대화는 날짜를 포함하고 이를 SQLite에 저장하고 있다. 차후 이 데이터를 검색하여 활용하려 한다.
출력 시 타이핑 효과를 아직 구현하지는 않았다. 그래서인지 순식간에 답변이 보이는데 꽤 빠른 편이다.
역시 단점은 내가 등록 한 API키를 사용하고 있기에 돈이 지불되어 공개를 하지 못하고 있다는 단점이 있긴 하다.
일부 입출력 부분과 대화 검색 부분만 추가 업그레이드 하면 그래도 그럴싸한 나만의 생성형 AI 웹 서비스 프로그램이 될 것 같다.
라마 3.1이 얼마 전 공개 되었고 폭발적인 반응이 여기저기 보인다.
라마 3.0이 공개되었을 때 맥북에도 설치하여 사용은 해보았지만, 솔직히 GTP와 같은 사용 서비스 유료 사용자로서는 당장 손이 가질 않았다. 하지만, 임베베디드 시스템용으로의 활용을 고려하면 라마 3.1이 대안이지 않을까 싶다.
뭐 자동차가 대세라고 자동차를 만들어야 하는 건 아니잖아. 편리한 차량용 거치대도 만들 수도 있을 것이고, 작고 설치하기 편한 쓰레기통도 만들다보면 자동차 이상의 값어치를 하지 않겠어!
꾸준히만 달려가보자고!