경력·사례·글은 한국어 원문으로 제공됩니다.

← 모든 에피소드

학생·연구원 시절 · 학생·연구 시절 · 원격 제어

음성 명령으로 전원을 켜던 프로토타입

말로 전원을 켜던 프로토타입에서 지금 집의 Home Assistant까지. 명령마다 조건문을 늘렸던 한계를 돌아보고, 여러 표현을 알아듣는 방법을 생각한다.

그때
음성으로 장치의 전원을 켜고 껐다.
지금
지금은 Home Assistant로 집 안 기기를 제어한다. 함수 호출과 구조화 출력도 시험해보고 싶다.

말로 전원을 켜는 것까지는 됐다

연구원 시절, 스마트폰에 대고 말하면 주변 장치의 전원을 켜고 끄는 프로토타입을 만들었다. 작은 컴퓨터에 전원 릴레이를 붙이고, 서버가 명령을 받아 릴레이를 움직이도록 했다. 램프나 선풍기 같은 교류 전원 장치와 저전압 장치를 제어했고, 프로그램을 실행하는 명령도 넣었다.

릴레이는 신호를 받으면 전원 회로를 연결하거나 끊어주는 스위치다. 스마트폰에서 받은 말을 명령으로 바꿔 서버에서 보내면, 릴레이가 전원을 켜거나 껐다. 여기까지는 작동했다.

그때 쓴 음성 인식은 STT(Speech-to-Text)였다. 말소리를 글자로 바꿔주는 기술이다. 글자로 바뀐 말을 보고 무엇을 실행할지는 내가 코드로 정했다. 어떤 단어가 들어왔는지에 따라 명령을 나누고, 비슷한 말은 조건문으로 하나씩 묶었다. 말이 글자로 나온다고 해서 프로그램이 그 뜻까지 알아듣는 건 아니었다.

새 기능을 넣을 때마다 코드를 고쳐야 했다. 문장으로 말하면 알아듣지 못했고, 명령을 늘릴수록 조건문도 늘어났다. 전원을 켜고 끄는 데는 성공했지만, 이 방식으로 계속 기능을 붙이기는 어려웠다. 프로토타입은 거기서 멈췄다.

지금 생각해보면 사람이 내가 정해둔 방식대로 말해줘야 했다. 비슷한 단어를 더 넣는다고, 사람이 말하는 여러 방식을 다 받아줄 수 있었을까. 다시 만든다면 조건문부터 늘리기보다 말을 알아듣는 부분을 먼저 살펴보고 싶다.

지금은 집에서 쓰고 있다

지금은 NAS에 Home Assistant를 설치해두고 우리 집의 에어컨, TV, 스마트 전구, 스마트 플러그를 제어하고 있다. Google Home과 Tuya 제품들을 연동해 구성했다. Home Assistant는 여러 제조사의 기기와 서비스를 연결해 관리할 수 있게 해주는 도구다. Home Assistant 소개

전원을 켜는 프로토타입을 만들었던 경험이, 이제는 집에서 쓰는 기기를 연결하는 일로 이어졌다. 여기서 조금 더 해본다면, 같은 뜻을 여러 말로 표현해도 알아듣게 하는 방법이 궁금하다.

다른 말도 같은 명령으로 알아듣게 하려면

지금이라면 함수 호출(function calling)을 써보는 건 어떨까. 이 기능을 지원하는 언어 모델에 사용할 수 있는 함수와 필요한 입력값을 미리 알려준다. 모델은 사람의 말을 읽고 어떤 함수를 어떤 값으로 실행하면 좋을지 답한다. 장치 제어라면 어느 장치를 켤지, 끌지 같은 정보가 입력값이 된다. 실제로 함수를 실행하고 장치를 움직이는 일은 프로그램이 한다. 함수 호출 참고

예를 들어 전원을 켜고 끄는 함수에 set_power(device, state)라는 이름을 붙여보자. 설명을 위해 만든 이름이다. "선풍기를 켜줘"와 "선풍기 좀 틀어줘"는 표현이 달라도 같은 동작을 바라는 말이다. 모델이 둘 다 device="fan", state="on"으로 읽어낼 수 있는지 보는 것이다. 실제로 같은 결과가 나오는지는 모델과 말을 바꿔가며 확인해야 한다.

이 방법으로 비슷한 말을 만날 때마다 조건문을 더하던 일을 줄일 수 있을까. 장치를 연결하고 전원을 제어하는 기능은 여전히 필요하다. 그 부분은 Home Assistant의 기존 연동 기능을 쓸 수 있는지부터 살펴보면 좋겠다. 우선 여러 표현을 같은 동작으로 읽어내는지 시험하고, 그 결과를 장치 제어에 어떻게 연결할지 생각해보고 싶다.

답의 형식이 맞아도 뜻은 틀릴 수 있다

구조화 출력(Structured Outputs)도 살펴볼 만하다. 모델의 답을 미리 정한 형식으로 받는 방법이다. 답에 어떤 항목이 들어가야 하고, 각 항목에 어떤 값을 쓸 수 있는지를 JSON Schema로 정한다. 이를테면 장치 이름은 등록된 목록에서 고르고, 전원 상태는 on이나 off로 받는 식이다. 이렇게 받으면 긴 답변에서 장치 이름과 전원 상태를 다시 골라내는 수고를 덜 수 있다. 구조화 출력 참고

함수 호출이 쓸 기능과 입력값을 고르는 방법이라면, 구조화 출력은 답을 어떤 모양으로 받을지 정하는 방법이다. 모델과 도구마다 지원하는 범위가 달라서 그 부분은 먼저 확인해야 한다. 당시 만들었던 정도의 프로그램이라면 장치 이름과 전원 상태를 받아 기존 코드로 처리하는 것만으로 충분할지도 모른다. 실행할 기능이 여러 개라면 함수 호출을 살펴볼 만하다. 처음부터 둘 다 쓸 필요는 없겠다.

걸리는 건, 답의 형식이 맞아도 뜻은 틀릴 수 있다는 점이다. 선풍기를 끄라고 했는데 모델이 on을 골라도 형식에는 문제가 없다. 그래도 그 값을 그대로 실행하면 내가 원한 것과 반대로 움직인다. 앞에서 음성을 글자로 잘못 옮겼다면, 모델은 애초에 잘못 적힌 말을 읽고 답할 수도 있다.

"조금 시원하게 해줘"라는 말은 어떨까. 선풍기를 켜달라는 건지 에어컨을 조절해달라는 건지 먼저 물어야 할 수도 있다. 이럴 때는 임의로 골라서 움직이기보다 한 번 더 물어보게 하고 싶다. 실행하기 전에는 등록된 장치인지, 허용한 동작인지도 코드에서 확인해야 한다. 다만 그 검사로 말뜻을 잘못 알아들은 경우까지 모두 걸러낼 수는 없다. 어떤 동작은 실행 전에 한 번 더 확인할지도 따로 정해야 할 것 같다.

집에 켜두고 쓸 수 있을까

지금 가진 RTX 3090이 들어간 Windows PC는 소음이 커서, 집에서 이런 용도로 쓰기에는 부담스럽다. 그래서 맥 스튜디오나 맥 미니를 사서 로컬 모델을 돌려보고 싶다. 내가 쓸 모델을 돌릴 때 얼마나 시끄러운지, 답을 기다리는 시간은 어느 정도인지 같이 살펴보고 싶다.

이 정도 일을 기기 안에서 돌아가는 작은 언어 모델로도 할 수 있을까. 실행 도구로는 Ollama를 써보면 좋겠다. Ollama는 모델을 실행하고 프로그램에서 요청을 보낼 수 있게 해주는 도구다. 말뜻을 해석하는 건 그 위에서 돌아가는 모델이다. 함수 호출이나 구조화 출력을 지원하는 모델을 고르고, 설정도 맞춰봐야 한다. 로컬 실행 참고

로컬 모델을 쓰면 말뜻을 내 기기에서 해석해볼 수 있다. 그만큼 기기의 메모리와 연산 능력이 필요하다. 어떤 모델을 쓸지에 따라 필요한 메모리와 응답 속도도 달라질 테니, 구입할 기기에서 쓸 만할지는 확인해봐야 한다. 음성을 글자로 바꾸는 일은 어디서 할지도 따로 정해야 한다. 언어 모델을 기기 안에서 돌리는 것만으로 모든 처리가 그 안에서 끝나지는 않는다.

처음에는 장치를 연결하지 않고 몇 가지 말부터 넣어보면 좋겠다. 표현이 달라도 같은 뜻으로 알아듣는지, "켜지 마"를 켜라는 말과 구분하는지 보고 싶다. 애매한 말에 다시 물어오는지도 궁금하다. 답을 기다리는 시간과 메모리를 얼마나 쓰는지도 봐야겠다. 말을 알아듣더라도 기다리는 시간이 길면 쓰기 불편할 수 있으니까.

써보려는 기기에서 만족스럽지 않다면 조금 더 기다려도 좋겠다. 앞으로 1년 정도 작은 모델이 한국어 명령을 알아듣는 능력과 기기에서 실행하는 방법이 어떻게 달라지는지 지켜보고 싶다. 그때 같은 문장으로 다시 확인해보면 지금과 비교하기 좋겠다. 성능이 좋아졌다는 설명도, 내가 쓸 말에서 얼마나 나아졌는지 확인해야 와닿을 것 같다.

그때는 정해둔 말로 전원을 켜고 끄는 것까지 만들었다. 다시 손댄다면 말을 조금 바꿔도 알아듣는지, 잘 모르겠을 때는 멈추고 되물을 수 있는지까지 살펴보고 싶다.

댓글

댓글은 GitHub 토론을 사용하며, 열면 GitHub 로그인이 필요합니다. 고객·사람이 드러나는 정보는 남기지 말아 주세요.

작성 2026-10-05 · 수정 2026-10-06

당시 기록으로 핵심 사실을 확인했고 세부 판단은 기억에 의존한 회고다.