본문으로 건너뛰기

© 2026 Molayo

Dev.to헤드라인2026. 05. 25. 18:37

컴퓨터를 제어하는 데스크톱 AI 어시스턴트를 만들었습니다 — 그 방법은 다음과 같습니다

요약

단순한 챗봇을 넘어 OS를 직접 제어하는 데스크톱 AI 어시스턴트 'Yaldabaoth'의 개발 과정을 소개합니다. Tauri, Python, Win32 API를 활용하여 화면 인식부터 명령 실행까지 가능한 4계층 아키텍처를 구축했습니다.

핵심 포인트

  • Tauri와 React를 사용하여 가볍고 빠른 네이티브 셸 구현
  • Python 백엔드를 오케스트레이터로 활용한 다단계 작업 체이닝
  • Win32 API와 PowerShell을 통한 직접적인 OS 제어 및 자동화
  • OCR과 다중 스레드를 이용한 실시간 화면 인식 시스템

요약(TL;DR): 저는 단순히 질문에 답만 하는 것이 아닌, Yaldabaoth를 만들었습니다. 이 데스크톱 AI 어시스턴트는 화면을 읽고, PowerShell 명령을 실행하며, 버튼을 클릭하고, 텍스트를 입력하며, 전체 워크플로우(Workflow)를 자동화합니다. 클라우드 의존성도 없고, 자동화를 위한 API 호출도 없습니다. 오직 Python, Rust, 그리고 순수한 OS 제어만 사용합니다.

문제점

2025년 현재, "AI 어시스턴트"는 다음 두 가지 중 하나를 의미합니다:

  1. 챗봇 (Chatbots) — 텍스트 상자에 입력하면 LLM(대규모 언어 모델)이 대답하는 방식
  2. API 래퍼 (API wrappers) — API 호출을 체이닝(Chaining)하지만 실제 운영체제(OS)를 건드릴 능력은 전혀 없는 도구

이 중 어느 것도 당신이 컴퓨터에서 무언가를 실제로 "수행"하는 데 도움을 주지 못합니다. 애플리케이션을 열고, 스크린샷을 찍고, PDF를 파싱하고, PowerShell 스크립트를 실행하고, 보고서를 작성하고 싶으신가요? 채팅 인터페이스를 통해 이 모든 것을 체이닝하기는 매우 어려울 것입니다.

저는 다른 것을 원했습니다. 당신의 데스크톱에 앉아 당신이 보는 것을 보고, 당신을 대신해 행동하는 어시스턴트 — 마치 시스템의 어떤 부분이라도 조작할 수 있는 엔지니어가 옆에 앉아 있는 것과 같은 존재 말입니다.

그래서 저는 Yaldabaoth를 만들었습니다.

아키텍처 (Architecture)

Yaldabaoth는 4계층 시스템입니다:

계층 1: 셸 (The Shell) — Tauri + React

바이너리 크기를 150MB 이상 늘릴 수 있는 Electron 대신, 저는 웹뷰(Webview) 프런트엔드를 네이티브 셸로 감싸는 Rust 기반 프레임워크인 Tauri를 사용했습니다. UI는 글래스모피즘(Glassmorphism) 디자인이 적용된 React입니다.

Tauri를 사용한 이유:

  • 바이너리 크기: Electron의 약 150MB 대비 약 5MB
  • 집중적인 작업에 대한 네이티브 성능 제공
  • 필요할 때 직접적인 Rust 시스템 접근 가능

계층 2: 오케스트레이터 (The Orchestrator) — Python 백엔드

Rust 셸은 모든 무거운 작업을 처리하는 Python 백엔드와 통신합니다. 통신은 stdin/stdout JSON 프로토콜을 통해 이루어지며, 이는 가볍고 별도의 HTTP 서버가 필요하지 않습니다.

오케스트레이터는 다음을 관리합니다:

  • 명령 라우팅 (음성/텍스트 → 적절한 핸들러)
  • 명령 간의 상태 유지 (State persistence)
  • 다단계 작업 체이닝 (Multi-step task chaining)
  • 페르소나 프로필 전환 (전문가 모드 vs 창의적 모드)

계층 3: 자동화 엔진 (The Automation Engine) — Win32 API + PowerShell

이곳에서 마법 같은 일이 벌어집니다. Python 백엔드는 다음을 통해 Windows OS에 직접 접근합니다:

  • pywinauto: 클릭, 타이핑, 창 관리 등을 위한 네이티브 Win32 API 제어
  • PowerShell subprocess: OS 수준 명령어 (서비스 제어, 레지스트리 편집, 파일 작업)
  • WMI: 시스템 정보 조회 (프로세스, 하드웨어, 네트워크)

계층 4: 인식 시스템 (The Perception System) — OCR + 화면 파싱

화면 파싱은 UI가 반응성을 유지하도록 별도의 스레드에서 실행됩니다. 여기서는 다음을 사용합니다:

  • OCR 기반 텍스트 추출: 스크린샷 → 텍스트 → 행동 결정
  • 다중 스레드 처리: 화면 캡처 + OCR을 위한 한 스레드, 명령어 실행을 위한 또 다른 스레드, UI 반응성을 위한 세 번째 스레드
  • 연쇄 자동화 (Chained automation): 클릭 → UI 업데이트 대기 → 화면 재스캔 → 다음 행동

어려운 부분들

스레딩의 악몽 (Threading Nightmares)

화면 파싱은 느립니다. OCR로 스크린샷을 처리하고, 텍스트를 분석하며, 무엇을 할지 결정하는 과정은 사이클당 500ms에서 2초가 걸릴 수 있습니다. 만약 이를 메인 스레드에서 수행하면 전체 앱이 멈춥니다.

해결책은 **생산자-소비자 아키텍처 (producer-consumer architecture)**였습니다:

  • 스레드 1: 화면 캡처 → OCR → 파싱된 텍스트를 큐에 넣기
  • 스레드 2: 명령어 실행기 — 큐에서 읽어와 행동 수행
  • 스레드 3: 메인 UI 스레드 — 반응성 유지
┌─────────┐    ┌──────────┐    ┌──────────┐
│ Screen  │───>│ Queue     │───>│ Command  │
│ Capture │    │ (JSON)   │    │ Executor │
... 

Python의 threading.Queuedaemon=True 스레드가 충분했습니다. 이 사용 사례에서는 multiprocessing나 async가 필요하지 않았습니다.

음성 우선 vs. 텍스트 우선 UX (Voice-First vs. Text-First UX)

저는 자연스럽게 명령을 말할 수 있도록 푸시 투 토크(Push-to-Talk) 인터페이스(F10 키)를 원했습니다. 하지만 음성 인식은 지연 시간과 오류를 유발합니다. 타협점은 다음과 같습니다:

  • 간단한 명령어(

Tauri 앱은 Rust 백엔드를 기대합니다. 하지만 Yaldabaoth에는 Python이 필요합니다. 웹 서버를 추가하지 않고 이 둘을 연결하는 것은 까다로운 작업이었습니다.

해결책은 stdin/stdout JSON-RPC였습니다. Rust 셸이 Python 프로세스를 생성하고, stdin/stdout을 통한 JSON 메시지로 통신합니다. 소켓(Socket)도, HTTP도, 실행 중인 서버에 대한 의존성도 없습니다. Python 프로세스는 앱이 열려 있는 동안 유지됩니다.

// Rust 측 — 최소한의 예시
let python = Command::new("python")
    .arg("backend/main.py")
...

배운 점

1. 데스크톱 자동화는 클라우드 자동화보다 어렵습니다. 클라우드 API는 프로그래밍 방식으로 호출되도록 설계되어 있습니다. 반면 데스크톱 UI는 인간을 위해 설계되었습니다. 렌더링된 UI를 파싱(Parsing)하고 이를 바탕으로 의사결정을 내리는 것은 API 엔드포인트를 호출하는 것과는 근본적으로 다릅니다.

2. 초기에 스레딩(Threading)을 적용하고, 자주 스레딩을 고려하세요. 저는 스레딩 모델을 세 번이나 다시 만들었습니다. 첫 번째 버전은 싱글 스레드(Single-threaded) 방식이라 끊임없이 멈췄습니다. 두 번째 버전은 멀티프로세싱(Multiprocessing)을 사용하여 과하게 설계되었습니다. 세 번째 버전인 단순한 큐(Queue) 기반 스레딩 방식이 딱 적당했습니다.

3. 컴퓨터 사용(Computer use)은 이미 2025년에 가능했습니다. "컴퓨터 사용"이 2026년에 유행어가 되기 전에도, Python 스크립트 + OCR + Win32 API만 있으면 충분했습니다. 참신함은 기술 그 자체가 아니라, 단순한 스크립트가 아닌 어시스턴트처럼 느껴지는 음성 우선(Voice-first)의 반응형 UI와 기술을 하나로 엮어내는 데 있습니다.

기술 스택 (Tech Stack)

구성 요소기술
셸 (Shell)Tauri (Rust + WebView2)
...

향후 계획

  • 크로스 플랫폼 지원 — 현재는 Win32 API 의존성 때문에 Windows 전용입니다. X11/Wayland를 통한 Linux 적응이 로드맵에 있습니다.
  • 더 나은 화면 파싱 — 더 풍부한 UI 이해를 위해 OCR 대신 비전 모델(Vision models)을 직접 사용합니다.
  • 플러그인 시스템 — 사용자가 커스텀 자동화 모듈을 작성할 수 있도록 합니다.

리포지토리 (Repo)

전체 소스 코드는 GitHub에서 확인할 수 있습니다: github.com/HENI-MOHAMED/Yaldabaoth

Tauri, React, Python, Rust, 그리고 인정하고 싶지 않을 만큼 많은 양의 커피로 만들어졌습니다.

AI 자동 생성 콘텐츠

본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.

원문 바로가기
0

댓글

0