Mobile Mirror AI
말 한마디로 연결된 여러 안드로이드/iOS 폰을 실제 조작하는 AI 오퍼레이터. 반복 작업은 한 번 녹화·학습하면 임베딩으로 기억했다가 LLM 없이 즉시 재실행합니다. PyQt5 데스크톱 + 로컬 LLM(Ollama) + mobile_mirror Flutter 앱(:28080) 연동.
📸 스크린샷 (1)
배경
여러 대의 안드로이드/iOS 폰을 PC 앞에서 한꺼번에 다루려면 기기마다 손이 가고, 같은 조작을 매번 반복해야 합니다. 자연어 한 문장으로 연결된 폰을 조작하고, 자주 하는 일은 한 번만 가르치면 스스로 재실행하도록 만드는 것이 목표입니다.
핵심 기능
- 자연어 명령 → 실제 조작 (Ollama LLM 의도 해석 + ReAct 실행 루프)
- 임베딩 회상 — 명령을 768차원 벡터로 임베딩해 학습 시나리오와 코사인 매칭(≥0.88), LLM 없이 재실행
- 동작 녹화 → JSON 저장/불러오기/재실행 + '학습하기'로 말로 실행되게 등록
- 복합 명령 플랜 분해 — '크롬 실행 후 유튜브 실행'을 결정적으로 나눠 오회상 방지
- 다중 기기 발견 — 와이파이 서브넷 스캔 + USB(adb forward) 병행, 미러링 꺼진 기기 감지·앱 자동 실행
- 자연어 스크롤 — '대출 메뉴에서 멈춰'(찾을 때까지)·'끝까지 스크롤'
- OCR 인증 — ARS/웹 OTP를 OCR 서버로 추출해 키패드까지 자동 입력
- 잠금 해제 — 사용자가 그린 패턴/PIN을 학습해 재현
- 실시간 MJPEG 미러링 + 기기 상태(배터리·CPU·메모리·온도·저장공간) 상시 표시
동작 방식
PyQt5 데스크톱이 QThread 워커로 여러 기기를 동시에 다룹니다. 명령이 들어오면 ① 복합 명령을 플랜으로 분해하고 ② nomic-embed 임베딩으로 학습 시나리오를 회상하며 ③ 못 맞추면 Ollama(qwen2.5:7b)가 의도를 해석하고 ReAct로 단계 실행합니다. 실제 조작은 각 폰의 mobile_mirror Flutter 앱 HTTP 서버(:28080)로 전달되며, 접근성 트리(/tree)로 버튼을 객체 단위로 이해하고 /tap·/swipe·/stroke·/click_node 로 조작합니다. USB 기기는 adb forward 로, 인증번호는 별도 OCR 서버로 처리합니다.
사용 방법
- 폰에서 mobile_mirror 앱을 실행하고 'Start Mirroring' 을 누른다
- PC 앱에서 스캔(와이파이+USB) 후 원하는 기기들을 연결한다
- 자연어로 명령하면 연결된 기기가 즉시 조작된다
- 반복 작업은 녹화·학습해 두고, 다음엔 말 한마디로 재실행한다
한눈에 보기
PC의 파이썬 데스크톱(PyQt5)이 자연어 명령을 받아, 각 폰에서 도는
mobile_mirror Flutter 앱의 HTTP 서버(:28080)로 실제
조작(탭·스와이프·스트로크)을 내려보냅니다. 화면은 MJPEG로 실시간 미러링되고,
접근성 트리(/tree)로 버튼·메뉴를 '객체'로 이해합니다. 한 번 가르친
반복 작업은 임베딩으로 기억했다가 다음엔 LLM 호출 없이 즉시 재실행합니다.
├─ 플랜 분해 (복합 명령 결정적 파싱)
├─ 임베딩 회상 (nomic-embed 768d · 코사인 ≥0.88)
└─ 의도/ReAct (Ollama qwen2.5:7b)
↓ 액션 플랜
mobile_mirror :28080 → 접근성 서비스 → 📱 실제 폰
엔지니어링 하이라이트
- 임베딩 기반 학습·회상 — 명령을 768차원 벡터로 임베딩해 학습 시나리오와 코사인 매칭(≥0.88). 같은 뜻의 다른 표현도 LLM 없이 재실행합니다.
- 플랜 우선 복합 명령 — "크롬 실행 후 유튜브 실행"처럼 이어진 명령을 회상보다 먼저 결정적으로 분해해 오회상을 막습니다.
- 다중 기기 발견 — 와이파이 서브넷 스캔 + USB(
adb forward)를 병행. 미러링이 꺼진 기기는 감지해 앱을 전면에 띄우고 안내합니다. - 자연어 스크롤 제어 — "대출 메뉴에서 멈춰"(찾을 때까지 스크롤)·"끝까지 스크롤"을 기존 이벤트로 구현.
- OCR 인증 연동 — ARS/웹 OTP를 OCR 서버로 추출해 키패드까지 자동 입력.
- 잠금 해제 — 사용자가 한 번 그린 패턴/PIN을 학습해 재현합니다.
- GPU 상주 — Ollama
keep_alive로 모델을 GPU에 상주시켜 응답 지연을 최소화합니다.
