AI 에이전트가 클릭한 것을 볼 수 없는 문제 해결하기
요약
AI 에이전트가 시각적 피드백 없이 행동하는 문제를 해결하기 위한 방법을 제시합니다. 화면 캡처와 주석을 통해 에이전트에게 현재 상태를 지속적으로 제공하고, 논리적/물리적 좌표 공간의 차이를 관리하여 안정적인 자동화 루프를 구축하는 것이 핵심입니다.
핵심 포인트
- 행동 전 반드시 프레임을 캡처하여 기준 이미지를 확보해야 합니다.
- OS 스케일링 팩터(scale_factor)를 고려한 주석 그리기가 필수적입니다.
- 논리적 좌표와 물리적 픽셀 간의 차이를 관리하는 것이 중요합니다.
- 행동 후 다시 화면을 캡처하고, 에이전트가 사용한 논리적 좌표에 주석을 달아 검증해야 합니다.
마우스 이동과 키 입력으로 데스크톱을 구동하는 AI 에이전트는 시각 장애 상태로 작동합니다. 이들은 OS에 좌표를 보내고 커서 아래에 올바른 버튼이 있을 것이라고 기대할 뿐입니다. UI가 변경되거나, 대화 상자가 포커스를 가로채거나, HiDPI 스케일링 팩터가 계산을 바꾸면, 에이전트는 계속 진행합니다. 빈 공간을 클릭하거나, 잘못된 필드에 타이핑하거나, 자신이 볼 수 없는 파괴적인 동작을 유발하는 식입니다.
본 글에서는 이 루프를 닫는 방법을 보여줍니다. 다음 내용을 배우게 될 것입니다:
- 화면을 캡처하고, 지속적인 주석(annotation)을 그리고, 주석이 달린 프레임을 에이전트에게 다시 공급하는 방법
- 왜 좌표 공간(논리적 vs. 물리적 픽셀)이 대부분의 순진한 오버레이를 깨뜨리는지
- 어떤 자동화 스택에도 적용할 수 있는 최소한의 Python Wrapper
행동하기 전에 프레임을 캡처하라
가장 흔한 실수는 최근 스크린샷 없이 행동하는 것입니다. 먼저 프레임을 확보하고, 그 후에 결정해야 합니다. 이는 또한 동작 후 주석을 달 기준 이미지(baseline image)를 제공합니다.
import mss
import numpy as np
from PIL import Image
...
mss는 pyautogui.screenshot보다 빠르며, 각 모니터의 지오메트리(geometry)에 직접 접근할 수 있게 해줍니다. 모니터 인덱스를 설정 가능하도록 유지하세요. 멀티 모니터 환경에서 좌표 버그가 숨어 있는 곳입니다.
스케일링을 견디는 주석 그리기
스크린샷 위에 그림을 그리는 것은 쉽습니다. 하지만 오버레이가 사용자가 보는 것과 일치하도록 그리려면 OS의 스케일링 팩터를 존중해야 합니다. Windows와 macOS에서 논리적 좌표 공간(pyautogui가 반환하는 값)은 물리적 픽셀 공간(스크린샷이 포함하는 값)과 다릅니다.
from PIL import ImageDraw, ImageFont
from dataclasses import dataclass
from typing import Tuple
...
scale_factor 인수가 핵심 연결고리입니다. 200% 스케일링 디스플레이에서는 2.0을 전달하고, 표준 밀도(standard density)에서는 1.0을 전달하세요. 시작 시 한 번 감지하여 재사용하는 것이 좋습니다 (다음 섹션 참조).
스케일 팩터 자동 감지하기
스케일 팩터를 하드코딩하는 방식은 사용자가 창을 다른 모니터로 드래그할 때까지는 작동합니다. 대신 OS에 질의하세요.
import sys
import ctypes
...
시작 시 한 번 current_scale_factor()를 호출하여 캐싱하세요. 에이전트가 실행되는 동안 사용자가 모니터를 핫플러그(hot-plug)할 만큼 충분히 오래 지속된다면, 각 캡처 전에 다시 확인해야 합니다.
주석 처리된 프레임을 에이전트에 되돌려주기 (Feed the Annotated Frame Back to the Agent)
에이전트는 자신의 행동 결과를 볼 필요가 있습니다. 가장 간단한 루프는 다음과 같습니다:
- 화면 캡처(Grab screen)
- 에이전트가 행동 제안 (논리적
x, y위치 클릭) - 행동 실행(Execute action)
- 다시 화면 캡처(Grab screen again)
- 에이전트가 사용한 논리적인 좌표에 주석을 그립니다(Draw annotation at the logical coordinates the agent used)
- 주석 처리된 이미지를 프롬프트 "클릭이 의도했던 곳에 착지했나요?"와 함께 모델로 전송합니다.
def verify_action(
agent,
target_x: int,
...
이 패턴은 맹목적인 행동을 검증된 단계로 바꿉니다. 에이전트는 이제 자체 수정(self-correct)할 수 있습니다. 만약 NO라고 답한다면, 조정된 좌표로 재시도하거나 인간에게 문제를 상향 전달(escalate to a human)할 수 있습니다.
발생 가능한 실패 모드 (Failure Modes You Will Hit)
| 상황 | 증상 | 완화 방법 (Mitigation) |
|---|---|---|
| 사용자가 창을 보조 모니터로 드래그함 | 주석이 오프셋되어 나타남 | 각 캡처 전에 current_scale_factor()를 재쿼리(Re-query)하세요 |
| ... |
가장 교묘한 버그는 혼합 DPI 설정입니다: 1080p 모니터 옆에 4K 패널이 있는 경우. mss.monitors는 각 모니터의 물리적 직사각형을 제공합니다. 에이전트의 논리적 좌표를 스케일링하기 전에 올바른 모니터로 매핑하세요.
핵심 요약 (Key Takeaways)
- 행동 전에 캡처(Capture before you act) -- 최근 스크린샷만이 유일한 진실 공급원(ground truth)입니다.
- 스케일 팩터는 선택 사항이 아닙니다(Scale factors are not optional) --
pyautogui의 논리적 좌표는 HiDPI 디스플레이의 스크린샷 픽셀과 일치하지 않습니다. - 논리 공간에서 주석 처리하고, 물리 공간에 그립니다(Annotate in logical space, draw in physical space) -- 변환은 에이전트의 추론 영역이 아닌, 당신의 드로잉 레이어에 속해야 합니다.
- 루프를 명시적으로 닫으세요(Close the loop explicitly) -- 모델에게 주석 처리된 결과를 확인하도록 요청하고; NO를 재시도하거나 중단하기 위한 일급 신호(first-class signal)로 취급하세요.
- 혼합 DPI 설정에서 테스트하세요(Test on mixed-DPI setups) -- 좌표 수학이 조용히 깨지는 곳이 바로 그곳입니다.
출처 (Source)
Show HN: AI 에이전트가 화면에 큰 화살표, 상자 및 텍스트를 그리게 하세요 (https://github.com/franzenzenhofer/big-arrow-on-the-screen) -- 원래 레포지토리가 다루지 않는 자동 DPI 감지, 멀티 모니터 처리, 실패 모드 분석을 포함한 완전한 캡처-주석-검증 루프를 추가했습니다.
이 작업 지원하기
이 글들은 유료 장벽, 스폰서 또는 추적 없이 연구되어 게시됩니다. 만약 이것이 당신에게 오후 시간을 절약해 주었다면, 작은 후원이 계속 이어지게 합니다.
USDT, USDC 또는 USDD · TRC-20 (Tron)
TFTNsfyomKrnUutRjBTGVULp19ByW29KbY
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기