말로 내린 명령을 안전하게 기기 제어로 바꾸는 중계 서버 — IntentCP
자연어를 서버가 직접 실행하면 위험하다. 해석은 폰의 온디바이스 AI·단축어에 맡기고, 서버는 정해진 형식(Control URL)으로 바뀐 것만, 그 형식에 정의된 동작만 실행하도록 가둔 1인 OSS의 설계.
자연어를 서버가 직접 실행하면 위험하다
스마트홈을 말로 제어할 때 가장 단순한 설계는 이렇다. 폰에서 “거실 불 좀 줄여줘”를 받아 서버로 보내고, 서버가 그 문장을 LLM으로 해석해 기기를 직접 움직인다. 동작은 한다.
문제는 자연어가 곧 실행 명령이 되는 순간, 무엇이 실행될지를 사전에 알 수 없다는 점이다. 같은 문장이 모델 버전이나 컨텍스트에 따라 다르게 풀릴 수 있다. “전부 꺼”가 어디까지를 전부로 보는지는 전적으로 해석에 달려 있다.
보안 쪽 일을 하다 보면 이런 구조가 익숙하다. 입력을 받아 그대로 실행하는 경로는 결국 입력을 신뢰하는 경로다. 자연어는 그중에서도 가장 신뢰하기 어려운 입력이다.
서버가 자연어를 직접 해석해 실행하는 한, 통제 범위는 모델의 출력이 정한다. 그건 내가 정한 범위가 아니다. 그래서 IntentCP의 설계 전제를 하나로 고정했다. 서버는 자연어를 해석하지 않는다.
해석과 실행을 가른다 — 형식을 먼저 강제한다
핵심은 말과 실행 사이에 검증 가능한 중간 표현을 끼워 넣는 것이다. 폰에 이미 있는 Apple Intelligence와 iOS 단축어가 자연어를 정해진 한 줄 주소 형식(Control URL)으로 먼저 바꾼다. 서버는 이 형식만 받는다. 그리고 그 형식에 정의된 동작만 실행한다.
흐름으로 보면 이렇게 된다.
이 한 줄이 설계의 전부다. 자연어 해석은 폰 쪽에서 끝난다. 서버 입구에 도착할 때는 이미 “거실등 켜기”처럼 약속된 형식으로 정규화돼 있다.
정의되지 않은 형식은 실행 경로 자체가 없다. 의도가 모호하든 모델이 엉뚱하게 풀든, 통제 범위 밖으로 새지 않는다. 입력 검증을 모델의 선의가 아니라 형식의 존재 여부로 강제한 셈이다.
부수 효과로 호출 경로가 통합된다. Siri 음성이든 단축어 자동화든 결국 같은 Control URL을 만들어 던진다. 그래서 입력 출처와 무관하게 같은 제약·실행 경로를 거친다.
이 하나의 포맷 위에서 다루는 동작은 다음과 같다.
- 클라우드 스마트홈 기기의 켜기·끄기
- 밝기 조절·상태 조회
- 여러 동작을 묶는 시퀀스
기기 응답은 다시 LLM이 사람이 읽을 한 줄로 요약한다. 이때도 LLM은 실행 권한이 없는 끝단에만 있다.
권한을 가진 코어에서 LLM을 뺀다
정리하면 해석은 양 끝에, 실행은 가운데에 둔다. 폰의 입력 해석과 응답 요약은 LLM이 맡되, 실제로 기기를 움직이는 권한을 가진 코어에는 LLM을 두지 않는다. 책임 분리의 실제 내용이 이것이다.
GPU 없이 상주한다
서버가 자연어를 해석하지 않으니 서버에 모델이 필요 없다. 이게 두 번째로 노린 지점이다. 보통 음성 스마트홈은 집에 모델을 상시 돌리는 GPU 서버를 전제하는데, 1인 자취 환경에 그런 걸 둘 이유가 없다.
코어는 Python·FastAPI REST 서버다. 해석 부하를 전부 폰에 위임했으니 코어가 하는 일은 둘뿐이다.
- 도착한 Control URL의 형식 검증
- 스마트홈 기기로의 중계
그래서 저전력 미니 서버에서 GPU 없이 24시간 상주한다. 저장소에는 설정·테스트용 웹 패널과 운영용 CLI를 내장했다. 코어 서버·단축어 배포·프롬프트 구성을 한 monorepo로 묶어 띄우는 비용을 줄였다.
누구든 집에 고성능 LLM이 없어도 직접 띄울 수 있게 하는 것, 그게 가벼움의 목표였다.
다만 자연어를 서버에서 빼고 형식을 실행 전에 강제한다는 설계 판단 자체는 보안 쪽에서 입력을 다루던 습관에서 나왔다.
신뢰할 수 없는 입력을 실행 직전에 정해진 형식으로 가두는 발상은 새로운 게 아니다. 그걸 AI 기기 제어에 그대로 옮겨놓은 것뿐이다.
운영으로 검증한다
2025년 12월 8일 GitHub에 공개했고, 유튜브 채널 영상 노출 이후 22 stars를 확보했다(2026.05 기준). 프로덕션 규모도, 실사용자 트래픽도 아니다.
검증이라고 부를 수 있는 건 하나뿐이다. 지금도 내 자취 환경 자동화 도구로 직접 매일 쓴다는 점이다. 형식을 강제하는 구조가 실제 거실에서 켜고 끄는 걸 6개월째 견디고 있다.
개인 OSS의 검증은 결국 본인이 그걸 계속 쓰느냐로 갈린다.
저장소는 github.com/jaebinsim/IntentCP 에 있다.