안녕하세요 미남홀란드입니다.
오늘은 AI 분야에서 AIoT 분야로의 확장을 위한 게시글을 준비해봤습니다.
라즈베리파이 피코라고 생소하실텐데요. 5천원짜리 미니컴퓨터라고 생각하시면 쉬울 것 같습니다. 워낙 저용량 이고 python 이 지원됨으로써 iot 분야에서 aiot 분야로 확장을 시키기 위해 쉽게 써 볼 수 있는 디바이스 입니다.
준비물 :
라즈베리파이 피코(W6100_EVB_PICO) ← 회사 물건이라 그냥 썼습니다 저는
마이크로파이썬 - Thony
ethernet 환경 구성
소프트웨어
본인이 쓸 Device 에 펌웨어관련을 설치해줍니다. 일반 Pico 는 이더넷이 지원이 되지 않음으로 따로 보드나, 이더넷 모듈을 장 착해야해서 번거로울 수 있습니다. 그건 고려부탁드립니다.
펌웨어를 설치해주면 이더넷 환경은 셋팅이 끝이 납니다.
Google API keys 셋팅
Studio site 에서 API key 를 발급 받아줍니다
현재 제미니의 요금제를 참고 바랍니다. GPT-3.5 turbo 보다 매우 적은 비용으로 토큰을 할당 할 수 있고 openAI 와 다르게 토큰 비용 계산이 조금 다르다고 합니다.
# Quickly test the API by running a cURL command
curl \
-H 'Content-Type: application/json' \
-d '{"contents":[{"parts":[{"text":"Write a story about a magic backpack"}]}]}' \
-X POST https://generativelanguage.googleapis.com/v1beta/models/gemini-pro:generateContent?key=YOUR_API_KEY
GPT와 달리 엔드포인트 주소에는 api_key가 포함되어 있으므로 그에 따라 기존 OpenAI 코드와는 다르게 수정을 해야합니다.
GPT 와 또 다르게 response 받는 형태 또한 조금 다르기 때문에 나중에 위 형식을 Docs 에서 참고해서 내용을 추출 해주시면 됩니다.
Source Code(main)
Gemini.py
import json
import urequests
gemini_api_key = "your_api_key"
gemini_url = f"https://generativelanguage.googleapis.com/v1beta/models/gemini-pro:generateContent?key={gemini_api_key}"
def send_prompt_to_gemini(prompt):
headers = {"Content-Type": "application/json"}
data = {
"contents": [{
"parts": [{"text": prompt}]
}]
}
response = urequests.post(gemini_url, headers=headers, data=json.dumps(data))
if response.status_code == 200:
response_data = json.loads(response.text)
return response_data["candidates"][0]["content"]["parts"][0]["text"]
else:
raise Exception(f"API error ({response.status_code}): {response.text}")
위 gemin.py 를 모듈로 사용해서 리스폰을 받아야합니다.
Send.py
from machine import Pin, SPI
import network
import utime
import gemini
#init Ethernet code
def init_ethernet(timeout=10):
spi = SPI(0, 2_000_000, mosi=Pin(19), miso=Pin(16), sck=Pin(18))
nic = network.WIZNET5K(spi, Pin(17), Pin(20)) # spi, cs, reset pin
# DHCP
nic.active(True)
start_time = utime.ticks_ms()
while not nic.isconnected():
utime.sleep(1)
if utime.ticks_ms() - start_time > timeout * 1000:
raise Exception("Ethernet connection timed out.")
print('Connecting ethernet...')
print(f'Ethernet connected. IP: {nic.ifconfig()}')
def main():
init_ethernet()
while True:
prompt = input("User: ")
if prompt.lower() == "exit":
print("Exiting...")
break
try:
response = gemini.send_prompt_to_gemini(prompt)
print("Gemini: ", response)
except Exception as e:
print("Error: ", e)
if __name__ == "__main__":
main()
간단한 이더넷 통신코드와 루프문을 통해서 gemini 와 통신하는 코드 입니다.
결과
제미니에게 뉴진스를 아냐고 물어봤는데 생각보다 자세하게 설명을 해주더라구요. 그래서 더 딥하게 민지를 아냐? 라고 하니깐 자세한 정보를 출력해주었습니다. 현재 Google 의 Gemini 는 어떻게 학습하였고 어떤데이터, 학습 시점 이 공개가 되지 않았는데 그래도 왠만한 open Source LLM 보다는 성능이 좋아 보입니다. 그러나 계속 뉴스에 나오지만 아직 GPT 만큼 성능이 안나온다라고 하기 때문에 계속 지켜봐야 할 것 같습니다.
위 코드가 되게 기본적인 코드라서 라이브러리가 깔리지 않는 임베디드 환경에서 URequest 를 통하여 호출해오는 기본 코드입니다. IoT 분야에서는 센싱 데이터를 가지고 추론을 api 를 통해서 보통하는 경우가 많은데 이렇게 LLM 들이 성능이 좋아질수록 AIOT 분야가 더욱 발전하지 않을까 조심스럽게 생각하고 있습니다.
긴글 읽어주셔서 감사합니다.