두 AI 작업이 동일한 마우스를 차지하려고 싸웠던 이유

병렬 에이전트 데모는 보기에는 좋아 보입니다. 하지만 두 작업이 동일한 마우스를 사용하려고 시도하는 순간 실패하게 됩니다.

한 작업은 사이트에 로그인합니다. 다른 작업은 브라우저를 엽니다. 세 번째 작업은 상태 업데이트를 요청합니다. 갑자기 시스템이 엉뚱한 곳을 클릭하거나 잘못된 실행을 취소합니다. 이것은 로직 오류가 아닙니다. 리소스 경합(resource contention) 문제입니다.

데스크톱 자동화를 위한 로컬 컨트롤 플레인인 CliGate를 구축하면서 이 사실을 배웠습니다.

코드에서는 병렬 처리가 잘 작동합니다. 런타임 세션이 작동하는 동안 날씨 조회 작업을 실행할 수 있습니다. 백그라운드 요약 작업은 무엇도 차단할 필요가 없습니다.

데스크톱은 다릅니다. 물리적인 키보드 하나, 마우스 하나, 그리고 화면 하나가 있습니다. 두 에이전트가 그 영역을 차지하려고 하면 서로를 방해하게 됩니다.

처음에는 새로운 작업이 들어오면 기존 작업을 취소해야겠다는 생각이 들었습니다. 하지만 그것은 잘못된 판단이었습니다. "어디까지 진행됐어?"라고 묻는 사용자 때문에 로그인 흐름이 중단되어서는 안 됩니다.

저는 동시성(concurrency)을 프롬프트 문제로 취급하는 것을 그만두었습니다. 이것은 리소스 문제입니다.

저는 세 가지 간단한 규칙을 구현했습니다:

  • 독립적인 작업은 병렬로 실행됩니다.
  • 데스크톱이 필요한 작업은 대기열(queue)에 추가되어야 합니다.
  • 취소는 사용자가 요청할 때만 발생합니다.

CliGate에서 데스크톱 입력은 임대(lease)처럼 작동합니다. 마우스를 사용하는 작업이 데스크톱 점유권을 갖게 됩니다. 다른 작업들은 기다려야 합니다.

새로운 로직은 다음과 같은 흐름을 따릅니다:

  • 새로운 작업이 도착합니다.
  • 데스크톱이 필요한가요?
  • 아니라면, 병렬로 실행합니다.
  • 그렇고 데스크톱이 비어 있다면, 점유합니다.
  • 그렇고 데스크톱이 사용 중이라면, 대기열에 추가합니다.
  • 사용자가 중지라고 말할 때만 취소합니다.

재시도(Retry)는 종종 데스크톱 자동화를 더 악화시킵니다. 두 번째 작업이 마우스를 잡으려고 계속 시도하면 간섭이 심해집니다. 더 강하게 재시도하는 대신, 어시스턴트는 다음과 같이 말해야 합니다: "데스크톱이 사용 중입니다. 대기열에서 기다리고 있습니다. 사용 가능해지면 시작하겠습니다."

이렇게 하면 실패를 예측 가능한 동작으로 바꿀 수 있습니다.

또한 엄격한 규칙을 하나 추가했습니다. 에이전트는 자신의 활성 실행을 스스로 취소할 수 없습니다. 이는 에이전트가 당황해서 자신의 종료 스위치를 클릭하는 상황을 방지합니다.

나쁜 AI 동작은 종종 너무 영리하게 행동하려 할 때 발생합니다. 사용자에게는 훨씬 더 단순한 것이 필요합니다:

  • 충돌하지 않는 작업은 실행합니다.
  • 물리적 리소스를 두고 충돌하는 작업은 대기열에 넣습니다.
  • 상태 로그를 통해 상태 질문에 답변합니다.
  • 사용자가 중지라고 하면 멈춥니다.

데스크톱을 제어하는 AI 도구를 만든다면 이 점을 기억하세요. 병렬 작업은 괜찮지만, 물리적 리소스에는 명확한 소유권이 필요합니다.

Source: https://dev.to/codekingai/my-two-ai-tasks-kept-fighting-for-the-same-mouse-1hij