지난 글 이후 일주일 동안 고친 것들을 적는다. 피코 웹 IDE는 sinabro10에서 sinabro14까지 올라갔고, 시나브로 AI(school-ai)도 여러 군데를 손봤다.
이번에는 "기능을 더했다"보다 "AI가 틀린 것을 서버가 먼저 잡게 했다"가 중심이다. 숫자는 모두 내가 직접 돌린 시험에서 나왔다.
피코 AI가 쓴 코드, 반은 피코에서 안 돌았다
피코 IDE에는 AI 도우미가 있다. "버튼을 누르면 LED가 켜지는 코드" 같은 걸 물으면 MicroPython 코드를 써 준다. 그런데 이 코드가 실제 피코에서 돌아가는지는 한 번도 재 본 적이 없었다.
그래서 과제 30개를 만들었다. LED 깜빡이기부터 HC-SR04 초음파, NeoPixel, OLED, MPU6050, 타이머 인터럽트까지. 학생이 쓰는 것과 똑같은 경로(같은 시스템 프롬프트, 같은 API)로 물어보고, 답을 다섯 가지로 채점했다.
- 코드 블록이 딱 하나 있는가
- 파이썬 문법이 맞는가
- 가짜 피코에서 돌렸을 때 오류가 없는가
- 요청한 핀을 썼는가
- 핀맵 설명(GP 번호와 물리 핀 번호)이 맞는가
가짜 피코(picosim)는 엄격하게 만들었다. 실제 rp2 포트에 없는 메서드를 부르면 바로 오류를 낸다. 예를 들어 oled.clear()는 없다. oled.fill(0)이 맞다.
결과는 30개 중 15개 통과였다. 틀린 방식이 재미있을 정도로 비슷했다.
import machine없이machine.Pin을 쓴다- 없는 메서드:
oled.clear(),np.write(color),PWM.duty_cycle(),I2C(baudrate=...),ADC.channel() - 초음파 센서에서
while echo.value() == 0: pass처럼 시간 제한 없이 기다린다. 센서가 빠져 있으면 피코가 영원히 멈춘다 - 설명만 있고 코드 블록이 없다(3개)
고친 방법: 서버가 먼저 돌려 본다
두 가지를 했다.
첫째, 시스템 프롬프트에 API 규칙을 넣었다. 틀린 이름과 맞는 이름을 짝으로 적었다. "OLED 지우기는 fill(0) 후 show()", "PWM은 duty_u16(0~65535)", "HC-SR04는 time_pulse_us(echo, 1, 30000)" 같은 식이다.
둘째, 서버에 가상 피코 검증을 붙였다. AI 답에 파이썬 코드가 있으면 서버가 네트워크가 막힌 도커 컨테이너에서 가짜 피코로 실행해 본다. 오류가 나면 그 오류를 모델에게 보여 주고 딱 한 번 다시 쓰게 한다. 학생 화면에는 "코드를 더 정확하게 다듬는 중"이라고만 보인다.
몇 가지 함정이 있었다.
- 무한 루프. 피코 코드는 거의 다
while True:다. 가짜 피코는sleep을 일정 횟수 넘게 부르면 "정상 종료"로 본다.sleep없이 도는 루프는 센서를 읽은 횟수로 끊는다. - 바쁜 대기 감지.
while x.value() == n: pass를 보면 따로 오류를 낸다. 실제 피코가 멈추는 모양 그대로다. - 외부 라이브러리.
bme280.py처럼 학생이 따로 올려야 하는 라이브러리는 가짜 피코에 없다. 처음엔 이걸 오류로 보고 고치게 했는데, 모델이 라이브러리 없이 레지스터를 직접 다루는 50줄짜리 코드로 바꿔 버렸다. 학생에게 더 나쁘다. 그래서 import 오류는 고치게 하지 않고 "라이브러리를 lib 폴더에 올리세요"라고 안내만 한다. - 고친 답의 말투. 처음에는 "오류 원인: time 모듈을 import하지 않아…"로 시작했다. 학생은 그 오류를 본 적이 없다. 처음 답하는 것처럼 쓰라고 지시를 바꿨다.
- 검증 결과가 사라지는 문제. 일반 코드 검증 단계가 결과 객체를 통째로 새로 만들어서, 가상 피코 결과가 기록에서 지워지고 있었다. 테스트가 잡아 줬다.
다시 돌린 결과는 30개 중 28개였다. 실패 2개는 코드 문제가 아니라 분당 요청 한도(20회)에 걸린 것이었다. 고치는 단계가 요청을 하나 더 쓰기 때문이다. 그 2개를 다시 돌리니 둘 다 통과했다. 사실상 30/30이고, 30개 중 6개는 서버가 한 번 고쳐서 통과했다. 평균 응답은 13초쯤이다.
센서 가이드에 없는 센서를 물으면
센서 가이드에는 30종이 있다. 학생들은 그 밖의 것도 묻는다. BME280, DS18B20, HX711 로드셀, MAX30102 심박, MQ-2 가스, VL53L0X, TCS34725, 홀 센서, 사운드 센서, HC-05 블루투스, 진동 센서, 빗물 센서. 이 12개를 물어보고 꼭 맞아야 할 사실(I2C 주소, 전압, 풀업 저항, 예열 같은 주의점)을 확인했다.
처음엔 12개 중 8개가 답 대신 "어떤 센서인가요?"라고 되물었다. 원인은 모델이 아니었다. 배선 질문인데 센서 이름이 없으면 "어떤 센서인가요?"라고 되묻는 안전장치가 있다. 그런데 이 장치가 아는 센서 목록이 22개뿐이었다. HX711이나 MQ-2라고 분명히 써도 "센서 이름을 알려 주세요"라고 되물었다. 이제는 부품 번호 모양(영문+숫자)이나 "○○ 센서"라는 말이 있으면 이름을 말한 것으로 본다.
고친 뒤에는 12개 중 11개가 핵심 사실을 모두 맞혔다. 나머지 하나인 HC-05 답에는 통신 속도(기본 9600)가 빠져 있었다. BME280 답의 "5V 연결 금지"는 처음에 채점기가 오답으로 잡았는데, 읽어 보니 경고문이었다. 채점기가 틀렸다.
센서 가이드 검색도 고쳤다. 학생이 실제로 칠 만한 말 46개로 시험했더니 33개만 찾았다. "DHT22", "PM2.5", "MH-Z19", "SG90", "가변저항", "스피커" 같은 말이 설명에 없었기 때문이다. 센서마다 별칭(부품 번호, 일상어)을 붙였더니 46/46이 됐다. 가이드에 없는 부품을 치면 "AI에게 물어보기" 버튼이 나와서 위 질문을 바로 보낸다.
그 밖에 피코 IDE
- 회로 감지를 새로 짰다. 예제 코드의 LED·버튼·센서를 보고 회로 그림에 모듈과 선을 그린다(예제 29개 대응).
- 코드 편집기가 내용에 맞게 늘어나고, 시뮬레이터는 접을 수 있다.
- 코드를 블록으로 바꿀 때 주석이 블록을 망가뜨리던 문제를 고쳤다.
- 보드 콘솔에 raw REPL 제어 문자("raw REPL; CTRL-B to exit")가 그대로 보이던 것을 숨겼다.
- 피코 IDE의 AI 사용량이 "API 한도"(하루 100회)로 잡히고 있었다. 수업 한 시간이면 금방 찬다. 같은 계정의 웹 사용으로 바꿔서 하루 200회 한도를 쓴다.
실제 피코 연결은 가상 피코 다리로 시험했다. 진짜 MicroPython 인터프리터를 웹소켓 뒤에 두고, 브라우저의 Web Serial 자리에 끼워 넣었다. 연결, 코드 실행, 출력, 그래프 그리기까지 실제 사이트에서 돌아갔다. 진짜 USB 피코로는 이번에 시험하지 못했다. 서버들에 피코가 꽂혀 있지 않았다. 다음 수업 전에 직접 꽂아 봐야 한다.
회귀 시험은 실제 사이트 기준으로 통합 45/45, 블록 57/57, 데이터 스튜디오 74/74, 머신러닝 핵심 34/34, 내보내기 10/10이다.
시나브로 AI(school-ai)
- 빈 답변. 모델이 생각(thinking)에 토큰을 다 써 버려서 답이 비어 오는 경우가 있었다. 빈 답이 오면 생각을 끄고 한 번 더 묻는다. 짧은 질문의 출력 한도도 256에서 1024로 올렸다.
- 이어 받기 경쟁. 답을 받는 중에 화면을 다시 열면, 이어 받기와 새 요청이 부딪혀 답이 두 번 그려지거나 멈췄다. 고쳤다.
- 요약 블록. 이름표가 없는 요약 블록을 "검증되지 않은 코드"로 잘못 보고 숨기던 문제를 고쳤다.
- 시간 제한을 420초로 늘리고, 실패한 답에 "다시 시도" 버튼을 달았다.
- 부하 시험. 20명이 동시에 긴 질문을 보내도 모두 끝까지 답했다. 중간값 137초, 가장 긴 것 303초. 빠르다고 할 수는 없지만 떨어지는 사람은 없었다.
학교 서버의 Cloudflare 터널은 로스앤젤레스(LAX) 거점으로 나간다. 요청마다 0.5~2초가 더 붙는다. 수십 초 걸리는 AI 답에서는 크지 않지만, 숫자로 남겨 둔다.
2호기 점검
학생 실습용 GPU 서버(2호기)와 1호기의 서비스도 하나씩 들어가 봤다. 로그인 설정과 서비스를 열어 둔 범위를 다시 정리하고, 바꾼 뒤 브라우저로 다시 확인했다. 서버 보안 설정은 자세히 적지 않는다.
배운 것
AI 답이 맞는지 걱정만 하는 것보다, 맞는지 기계가 먼저 돌려 보게 하는 쪽이 훨씬 싸다. 30개 과제와 가짜 피코 하나로 실패율이 50%에서 거의 0으로 내려갔다. 그리고 이번에도 내 채점기와 내 안전장치가 먼저 틀렸다. 되묻기 장치는 센서 이름을 못 알아봤고, 채점기는 경고문을 오답으로 봤다. 숫자를 믿기 전에 답을 직접 읽어야 한다.